JSP 页面是Web 程序的展示部分,既包括html代码,也可以运行后台代码,还有一些自己特定的处理方式。本质上也是一个Servlet。
1. 隐式对象
Servlet 容器会传递一些对象给Servlet,在jsp中可以通过隐式对象来访问Servlet 容器传递的几个对象,隐式对象如下:
- request:HttpServletRequest
- response:HttpServletResponse
- out:JspWriter
- session:HttpSession
- application:ServletContext
- config:ServletConfig
- pageContext:PageContext
- page:HttpJspPage
- exception:Throwable
如从HttpServletRequest 中获取username 的参数,
<%
String userName=request.getParameter("userName")
%>
2. 指令
指令是JSP语法元素的第一种类型,它们指示JSP转换器如何翻译JSP页面为Servlet,JSP2.2定义了多个指令,但目前用的比较多的是page和include指令。
- page:<%@ page … %>,一般用来导入包,<%@ page import=“java.util.Date”%>;
- include: <%@ include…%>,可以将其他文件内容包含到当前页面中,<%@include file=“main1.jspf”%>。
3. 脚本元素
一个脚本程序是一个java代码块,以<% 开始,以%>结束。
3.1 表达式
每个表达式都会被JSP容器执行,并使用隐式对象out的打印方法输出结果,表达式以<%= 开始,以%>结束。
3.2 声明
可以声明能在JSP页面中使用的变量和方法,声明以<%! 开始,以%> 结束。
4. 动作
动作是第三种类型的语法元素,他们被转换成java代码来执行操作,如访问一个java 对象或者调用方法,有JSP 容器支持的标注动作,也可以创建自定义标签来执行某些操作,
<jsp:useBean id="today" class="java.util.Date" />
<%=today%>
创建Date的对象today,并打印出来。另外还有setProperty (给一个对象设置属性,并且可以指定属性的范围,在5.1中: jsp的4个作用域 pageScope、requestScope、sessionScope、applicationScope)和 getProperty(获取一个对象的属性)。
5. 表达式语音
JSP 2.0 最重要的特性之一就是表达式语言,以 开 始 , 以 结 束 , 结 构 为 { 开始,以 } 结束,结构为 开始,以结束,结构为{expression},EL 表达式可以返回任意类型的值,如果返回的值是一个带对象的属性,可以使用[] 或者 . 来访问属性。对于request域的属性访问,可以是显式的也可以是隐式的,如${requestScope.employee.name} 或者 ${employee.name}都可以
5.1 EL 隐式对象
JSP 有自己的隐式对象,但是在免脚本(脚本表达式<%%>)的JSP页面中不能访问这些隐式对象。EL 允许通过它自己的隐式对象来访问所有的对象。
对象 | 描述 |
---|---|
pageContext | 当前JSP的PageContext,可以访问JSP 的隐式对象 |
initParam | 包含所有环境的初始化参数,并用参数名作为key的map |
param | 这是一个包含所有请求参数,并用参数名作为key的map,每个key值就是指定名称的第一个参数值,如果两个参数名同名,只有第一个能够用param来获取值,要想获取所有同名参数的值,就得用params代替 |
paramValues | 这是一个包含所有请求参数,并用参数名作为key的map,每个key值就是一个字符串数组,其中包含了指定参数名称的所有参数值,就算该参数只有一个值,他也仍然会返回一个带有一个元素的数组 |
header | 这是一个包含请求标题并用标题名作为key的map,每个key值就是指定标题名称的第一个标题,如果同名的标题不止一个,只返回第一个值,要想获取多个值的标题,使用 headerValues 对象代替 |
headerValues | 类似header,每个key值就是一个字符串数组,包含了指定参数名称的所有值 |
cookie | 包含了当前请求对象中所有cookie对象的map,cookie 名称就是key名称,并且每个key都映射到一个cookie对象 |
applicationScope | ServletContext对象中所有属性的map,是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用,application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。 |
sessionScope | HttpSession对象中所有属性的map,是用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法),session的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。 |
requestScope | 当前HttpServletRequest对象中所有属性的map,指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了 |
pageScope | 包含了全页面范围内的所有属性,是一个map,属性名称就是map的key,当前页面有效。在一个jsp页面里有效。page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了 |