pageContext对象 Tags: jsp , taglib
request:pageContext.getRequest();
session:pageContext.getSession();
application:pageContext.getServletContext();
response:pageContext.getResponse();
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頁面),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中作為屬性,所以我們可以在上面這個頁面中取得之前設定的物件,同樣的道理,您也可以用相同的方式設定屬性給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);
%>
<%
String attr = (String) pageContext.getAttribute("str", pageContext.APPLICATION_SCOPE);
out.println("取得application屬性:" + attr);
%>
pageContext对象能够存取其他隐含对象。
1.pageContext对象存取其他隐含对象属性的方法,此时需要指定范围的参数。
Object getAttribute(String name, int scope)
Enumeration getAttributeNamesInScope(int scope)
void removeAttribute(String name, int scope)
void setAttribute(String name, Object value, int scope)
范围参数有四个,分别代表四种范围:PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE
2.PageContext对象取得其他隐含对象的方法
Exception getException( ) 回传目前网页的异常,不过此网页要为error page,
JspWriter getOut( ) 回传目前网页的输出流,例如:out
Object getPage( ) 回传目前网页的Servlet 实体(instance),例如:page
ServletRequest getRequest( ) 回传目前网页的请求,例如:request
ServletResponse getResponse( ) 回传目前网页的响应,例如:response
ServletConfig getServletConfig( ) 回传目前此网页的ServletConfig 对象,例如:config
ServletContext getServletContext( ) 回传目前此网页的执行环境(context),例如:application
HttpSession getSession( ) 回传和目前网页有联系的会话(session),例如:session
3.PageContext对象提供取得属性的方法
Object getAttribute(String name, int scope) 回传name 属性,范围为scope的属性对象,回传类型为Object
Enumeration getAttributeNamesInScope(int scope) 回传所有属性范围为scope 的属性名称,回传类型为Enumeration
int getAttributesScope(String name) 回传属性名称为name 的属性范围
void removeAttribute(String name) 移除属性名称为name 的属性对象
void removeAttribute(String name, int scope) 移除属性名称为name,范围为scope 的属性对象
void setAttribute(String name, Object value, int scope) 指定属性对象的名称为name、值为value、范围为scope
Object findAttribute(String name) 寻找在所有范围中属性名称为name 的属性对象