第5章〓JSP内置对象 本章思维导图 本章目标  熟悉JSP内置对象的分类及组成。  掌握request、response和out对象的特性及常用的使用方法。  掌握session、application对象的特性及常用的使用方法。  理解pageContext、request、session、application四种作用域的区别和联系。  了解page、config对象。  掌握exception对象的使用方式。 5.1内置对象简介◆ JSP内置对象是指在JSP页面中,不用声明就可以在脚本和表达式中直接使用的对象。JSP内置对象也称隐含对象,它提供了Web开发常用的功能。为了提高开发效率,JSP规范预定义了一些内置对象。 JSP内置对象有如下特点。  内置对象由Web容器自动载入,不需要实例化。  内置对象通过Web容器来实现和管理。  在所有的JSP页面中,直接调用内置对象都是合法的。 JSP规范定义了9种内置对象,其名称、类型、功能如表51所示。 表51JSP内置对象的名称、类型、功能 对 象 名 称类型功能 requestjavax.servlet.http.HttpServletRequest请求对象,提供客户端HTTP请求数据的访问 responsejavax.servlet.http.HttpServletResponse响应对象,用来向客户端输出响应 outjavax.servlet.jsp.JspWriter输出对象,提供对输出流的访问 sessionjavax.servlet.http.HttpSession会话对象,用来保存服务器与每个客户端会话过程中的信息 applicationjavax.servlet.ServletContext应用程序对象,用来保存整个应用环境的信息 pageContextjavax.servlet.jsp.PageContext页面上下文对象,用于存储当前JSP页面的相关信息 configjavax.servlet.ServletConfig页面配置对象,JSP页面的配置信息对象 pagejavax.servlet.jsp.HttpJspPage当前JSP页面对象,即this exceptionjava.lang.Throwable异常对象,用于处理JSP页面中的错误 5.2与Input/Output有关的内置对象◆ 与Input/Output(输入/输出)有关的隐含对象包括request对象、response对象和out对象,这类对象主要用来作为客户端和服务器间通信的桥梁。request对象表示客户端对服务器端发送的请求; response对象表示服务器对客户端的响应; 而out对象负责把处理结果输出到客户端。 视频讲解 5.2.1request对象 request对象即请求对象,表示客户端对服务器发送的请求,主要用于接受客户端通过HTTP传送给服务器端的数据。request对象的类型为javax.servlet.http.HttpServletRequest,与Servlet中的请求对象为同一对象。request对象的作用域为一次request请求。 request对象拥有HttpServletRequest接口的所有方法,其常用方法如下。  void setCharacterEncoding(String charset): 设置请求体参数的解码字符集。  String getParameter(String name): 根据参数名获取单一参数值。  String[] getParameterValues(String name): 根据参数名获取一组参数值。  void setAttribute(String name,Object value): 以名/值的方式存储请求域属性。  Object getAttribute(String name): 根据属性名获取存储的对象数据。 下述实例通过一个用户登录功能,演示request对象获取请求参数方法的使用。该实例需要两个JSP页面,分别是用户登录页面login.jsp和信息获取显示页面loginParameter.jsp。首先创建用户登录表单页面login.jsp,代码如下所示。 【案例51】login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录

用户名:

密  码:

启动服务器,在浏览器中访问http://localhost:8080/ch05/login.jsp,运行结果如图51所示。 图51login.jsp运行结果 单击“登录”按钮,form表单将向loginParameter.jsp发送请求数据,loginParameter.jsp从请求对象(request)中获取请求参数并输出显示,代码如下所示。 【案例52】loginParameter.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.util.Enumeration,java.util.Map"%> 获取登录请求参数 <% //设置POST请求编码 request.setCharacterEncoding("UTF-8"); //获取请求参数的值 String username = request.getParameter("username"); String password = request.getParameter("password"); out.println("参数username的值:" + username + "
"); out.println("参数password的值:" + password + "
"); %> 提交表单后,loginParameter.jsp的运行结果如图52所示。 图52loginParameter.jsp运行结果 request对象获取请求参数的方法既适用于URL查询字符串的GET请求,也适用于Form表单的POST请求。 request对象可以通过setAtrribute()和getAttribute()方法存取请求域属性,在实际开发中,多用于存储、传递本次请求的处理结果。下述实例代码用来实现对案例51中login.jsp的登录信息进行验证,并将产生的验证结果回传到login.jsp页面中进行显示。其中,登录信息验证的代码如下所示。 【案例53】loginValidate.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录验证 <% //设置POST请求编码 request.setCharacterEncoding("UTF-8"); //获取请求参数 String username = request.getParameter("username"); String password = request.getParameter("password"); StringBuffer errorMsg = new StringBuffer(); //参数信息验证 if("".equals(username)) errorMsg.append("用户名不能为空!
"); if("".equals(password)) errorMsg.append("密码不能为空!
"); else if(password.length() < 6 || password.length() > 12) errorMsg.append("密码长度需为6~12位。
"); //将错误信息保存在请求域属性errorMsg中 request.setAttribute("errorMsg", errorMsg.toString()); if(errorMsg.toString().equals("")) out.println(username + ",您的登录信息验证成功!"); else{ %> <% } %> 在登录页面中加入验证信息的获取和显示的代码如下所示。 【案例54】login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录 <% //从请求域属性errorMsg中获取错误信息 String error = (String)request.getAttribute("errorMsg"); if(error != null) out.print("" + error + ""); %>

用户名:

密  码:

注意 在一开始请求login.jsp时,request对象中还未设置errorMsg属性的情况,此时需要先进行属性是否存在的判断(即getAttribute()方法返回值是否为null),否则页面会显示“null”字样。 启动服务器,在浏览器中访问http://localhost:8080/ch05/login.jsp,在用户名、密码都不填写直接登录的情况下,运行结果如图53所示。 图53登录信息验证运行结果 上述代码中,验证错误信息以请求域属性的形式保存在request对象中,并通过请求转发的方式将请求对象再转发回login.jsp,在login.jsp页面中便可从request对象中获取到属性值,从而实现验证信息在一次request请求范围内的传递。 5.2.2response对象 response对象即响应对象,表示服务器对客户端的响应。主要用来将JSP处理后的结果传回到客户端。response对象类型为javax.servlet.http.HttpServletResponse,与Servlet中的响应对象为同一对象。 response对象拥有HttpServletResponse接口的所有方法,其常用的方法如下。  void setContentType(String name): 设置响应内容的类型和字符编码。  void sendRedirect(String url): 重定向到指定的URL资源。 下述实例代码演示使用sendRedirect()方法,在案例53中loginValidate.jsp登录信息验证成功时重定向到用户主页面main.jsp。更改后的loginValidate.jsp如下所示。 【案例55】loginValidate.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录验证 <% //设置POST请求编码 request.setCharacterEncoding("UTF-8"); //获取请求参数 String username = request.getParameter("username"); String password = request.getParameter("password"); StringBuffer errorMsg = new StringBuffer(); //参数信息验证 if("".equals(username)) errorMsg.append("用户名不能为空!
"); if("".equals(password)) errorMsg.append("密码不能为空!
"); else if(password.length() < 6 || password.length() > 12) errorMsg.append("密码长度需为6~12位。
"); //将错误信息保存在请求域属性errorMsg中 request.setAttribute("errorMsg", errorMsg.toString()); if(errorMsg.toString().equals("")){ //验证成功,重定向到main.jsp response.sendRedirect("main.jsp"); }else{ %> <% } %> 用户主界面main.jsp的代码如下所示。 【案例56】main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 用户主界面 欢迎您! 启动服务器,在浏览器中访问http://localhost:8080/ch05/main.jsp,在验证信息填写正确的情况下登录后,运行结果如图54所示。 图54登录信息验证正确情况下的重定向结果 注意 因这里是使用重定向进行的页面跳转,故不能使用请求域属性进行用户名的传递。 5.2.3out对象 out对象即输出对象,用来控制管理输出的缓冲区(buffer)和输出流(output stream)向客户端页面输出数据。out对象类型为javax.servlet.jsp.JspWriter,与HttpServletResponse接口的getWriter()方法获得的PrintWriter对象功能相同,并都由java.io.Writer类继承而来。 out对象的方法可以分为以下两类。  数据的输出。  缓冲区的处理。 其中数据输出的方法及描述如表52所示。 表52out对象的数据输出方法及描述 方法描述 print/println(基本数据类型)输出一个基本数据类型的值 print/println(Object obj)输出一个对象的引用地址 print/println(String str)输出一个字符串的值 newLine()输出一个换行符 【示例】out对象的数据输出方法 <% int i=0; java.util.Date date=new java.util.Date(); out.print(i); out.newLine(); out.println(date); %> 注意out对象的newLine()和println()方法在页面显示上并不会有换行的效果,但在生成的HTML页面源代码中,这两个方法会在输出的数据后面进行换行。 out对象缓冲区的处理方法及描述如表53所示。 表53out对象缓冲区的处理方法及描述 方法描述 void clear()清除输出缓冲区的内容。若缓冲区为空,则产生IOException异常 void clearBuffer()清除输出缓冲区的内容。若缓冲区为空,不会产生IOException异常 void flush()直接将目前暂存于缓冲区的数据刷新输出 void close()关闭输出流。一旦关闭,就不能再使用out对象做任何操作 int getBufferSize()获取目前缓冲区的大小(KB) int getRemaining()获取目前使用后还剩下的缓冲区大小(KB) boolean isAutoFlush()返回true表示缓冲区满时会自动刷新输出; 返回false表示缓冲区满时不会自动清除并产生异常处理 向out对象的输出流中写入数据时,数据会先被存储在缓冲区中,在JSP默认配置下,缓冲区满时会被自动刷新输出。相关的配置由JSP页面中page指令的autoFlush属性和buffer属性决定,autoFlush属性表示是否自动刷新,默认值为true; buffer属性表示缓冲区大小,默认值为8KB。在此配置下,out对象在输出缓冲区内容每次达到8KB后,会自动刷新输出而不会产生异常处理。 下述代码演示在取消自动刷新功能时,页面输出信息超过缓冲区指定大小的情况和使用out.flush()刷新方法后的情况。 【案例57】outExample.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" autoFlush="false" buffer="1kb"%> Insert title here <% for(int i=0;i<100;i++){ out.println("*******************"); //out.flush(); } %> 启动服务器,在浏览器中访问http://localhost:8080/ch05/outExample.jsp,运行结果如图55所示。 图55outExample.jsp运行结果 从运行结果可以看出,在取消了页面自动刷新功能(autoFlush="false")后,当输出流内容超过缓冲区大小(buffer="1KB")时,页面不能被正常执行。若在输出信息代码后面加上“out.flush()”刷新缓冲区的代码,在每次循环输出内容不超过1KB的情况下,内容被及时刷新输出,页面恢复正常运行,运行结果如图56所示。 图56outExample.jsp更改代码后的运行结果 5.3与Context有关的内置对象◆ 与Context(上下文)有关的内置对象包括session、application和pageContext。其中session对象表示浏览器与服务器的会话上下文环境; application对象表示应用程序上下文环境; pageContext对象表示当前JSP页面上下文环境。 5.3.1session对象 session对象即会话对象,表示浏览器与服务器之间的一次会话。一次会话的含义是: 从客户端浏览器连接服务器开始,到服务器端会话过期或用户主动退出后,会话结束。这个过程可以包含浏览器与服务器之间的多次请求与响应。 session对象的类型为javax.servlet.http.HttpSession,session对象具有HttpSession接口的所有方法,其常用方法如下。  void setAttribute(String name, Object value): 以名/值对的方式存储session域属性。  Object getAttribute(String name): 根据属性名获取属性值。  void invalidate(): 使session对象失效,释放所有的属性空间。 下述代码演示使用setAttribute()方法对用户登录验证成功后的用户名进行保存,在重定向的用户主界面中使用getAttribute()方法获取用户名。改进后的loginValidate.jsp如下所示。 【案例58】loginValidate.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录验证 <% //设置POST请求编码 request.setCharacterEncoding("UTF-8"); //获取请求参数 String username = request.getParameter("username"); String password = request.getParameter("password"); StringBuffer errorMsg = new StringBuffer(); //参数信息验证 if("".equals(username)) errorMsg.append("用户名不能为空!
"); if("".equals(password)) errorMsg.append("密码不能为空!
"); else if(password.length() < 6 || password.length() > 12) errorMsg.append("密码长度需为6~12位。
"); //将错误信息保存在请求域属性errorMsg中 request.setAttribute("errorMsg", errorMsg.toString()); if(errorMsg.toString().equals("")){ //将用户名存储在session域属性username中 session.setAttribute("username", username); //验证成功,重定向到main.jsp response.sendRedirect("main.jsp"); }else{ %> <% } %> 重定向的main.jsp中获取用户名的改进代码如下所示。 【案例59】main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 用户主界面 欢迎您! <% String username = (String)session.getAttribute("username"); if(username != null) out.print(username); %> 启动服务器,在浏览器中访问http://localhost:8080/ch05/login.jsp,在登录页面中输入格式正确的用户名和密码登录后,运行结果如图57所示。 图57session范围中用户名的运行结果 从运行结果可以看出,存储在session范围中的属性即使经过重定向的多次请求仍然有效。在浏览器未关闭的情况下,访问main.jsp一直可以获取到用户名,若要让其失效,可以使用invalidate()方法。下述代码演示在main.jsp中增加“安全退出”功能,退出后重新返回登录页面。main.jsp的改进代码如下所示。 【案例510】main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 用户主界面 欢迎您! <% String username = (String)session.getAttribute("username"); if(username != null) out.print(username); %> 安全退出 实现退出功能的logout.jsp的代码如下所示。 【案例511】logout.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% session.invalidate(); response.sendRedirect("login.jsp"); %> 启动服务器,在浏览器中访问http://localhost:8080/ch05/main.jsp,如图58所示单击“安全退出”。 图58单击“安全退出” 此时若再访问http://localhost:8080/ch05/main.jsp,会发现用户名不再显示,表示上次会话已经失效,新的会话已经开始。 注意 考虑session本身的目的,通常应只把与用户会话状态相关的信息放入session范围内,不要仅为了两个页面之间传递信息就将信息放入session范围,这样会加大服务器端的开销。如果仅为了两个页面交换信息,应将该信息放入request范围内,然后通过请求转发即可。 视频讲解 5.3.2application对象 application对象即应用程序上下文对象,表示当前应用程序运行环境,用以获取应用程序上下文环境中的信息。application对象在容器启动时实例化,在容器关闭时销毁。作用域为整个Web容器的生命周期。 application对象实现了javax.servlet.ServletContext接口,具有ServletContext接口的所有功能,application对象常用方法如下。  void setAttribute(String name,Object value): 以名/值对的方式存储application域属性。  Object getAttribute(String name): 根据属性名获取属性值。  void removeAttribute(String name): 根据属性名从application域中移除属性。 下述实例演示使用application对象实现一个页面留言板,代码如下所示。 【案例512】guestBook.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> 用户留言板

请留言

输入您的名字:

输入您的留言:


留言内容

<% //获取留言信息 request.setCharacterEncoding("UTF-8"); String username=request.getParameter("username"); String message=request.getParameter("message"); //从application域属性messageBook中获取留言本 Vector book = (Vector)application.getAttribute("messageBook"); if(book == null)//若留言本不存在则新创建一个 book = new Vector(); //判断用户是否提交了留言,若已提交,则将提交信息加入留言本,存入application域属性中 if(username!=null && message!=null){ String info=username+"#"+message; book.add(info); application.setAttribute("messageBook", book); } //遍历显示出所有的用户留言 if(book.size()>0){ for(String mess:book){ String[] arr = mess.split("#"); out.print("

姓名:"+arr[0]+"
留言:"+arr[1]+"

"); } }else{ out.print("还没有留言!"); } %> 上述代码中,使用Vector集合类存放用户的每次留言,并将其作为application域属性messageBook的值,这样Vector对象在整个服务器生命周期内就可以不断添加各客户端提交的留言信息。启动服务器,在浏览器中访问http://localhost:8080/ch05/guestBook.jsp,运行结果如图59所示。 图59guestBook.jsp运行结果 5.3.3pageContext对象 pageContext即页面上下文对象,表示当前页面运行环境,用于获取当前JSP页面的相关信息。pageContext对象作用范围为当前JSP页面。 pageContext对象类型为javax.servlet.jsp.PageContext,pageContext对象可以访问当前JSP页面所有的内置对象,如表54所示。另外pageContext对象还提供存取页面域属性的方法,如表55所示。 表54pageContext对象获取内置对象的方法及描述 方法描述 ServletRequest getRequest()获取当前JSP页面的请求对象 ServletResponse getResponse()获取当前JSP页面的响应对象 HttpSession getSession()获取和当前JSP页面有联系的会话对象 ServletConfig getServletConfig()获取当前JSP页面的ServletConfig对象 ServletContext getServletContext()获取当前JSP页面的运行环境application对象 Object getPage()获取当前JSP页面的Servlet实体page对象 Exception getException()获取当前JSP页面的异常exception对象,不过此页面的page指令的isErrorPage属性要设为true JspWriter getOut()获取当前JSP页面的输出流out对象 表55pageContext对象存取页面域属性的方法及描述 方法描述 Object getAttribute(String name, int scope)获取范围为scope,名为name的属性对象 void setAttribute(String name, Object value, int scope)以名/值对的方式存储scope范围域属性 void removeAttribute(String name, int scope)从scope范围移除名为name的属性 Enumeration getAttributeNamesInScope(int scope)从scope范围中获取所有属性的名称 在表55存取域属性的方法中scope参数被定义为四个常量,分别代表四种作用域范围: PAGE_SCOPE=1代表页面域,REQUEST_SCOPE=2代表请求域,SESSION_SCOPE=3代表会话域,APPLICATION_SCOPE=4代表应用域。 【示例】添加和获取会话域属性 <% pageContext.getSession().setAttribute("sessionKey","QST"); Object object=pageContext.getAttribute("sessionKey",pageContext.SESSION_SCOPE); %> <%=object %> 5.4与Servlet有关的内置对象◆ 与Servlet有关的内置对象包括page对象和config对象。page对象表示JSP翻译后的Servlet对象,config对象表示JSP翻译后的Servlet的ServletConfig对象。 5.4.1page对象 page对象即this,代表JSP本身,更准确地说它代表JSP被翻译后的Servlet,因此它可以调用Servlet类所定义的方法。page对象的类型为javax.servlet.jsp.HttpJspPage,在实际应用中,page对象很少在JSP中使用。 下述代码演示page对象获取页面page指令的info属性指定的页面说明信息。 【案例513】pageExample.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" info="page内置对象的使用"%> Insert title here

使用"this"获取的页面说明信息:<%=this.getServletInfo() %>

使用"page"获取的页面说明信息:<%=((HttpJspPage)page).getServletInfo() %>

启动服务器,在浏览器中访问http://localhost:8080/ch05/pageExample.jsp,运行结果如图510所示。 图510pageExample.jsp运行结果 5.4.2config对象 config对象即页面配置对象,表示当前JSP页面翻译后的Servlet的ServletConfig对象,存放着一些初始的数据结构。config对象实现于java.servlet.ServletConfig接口。config对象和page对象一样都很少被用到。 下述实例演示JSP通过config对象获取初始化参数。 【案例514】configExample.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here <% String initParam = config.getInitParameter("init"); out.println(initParam); %> 初始化参数在web.xml文件中的配置如下所示。 【案例515】web.xml configExample /configExample.jsp init JSP初始化参数值 configExample /configExample.jsp 启动服务器,在浏览器中访问http://localhost:8080/ch05/configExample.jsp,运行结果如图511所示。 图511configExample.jsp的运行结果 5.5与Error有关的内置对象◆ 与Error有关的内置对象只有一个成员: exception对象。当JSP网页有错误时会产生异常,exception对象就用来处理这个异常。 exception对象即异常对象,表示JSP页面产生的异常。需要注意的是,如果一个JSP页面要应用此对象,必须将此页面中page指令的isErrorPage属性值设为true,否则无法编译。exception对象是java.lang.Throwable的对象。 下述代码描述exception对象对页面异常的处理。 【案例516】error.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> Insert title here <%exception.printStackTrace(response.getWriter()); %> 下述代码描述产生异常的页面,需要注意页面中page指令的errorPage属性要指向上面定义的异常处理页面“error.jsp”。 【案例517】calculate.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp"%> 计算 <% int a, b; a = 10; b = 0; int c = a / b; %> 启动服务器,在浏览器中访问http://localhost:8080/ch05/calculate.jsp,运行结果如图512所示。 图512calculate.jsp的运行结果 视频讲解 5.6JSP的四种作用域◆ 对象的生命周期和可访问性称为作用域(scope),在JSP中有四种作用域: 页面域、请求域、会话域和应用域。四种作用域的生命周期和可访问性介绍如下。  页面域(page scope),页面域的生命周期是指页面执行期间。存储在页面域的对象只对于它所在页面是可访问的。  请求域(request scope),请求域的生命周期是指一次请求过程,包括请求被转发(forward)或者被包含(include)的情况。存储在请求域中的对象只有在此次请求过程中才可以被访问。  会话域(session scope),会话域的生命周期是指某个客户端与服务器所连接的时间; 客户端在第一次访问服务器时创建会话,在会话过期或用户主动退出后,会话结束。存储在会话域中的对象在整个会话期间(可能包含多次请求)都可以被访问。  应用域(application scope),应用域的生命周期是指从服务器开始执行服务到服务器关闭为止,是四个作用域中时间最长的。存储在应用域中的对象在整个应用程序运行期间可以被所有JSP和Servlet共享访问,在使用时要特别注意存储数据的大小和安全性,否则可能会造成服务器负载过重和线程安全性问题。 JSP的四种作用域分别对应pageContext、request、session和application四个内置对象,四个内置对象都通过setAttribute(String name,Object value)方法来存储属性,通过getAttribute(String name)来获取属性,从而实现属性对象在不同作用域的数据分享。 下述代码演示使用pageContext、session、application对象分别实现页面域、会话域、应用域的页面访问统计效果。 【案例518】visitCount.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 访问统计 <% int pageCount = 1; int sessionCount = 1; int applicationCount = 1; //页面域计数 if (pageContext.getAttribute("pageCount") != null) { pageCount = Integer.parseInt(pageContext.getAttribute( "pageCount").toString()); pageCount++; } pageContext.setAttribute("pageCount", pageCount); //会话域计数 if (session.getAttribute("sessionCount") != null) { sessionCount = Integer.parseInt(session.getAttribute( "sessionCount").toString()); sessionCount++; } session.setAttribute("sessionCount", sessionCount); //应用域计数 if (application.getAttribute("applicationCount") != null) { applicationCount = Integer.parseInt(application.getAttribute( "applicationCount").toString()); applicationCount++; } application.setAttribute("applicationCount", applicationCount); %>

页面域计数:<%=pageCount%>

会话域计数:<%=sessionCount%>

应用域计数:<%=applicationCount%>

启动服务器,在Chrome浏览器中访问http://localhost:8080/ch05/visitCount.jsp,第一次访问该页面,运行结果如图513所示。 图513第一次访问visitCount.jsp 多次刷新Chrome浏览器窗口后,运行结果如图514所示。 图514visitCount.jsp多次刷新后 另外打开一个Firefox浏览器窗口(此处使用不同的浏览器软件,同种浏览器的不同窗口session可能依然累加),再次访问此页面后,运行结果如图515所示。 图515新开浏览器窗口访问visitCount.jsp 通过上述运行结果可以看出,pageContext域属性的访问范围为当前JSP页面,因此访问计数始终为1; session域属性的访问范围为当前浏览器与服务器的会话,因此刷新页面访问计数会累加,但新开启浏览器窗口时,会新建一个会话,计数又会从1开始; application域属性的访问范围为整个应用,所以只要应用程序不停止运行,计数会不断累加。 在Web应用开发时需要仔细考虑这些对象的作用域,按照对象的需要赋予适合的作用域,不要过大也不要过小。为一个只在页面内使用的对象赋予了应用域显然毫无意义; 但如果访问对象有太多的限制,那么也会使应用变得更加复杂。因此需要仔细权衡每个对象及其用途,从而准确推断其作用域。 本章总结  JSP内置对象是指不用声明就可以在JSP页面的脚本和表达式中直接使用的对象。  request对象即请求对象,表示客户端向服务器端发送的请求。request对象的类型为javax.servlet.http.HttpServletRequest。  response对象即响应对象,表示服务器对客户端的响应。response对象类型为javax.servlet.http.HttpServletResponse。  out对象即输出对象,用来控制管理输出的缓冲区(buffer)和输出流(output stream)向客户端页面输出数据。out对象类型为javax.servlet.jsp.JspWriter。  session对象即会话对象,表示浏览器与服务器之间的一次会话。session对象的类型为javax.servlet.http.HttpSession。  application对象即应用程序上下文对象,表示当前应用程序运行环境,用以获取应用程序上下文环境中的信息。application对象类型为javax.servlet.ServletContext。  pageContext即页面上下文对象,表示当前页面运行环境,用以获取当前JSP页面的相关信息。pageContext对象类型为javax.servlet.jsp.PageContext。  page对象即this,代表JSP本身,更准确地说它代表JSP被翻译后的Servlet,因此它可以调用Servlet类所定义的方法。page对象的类型为javax.servlet.jsp.HttpJspPage。  config对象即页面配置对象,表示当前JSP页面翻译后的Servlet的ServletConfig对象,存放着一些初始的数据结构。config对象类型为java.servlet.ServletConfig。  exception对象即异常对象,表示JSP页面产生的异常。exception对象是java.lang.Throwable的对象。  JSP中有四种作用域: 页面域、请求域、会话域和应用域。  JSP的四种作用域分别对应pageContext、request、session和application四个内置对象。四个内置对象都通过setAttribute(String name,Object value)方法来存储属性,通过getAttribute(String name)来获取属性,从而实现属性对象在不同作用域的数据分享。 本章习题 1. 下面不是JSP的内置对象。 A. sessionB. requestC. cookieD. out 2. response对象的setHeader(String name, String value)方法的作用是。 A. 添加HTTP文件头 B. 设定指定名字的HTTP文件头的值 C. 判断指定名字的HTTP文件头是否存在 D. 向客户端发送错误信息 3. 要设置某个JSP页面为错误处理页面,以下page指令正确的是。 A. <%@ page errorPage="true"%> B. <%@ page isErrorPage="true"%> C. <%@ page extends="javax.servlet.jsp.JspErrorPage"%> D. <%@ page info="error"%> 4. 下面关于JSP作用域对象的说法错误的是。 A. request对象可以得到请求中的参数 B. session对象可以保存用户信息 C. application对象可以被多个应用共享 D. 作用域范围从小到大是page、request、session、application 5. 在JSP中,request对象的方法可以获取页面请求中一个表单组件对应多个值时的用户的请求数据。 A. String getParameter(String name) B. String[] getParameter(String name) C. String getParameterValuses(String name) D. String[] getParameterValues(String name) 6. 如果选择一种对象保存聊天室信息,则选择。 A. pageContextB. requestC. sessionD. application 7. JSP中获取输入参数信息,使用对象的getParameter()方法。 A. responseB. requestC. outD. session 8. JSP中保存用户会话信息使用对象。 A. responseB. requestC. outD. session 9. 以下对象中作用域最大的是。 A. applicantB. requestC. pageD. session 10. 创建a.jsp页面,将一个字符串存入请求域属性temp中,转发请求到b.jsp; 在b.jsp中获取并显示temp的值; 将请求转发到b.jsp改为重定向到b.jsp,观察是否能够获取temp的值。 11. 充分利用session和application的特点,实现一个禁止用户使用同一用户名同时在不同客户端登录的功能程序。 12. 创建exceptionTest.jsp页面,模拟一个空指针异常,指定异常处理页面为error.jsp; 使用exception内置对象在异常处理页面error.jsp中输出异常信息。