如何使用JSF FacesContext
在Faces API中有兩個(gè)類是要經(jīng)常使用的. 一個(gè)是FacesContext 一個(gè)是ExternalContext, 本篇文章講解如何使用前者, 在下面的一篇文章中在繼續(xù)講解任何使用后者:對(duì)每個(gè)JSF請(qǐng)求,F(xiàn)acesServlet對(duì)象都會(huì)為其獲取一個(gè)javax.faces. context. FacesContext類的實(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)信息。
FacesContext實(shí)例及其封裝的對(duì)象
獲取當(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();
獲取和修改組件樹FacesContext實(shí)例里最重要的內(nèi)容是請(qǐng)求頁(yè)面的組件樹。
組件樹是由javax.faces.tree.Tree類來(lái)表示的(本 章后面的“使用Tree類”一節(jié)會(huì)討論)。
FacesContext實(shí)例的tree屬性就是Tree對(duì)象。要獲取或修改Tree對(duì)象,可使用tree屬性 的讀取方法和賦值方法:
public abstract Tree getTree()public abstract void setTree(Tree tree)
添加和獲取消息在請(qǐng)求處理生命周期里,可能會(huì)遇到錯(cuò)誤。比如,當(dāng)驗(yàn)證器執(zhí)行輸入驗(yàn)證時(shí),因?yàn)橛脩糨斎肓瞬徽_的值,驗(yàn)證可能失敗;當(dāng)組件試圖把輸入值轉(zhuǎn)換 為綁定到組件的模型對(duì)象所需的類型時(shí),也可能會(huì)失敗。
所有消息都必須存放到FacesContext實(shí)例里以備后面進(jìn)行處理。比如,您可能希望在頁(yè)面里顯 示錯(cuò)誤消息,從而為用戶更正錯(cuò)誤提供幫助。
錯(cuò)誤消息是由javax.faces.application.Message接口(第11章再詳細(xì)討論)來(lái)表 示的,您可以通過(guò)使用FacesContext類的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ì)象。
添加和獲取請(qǐng)求處理事件UIComponent可以生成FacesEvent對(duì)象。
比如,當(dāng)單擊一個(gè)UICommand組件時(shí),它會(huì)生成一個(gè) ActionEvent對(duì)象(ActionEvent類是FacesEvent類的子類)。
這個(gè)FacesEvent對(duì)象需要在FacesContext 實(shí)例里保存起來(lái),以備請(qǐng)求處理生命周期里的下一步處理事件時(shí)所用。
可通過(guò)使用FacesContext類的addFacesEvent方法向 FacesContext實(shí)例添加FacesEvent對(duì)象。
此方法的簽名如下:public abstract void addFacesEvent(FacesEvent event)
要提取先前添加的FacesEvent對(duì)象,可調(diào)用getFacesEvents方法,
其簽名如下:public abstract Iterator getFacesEvents()
此方法返回FacesEvent時(shí)的順序與其在隊(duì)列中的順序一致。
向Response對(duì)象里寫入信息為了向Response對(duì)象里寫入信息,F(xiàn)acesContext類提供了兩個(gè)屬性,
一個(gè)是 javax.faces.Context.ResponseStream類型,
另一個(gè)是 javax.faces.context.ResponseWriter類型。
ResponseStream類型的對(duì)象用于輸出二進(jìn)制數(shù)據(jù),而 ResponseWriter類型的對(duì)象則用于輸出字符。
這些屬性的讀取方法和賦值方法如下:
public abstract ResponseStream getResponseStream()
public abstract void setResponseStream(ResponseStream responseStream)
public abstract ResponseWriter getResponseWriter()
public abstract void setResponseWriter(ResponseWriter responseWriter)
獲取和設(shè)置地區(qū),JSF支持國(guó)際化和本地化。這意味著您可以根據(jù)用戶的地區(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)
操作請(qǐng)求處理生命周期FacesContext類還提供了兩個(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()
獲取其他請(qǐng)求狀態(tài)信息其他每個(gè)請(qǐng)求的狀態(tài)信息封裝在ExternalContext對(duì)象里,可以使用getExternalContext方法獲取該對(duì) 象:
public abstract ExternalContext getExternalContext()ExternalContext放在下一節(jié)討論。
posted on 2008-05-08 15:21 gembin 閱讀(1308) 評(píng)論(0) 編輯 收藏 所屬分類: JSF