个人技术分享


一、什么是JSP?

JSP(Java Server Page)

  • 建立在Servlet规范上的动态网页开发技术本质是servlet(Html + Java)
  • 特点:跨平台、业务代码相分离、JavaBean组件重用、预编译(一个用户只编译一次)
  • 产生原因:html页面输出太麻烦

二、jsp运行原理

  • 本质就是servlet,第一次被访问的时候被web容器翻译成servlet再执行
  • helloServlet.jsp→helloServlet_jsp.java源文件→helloServlet_jsp.class字节码文件
  • 被翻译后的servlet在Tomcat的work目录中可以找到
  • F:\Tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\WEB17\org\apache\jsp
  • jsp继承了HttpjspBase,HttpjspBase类又继承了HttpServlet,故jsp就是servlet

三、文档结构

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
	</body>
</html>

四、jsp基本语法

脚本分类 说明
<%(变量/方法/语句等)%> jspScriptlets:被翻译到Servlet中的service方法的局部变量。调用完则释放内存空间,常用于输出
<%=(变量/表达式)%> jsp表达式:被翻译成servlet中service方法内部out.print()输出,变量或者表达式后面不能有分号
<%!java代码%> jsp声明语句:被翻译成servlet类的成员方法/变量/代码块,静态方法/变量/代码块,对整个jsp页面有效
注释分类 说明 可见范围
Html注释 <!–注释内容–> jsp源码、java源码、html源码
java注释 //单行注释/多行注释/ java源码、jsp源码
jsp注释 <%–注释内容–%> jsp源码
指令(指导jsp翻译和运行的命令)分类 属性
<%@page 属性名1=“属性值1”%> language:jsp脚本中可以嵌入的语言种类java
属性名称区分大小写 pageEncoding:读取jsp文件内容采用的编码一定要和保存文件的编码一致–内部可以包含contentType
contentType:有效文档类型text/html;
session:是否jsp在翻译时自动创建true/false
import:导入java的包 可多次,其他只能一次java.util.*
errorPage:当当前页面出错后跳转到哪个页面
isErrorPage:当前页面是一个处理错误的页面true/false
buffer:8kb,jsp缓存大小,也是out的缓冲区大小
autoFlush:自动刷新,true/false
<%@taglib 属性名1=“属性值1” > uri:要引入的(jstl、struts2)标签库地址, prefix:前缀 使用xxx:前缀
<%@include 属性名1=“属性值1”%> file:被包含的相对于webcontent文件地址(静态包含)

五、jsp9大内置对象(笔试)

jsp被翻译成servlet后,service方法中有9个对象定义并初始化完毕,jsp脚本可直接使用
所有对象都可以存取数据request.setAttribute("age", 30);
9大内置对象名称 类型 说明
request HttpServletRequest 得到用户请求信息
response HttpServletResponse 服务器向客户端回应信息
config ServletConfig 服务器配置,可以取得初始化参数
session HttpSession 保存用户信息
application ServletContext 所有用户的共享信息
page Object 指当前页面转换后的Servlet类的实例
exception Throwable 表示jsp页面所发生的异常,在错误页面中才起作用
pageContext PageContext jsp的页面容器,jsp页面的上下文对象
①获得其他8个内置对象:pageContext.getRequest()
②域对象:setAttribute(String name,Object obj[,int scope])
getAttribute(String name[,int scope])
removeAttrbute(String name[,int scope])
pageContext.(PAGE/REQUEST/SESSION/APPLICATION)_SCOPE
③findAttribute(String name)依次从page,request,session,application域中获取属性
out jspWriter 用于页面输出
response.getWriter().write(“a”),先输出,out.write后输出
out.write()先放到jspWriter缓冲区中(默认8kb)
若page属性buffer=“0kb” 关闭out缓冲区,则按顺序输出
jsp标签/动作 说明
<jsp:include /> page:被包含的页面的地址 flush:包含页面flush是否将输出内容立即刷新到客户端,默认false,
false;等全部加载完了再刷新
<jsp:forward /> page=“要转发请求的资源相对于webcontent地址”
include指令(静态包含) include标签(动态包含)
引入的资源必须是jsp格式的文件 引入的资源必须能被web容器独立运行
引入的资源是编译前包含的 引入的资源是编译后包含的
不限制改变状态码和设置响应头 不能改变状态码和设置响应头

六、el(${el表达式}):Expression Language

简单的数据访问语言,使jsp的代码更加简化

七、11个内置对象(自定义的数据必须放在域中el才能得到)

分类 内置对象名称 说明
作用域 pageScope page作用域
requestScope request作用域
sessionScope session作用域
applicationScope application作用域
请求参数 param 获得一个参数
paramValues 获得一组参数
请求头 header 获得一个请求头
headerValues 获得一组请求头
jsp上下文对象 pageContext
全局初始化参数 initParam
cookie cookie
内置对象使用 说明
${内置对象} 获得内置对象
${内置对象.key} 获得内置对象数据
${内置对象.[key-xxx]} 获得内置对象有-或者空格的数据
${内置对象.key[index]} 获得内置对象数据为数组,list,map,对象集合的数据
${key} 底层使用findAttribute(“name”),依次从page、request、session、application获得数据
${pageContext.request} pageContext获得其他八大对象
$(pageContext.request.contextPath)/XXX 相当于<%=pageContext.getRequest().getContextPath%>获得WEB应用的名称
${表达式} el表达式运算

八、jstl(jsp Standard Tag Library)

  • jsp标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。
  • jstl出现的目的同el一样也是要提到jsp页面中的脚本代码
jstl使用 说明
导入jstl.jar 包含JSTL规范中定义的接口和相关类
导入standard.jar 包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)
引入标签库 <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
遍历对象 <c:forEach begin="0"end="5"var=“i” step=“2”>${i}</c:forEach>
<c:forEach items=“将要迭代的对象” var=“每一个对象的值” [varStatus=“”]>
获得普通list的值 <c:forEach items=" l i s t " v a r = " s t r " > {list }" var="str"> list"var="str">{str }</c:forEach>
获得list对象的值 <c:forEach items=" u s e r L i s t " v a r = " u s e r " > {userList}" var="user"> userList"var="user">{user.name }${user.age}</c:forEach>
获得普通map的值 <c:forEach items=" s t r M a p " v a r = " e n t r y " > {strMap }" var="entry"> strMap"var="entry">{entry.key }==${entry.value }</c:forEach>
获得map对象的值 <c:forEach items=" u s e r M a p " v a r = " e n t r y " > {userMap }" var="entry"> userMap"var="entry">{entry.value.name }–${entry.value.password }</c:forEach>
判断条件 <c:if test=“” var=“” scope=“page”></c:if>
输出 <c:out value=“hello,world”>

总结

本文介绍了jsp的使用,如有问题欢迎私信和评论