pageContext 隱含物件對(duì)應(yīng)於javax.servlet.jsp.PageContext型態(tài)之物件,,隱含物件都自動(dòng)的被加入至pageContext中,您可以藉由它來(lái)取得與JSP相關(guān)的隱含物件對(duì)應(yīng)之Servlet物件,像是getRequest()可以取得ServletRequest, getServletConfig()可以取得ServletConfig,getSession()可以取得HttpSession等等。提供取得隱含物件對(duì)應(yīng)之Servlet物件并不是pageContext的主要作用,它的主要功能在提供一個(gè)單一個(gè)介面,以管理各種的公開(kāi)物件(像是 HttpSession、ServletContext、ServletConfig、ServletRequest、ServletResponse等等),提供一個(gè)單一的API來(lái)管理屬性作用范圍等等。
我們之前曾經(jīng)使用過(guò)session的setAttribute()等方法設(shè)定一個(gè)進(jìn)程可以共用的屬性物件,使用session設(shè)定的屬性在同一個(gè)進(jìn)程中可以共用,除了session之外,還有pageContext、 request、application也都可以使用setAttribute()之類(lèi)的方法(詳請(qǐng)查閱API文件)來(lái)設(shè)定可以共用的屬性物件,只不過(guò)這四個(gè)物件所設(shè)定的屬性其共用范圍各不相同。
使用pageContext所設(shè)定的屬性物件,其共用范圍限於同一個(gè) JSP頁(yè)面,使用request所設(shè)定的屬性物件,其在同一個(gè)request處理期間可以共用(包括forward給其它JSP頁(yè)面),session物件所設(shè)定的屬性物件則限於同一個(gè)進(jìn)程作用期間可以共用,而application物件所設(shè)定的屬性,則在整個(gè)Web應(yīng)用程式中的JSP頁(yè)面都可以共用。
以下舉application為例,您可以將一些物件當(dāng)作屬性設(shè)定給application,則另一個(gè)JSP頁(yè)面就可以在適當(dāng)?shù)臅r(shí)候取得這個(gè)屬性物件,例如:
<%
String attr = "字串物件";
out.println("設(shè)定屬性給application:" + attr);
application.setAttribute("str", attr);
%>
我們先連上這個(gè)JSP網(wǎng)頁(yè)以執(zhí)行屬性設(shè)定,然后我們?cè)龠B上這個(gè)JSP網(wǎng)頁(yè):
<%
String attr = (String) application.getAttribute("str");
out.println("取得application屬性:" + attr);
%>
由於我們之前已經(jīng)將字串物件設(shè)定在application中作為屬性,所以我們可以在上面這個(gè)頁(yè)面中取得之前設(shè)定的物件,同樣的道理,您也可以用相同的方式設(shè)定屬性給pageContext、request、session等物件,只要在允許的作用范圍中,就可以取得所設(shè)定的屬性物件。
您可以使用pageContext物件來(lái)設(shè)定屬性,并指定屬性的作用范圍,而不用使用個(gè)別的pageContext、request、session、 application來(lái)進(jìn)行設(shè)定,這就是之前所提的,以pageContext提供一個(gè)單一的API來(lái)管理屬性作用范圍,您可以使用以下的方法來(lái)進(jìn)行設(shè)定:
getAttribute(String name, int scope)
setAttribute(String name, Object value, int scope)
removeAttribute(String name, int scope)
其中的scope可以使用以下的常數(shù)來(lái)進(jìn)行指定:pageContext.PAGE_SCOPE、pageContext.REQUEST_SCOPE、 pageContext.SESSION_SCOPE、pageContext.APPLICATION_SCOPE,常數(shù)的名稱(chēng)已經(jīng)直接指明屬性范圍,我們可以將上面的兩個(gè)JSP頁(yè)面改為以下的形式:
<%
String attr = "字串物件";
out.println("設(shè)定屬性給application:" + attr);
pageContext.setAttribute("str", attr, pageContext.APPLICATION_SCOPE);
%>
<%
String attr = (String) pageContext.getAttribute("str", pageContext.APPLICATION_SCOPE);
out.println("取得application屬性:" + attr);
%>
我們之前曾經(jīng)使用過(guò)session的setAttribute()等方法設(shè)定一個(gè)進(jìn)程可以共用的屬性物件,使用session設(shè)定的屬性在同一個(gè)進(jìn)程中可以共用,除了session之外,還有pageContext、 request、application也都可以使用setAttribute()之類(lèi)的方法(詳請(qǐng)查閱API文件)來(lái)設(shè)定可以共用的屬性物件,只不過(guò)這四個(gè)物件所設(shè)定的屬性其共用范圍各不相同。
使用pageContext所設(shè)定的屬性物件,其共用范圍限於同一個(gè) JSP頁(yè)面,使用request所設(shè)定的屬性物件,其在同一個(gè)request處理期間可以共用(包括forward給其它JSP頁(yè)面),session物件所設(shè)定的屬性物件則限於同一個(gè)進(jìn)程作用期間可以共用,而application物件所設(shè)定的屬性,則在整個(gè)Web應(yīng)用程式中的JSP頁(yè)面都可以共用。
以下舉application為例,您可以將一些物件當(dāng)作屬性設(shè)定給application,則另一個(gè)JSP頁(yè)面就可以在適當(dāng)?shù)臅r(shí)候取得這個(gè)屬性物件,例如:
<%
String attr = "字串物件";
out.println("設(shè)定屬性給application:" + attr);
application.setAttribute("str", attr);
%>
我們先連上這個(gè)JSP網(wǎng)頁(yè)以執(zhí)行屬性設(shè)定,然后我們?cè)龠B上這個(gè)JSP網(wǎng)頁(yè):
<%
String attr = (String) application.getAttribute("str");
out.println("取得application屬性:" + attr);
%>
由於我們之前已經(jīng)將字串物件設(shè)定在application中作為屬性,所以我們可以在上面這個(gè)頁(yè)面中取得之前設(shè)定的物件,同樣的道理,您也可以用相同的方式設(shè)定屬性給pageContext、request、session等物件,只要在允許的作用范圍中,就可以取得所設(shè)定的屬性物件。
您可以使用pageContext物件來(lái)設(shè)定屬性,并指定屬性的作用范圍,而不用使用個(gè)別的pageContext、request、session、 application來(lái)進(jìn)行設(shè)定,這就是之前所提的,以pageContext提供一個(gè)單一的API來(lái)管理屬性作用范圍,您可以使用以下的方法來(lái)進(jìn)行設(shè)定:
getAttribute(String name, int scope)
setAttribute(String name, Object value, int scope)
removeAttribute(String name, int scope)
其中的scope可以使用以下的常數(shù)來(lái)進(jìn)行指定:pageContext.PAGE_SCOPE、pageContext.REQUEST_SCOPE、 pageContext.SESSION_SCOPE、pageContext.APPLICATION_SCOPE,常數(shù)的名稱(chēng)已經(jīng)直接指明屬性范圍,我們可以將上面的兩個(gè)JSP頁(yè)面改為以下的形式:
<%
String attr = "字串物件";
out.println("設(shè)定屬性給application:" + attr);
pageContext.setAttribute("str", attr, pageContext.APPLICATION_SCOPE);
%>
<%
String attr = (String) pageContext.getAttribute("str", pageContext.APPLICATION_SCOPE);
out.println("取得application屬性:" + attr);
%>