pageContext对象
pageContext对象是JSP中很重要的一个内置对象,不过在一般的JSP程序中,很少用到它,所以知道request对象、response对象的人比较多,知道pageContext对象的人就比较少了。它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。实际上,pageContext对象提供了对JSP页面所有的对象及命名空间的访问,正如前面所介绍的一样,使用pageContext对象可以访问application对象、exception对象,还有session对象等。pageContext对象的方法可以访问除本身以外的8个JSP内部对象,还可以直接访问绑定在application对象、page对象、request对象、session对象上的Java对象。pageContext对象相当于JSP程序中所有对象功能的集成者。不过,这里存在着一个问题,既然可以直接访问JSP内部对象,为什么还要多此一举,通过pageContext对象来访问它们呢?这也正是pageContext对象应用较少的原因。话虽这样说,pageContext对象总是JSP中9个内置对象不可或缺的一部分,读者还是需要掌握它的用法的。
在JSP程序中,我们可以使用pageContext来代表pageContext对象:
<%
pageContext.Method();
%>
pageContext对象的主要用法如下。
1)getOut()
该方法返回一个JspWriter类的实例对象,也就是JSP内置对象——out对象,可以往客户端写入输入流。它的使用方法如下:
<%
JspWriter myout=pageContext.getOut();
myout.println(“myout write: hello world”+”<br>”);
out.println(“out write: hello world”);
%>
2)getSession()
该方法的返回值是一个HttpSession接口的实例对象,即JSP内置对象——session对象,可以保存不同用户的信息。它的使用方法如下:
<%
String username1=”george”;
String password1=”george”;
HttpSession mySession= pageContext. getSession();
mySession.putValue(“username”,username1);
mySession.putValue(“password”, password1);
%>
3)getPage()
该方法的返回值是一个java.lang.Object对象,也就是JSP内置对象——page对象。它的使用方法如下:
<%
Object mypage=pageContext.getPage();
out.println(mypage.toString());
%>
4)getResponse()
该方法的返回对象是javax.servlet.ServletResponse,也就是JSP内置对象——response对象,主要用于控制HTTP连接。它的使用方法如下:
<%
ServletResponse myresponse=pageContext.getResponse();
out.println(myresponse.getCharacterEncoding());
%>
5)getRequest()
该方法的返回对象是javax.servlet.ServletRequest,也就是JSP内置对象——request对象,主要用于获取客户端的信息。它的使用方法如下:
<%
ServletRequest myrequest=pageContext.getRequest();
out.println(myrequest.getRemoteHost());
String username2=”robin”;
String password2=”robin”;
myrequest.setAttribute(“username”,username2);
myrequest.setAttribute(“password”, password2);
%>
6)getException()
该方法的返回值是当前页的exception对象。它的使用方法如下:
<%
Exception myexception=pageContext. getException();
out.println(myexception.getMessage());
%>
上面的代码片段最好在错误处理程序中使用,也就是page编译指令的isErrorPage属性为true的页面中。
7)getServletConfig()
该方法可以返回当前的config对象,用于获取JSP/Servlet程序的初始参数。它的使用方法如下:
<%
ServletConfig myconfig=pageContext.getServletConfig();
%>
8)getServletContext()
该方法的返回值是一个ServletConfig接口的实例对象,也就是JSP内置对象——application对象的副本。它的使用方法如下:
<%
ServletContext myapplication=pageContext.getServletContext();
out.println(myapplication.getServerInfo());
String username3=”java”;
String password3=”java”;
myapplication.setAttribute(“username”,username3);
myapplication.setAttribute(“password”, password3);
%>
9)setAttribute(String name, Object o, int scope)
pageContext对象的setAttribute()方法可以将参数或者Java对象绑定到application对象、session对象、request对象或者page对象上,这里的scope参数可以取以下的值。
l pageContext.PAGE_SCOPE
l pageContext.REQUEST_SCOPE
l pageContext.SESSION_SCOPE
l pageContext.APPLICATION_SCOPE
当scope参数的值为pageContext.SESSION_SCOPE时,调用PageContext对象的setAttribute()方法和调用session对象的putValue()方法是等效的,都是将某个参数或者Java对象和当前的session绑定起来。如果scope参数的值为如果scope参数的值为pageContext.APPLICATION_SCOPE,那么调用PageContext对象的setAttribute()方法和调用application对象的setAttribute()方法是等效的。如果scope参数是其他的值,原理也是一样的,我们就不多说了。它的使用方法如下:
<%
pageContext.setAttribute(“username”,”george”,
pageContext.APPLICATION_SCOPE);
pageContext.setAttribute(“username”,”robin”,pageContext.
SESSION_SCOPE);
%>
10)getAttribute(String name, int scope)
pageContext对象的getAttribute()方法也可以直接获取和application对象、page对象、session对象、request对象相互绑定的参数或者Java对象的值。这个方法的scope参数的意义和上面讲的一样。如果scope参数的值是pageContext.REQUEST_SCOPE,那么getAtttribute()方法就在当前的request对象内部查找有没有绑定一个名为name的Java对象,如果有,就返回这个对象,如果没有,返回null值。如果scope参数的值是pageContext.APPLICATION_SCOPE,那么getAtttribute()方法的作用范围将是application对象。它的使用方法如下:
<%
pageContext.getAttribute(“username”, pageContext.APPLICATION_SCOPE);
pageContext.getAttribute(“username”, pageContext.SESSION_SCOPE);
%>
11)removeAttribute(String name, int scope)
顾名思义,pageContext对象的removeAttribute()方法可以直接解除application对象、session对象、request对象、page对象和某个特定的参数或者Java对象的绑定关系。这个方法的scope参数指定了作用的范围,如果scope参数的值为pageContext.SESSION_SCOPE,那么removeAttribute()方法将会使某个参数或者Java对象和当前的session对象解除绑定关系,如果scope参数是其他值,原理也一样的。它的使用方法如下:
<%
pageContext.removeAttribute(“username”,
pageContext.APPLICATION_SCOPE);
pageContext.removeAttribute(“username”, pageContext.SESSION_SCOPE);
%>
12)findAttribute(String name)
pageContext对象的findAttribute()方法将在application对象、session对象、request对象、page对象内部查找是否有某个参数或者Java对象与这些对象绑定了,搜索顺序是先是范围最小的page对象,其次是request对象、session对象,最后是application对象,这个方法的返回值是第一个符合要求的Java对象的值。它的使用方法如下:
<%
String username=pageContext.findAttribute(“username”);
%>
13)getAttributeScope(String name)
使用这个方法可以知道特定的参数或者Java对象和哪一个JSP对象绑定在一起。该方法的返回值是整型常数,可能是下面4个常数之一:
l pageContext.PAGE_SCOPE
l pageContext.REQUEST_SCOPE
l pageContext.SESSION_SCOPE
l pageContext.APPLICATION_SCOPE
如果返回值是pageContext.SESSION_SCOPE,表明这个Java对象和session对象绑定在一起。如果是其他返回值,读者可以依次类推。它的使用方法如下:
<%
Int scope=pageContext.getAttributeScope(“username”);
%>
14)getAttributeNameInScope(int scope)
该方法可以获取特定JSP对象内部绑定了哪些参数或者Java对象,scope参数指定了该方法的作用范围。这个方法的返回值是一个枚举对象(Enumeration)。它的用法示例如下:
<%
Enumeration enum=null;
enum=pageContext.getAttributeNamesInScope(pageContext.SESSION_SCOPE);
while(enum.hasMoreElements())
{
out.println(enum.nextElement()+”<br>”);
}
%>
上面的JSP代码段将返回session对象中所绑定的参数或者Java对象的名字。
15)release()
该方法将会释放pageContext对象所占的资源。
16)forward(String url)
该方法可以实现网页的重定向功能,类似于response.sendRedirect()方法。
17)include(String relativeUrlPath)
该方法可以让当前文件包含进一个外部文件,类似于JSP的include编译指令和<jsp:include>操作指令。
由上面对pageContext对象的介绍,读者应该不难看出,pageContext对象有两大主要功能,分别是获取各JSP内部对象,以及直接操作与某些JSP对象绑定在一起的参数或者Java对象。下面我们将举出两个比较完整的例子,分别演示pageContext对象的这两个主要功能,如程序4-14和程序4-15所示。
【程序4-14】pageContext1.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 JspWriter myout=pageContext.getOut();
08 myout.println(“myout write: hello world”+”<br>”);
09 out.println(“out write: hello world”+”<br>”);
10
11 String username1=”george”;
12 String password1=”george”;
13 HttpSession mySession= pageContext. getSession();
14 mySession.putValue(“username”,username1);
15 mySession.putValue(“password”, password1);
16
17 out.println(“Session bind username:”+session.getValue
18 (“username”)+”<br>”);
19 out.println(“Session bind password:”+session.getValue
20 (“password”)+”<br><br>”);
21
22 Object mypage=pageContext.getPage();
23 out.println(“Compile Class Came:”+mypage.toString()+”<br><br>”);
24
25 ServletResponse myresponse=pageContext.getResponse();
26 out.println(“Character Encoding:”+
27 myresponse.getCharacterEncoding()+”<br><br>”);
28
29 ServletRequest myrequest=pageContext.getRequest();
30 out.println(myrequest.getRemoteHost());
31 String username2=”robin”;
32 String password2=”robin”;
33 myrequest.setAttribute(“username”,username2);
34 myrequest.setAttribute(“password”, password2);
35
36 out.println(“Request bind username:”+request.getAttribute
37 (“username”)+”<br>”);
38 out.println(“Request bind password:”+request.getAttribute
39 (“password”) +”<br><br>”);
40
41 ServletContext myapplication=pageContext.getServletContext();
42 out.println(myapplication.getServerInfo());
43 String username3=”java”;
44 String password3=”java”;
45 myapplication.setAttribute(“username”,username3);
46 myapplication.setAttribute(“password”, password3);
47
48 out.println(“Application bind username:”+application.getAttribute
49 (“username”)+”<br>”);
50 out.println(“Application bind password:” +application.getAttribute
51 (“password”)+”<br><br>”);
52 %>
53 </body>
54 </html>
执行结果如图4-13所示。
图4-13 pageContext.jsp程序的运行效果
【程序4-15】pageContext2.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1"%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 pageContext.setAttribute(“username”,”george”, pageContext.
08 APPLICATION_SCOPE);
09 pageContext.setAttribute(“username”,”robin”,
10 pageContext.SESSION_SCOPE);
11 pageContext.setAttribute(“username”,”java”,
12 pageContext.REQUEST_SCOPE);
13 pageContext.setAttribute(“username”,”test”,
14 pageContext.PAGE_SCOPE);
15
16 out.println(pageContext.getAttribute(“username”,
17 pageContext.APPLICATION_SCOPE)+”<br>”);
18 out.println(pageContext.getAttribute(“username”,
19 pageContext.SESSION_SCOPE)+”<br>”);
20 out.println(pageContext.getAttribute(“username”,
21 pageContext.REQUEST_SCOPE)+”<br>”);
22 out.println(pageContext.getAttribute(“username”,
23 pageContext.PAGE_SCOPE)+”<br><br>”);
24
25 out.println(application.getAttribute(“username”)+”<br>”);
26 out.println(session.getValue(“username”)+”<br>”);
27 out.println(request.getAttribute(“username”)+”<br>”);
28 out.println(username+”<br>”);
29 out.println(“<br>”);
30
31 out.println(pageContext.getAttributesScope(“username”)+”<br>”);
32 out.println(“<br>”);
33
34 out.println(pageContext.findAttribute(“username”)+”<br>”);
35 out.println(“<br>”);
36
37 pageContext.removeAttribute(“username”,
38 pageContext.APPLICATION_SCOPE);
39 pageContext.removeAttribute(“username”,
40 pageContext.SESSION_SCOPE);
41
42 out.println(pageContext.getAttribute(“username”,
43 pageContext.APPLICATION_SCOPE)+”<br>”);
44 out.println(pageContext.getAttribute(“username”,
45 pageContext.SESSION_SCOPE)+”<br>”);
46 out.println(pageContext.getAttribute(“username”,
47 pageContext.REQUEST_SCOPE)+”<br>”);
48 out.println(pageContext.getAttribute(“username”,
49 pageContext.PAGE_SCOPE)+”<br><br>”);
50
51 Enumeration enum=null;
52 enum=pageContext.getAttributeNamesInScope(
53 pageContext. REQUEST_SCOPE);
54
55 while(enum.hasMoreElements()) {
56 String name=(String)enum.nextElement();
57 out.println(“name----->”+name+”<br>”);
58 out.println(“value----->”+request.getAttribute(name)+”<br>”);
59 }
60
61 pageContext.release();
62 %>
63 </body>
64 </html>
程序4-15演示了如何使用pageContext对象的各种方法直接操作application对象、session对象、request对象、page对象所绑定的参数或者Java对象。这个程序的流程十分简单,在这里就不详细介绍了,读者不妨自己运行这个程序,看看和直接用application等对象的方法操作绑定对象有何不同。程序4-15的运行效果如图4-14所示。
图4-14 pageContext2.jsp程序的运行效果