版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第1章 JSF Faces API中的FacesContext和ExternalContext關(guān)鍵字: facescontext和externalcontext 在Faces API中有兩個類是要經(jīng)常使用的. 一個是FacesContext 一個是ExternalContext.首先講解如何使用FacesContext . 對每個JSF請求,F(xiàn)acesServlet對象都會為其獲取一個javax.faces. context. FacesContext類的實例。FacesServlet對象將下列3個取自Web容器的對象傳給javax.faces.context.FacesContextFact
2、ory對象的getFacesContext方法,以此來做到這一點(diǎn): javax.servlet.ServletContext javax.servlet.ServletRequest javax.servlet.ServletResponse 這意味著FacesContext的實例里包含了所有處理JSF請求所需的每個請求的狀態(tài)信息。圖3-1展示了FacesContext實例里
3、封裝的其他一些對象。 3.2.1 獲取當(dāng)前實例 一個經(jīng)常用到的方法是靜態(tài)的getCurrentInstance方法,它返回當(dāng)前的FacesContext實例。此方法的簽名如下: public static FacesContext getCurrentInstance() 下面的代碼是一個用此方法獲取FacesContext當(dāng)前實例的例子: FacesContext facesContext = FacesContext.getCurrentInstance(); 3.2.2 獲取和修改組件樹 FacesContext實例里最重要的內(nèi)容是請求頁面的組件樹。組件樹是由ja
4、vax.faces.tree.Tree類來表示的(本章后面的“使用Tree類”一節(jié)會討論)。FacesContext實例的tree屬性就是Tree對象。 要獲取或修改Tree對象,可使用tree屬性的讀取方法和賦值方法: public abstract Tree getTree() public abstract void setTree(Tree tree) 3.2.3 添加和獲取消息 在 請求處理生命周期里,可能會遇到錯誤。比如,當(dāng)驗證器執(zhí)行輸入驗證時,因為用戶輸入了不正確的值,驗證可能失敗;當(dāng)組件試圖把輸入值轉(zhuǎn)換為綁定到組件的模 型對象所需的類型時,也可能會失敗。所有消息都必
5、須存放到FacesContext實例里以備后面進(jìn)行處理。比如,您可能希望在頁面里顯示錯誤消息,從而 為用戶更正錯誤提供幫助。 錯誤消息是由javax.faces.application.Message接口(第11章再詳細(xì)討論)來表示的,您可以通過使用FacesContext類的addMessage方法向FacesContext實例里添加Message對象。這個方法的簽名如下: public abstract void addMessage(UIComponent component, Message message) 如果component不為空,新加入的message就關(guān)聯(lián)到componen
6、t上。否則,它就不與任何特定組件的實例相關(guān)。 舉例來說,驗證器在驗證組件值失敗時可調(diào)用FacesContext的addMessage方法,傳入值無效的組件及一個包含特定錯誤消息的Message對象。 所有添加到FacesContext實例的Message對象都被加入到一個集合里??赏ㄟ^調(diào)用getMessages方法的兩個重載方法之一來獲取加入的Message對象: public abstract Iterator getMessages() public abstract Iterator getMessages(UIComponent component) 第一種形式的調(diào)用在一個Iterat
7、or里返回所有Message對象,而第二種形式的調(diào)用則僅返回與給定UIComponent相關(guān)聯(lián)的Message對象。 3.2.4 添加和獲取請求處理事件 UIComponent 可以生成FacesEvent對象。比如,當(dāng)單擊一個UICommand組件時,它會生成一個ActionEvent對象(ActionEvent類是 FacesEvent類的子類)。這個FacesEvent對象需要在FacesContext實例里保存起來,以備請求處理生命周期里的下一步處理事件 時所用。 可通過使用FacesContext類的addFacesEvent方法向FacesContext實例添加Face
8、sEvent對象。此方法的簽名如下: public abstract void addFacesEvent(FacesEvent event) 要提取先前添加的FacesEvent對象,可調(diào)用getFacesEvents方法,其簽名如下: public abstract Iterator getFacesEvents() 此方法返回FacesEvent時的順序與其在隊列中的順序一致。 3.2.5 向Response對象里寫入信息 為 了向Response對象里寫入信息,F(xiàn)acesContext類提供了兩個屬性,一個是 javax.faces.Context.ResponseStre
9、am類型,另一個是 javax.faces.context.ResponseWriter類型。ResponseStream類型的對象用于輸出二進(jìn)制數(shù)據(jù),而 ResponseWriter類型的對象則用于輸出字符。這些屬性的讀取方法和賦值方法如下: public abstract ResponseStream getResponseStream() public abstract void setResponseStream(ResponseStream responseStream) public abstract ResponseWriter getResponseWriter() publi
10、c abstract void setResponseWriter(ResponseWriter responseWriter) 3.2.6 獲取和設(shè)置地區(qū) 第11章將會討論到,JSF支持國際化和本地化。這意味著您可以根據(jù)用戶的地區(qū)決定發(fā)送什么樣的回應(yīng)信息。locale屬性里存放了當(dāng)前處理中所用的Locale對象。 初始狀況下,locale屬性的值和網(wǎng)絡(luò)瀏覽器里指定的地區(qū)是一樣的,但可以修改這個值,從而發(fā)送輸出所使用的地區(qū)將獨(dú)立于瀏覽器所使用的地區(qū)。此屬性的讀取方法和賦值方法如下: public abstract Locale getLocale() public abstract
11、 void setLocale(Locale locale) 3.2.7 操作請求處理生命周期 FacesContext類還提供了兩個方法與請求處理生命周期進(jìn)行交互: 在當(dāng)前階段的處理完成后,調(diào)用renderResponse方法通知JSF實現(xiàn)把控制權(quán)轉(zhuǎn)到呈現(xiàn)響應(yīng)階段。也就是說,處于當(dāng)前階段和呈現(xiàn)響應(yīng)階段之間的所有其他階段都不再執(zhí)行。 調(diào)用responseComplete方法,告訴JSF實現(xiàn)此次請求的HTTP響應(yīng)已經(jīng)完成(比如在使用了HT
12、TP重定向的情況下)。因此,當(dāng)前階段完成后,必須中止請求處理生命周期的處理。 這些方法的簽名如下: public abstract void renderResponse() public abstract void responseComplete() 3.2.8 獲取其他請求狀態(tài)信息 其他每個請求的狀態(tài)信息封裝在ExternalContext對象里,可以使用getExternalContext方法獲取該對象: public abstract ExternalContext getExternalContext() 現(xiàn)在講解ExternalContext。 使 用External
13、Context類提供的方法可以獲取ServletContext、ServletRequest和ServletResponse對 象,構(gòu)造FacesContext實例時需要這些對象。除此之外,ExternalContext實例提供了包裝器方法,可以使用這些方法獲得原來需要從 ServletContext、ServletRequest及ServletResponse對象上調(diào)用一些方法獲得的信息。 3.3.1 獲取ServletContext、ServletRequest和ServletResponse對象 可使用下列方法獲取servlet信息:
14、160; getContext 此方法可獲取Web應(yīng)用中與當(dāng)前請求相關(guān)聯(lián)的ServletContext對象。其簽名如下: public abstract Object getContext() getRequest 此方法可獲取代表當(dāng)前正在處理的請求的ServletRequest對象。其簽名如下: public abstract Object getRequest() getResponse 此方法可獲取代表當(dāng)前正在呈現(xiàn)的響應(yīng)的Serv
15、letResponse對象。其簽名如下: public abstract Object getResponse() 這些方法都是返回一個java.lang.Object對象,不是servlet特有的類型,這樣就可以使JSF實現(xiàn)獨(dú)立于其運(yùn)行的環(huán)境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。 3.3.2 獲取ServletContext特性 getApplicationMap方法返回一個包含ServletContext對象里全部特性名/值對的Map對象。下面是此方法的簽名: public abstract java.util.Map getApplicat
16、ion() 作為一個例子,下面的代碼可獲取一個名叫databaseUtility的特性: Object contextAttribute = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map contextMap = externalContext.getApplicationMap(); if (contextMap!=null) contextAttribut
17、e = contextMap.get("databaseUtility"); 3.3.3 獲取Session對象及其特性 通 過ExternalContext對象可訪問與當(dāng)前請求相關(guān)聯(lián)的Session對象。getSession方法可取回當(dāng)前用戶的 javax.servlet.http.HttpSession對象,如果當(dāng)前用戶沒有相應(yīng)的Session對象,此方法的行為由傳入的參數(shù)決定:如果為 該方法傳入了一個true值,它會創(chuàng)建一個Session對象;否則,它會返回null。下面是getSession方法的簽名: public abstract Object ge
18、tSession(boolean create) 此方法其實是javax.servlet.http.HttpServletRequest接口中g(shù)etSession方法的包裝器。 getSessionMap方法返回一個包含與當(dāng)前請求相關(guān)聯(lián)的Session對象里所有特性名/值對的Map對象。下面是它的方法簽名: public abstract java.util.getSessionMap() 要 獲取Session對象里的特性,可調(diào)用Map類的get方法,傳入要獲取的特性名即可。文檔中沒有指明在當(dāng)前請求沒有相應(yīng)Session對象的情況下, 此方法是返回null還是一個空的Map對象。所以在調(diào)用M
19、ap的get方法之前,需要先檢查Map是否為null。下面的代碼是獲取Session特性 的例子: Object sessionAttribute = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map sessionMap = externalContext.getSessionMap(); if (sessionMap!=null) sessionAttribu
20、te = sessionMap.get(key); 最后一行的key是一個包含特性名的字符串。 3.3.4 獲取ServletContext對象的初始參數(shù) getInitParameter方法是ServletContext對象的getInitParameter方法的包裝器,用這個方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始參數(shù)值。此方法的簽名如下: public abstract String getInitParameter(String parameterName) 舉例來說,如果在部署描述符聲明了如下context-init元素:
21、<context-param> <param-name>contactPerson</param-name> <param-value>Scott Jobim</param-value> </context-param> 下面代碼中的字符串變量initParam的值會是Scott Jobim。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExt
22、ernalContext(); String initParam = externalContext.getInitParameter("contactPerson"); getInitParameterMap方法返回一個包含ServletContext對象中全部初始參數(shù)的Map對象。其簽名如下: public abstract java.util.Map getInitParameterMap() 為了獲取一個初始參數(shù)的值,使用Map對象的get方法,同時傳遞初始參數(shù)的名稱。比如,下面的代碼把初始參數(shù)databaseName的值輸出到控制臺。 FacesContext f
23、acesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map paramMap = externalContext.getInitParameterMap(); if (paramMap!=null) System.out.println(paramMap.get("databaseName"); 3.3.5 獲取Request對象的特性 getRequestMap方法返回一個包含當(dāng)
24、前Request對象中全部特性名/值對的Map對象。其方法簽名如下: public abstract java.util.Map getRequestMap() 作為一個例子,下面的代碼可用來提取Request對象里的特性: Object requestAttribute = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestMap = extern
25、alContext.getRequestMap(); if (requestMap!=null) requestAttribute = requestMap.get(key); 最后一行里的Key是一個包含要提取的屬性名的字符串。 3.3.6 訪問Request對象里的參數(shù)名和值 getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用來訪問Request對象里的參數(shù)名和值。 getRequestParameterMap返回一個包含Request對象里全部參數(shù)名/值對的Map對象
26、。其簽名如下: public abstract java.util.Map getRequestParameterMap() 作為一個例子,下面的代碼可用來提取名為id的請求參數(shù)的值: String id = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestParameterMap = externalContext.getRequestParam
27、eterMap(); if (requestParameterMap!=null) id = (String) requestParameterMap.get("id"); getRequestParameterNames 方法返回一個包含全部請求參數(shù)名的Iterator。此方法其實是ServletRequest.getParameterNames方法的包裝器。不同 的是,ExternalContext類的getRequestParameterNames返回一個Iterator,而不是 java.util.Enumeration。此方法的簽名如下: public abstr
28、act java.util.Iterator getRequestParameterNames() 作為一個例子,下面的代碼把所有的請求參數(shù)名/值對輸出到控制臺。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestParameterMap = externalContext.getRequestParameterMap(); Iterator parameter
29、Names = externalContext.getRequestParameterNames(); while (parameterNames.hasNext() String parameterName = (String) parameterNames.next(); String parameterValue = (String) requestParameterMap.get(parameterName); System.out.println(parameterName + " : " + parameterValue); getRequestParamete
30、rValuesMap 方法返回一個包含Request對象里全部參數(shù)名/值對的Map對象。此方法與getRequestParameterMap方法很相似,但 getRequestParameterValuesMap可返回全部相同參數(shù)名的值。在此方法返回的Map對象上調(diào)用get(key)方法,這一點(diǎn)等同 于獲取當(dāng)前請求的ServletRequest并在其上調(diào)用getParameterValues(key)。也就是說,Map對象返回的是一個字符串?dāng)?shù) 組。GetRequestParameterValuesMap方法的簽名如下: public abstract java.util.Map getRequ
31、estParameterValuesMap() 下面例子中的代碼把請求參數(shù)id的全部值輸出到控制臺。 String id = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap(); if (requestParamete
32、rValuesMap!=null) id = (String) requestParameterValuesMap.get("id"); / print all values of id for (int i=0; i<id.length; i+) System.out.println(idi); 3.3.7 獲取請求頭的名和值 getRequestHeaderMap方法返回一個包含當(dāng)前請求中全部頭名/值對的Map對象。其方法簽名如下: public abstract java.util.Map getRequestHeaderMap() 舉個例子來說,下
33、面的代碼提取host頭的值: String host = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map headerMap = externalContext.getRequestHeaderMap(); if (headerMap!=null) host = (String) headerMap.get("host"); System.o
34、ut.println(host); 注意: 報頭的名稱是不區(qū)分大小寫的。比如,對getRequestHeaderMap返回的Map對象分別用host、Host和Host作為參數(shù)來調(diào)用get方法,其結(jié)果是一樣的。 getRequestHeaderValuesMap方法與getRequestHeaderMap方法相似。但在getRequestHeader ValuesMap方法返回的Map對象上調(diào)用get方法會得到一個字符串的數(shù)組。getRequestHeaderValuesMap方法的簽名如下: public abstract java.util.Map getRequestHeaderValu
35、esMap() 在getRequestHeaderValuesMap方法返回的Map對象上調(diào)用get方法會返回一個java.util.Enumeration值。 下面的代碼使用getRequestHeaderValuesMap方法來獲取一個包含全部頭名/值對的Map對象,然后在此Map對象上調(diào)用get方法以獲取全部Accept-Encoding頭的值,并將結(jié)果輸出到控制臺。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.g
36、etExternalContext(); Map headerValuesMap = externalContext.getRequestHeaderValuesMap(); if (headerValuesMap!=null) Enumeration headers = (Enumeration) headerValuesMap.get("Accept-Encoding"); while (headers.hasMoreElements() String value = (String) headers.nextElement(); System.out.println(
37、value); 3.3.8 獲取Cookie getRequestCookies方法是HttpServletRequest.getCookies方法的包裝器,它返回一個javax.servlet.http.Cookie對象的數(shù)組,數(shù)組中是當(dāng)前Request對象里的全部Cookie。此方法的簽名如下: public abstract Cookie getRequestCookies() 例如,下面的代碼取得當(dāng)前請求中的全部Cookie對象,然后在結(jié)果數(shù)組上循環(huán),輸出全部Cookie的名和值。 FacesContext facesContext = FacesContext.getCu
38、rrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Cookie cookies = externalContext.getRequestCookies(); for (int i=0; i<cookies.length; i+) Cookie cookie = cookiesi; String cookieName = cookie.getName(); String cookieValue = cookie.getValue(); System.out.printl
39、n(cookieName + " : " + cookieValue); getRequestCookieMap 方法返回一個包含當(dāng)前請求中全部Cookie的、以Cookie的名稱作為鍵的Map對象。在此Map對象上調(diào)用get方法會返回一個 javax.servlet.http.Cookie對象。GetRequestCookieMap方法的簽名如下: public abstract java.util.Map getRequestCookieMap() 例如,下面的代碼取得名為password的Cookie對象并將其值輸出到控制臺。 FacesContext facesCo
40、ntext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map cookieMap = externalContext.getRequestCookieMap(); if (cookieMap!=null) Cookie cookie = (Cookie) cookieMap.get("password"); if (cookie!=null) System.out.println("Value:&
41、quot; + cookie.getValue(); 注意: Cookie名稱區(qū)分大小寫。 3.3.9 獲取場所 getRequestLocale方法是ServletRequest.getLocale方法的包裝器,它返回Request對象中的Locale對象。此方法的簽名如下: public abstract java.util.Locale getRequestLocale() 例如,下面的代碼取回用戶的場所并輸出該場所的顯示語言和顯示國家。 FacesContext facesContext = FacesContext.getCurrentInstance(); Extern
42、alContext externalContext = facesContext.getExternalContext(); Locale locale = externalContext.getRequestLocale(); System.out.println("Language:" + locale.getDisplayLanguage(); System.out.println("Country:" + locale.getDisplayCountry(); 3.3.10 獲取上下文路徑 getRequestContextPath是
43、HttpServletRequest.getContextPath方法的包裝器,它返回請求URI中指明請求上下文的上下文路徑部分。其方法簽名如下: public abstract String getRequestContextPath() 下面的代碼段把請求URI的上下文路徑輸出到控制臺: FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); System.out.println(&q
44、uot;Context path:" + externalContext.getRequestContextPath(); 對于URL http:/localhost:8080/JSFCh03/faces/test.jsp來說,getRequestContextPath方法的返回值為/JSFCh03。 getRequestPathInfo 方法是HttpServletRequest.getPathInfo方法的包裝器,它返回當(dāng)客戶端進(jìn)行請求時與客戶端發(fā)送的URL相關(guān)聯(lián)的額外路徑信 息。這部分信息跟在servlet路徑信息的后面,但在查詢字符串之前。getRequestPathInfo
45、方法的簽名如下: public abstract String getRequestPathInfo() 例如,下面代碼輸出請求URL的路徑信息。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); System.out.println("Path info:" + externalContext.getRequestPathInfo(); 對于URL http:/
46、localhost:8080/JSFCh03/faces/test.jsp而言,getRequestPathInfo方法的返回值為test.jsp。 3.3.11 獲取資源路徑 getResourcePaths 方法是ServletContext類的getResourcePaths方法的包裝器,它返回一個Set對象,其中包含Web應(yīng)用中最長子路徑與傳入的 路徑參數(shù)相匹配的資源路徑。表示子目錄的路徑以“/”結(jié)束。返回的路徑是相對于Web應(yīng)用根路徑的相對路徑,并以“/”開始。此方法的簽名如下: public abstract java.util.Set getResourcePaths
47、(String path) 比如,考慮如下代碼: FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Set resourcePaths = externalContext.getResourcePaths("/"); Iterator iterator = resourcePaths.iterator(); while (iterator.hasNext() St
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京工業(yè)大學(xué)浦江學(xué)院《設(shè)計符號學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 分式的運(yùn)算說課稿
- 蹲距式跳遠(yuǎn)說課稿
- 災(zāi)后重建(合江小學(xué)南天校區(qū))工程施工組織設(shè)計
- 《漁舟唱晚》說課稿
- 《西風(fēng)的話》說課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《當(dāng)代中國政府與政治》2021-2022學(xué)年第一學(xué)期期末試卷
- 科研合同范本(2篇)
- 南京工業(yè)大學(xué)《新能源技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 不孕不育課件教學(xué)課件
- SAP項目實施服務(wù)合同(2024版)
- 集體榮譽(yù)感主題教育班會
- HG-T 2006-2022 熱固性和熱塑性粉末涂料
- 金融調(diào)解中心可行性報告
- 2024年全國初中數(shù)學(xué)競賽試題含答案
- 醫(yī)學(xué)檢驗技術(shù)生涯規(guī)劃報告
- 2024陜西榆林能源集團(tuán)橫山煤電限公司招聘46人公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 2024年大學(xué)試題(管理類)-應(yīng)急管理筆試參考題庫含答案
- 學(xué)校中層干部管理培訓(xùn)
- 大中小思政課一體化建設(shè)的理念與路徑
- 安全使用家用電器教案活動
評論
0/150
提交評論