JSP内置对象
JSP中共包含9种内置对象,分别为:
- application:javax.serlvet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet之间交换信息。
- config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。
- exception:java.lang.Throwable的实例,该实例代表其他页面的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。
- out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。
- page:代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可用this。
- pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。
- request:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。
- response:javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。response对象常被用于进行重定向。
- session:javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。
这9个内置对象都是在JSP页面对应的Servlet文件中声明的,具体的代码片段如下:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html charset=GBK");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
......
上述的_jspService()方法包含了JSP静态页面和脚本的执行代码,这些执行代码负责完成解析参数、处理请求、生成相应等业务功能。
JSP与Servlet进行数据通信,需要借助JSP内置对象来完成。主要有四个对象负责JSP与Servlet之间的通信,即application、session、request和page。这四个对象分别对应于不同的作用范围。下面将对9种不同的内置对象进行分别介绍:
application
application对象代表Web应用本身,因此使用application来操作Web应用相关数据。application对象通常有如下两个作用:
- 在整个Web应用的多个JSP、Servlet之间共享数据
- 设置属性:setAttribute(String attrName, Object value)
- 获取属性:getAttribute(String attrName, Object value)
- 该对象应当只存储Web应用的状态数据
访问Web应用的配置参数
- 获取web.xml中的配置参数:getInitParameter(String paramName)
在web.xml中的配置参数格式(参数为paramName,返回值为paramValue):
<context-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> </context-param>
config
config对象代表当前JSP配置信息,但JSP页面通常无须配置,因此也就不存在配置信息。这个对象应用比较少。常用的功能有两个:
- 获得处理请求的Servlet的名称(对于JSP页面,该值默认都为jsp):getServletName()
获取web.xml中的JSP页面的配置参数:getInitParameter(String paramName)
在web.xml中的配置参数格式(参数为paramName,返回值为paramValue):
<servlet> <!-- 指定Servlet名字 --> <servlet-name>ServletName</servlet-name> <!-- 指定哪个JSP页面配置成Servlet --> <jsp-file>/JspPage.jsp</jps-file> <!-- 配置参数1 --> <init-param> <param-name>ParamName1</param-name> <param-value>ParamValue1</param-value> </init-param> <!-- 配置参数2 --> <init-param> <param-name>ParamName2</param-name> <param-value>ParamValue2</param-name> </init-param> </servlet> <servlet-mapping> <!-- 指定将ServletName配置到指定目录/config下 --> <servlet-name>ServletName</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>
exception
exception对象代表JSP脚本中产生的错误和异常,是JSP页面异常机制的一部分。通常一个JSP页面出现异常,就会将异常交给错误处理页面处理。exception对象也只在错误处理页面中才有效。所以,exception对象也只有JSP页面的page指令的isErrorPage属性值为true时,exception对象才会被创建并使用。
exception对象的主要功能就是在错误处理页面中显示跳转页面的异常信息。
out
out对象代表一个页面输出流,通常用于在页面上输出变量值及常量。一般在使用输出表达式的地方,都可以使用out对象来达到同样效果。
out对象最常用的方法就是println(String str):在JSP页面中显示某段字符串。
page
page对象有点类似于Java编程中的this指针,就是指当前JSP页面本身。page是java.lang.Object类的对象。page对象在实际开发过程中并不经常使用。
- 返回当时Object的类:getClass()
- 返回此时Object的哈希代码:hashCode()
- 将此时的Object类转换成字符串:toString()
- 比较此对象是否与指定的对象相等:equals(Object ob)
- 将此对象复制到指定的对象中:copy(Object ob)
- 对此对象进行克隆:clone()
pageContext
pageContext对象代表上下文,该对象主要用于访问JSP之间的共享数据。使用pageContext可以访问page、request、session、application范围的变量。
- 获得page范围内属性的值:getAttribute(String name)
- 获得指定范围内属性的值:getAttribute(String name, int scope),scope的值可以取以下四种:
- PageContext.PAGE_SCOPE == 1
- PageContext.REQUEST_SCOPE == 2
- PageContext.SESSION_SCOPE == 3
- PageContext.APPLICATION_SCOPE == 4
- 设置page范围内属性的值:setAttribute(String name, Object value)
- 设置指定范围内属性的值:setAttribute(String name, Object value, int scope),scope的值可以取以下四种:
- PageContext.PAGE_SCOPE == 1
- PageContext.REQUEST_SCOPE == 2
- PageContext.SESSION_SCOPE == 3
- PageContext.APPLICATION_SCOPE == 4
- 获取request对象:getRequest()
- 获取response对象:getResponse()
- 获取config对象:getServletConfig()
- 获取application对象:getServletContext()
- 获取session对象:getSession()
request
request对象是JSP中重要的对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
- 获取请求头/请求参数
- 获取paramName请求参数的值:getParameter(String paramName)
- 获取所有请求参数名和参数值所组成的Map对象:getParameterMap()
- 获取所有请求参数名所组成的Enumeration对象:getParameterNames()
- 获取具有多个值的请求参数的所有值组成的数组:getParameterValues()
- 根据指定请求头的值:getHeader(String name)
- 获取所有请求头的名称:getHeaderNames()
- 获取指定请求头的多个值:getHeaders(String name)
- 获取指定请求头的值,并将该值转为整数值:getIntHeader(String name)
- 操作request范围的属性
- 设置request范围的属性:setAttribute(String attName, Object attValue)
- 获取request范围的属性:getAttribute(String attName)
- 执行forward或include
- 获得RequestDispatcher对象,path为目标路径:getRequestDispatcher(String path)
- 执行forward,同jsp:forward命令:forward(ServletRequest request, ServletResponse response)
- 执行include,同jsp:include命令:include(ServletRequest request, ServletResponse response)
- 获得RequestDispatcher对象,path为目标路径:getRequestDispatcher(String path)
response
response代表服务器对客户端的响应。out也可以进行响应,不过out代表页面输出流,对于非字符输出,还是需要response来完成。
- response响应生成非字符响应
- 获取getOutputStream()
- 重定向
- 重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,所以发送一次请求的请求参数和request范围的属性范围全部丢失,区别于forward指令。
- 重定向到path资源,即重新向path资源发送请求:sendRedirect(String path)
- 执行重定向操作后,浏览器地址栏的地址会变成重定向的地址,区别于forward指令
- 增加Cookie
- Cookie通常用于网站记录客户的某些信息
- Cookie与session的不同在于: session会随浏览器的关闭而失效,但Cookie会一直存放在客户端机器上,除非超出Cookie的生命期限
- Cookie的使用需要浏览器的支持
- 增加Cookie:addCookie(Cookie cookie)
- Cookie创建过程:
- 1.构造器:Cookie(String name, String value)
- 2.设置生命周期:setMaxAge(int time)
- 3.向客户端写Cookie:addCookie(Cookie cookie)
- Cookie创建过程:
- 获取Cookie需要利用request对象:getCookies()
- Cookie中默认不支持中文,所以需要对中文进行转码:java.net.URLEncoder.encode(“中文”, “gbk”)
session
session对象代表一次用户会话。一次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。
- 设置session属性:setAttribute(String attName, Object attValue)
- 获取session属性值:getAttribute(String attName)
- session中通常用于存储与用户会话状态相关的信息,如果只为了实现两个页面之间交换信息,可以将信息放到request范围内,然后通过forward请求实现通信。
- session里的属性值必须是可序列化的,否则会引发不可序列化的异常