6.4.9 pageContext对象

优质
小牛编辑
126浏览
2023-12-01

pageContext对象是javax.servlet.jsp.PageContext类的对象实例,该类是javax.servlet.jsp.JspContext的子类。pageContext对象封装了当前JSP页面的各种信息,通过pageContext对象的getter方法可以获得JSP页面的其他8个内置对象,这些getter方法如下:

getException:该方法返回exception对象。

getOut:该方法返回out对象。

getPage:该方法返回page对象。

getRequest:该方法返回request对象。

getResponse:该方法返回response对象。

getServletConfig:该方法返回config对象。

getServletContext:该方法返回application对象。

getSession:该方法返回session对象。

如果在JSP页面中要使用某个普通的类,在该类中要使用JSP的内置对象,为了方便起见,可以将pageContext对象作为参数传入该类的对象实例,这样在该类中就可以使用JSP页面中所有9个内置对象了。

在前面讲过,request和application对象都可以通过forward和include方法转发和包含Web资源。实际上,在pageContext对象中也提供了forward和include方法来简化转发和包含Web资源的编码工作。

在pageContext对象中有一个forward方法和两个include方法,这三个方法的定义如下:

abstract public void forward(String relativeUrlPath) 
throws ServletException, IOException;
abstract public void include(String relativeUrlPath) 
throws ServletException, IOException;
abstract public void include(String relativeUrlPath, boolean flush)
    throws ServletException, IOException;

其中flush参数为true,表示在调用include方法之前,将out对象的缓冲区中的内容刷新到Servlet引擎提供的缓冲区中。pageContext对象中的forward和include方法与前面讲的相应方法类似,只是forward方法在处理out对象缓冲区上有一些区别。看如下的代码:

<!--  pageContext.jsp  -->
<%@ page language="java" pageEncoding="UTF-8" %>
<%
    pageContext.forward("/test.html");
%>

如果将pageContext.jsp页面中<%...%>后面的静态部分都删除,则可以正常访问该页面,但如果在<%...%>后面还有静态部分,则在访问pageContext.jsp页面时会抛出如图6.9所示的异常。这是由于pageContext对象的forward对象在转发Web资源之前,会先清空out对象的缓冲区,因此,在<%...%>之前写入out对象缓冲区的内容将作废,这时如果<%...%>后面没有静态部分,则系统就不会调用getWriter方法获得PrintWriter对象,因此,也就不会抛出异常了。

如果在<%...%>后面也加上JSP页面的静态部分,则仍然会抛出图6.9所示的异常。这是因为虽然在调用forward方法之前清空了out对象的缓冲区,但在调用forward方法之后,仍然会继续将静态内容写入out对象的缓冲区。当JSP页面结束时,还会调用getWriter方法来获得PrintWriter对象。因此,就会抛出图6.9的异常。

pageContext对象拥有自己的域,也就是说,可以通过setAttribute、getAttribute、removeAttribute方法设置、获得和删除域信息外。还有如下两个方法可以访问pageContext、request、session和application四个域:

l findAttribute:该方法可以依次从pageContext、request、session和application四个域中获得指定的属性值。如果前一个域中没有要找的属性,则继续在下一个域中寻找。如果在这四个域中都没有要找的属性,则该方法返回null。

2  getAttributeNamesInScope:该方法返回某个域中的所有属性名,这些属性名将被放在一个Enumeration对象中返回。该方法有一个参数,可以通过PageContext的常量设置。如要获得request域中的所有属性的名称,可以使用PageContext.REQUEST作为该方法的参数值。