1、requestjavax.servlet.http.HttpServletRequestresponsejavax.servlet.http.HttpServletResponsepageContextjavax.servlet.jsp.PageContextsessionjavax.servlet.http.HttpSessionapplicationjavax.servlet.ServletContextoutjavax.servlet.jsp.JspWriterconfigjavax.servlet.ServletConfigpagejava.lang.Objectexceptionja
2、va.lang.Throwable其中request,response,session,application和config对象所属的类及其用法在前面的Servlet章节中我们已经介绍过了,下面主要介绍一下其他的对象。12.4.1 pageContextpageContext对象提供了访问其他隐含对象的方法,如下:? public abstract javax.servlet.ServletRequest getRequest() public abstract javax.servlet.ServletResponse getResponse() public abstract javax.
3、servlet.http.HttpSession getSession() public abstract javax.servlet.ServletContext getServletContext() public abstract JspWriter getOut() public abstract javax.servlet.ServletConfig getServletConfig() public abstract java.lang.Object getPage() public abstract java.lang.Exception getException()在pageC
4、ontext对象中,可以使用下面两个方法来保存和获取属性。 public abstract void setAttribute(java.lang.String name, java.lang.Object value) public abstract java.lang.Object getAttribute(java.lang.String name)在pageContext对象中保存的属性,只能在当前页面中去获取,也就是说,pageContext对象具有页面范围(详见12.5节)。利用pageContext对象,还可以设置和得到在其他范围对象中保存的属性。pageContext对象提供了
5、另外两个setAttribute()和getAttribute()方法,如下: public abstract void setAttribute(java.lang.String name, java.lang.Object value, int scope) public abstract java.lang.Object getAttribute(java.lang.String name, int scope)其中的scope参数用于指定要获取哪一个范围对象的属性,有四个可能的取值,其中PageContext. PAGE_SCOPE表示页面范围,PageContext.REQUEST_
6、SCOPE表示请求范围,PageContext.SESSION_ SCOPE表示会话范围,PageContext.APPLICATION_SCOPE表示Web应用程序范围。在pageContext对象中,可以使用下面两个方法来删除范围中的属性。 public abstract void removeAttribute(java.lang.String name, int scope)删除指定范围内名字为name的属性。 public abstract void removeAttribute(java.lang.String name)删除所有范围内名字为name的属性。pageContext
7、对象还提供了搜索属性的方法: public abstract java.lang.Object findAttribute(java.lang.String name)该方法会按照page,request,session和application范围的顺序搜索指定名字的属性,如果找到,则返回属性的值,如果没有找到,则返回null。关于范围,请参见12.5节。pageContext对象也提供了请求转发的两个方法forward()和include(),其内部实现是调用RequestDispatcher对象的forward()和include()方法。从pageContext对象提供的方法可以看出,p
8、ageContext对象实际上是为我们提供了访问其他隐含对象的统一入口,在多数情况下,直接利用pageContext对象就可以完成想要实现的功能。12.4.2 outout对象的类型是javax.servlet.jsp.JspWriter,该类从java.io.Writer类派生,以字符流的形式输出数据。out对象实际上是PrintWriter对象的带缓冲的版本(在out对象内部使用PrintWriter对象来输出数据),可以通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb。在out对象中,提供了几个和缓冲区操作相关的方法,如下所示。 public abstract
9、void clear() throws java.io.IOException清除缓冲区中的内容。如果缓冲区已经被刷新,clear()方法将抛出IOException异常。 public abstract void clearBuffer() throws java.io.IOException清除缓冲区中的当前内容。这个方法和clear()方法的区别是,如果缓冲区已经被刷新,这个方法不会抛出IOException异常。 public abstract void close() throws java.io.IOException刷新缓冲区,关闭输出流。注意,我们在编写JSP页面时,不需要显式
10、地去调用这个方法,因为在JSP容器所生成的代码中会自动包含对close()方法的调用。 public abstract void flush() throws java.io.IOException刷新缓冲区。 public int getBufferSize()获得out对象使用的缓冲区的大小。 public abstract int getRemaining()获得缓冲区中未使用的字节数。 public boolean isAutoFlush()判断out对象是否是自动刷新。out对象针对不同的数据类型,提供了多个重载的print()和println()方法,用于输出数据。要注意的是,虽然
11、println()方法会输出一个换行,但是客户端的浏览器在显示页面时会忽略输出的换行。12.4.3 pagepage对象是当前页面转换后的Servlet类的实例。从转换后的Servlet类的代码中,可以看到这种关系:Object page = this;在JSP页面中,很少使用page对象。12.4.4 exceptionexception对象表示了JSP页面运行时产生的异常,该对象只有在错误页面(在page指令中指定属性isErrorPage=true的页面)中才可以使用。在JSP页面中,我们可以利用page指令的errorPage属性指定一个错误处理页面,当JSP页面运行发生错误时,JSP
12、容器会自动调用指定的错误处理页面。要注意的是,如果一个JSP页面使用errorPage属性定义了错误页面,那么在web.xml文件中定义的任何错误页面将不会被使用。下面我们看一个例子:price.jsp%String strPrice=request.getParameter(price);double price=Double.parseDouble(strPrice);out.println(Total price = +price * 3);%excep.jsp%page isErrorPage=trueexception.toString():brout.println(excepti
13、on.toString();pexception.getMessage():out.println(exception.getMessage();在price.jsp页面中,通过page指令的errorPage属性指定错误处理页面为excep.jsp。在excep.jsp页面中,通过page指令的isErrorPage属性指定当前页面是错误处理页面,只有设置了isErrorPage为true,在此页面中才可以使用exception对象。我们访问price.jsp页面时,输入URL:http:/localhost:8080/ch12/price.jsp?price=5.0将看到输出:Total
14、price = 15.0如果输入:price=abc将看到如下的错误信息:java.lang.NumberFormatException: For input string: abcFor input string:在JSP页面中的对象,包括用户创建的对象(例如,JavaBean对象)和JSP的隐含对象,都有一个范围属性。范围定义了在什么时间内,在哪一个JSP页面中可以访问这些对象。例如,session对象在会话期间内,可以在多个页面中被访问。application对象在整个Web应用程序的生命周期中都可以被访问。在JSP中,有4种范围,如下所示。 page范围具有page范围的对象被绑定到j
15、avax.servlet.jsp.PageContext对象中。在这个范围内的对象,只能在创建对象的页面中访问。可以调用pageContext这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象(pageContext对象还提供了访问其他范围对象的getAttribute方法),pageContext对象本身也属于page范围。当Servlet类的_jspService()方法执行完毕,属于page范围的对象的引用将被丢弃。page范围内的对象,在客户端每次请求JSP页面时创建,在页面向客户端发送回响应或请求被转发(forward)到其他的资源后被删除。 request范
16、围具有request范围的对象被绑定到javax.servlet.ServletRequest对象中,可以调用request这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。在调用forward()方法转向的页面或者调用include()方法包含的页面中,都可以访问这个范围内的对象。要注意的是,因为请求对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。 session范围具有session范围的对象被绑定到javax.servlet.http.HttpSession对象中,可以调用session这个隐含对象的getAttri
17、bute()方法来访问具有这种范围类型的对象。JSP容器为每一次会话,创建一个HttpSession对象,在会话期间,可以访问session范围内的对象。 application范围具有application范围的对象被绑定到javax.servlet.ServletContext中,可以调用application这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象。下面我们通过几个简单的例子,来看一下这4种范围对象的应用。1测试page范围test1.jsppageContext.setAttribute
18、(name,zhangsantest1.jsp:out.println(pageContext.getAttribute();pageContext.include(test2.jsptest2.jsptest2.jsp:访问test1.jsp,将看到如下的输出: zhangsan null说明保存在pageContext对象中的属性具有page范围,只能在同一个页面中被访问。2测试request范围修改test1.jsp和test2.jsp,如下所示。request.setAttribute(out.println(request.getAttribute( zhangsan说明保存在req
19、uest对象中的属性具有request范围,在请求对象存活期间,可以访问这个范围内的对象。将这一句注释起来,先访问test1.jsp,再访问test2.jsp,可以看到如下输出:这是因为客户端开始了一个新的请求。3测试session范围session.setAttribute(out.println(session.getAttribute(先访问test1.jsp,然后在同一个浏览器窗口中访问test2.jsp,可以看到如下输出:说明保存在session对象中的属性具有session范围,在会话期间,可以访问这个范围内的对象。如果我们在访问完test1.jsp后,关闭浏览器,重新打开浏览器窗口,访问test2.jsp,将看到如下输出:这是因为客户端与服务器开始了一次新的会话。4测试application范围application.setAttribute(out.println(application.getAttribute(先访问test1.jsp,然后关闭浏览器,再打开浏览器窗口,访问test2.jsp,可以看到如下输出:说明保存在application对象中的属性具有application范围,在Web应用程序运行期间,都可以访问这个范围内的对象。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1