JSP pagecontext对象详解

pageContext对象是javax.servlet.jsp.PageContext类的实例对象,用来代表整个JSP页面。它代表页面上下文,该对象主要用于访问 JSP 之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。

获取实例

pageContext对象是通过调用JspFactory.getPageContext方法返回的。

public PageContext getPageContext(
javax.servlet.Servlet servlet,
javax.servlet.ServletRequest request,
javax.servlet.ServletResponse response,
java.lang.String errorPageURL, boolean needsSession,
int buffer, boolean autoflush)

JSP页面中只需将pageContext对象传递给某个Java类的实例对象,在该Java对象中就可以访问和调用其他隐式对象的功能了。

常用方法

JspWriter getOut(); //返回当前客户端响应被使用的JspWriter流(out)

HttpSession getSession(); //返回当前页面中HttpSession对象(session)

Object getPage(); //返回当前页面的Object对象(Object)

ServeletRequest getRequest(); //返回当前页面的ServletRequest对象(request)

ServeletResponse getResponse(); //返回当前页面的ServletResponse对象(response)

void setAttribute(String name,Object attribute); //设置属性及属性值

void getAttribute(String name,int scope); //在指定范围内取属性的值

int getAttributeScope(String name); //返回某属性的作用范围

void forward(String relativeUrlPath); //使当前页面重导到另一页面

void include(String relativeUrlPath); //在当前位置包含另一文件

作用

1. 获取所有内置对象

getException()返回exception隐式对象

getPage()返回page隐式对象

getRequest()返回request隐式对象

getResponse()返回response隐式对象

getServletConfig()返回config隐式对象

getServletContext()返回application隐式对象

getSession()返回session隐式对象

getOut()返回out隐式对象

import javax.servlet.ServletContext;  
import javax.servlet.jsp.PageContext;  
public class pagecontext {  
    public void m(PageContext pag){  
        //如果你要传参9大隐式对象,不可能写9个参量吧!  
        //这个时候我们的Context的作用就可以了,它可以调用其他8个隐式对象,直接可定义这一个  
        //这样就方便很多了。  
        ServletContext ser=pag.getServletContext();  
        pag.getServletConfig();  
        pag.getOut();  
        pag.getPage();  
        pag.getRequest();  
        pag.getResponse();  
        pag.getSession();  
        pag.getException();  
        //这就是其他8个隐式对象了,都可以通过PageContext得到,非常的方便  
    }  
}

2. 引入和跳转到其他资源,提供了转发和包含的简便方法

PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和RequestDispatcher.include方法的调用。

public void forward(java.lang.String relativeUrlPath) throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath) throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath,boolean flush) throws javax.servlet.ServletException,java.io.IOException

传递给这些方法的资源路径都只能是相对路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径。

RequestDispatcher rd = request.getRequestDispatcher("/url");//“/”绝对路径
rd.forward(request,response);
pageContext.forward("url");//重定向
pageContext.include("url");//包含

3. 本身是域对象,同时可以操作其他域对象

JSP中的四大作用域对象:page,request,session,application,作为域对象,很容易得出,里面必定有三个方法,setAttribute,getAttribute和removeAttribute。pagecontext这3个方法中带一个scope参数,可以通过这个参数来操作其他的域对象。

void setAttribute(String name,Object value,int scope)//scope操作于其他三大域对象
void removeAttribute(String name,int scope)
Object getAttribute(String name,int scope) 

scope取值如下

PageContext.PAGE_SCOPE(对应page范围)
PageContext.REQUEST_SCOPE(对应request范围)
PageContext.SESSION_SCOPE(对应session范围)
PageContext.APPLICATION_SCOPE(对应application范围)

例子

//PageContext1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%>  
<html>  
  <head>  
    <base href="<%=basePath%>">  
  </head>  
  <body>  
    <%  
    //pageContext只在本页面有效,在其他页面使用pageContext是不能取不到值的  
    //pageContext.setAttribute("p1", "p的第一个值");  
    pageContext.setAttribute("p1", "p的第二个值",PageContext.PAGE_SCOPE);  
    //可是如果用HttpRequest呢?  
     //request.setAttribute("p2", "p2");  
    pageContext.setAttribute("p2", "p22",PageContext.REQUEST_SCOPE);  
      
    // session.setAttribute("p3", "p3");  
    pageContext.setAttribute("ps","p33",PageContext.SESSION_SCOPE);  
      
    //application.setAttribute("p4", "p4");  
    pageContext.setAttribute("p4", "p44",PageContext.APPLICATION_SCOPE);  
      
      
    pageContext.forward("/PageContext2.jsp");  
    //response.sendRedirect("/day09/PageContext2.jsp");  
    %>  
  </body>  
</html>  
//PageContext2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%>  
<html>  
  <head>  
    <base href="<%=basePath%>">  
  </head>  
  <body>  
    <%=pageContext.getAttribute("p")//得到PageContext1.jsp页面p的值?试问可以得到吗?大家想想 %>  
    <%=application.getAttribute("p") %><!-- 那大家想想这里取得到上一页面的值吗? -->  
    <%=pageContext.findAttribute("p") %>  
  </body>  
</html> 

总结

1. pageContext对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。

2. pageContext对象封装了当前JSP页面的运行信息,它提供了返回JSP页面的其他隐式对象的方法。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。