pageContext隐含对象对应于javax.servlet.jsp.PageContext类 型之对象,,隐含对象都自动的被加入至
pageContext中,您可以藉由它来取得与JSP相关的隐含对象对应之Servlet对象,像是getRequest()可以取得
ServletRequest,getServletConfig()可以取得ServletConfig,getSession()可以取得
HttpSession等等。提供取得隐含对象对应之Servlet对象并不是pageContext的主要作用,它的主要功能在提供一个单一个接口,以
管理各种的公开对象(像是HttpSession、ServletContext、ServletConfig、ServletRequest、
ServletResponse等等),提供一个单一的API来管理属性作用范围等等。 之前曾经使用过session的setAttribute()等方法设定一个进程可以共用的属性对象,使用session设定的属性在同一个进程中可以共 用,除了session之外,还有pageContext、request、application也都可以使用setAttribute()之类的方法 (详请查阅API文件)来设定可以共用的属性对象,只不过这四个对象所设定的属性其共用范围各不相同。 使用pageContext所设定的属性对象,其共用范围限于同一个JSP页面。 使用request所设定的属性对象,其在同一个 request处理期间可以共用(包括forward给其它JSP页面),由于request只存活在请求时,设定属性时为线程安全的。 session对象所设定的属性对象则限于同一个进程作用期间可以共用,设定属性时,必须注意线程安全问题。 而application对象所设定的属性,则在整个Web应用程序中的JSP页面都可以共用,设定属性时,必须注意线程安全问题。 以下举application为例,您可以将一些对象当作属性设定给application,则另一个JSP页面就可以在适当的时候取得这个属性对象,例如: <%
String attr = "字符串对象"; out.println("设定属性给application:" + attr); application.setAttribute("str", attr); %> 先连上这个JSP网页以执行属性设定,然后再连上这个JSP网页: <%
String attr = (String) application.getAttribute("str"); out.println("取得application属性:" + attr); %> 由于之前已经将字符串对象设定在application中作为属性,所以可以在上面这个JSP页面中取得之前设定的对象,同样的道理,您也可以用相同的方式 设定属性给pageContext、request、session等对象,只要在允许的作用范围中,就可以取得所设定的属性对象。 您可以使用pageContext对象来设定属性,并指定属性的作用范围,而不用使用个别的pageContext、request、 session、application来进行设定,这就是之前所提的,以pageContext提供一个单一的API来管理属性作用范围,您可以使用以 下的方法来进行设定: getAttribute(String name, int scope)
setAttribute(String name, Object value, int scope) removeAttribute(String name, int scope) 其中的scope可以使用以下的常量来进行指定:pageContext.PAGE_SCOPE、 pageContext.REQUEST_SCOPE、pageContext.SESSION_SCOPE、 pageContext.APPLICATION_SCOPE,常量的名称已经直接指明属性范围,可以将上面的两个JSP页面改为以下的形式: <%
String attr = "字符串对象"; out.println("设定属性给application:" + attr); pageContext.setAttribute("str", attr, pageContext.APPLICATION_SCOPE); %> 另一个JSP页面: <%
String attr = (String) pageContext.getAttribute("str", pageContext.APPLICATION_SCOPE); out.println("取得application属性:" + attr); %> 当您不知道属性的范围时,也可以使用pageContext来找出属性,例如: <%
String attr = (String) pageContext.findAttribute("str"); out.println(attr); %> pageContext会从page范围开始寻找属性,如果找不到就依request、session、application的范围来寻找属性对象。 |