日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JSF中使用FacesContext和ExternalContext對(duì)象

 Gemmy 2009-12-23

在Faces API中有兩個(gè)類(lèi)是要經(jīng)常使用的. 一個(gè)是FacesContext 一個(gè)是ExternalContext.首先講解如何使用FacesContext .

對(duì)每個(gè)JSF請(qǐng)求,F(xiàn)acesServlet對(duì)象都會(huì)為其獲取一個(gè)javax.faces. context.
FacesContext類(lèi)的實(shí)例。FacesServlet對(duì)象將下列3個(gè)取自Web容器的對(duì)象傳給javax.faces.context.FacesContextFactory對(duì)象的getFacesContext方法,以此來(lái)做到這一點(diǎn):

●       javax.servlet.ServletContext
●       javax.servlet.ServletRequest
●       javax.servlet.ServletResponse
這意味著FacesContext的實(shí)例里包含了所有處理JSF請(qǐng)求所需的每個(gè)請(qǐng)求的狀態(tài)信息。圖3-1展示了FacesContext實(shí)例里封裝的其他一些對(duì)象。
3.2.1 獲取當(dāng)前實(shí)例
一個(gè)經(jīng)常用到的方法是靜態(tài)的getCurrentInstance方法,它返回當(dāng)前的FacesContext實(shí)例。此方法的簽名如下:
public static FacesContext getCurrentInstance()
下面的代碼是一個(gè)用此方法獲取FacesContext當(dāng)前實(shí)例的例子:
FacesContext facesContext = FacesContext.getCurrentInstance();
3.2.2 獲取和修改組件樹(shù)
FacesContext實(shí)例里最重要的內(nèi)容是請(qǐng)求頁(yè)面的組件樹(shù)。組件樹(shù)是由javax.faces.tree.Tree類(lèi)來(lái)表示的(本章后面的“使用Tree類(lèi)”一節(jié)會(huì)討論)。FacesContext實(shí)例的tree屬性就是Tree對(duì)象。
要獲取或修改Tree對(duì)象,可使用tree屬性的讀取方法和賦值方法:
public abstract Tree getTree()
public abstract void setTree(Tree tree)
3.2.3 添加和獲取消息
在請(qǐng)求處理生命周期里,可能會(huì)遇到錯(cuò)誤。比如,當(dāng)驗(yàn)證器執(zhí)行輸入驗(yàn)證時(shí),因?yàn)橛脩?hù)輸入了不正確的值,驗(yàn)證可能失??;當(dāng)組件試圖把輸入值轉(zhuǎn)換為綁 定到組件的模型對(duì)象所需的類(lèi)型時(shí),也可能會(huì)失敗。所有消息都必須存放到FacesContext實(shí)例里以備后面進(jìn)行處理。比如,您可能希望在頁(yè)面里顯示錯(cuò) 誤消息,從而為用戶(hù)更正錯(cuò)誤提供幫助。
錯(cuò)誤消息是由javax.faces.application.Message接口(第11章再詳細(xì)討論)來(lái)表示的,您可以通過(guò)使用FacesContext類(lèi)的addMessage方法向FacesContext實(shí)例里添加Message對(duì)象。這個(gè)方法的簽名如下:
public abstract void addMessage(UIComponent component, Message message)
如果component不為空,新加入的message就關(guān)聯(lián)到component上。否則,它就不與任何特定組件的實(shí)例相關(guān)。
舉例來(lái)說(shuō),驗(yàn)證器在驗(yàn)證組件值失敗時(shí)可調(diào)用FacesContext的addMessage方法,傳入值無(wú)效的組件及一個(gè)包含特定錯(cuò)誤消息的Message對(duì)象。
所有添加到FacesContext實(shí)例的Message對(duì)象都被加入到一個(gè)集合里??赏ㄟ^(guò)調(diào)用getMessages方法的兩個(gè)重載方法之一來(lái)獲取加入的Message對(duì)象:
public abstract Iterator getMessages()
public abstract Iterator getMessages(UIComponent component)
第一種形式的調(diào)用在一個(gè)Iterator里返回所有Message對(duì)象,而第二種形式的調(diào)用則僅返回與給定UIComponent相關(guān)聯(lián)的Message對(duì)象。
3.2.4 添加和獲取請(qǐng)求處理事件
UIComponent可以生成FacesEvent對(duì)象。比如,當(dāng)單擊一個(gè)UICommand組件時(shí),它會(huì)生成一個(gè)ActionEvent對(duì) 象(ActionEvent類(lèi)是FacesEvent類(lèi)的子類(lèi))。這個(gè)FacesEvent對(duì)象需要在FacesContext實(shí)例里保存起來(lái),以備請(qǐng)求 處理生命周期里的下一步處理事件時(shí)所用。
可通過(guò)使用FacesContext類(lèi)的addFacesEvent方法向FacesContext實(shí)例添加FacesEvent對(duì)象。此方法的簽名如下:
public abstract void addFacesEvent(FacesEvent event)
要提取先前添加的FacesEvent對(duì)象,可調(diào)用getFacesEvents方法,其簽名如下:
public abstract Iterator getFacesEvents()
此方法返回FacesEvent時(shí)的順序與其在隊(duì)列中的順序一致。
3.2.5 向Response對(duì)象里寫(xiě)入信息
為了向Response對(duì)象里寫(xiě)入信息,F(xiàn)acesContext類(lèi)提供了兩個(gè)屬性,一個(gè)是 javax.faces.Context.ResponseStream類(lèi)型,另一個(gè)是 javax.faces.context.ResponseWriter類(lèi)型。ResponseStream類(lèi)型的對(duì)象用于輸出二進(jìn)制數(shù)據(jù),而 ResponseWriter類(lèi)型的對(duì)象則用于輸出字符。這些屬性的讀取方法和賦值方法如下:
public abstract ResponseStream getResponseStream()
public abstract void setResponseStream(ResponseStream responseStream)
public abstract ResponseWriter getResponseWriter()
public abstract void setResponseWriter(ResponseWriter responseWriter)
3.2.6 獲取和設(shè)置地區(qū)
第11章將會(huì)討論到,JSF支持國(guó)際化和本地化。這意味著您可以根據(jù)用戶(hù)的地區(qū)決定發(fā)送什么樣的回應(yīng)信息。locale屬性里存放了當(dāng)前處理中所用的Locale對(duì)象。
初始狀況下,locale屬性的值和網(wǎng)絡(luò)瀏覽器里指定的地區(qū)是一樣的,但可以修改這個(gè)值,從而發(fā)送輸出所使用的地區(qū)將獨(dú)立于瀏覽器所使用的地區(qū)。此屬性的讀取方法和賦值方法如下:
public abstract Locale getLocale()
public abstract void setLocale(Locale locale)
3.2.7 操作請(qǐng)求處理生命周期
FacesContext類(lèi)還提供了兩個(gè)方法與請(qǐng)求處理生命周期進(jìn)行交互:
●       在當(dāng)前階段的處理完成后,調(diào)用renderResponse方法通知JSF實(shí)現(xiàn)把控制權(quán)轉(zhuǎn)到呈現(xiàn)響應(yīng)階段。也就是說(shuō),處于當(dāng)前階段和呈現(xiàn)響應(yīng)階段之間的所有其他階段都不再執(zhí)行。
●       調(diào)用responseComplete方法,告訴JSF實(shí)現(xiàn)此次請(qǐng)求的HTTP響應(yīng)已經(jīng)完成(比如在使用了HTTP重定向的情況下)。因此,當(dāng)前階段完成后,必須中止請(qǐng)求處理生命周期的處理。
這些方法的簽名如下:
public abstract void renderResponse()
public abstract void responseComplete()
3.2.8 獲取其他請(qǐng)求狀態(tài)信息
其他每個(gè)請(qǐng)求的狀態(tài)信息封裝在ExternalContext對(duì)象里,可以使用getExternalContext方法獲取該對(duì)象:
public abstract ExternalContext getExternalContext()
現(xiàn)在講解ExternalContext。
使用ExternalContext類(lèi)提供的方法可以獲取ServletContext、ServletRequest和 ServletResponse對(duì)象,構(gòu)造FacesContext實(shí)例時(shí)需要這些對(duì)象。除此之外,ExternalContext實(shí)例提供了包裝器方 法,可以使用這些方法獲得原來(lái)需要從ServletContext、ServletRequest及ServletResponse對(duì)象上調(diào)用一些方法獲 得的信息。
3.3.1 獲取ServletContext、ServletRequest和ServletResponse對(duì)象
可使用下列方法獲取servlet信息:
●       getContext 此方法可獲取Web應(yīng)用中與當(dāng)前請(qǐng)求相關(guān)聯(lián)的ServletContext對(duì)象。其簽名如下:
public abstract Object getContext()
●      getRequest 此方法可獲取代表當(dāng)前正在處理的請(qǐng)求的ServletRequest對(duì)象。其簽名如下:
public abstract Object getRequest()
●       getResponse 此方法可獲取代表當(dāng)前正在呈現(xiàn)的響應(yīng)的ServletResponse對(duì)象。其簽名如下:
public abstract Object getResponse()
這些方法都是返回一個(gè)java.lang.Object對(duì)象,不是servlet特有的類(lèi)型,這樣就可以使JSF實(shí)現(xiàn)獨(dú)立于其運(yùn)行的環(huán)境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。
3.3.2 獲取ServletContext特性
getApplicationMap方法返回一個(gè)包含ServletContext對(duì)象里全部特性名/值對(duì)的Map對(duì)象。下面是此方法的簽名:
public abstract java.util.Map getApplication()
作為一個(gè)例子,下面的代碼可獲取一個(gè)名叫databaseUtility的特性:
Object contextAttribute = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map contextMap = externalContext.getApplicationMap();
if (contextMap!=null)
contextAttribute = contextMap.get("databaseUtility");
3.3.3 獲取Session對(duì)象及其特性
通過(guò)ExternalContext對(duì)象可訪問(wèn)與當(dāng)前請(qǐng)求相關(guān)聯(lián)的Session對(duì)象。getSession方法可取回當(dāng)前用戶(hù)的 javax.servlet.http.HttpSession對(duì)象,如果當(dāng)前用戶(hù)沒(méi)有相應(yīng)的Session對(duì)象,此方法的行為由傳入的參數(shù)決定:如果為 該方法傳入了一個(gè)true值,它會(huì)創(chuàng)建一個(gè)Session對(duì)象;否則,它會(huì)返回null。下面是getSession方法的簽名:
public abstract Object getSession(boolean create)
此方法其實(shí)是javax.servlet.http.HttpServletRequest接口中g(shù)etSession方法的包裝器。
getSessionMap方法返回一個(gè)包含與當(dāng)前請(qǐng)求相關(guān)聯(lián)的Session對(duì)象里所有特性名/值對(duì)的Map對(duì)象。下面是它的方法簽名:
public abstract java.util.getSessionMap()
要獲取Session對(duì)象里的特性,可調(diào)用Map類(lèi)的get方法,傳入要獲取的特性名即可。文檔中沒(méi)有指明在當(dāng)前請(qǐng)求沒(méi)有相應(yīng)Session對(duì) 象的情況下,此方法是返回null還是一個(gè)空的Map對(duì)象。所以在調(diào)用Map的get方法之前,需要先檢查Map是否為null。下面的代碼是獲取 Session特性的例子:
Object sessionAttribute = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map sessionMap = externalContext.getSessionMap();
if (sessionMap!=null)
sessionAttribute = sessionMap.get(key);
最后一行的key是一個(gè)包含特性名的字符串。
3.3.4 獲取ServletContext對(duì)象的初始參數(shù)
getInitParameter方法是ServletContext對(duì)象的getInitParameter方法的包裝器,用這個(gè)方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始參數(shù)值。此方法的簽名如下:
public abstract String getInitParameter(String parameterName)
舉例來(lái)說(shuō),如果在部署描述符聲明了如下context-init元素:
<context-param>
<param-name>contactPerson</param-name>
<param-value>Scott Jobim</param-value>
</context-param>
下面代碼中的字符串變量initParam的值會(huì)是Scott Jobim。
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String initParam = externalContext.getInitParameter("contactPerson");
getInitParameterMap方法返回一個(gè)包含ServletContext對(duì)象中全部初始參數(shù)的Map對(duì)象。其簽名如下:
public abstract java.util.Map getInitParameterMap()
為了獲取一個(gè)初始參數(shù)的值,使用Map對(duì)象的get方法,同時(shí)傳遞初始參數(shù)的名稱(chēng)。比如,下面的代碼把初始參數(shù)databaseName的值輸出到控制臺(tái)。
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getInitParameterMap();
if (paramMap!=null) {
System.out.println(paramMap.get("databaseName"));
}
3.3.5 獲取Request對(duì)象的特性
getRequestMap方法返回一個(gè)包含當(dāng)前Request對(duì)象中全部特性名/值對(duì)的Map對(duì)象。其方法簽名如下:
public abstract java.util.Map getRequestMap()
作為一個(gè)例子,下面的代碼可用來(lái)提取Request對(duì)象里的特性:
Object requestAttribute = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map requestMap = externalContext.getRequestMap();
if (requestMap!=null)
requestAttribute = requestMap.get(key);
最后一行里的Key是一個(gè)包含要提取的屬性名的字符串。
3.3.6 訪問(wèn)Request對(duì)象里的參數(shù)名和值
getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用來(lái)訪問(wèn)Request對(duì)象里的參數(shù)名和值。
getRequestParameterMap返回一個(gè)包含Request對(duì)象里全部參數(shù)名/值對(duì)的Map對(duì)象。其簽名如下:
public abstract java.util.Map getRequestParameterMap()
作為一個(gè)例子,下面的代碼可用來(lái)提取名為id的請(qǐng)求參數(shù)的值:
String id = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map requestParameterMap = externalContext.getRequestParameterMap();
if (requestParameterMap!=null)
id = (String) requestParameterMap.get("id");
getRequestParameterNames方法返回一個(gè)包含全部請(qǐng)求參數(shù)名的Iterator。此方法其實(shí)是 ServletRequest.getParameterNames方法的包裝器。不同的是,ExternalContext類(lèi)的 getRequestParameterNames返回一個(gè)Iterator,而不是java.util.Enumeration。此方法的簽名如下:
public abstract java.util.Iterator getRequestParameterNames()
作為一個(gè)例子,下面的代碼把所有的請(qǐng)求參數(shù)名/值對(duì)輸出到控制臺(tái)。
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map requestParameterMap = externalContext.getRequestParameterMap();
Iterator parameterNames = externalContext.getRequestParameterNames();
while (parameterNames.hasNext()) {
String parameterName = (String) parameterNames.next();
String parameterValue =
(String) requestParameterMap.get(parameterName);
System.out.println(parameterName + " : " + parameterValue);
}
getRequestParameterValuesMap方法返回一個(gè)包含Request對(duì)象里全部參數(shù)名/值對(duì)的Map對(duì)象。此方法與 getRequestParameterMap方法很相似,但getRequestParameterValuesMap可返回全部相同參數(shù)名的值。在此 方法返回的Map對(duì)象上調(diào)用get(key)方法,這一點(diǎn)等同于獲取當(dāng)前請(qǐng)求的ServletRequest并在其上調(diào)用 getParameterValues(key)。也就是說(shuō),Map對(duì)象返回的是一個(gè)字符串?dāng)?shù)組。 GetRequestParameterValuesMap方法的簽名如下:
public abstract java.util.Map getRequestParameterValuesMap()
下面例子中的代碼把請(qǐng)求參數(shù)id的全部值輸出到控制臺(tái)。
String[] id = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap();
if (requestParameterValuesMap!=null) {
id = (String[]) requestParameterValuesMap.get("id");
// print all values of id
for (int i=0; i<id.length; i++) {
System.out.println(id[i]);
}
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多