第3章内置对象技术 JSP 页面或Servlet 页面的内置对象由容器(服务器)提供, 可以使用标准的变量访问这些对象,并且不用编写任何额外的 代码,在JSP 页面或Servlet 页面中使用。在JSP 2.0 规范中定 义了以下 9 个内置对象:request(请求对象)、response(响应 对象)、session(会话对象)、application(应用程序对象)、out (输出对象)、page(页面对象)、config(配置对象)、exception (异常对象)、pageContext(页面上下文对象)。在本章中,将对 它们进行介绍,并通过示例介绍它们的具体使用方法。 3.内置对象概述 1 Web应用程序的特点是一个JSP文件(或者一个Servlet)相当于一个独立的运行单元, 类似于一个独立的应用程序,并由容器(Tomcat)统一管理。对于一个实际项目来说,不可 能只有一张页面,且页面之间存在着各类内部数据的实时通信及共享问题,例如,把A页面 登录数据传递到B页面进行验证,购物车的设计涉及若干页面共享数据问题,公告栏涉及不 同用户的数据共享问题。而且,在实际项目中,存在着对各类请求/响应的一些特殊要求等。 因此,容器根据规范要求,向用户提供了一些内置对象,用于解决上述问题,并负责对这些对 象的管理,包括内置对象的生存期、作用域等。 在这些内置对象中,request、response对象是在客户端请求JSP页面或Servlet页面 时,由容器实时生成并作为服务参数传递给JSP文件(实际上是Servlet),在请求/响应过 程结束时由容器回收;sesion一般是在用户开始登录系统时生成的,在退出系统时由容器 回收。 3.2 request对象 request对象最主要的作用在当次请求中进行数据传递,当请求发起方(JSP页面或 Servlet页面,甚至是HTML页面)向另一方(JSP页面或Servlet页面)发起请求时,容器(服 务器)会将客户端的请求信息包装在这个request对象中,请求信息的内容包括请求的头信 息、请求的方式、请求的参数名称和参数值等信息。request对象封装了用户提交的信息,通 过调用该对象相应的方法可以获取来自客户端的请求信息,然后根据不同需求做出响应。 它是HtpServletRequest类的实例。 3.2.1 主要方法 request对象的主要方法如表3-1所示。 表3- 1 request对象的主要方法 方法名 方法说明 getAtribute(Stringname) getAtributeNames( ) getCharacterEncoding( ) getContentLength( ) getContentType( ) getInputStream( ) getParameter(Stringname) getParameterNames( ) getParameterValues(Stringname) getProtocol( ) getServerName( ) getServerPort( ) getReader( ) getRemoteAddr( ) getRemoteHost( ) setAtribute(Stringkey,Objectobj) getRealPath(Stringpath) 返回指定属性的值 返回所有可用属性名 返回字符编码方式 返回请求体的长度(以字节为单位) 得到请求体的MIME类型 得到请求体中的二进制流 返回指定参数的值 返回所有可用参数名 返回包含指定参数的所有值的数组 返回请求方使用的协议类型及版本号 返回接收请求的服务器主机名 返回服务器接收请求所用的端口号 返回解码后的请求体 返回发送请求的客户端IP地址 返回发送请求的客户端主机名 设置指定属性的值 返回指定虚拟路径的真实路径 45 续表 46 方 法 名方法说明 getMethod() 返回客户端向服务器传输数据的方式 getRequestURL() 返回发出请求字符串的客户端地址 getSession() 创建一个session对象 下面的程序给出了request对象的常用方法示例,通常使用request对象获得客户端传 来的数据。 Example3_1.jsp代码如下: <%@ page contentType="text/html;charset=utf-8" %>
您想使用什么方式查看文本文件A.txt?
(3)response1.jsp代码如下: <%@ page contentType="text/html;charset=gb2312"%> <% String str1=request.getParameter("submit1"); String str2=request.getParameter("submit2"); if (str1==null) { str1=""; } if (str2==null) { str2=""; } if (str1.startsWith("word")) { response.setContentType("application/msword;charset=GB2312"); out.print(str1); } if (str2.startsWith("excel")) { response.setContentType("application/x-msexcel;charset=GB2312"); } %>创建时间:<%=new Date(session.getCreationTime())%>
最后访问时间:<%=new Date(session.getLastAccessedTime())%>
是否是一次新的对话? ? ? <%=session.isNew()%>
原设置中的一次会话持续的时间:<%=session.getMaxInactiveInterval()%> <%--重新设置会话的持续时间--%> <%session.setMaxInactiveInterval(100);%>
新设置中的一次会话持续的时间:<%=session.getMaxInactiveInterval()%>
属性UserName 的原值:<%=session.getAttribute("UserName")%> <%--设置属性UserName 的值--%> <%session.setAttribute("UserName","The first user!");%>
属性UserName 的新值:<%=session.getAttribute("UserName")%> 程序运行结果如图3-3所示。 图3-3 程序运行结果 58 3.4.2 常用技术 1.多页面数据共享技术 对于多页面的Web应用系统,一个用户在一个会话期内可能出现以下两种多页面数据 共享的情况: . 登录后,把相关登录信息(如用户名、角色、权限等)保存在数据共享区内,相当于一 个会话期内的全局变量,给其他页面或Servlet查询这些信息提供便利。 . 在特定情形下,多页面数据共享也是电子商务购物车技术实现的方案之一。多页面 相当于多货架,购物车相当于多页面数据共享。 实现以上技术的原理简述如下: (1)数据录入: session.setAttribute(String key, Object value) 其中,value是任意类型的Java对象,当然也可以是JSON 对象,可存放各类数据。需要注意 的是,在Servlet中,需要通过以下方法获得session对象: session=request. getSession() (2)数据查询: session.getAttribute(String key) 2.安全控制技术 主要安全控制技术如下: . 防止非法用户绕过登录页面,直接利用URL进入需要登录才能进入的页面。具体 解决办法有两种:其一是利用session中的信息,在页面中进行合法性验证;其二是 利用过滤器技术(以后章节会详细介绍)。 . 当登录用户由于特殊原因暂时离开时,非法用户趁机进行非法操作,会带来意想不 到的损失。对于这种情况,除了安全意识教育外,还可以利用session进行技术防 范,其主要原理是:设置有效的session活动间隔时间,默认是30min,可以人工设置 session对象的生命周期。 . 实现安全退出机制。关闭浏览器,并不能马上触发后台结束session,这会带来意想 不到的安全隐患。可在系统中专门设立“安全退出”按钮,单击该按钮,后台实际上 调用session.invalidate()方法,服务器同时回收内存。 3.其他内置对象介绍 5 3.5.1 application 对象 application对象实现了用户间数据的共享。与sesion对象只存放一个用户的共享 数据不同,application对象可存放所有用户的全局变量。application对象开始于服务器 的启动,随着服务器的关闭而消亡。在此期间,此对象将一直存在,这样,在用户的前后 两次连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对 此对象属性的操作都将影响到其他用户对此对象的访问。服务器的启动和关闭决定了 application对象的生命周期。它是ServletContext类的实例。表3-4是application对象 的主要方法。 表3- 4 application对象的主要方法 方法名 方法说明 getAtribute(Stringname) getAtributeNames() setAtribute(Stringname,Objectobject) removeAtribute(Stringname) getServerInfo() getRealPath(Stringpath) getInitParameter(Stringname) 返回指定属性的值 返回所有可用属性名 设置指定属性的值 删除属性及其值 返回JSP(或Servlet)引擎名及版本号 返回指定虚拟路径的真实路径 返回指定属性的初始值 从表34可见,n对象的数据存取方式与sn对象相似。在具体应用过程 -applicatioesio 中,可以把Web应用的状态数据放入application对象中,如实时在线人数、公共留言等信 息;也可使用application对象的getlnitParameter(StringparamName)方法获取Web应用 的参数,这些参数在web.xml文件中使用context-param元素配置。 3.5.2 out 对象 out对象代表向客户端发送数据,发送的内容是浏览器需要显示的内容。out对象是 PrintWriter类的实例,是向客户端输出内容时的常用对象。out对象的主要方法如表3-5 所示。 59 60 表3-5 out对象的主要方法 方 法 名方法说明 clear() 清除缓冲区的内容 clearBuffer() 清除缓冲区的当前内容 flush() 清空流 getBufferSize() 返回缓冲区的大小(以字节为单位),如不设缓冲区则为0 getRemaining() 返回缓冲区剩余空间大小 isAutoFlush() 返回缓冲区满时是自动清空还是抛出异常 println() 向页面输出内容 close() 关闭输出流 在同步请求/响应过程中,可以用request对象传递数据。而在异步请求/响应过程中, 则可以用response对象向请求端输出字符数据流(如JSON 文本串),这是通过out内置对 象完成的,具体如下: (1)前端(浏览器)的JSP页面或者HTML页面发起一个异常请求(以后章节会介绍)。 (2)后端(如Tomcat、Servlet)接收数据,并在处理后写回文本串数据。 PrintWriter out=response.getWriter(); out.write("文本串"); 文本串可以是简单的字符串,如"ok",也可以是JSON 文本串。具体应用在以后章节会 介绍。 3.5.3 config 对象 config对象用于在一个Servlet初始化时JSP引擎向它传递信息,此信息包括Servlet 初始化时要用到的参数(由属性名和属性值构成)以及服务器的有关信息(通过传递一个 ServletContext对象提供)。config对象的主要方法如表3-6所示。 表3-6 config对象的主要方法 方 法 名方法说明 getServletContext() 返回含有服务器相关信息的ServletContext对象 getInitParameter(Stringname) 返回初始化参数的值 getInitParameterNames() 返回初始化所需的所有参数 config对象提供了对每一个给定的服务器小程序或JSP页面的javax.servlet.Servlet Config对象的访问方法。它封装了初始化参数以及一些方法。其作用范围是当前页面,而 61 在别的页面无效。config对象在JSP中作用不大,而在Servlet中作用比较大。 3.5.4 exception 对象 exception对象用于异常处理。当一个页面在运行过程中发生了异常,就会产生此对 象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。此 对象是java.lang.Throwable的实例。exception对象的主要方法如表3-7所示。 表3-7 exception对象的主要方法 方 法 名方法说明 getMessage() 返回描述异常的消息 toString() 返回关于异常的简短描述消息 printStackTrace() 显示异常及其栈轨迹 FillInStackTrace() 重写异常的执行栈轨迹 下面用一个示例来说明exception对象的用法。首先在errorthrow.jsp中抛出一个异 常,代码如下: <%@ page language="java" import="java.util.*;" pageEncoding="ISO-8859-1" errorPage="error.jsp"%>
<% int result=1 / 0; %> 在上面的代码中,使用page指令设定当前页面发生异常时重定向到error.jsp,error.jsp 的代码如下: <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1" isErrorPage="true"%> <% String path=request.getContextPath(); String basePath=request.getScheme() + "://" + request.getServerName() + ":"+request.getServerPort()+path+"/"; %>