在Faces API中有兩個類是要經(jīng)常使用的. 一個是FacesContext 一個是ExternalContext, 本篇文章講解如何使用前者, 在下面的一篇文章中在繼續(xù)講解任何使用后者:
對每個JSF請求,F(xiàn)acesServlet對象都會為其獲取一個javax.faces. context.
FacesContext類的實例。
FacesServlet對象將下列3個取自Web容器的對象傳給javax.faces.context.FacesContextFactory對象的getFacesContext方法,以此來做到這一點:
● javax.servlet.ServletContext
● javax.servlet.ServletRequest
●
javax.servlet.ServletResponse
這意味著FacesContext的實例里包含了所有處理JSF請求所需的每個請求的狀態(tài)信息。
FacesContext實例及其封裝的對象
獲取當(dāng)前實例一個經(jīng)常用到的方法是靜態(tài)的getCurrentInstance方法,它返回當(dāng)前的FacesContext實例。
此方法的簽名如
下:public static FacesContext
getCurrentInstance()
下面的代碼是一個用此方法獲取FacesContext當(dāng)前實例的例子:
FacesContext
facesContext = FacesContext.getCurrentInstance();
獲取和修改組件樹FacesContext實例里最重要的內(nèi)容是請求頁面的組件樹。
組件樹是由javax.faces.tree.Tree類來表示的(本
章后面的“使用Tree類”一節(jié)會討論)。
FacesContext實例的tree屬性就是Tree對象。要獲取或修改Tree對象,可使用tree屬性
的讀取方法和賦值方法:
public abstract Tree getTree()public abstract void
setTree(Tree tree)
添加和獲取消息在請求處理生命周期里,可能會遇到錯誤。比如,當(dāng)驗證器執(zhí)行輸入驗證時,因為用戶輸入了不正確的值,驗證可能失敗;當(dāng)組件試圖把輸入值轉(zhuǎn)換
為綁定到組件的模型對象所需的類型時,也可能會失敗。
所有消息都必須存放到FacesContext實例里以備后面進行處理。比如,您可能希望在頁面里顯
示錯誤消息,從而為用戶更正錯誤提供幫助。
錯誤消息是由javax.faces.application.Message接口(第11章再詳細討論)來表
示的,您可以通過使用FacesContext類的addMessage方法向FacesContext實例里添加Message對象。
這個方法的簽名如
下:public abstract void addMessage(UIComponent component, Message
message)
如果component不為空,新加入的message就關(guān)聯(lián)到component上。否則,它就不與任何特定組件的實例相關(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)用在一個Iterator里返回所有Message對象,
第二種形式的調(diào)用則僅返回與給定UIComponent相
關(guān)聯(lián)的Message對象。
添加和獲取請求處理事件UIComponent可以生成FacesEvent對象。
比如,當(dāng)單擊一個UICommand組件時,它會生成一個
ActionEvent對象(ActionEvent類是FacesEvent類的子類)。
這個FacesEvent對象需要在FacesContext
實例里保存起來,以備請求處理生命周期里的下一步處理事件時所用。
可通過使用FacesContext類的addFacesEvent方法向
FacesContext實例添加FacesEvent對象。
此方法的簽名如下:public abstract void
addFacesEvent(FacesEvent
event)
要提取先前添加的FacesEvent對象,可調(diào)用getFacesEvents方法,
其簽名如下:public abstract
Iterator getFacesEvents()
此方法返回FacesEvent時的順序與其在隊列中的順序一致。
向Response對象里寫入信息為了向Response對象里寫入信息,F(xiàn)acesContext類提供了兩個屬性,
一個是
javax.faces.Context.ResponseStream類型,
另一個是
javax.faces.context.ResponseWriter類型。
ResponseStream類型的對象用于輸出二進制數(shù)據(jù),而
ResponseWriter類型的對象則用于輸出字符。
這些屬性的讀取方法和賦值方法如下:
public abstract
ResponseStream getResponseStream()
public abstract void
setResponseStream(ResponseStream responseStream)
public abstract
ResponseWriter getResponseWriter()
public abstract void
setResponseWriter(ResponseWriter responseWriter)
獲取和設(shè)置地區(qū),JSF支持國際化和本地化。這意味著您可以根據(jù)用戶的地區(qū)決定發(fā)送什么樣的回應(yīng)信息。
locale屬性里存放了當(dāng)前處
理中所用的Locale對象。初始狀況下,locale屬性的值和網(wǎng)絡(luò)瀏覽器里指定的地區(qū)是一樣的,但可以修改這個值,從而發(fā)送輸出所使用的地區(qū)將獨立于
瀏覽器所使用的地區(qū)。
此屬性的讀取方法和賦值方法如下:
public abstract Locale getLocale()
public
abstract void setLocale(Locale locale)
操作請求處理生命周期FacesContext類還提供了兩個方法與請求處理生命周期進行交互:
●
在當(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)完成(比如在使用了HTTP重定向的情況下)。
因此,當(dāng)前階段完成
后,必須中止請求處理生命周期的處理。
這些方法的簽名如下:
public abstract void renderResponse()
public
abstract void responseComplete()
獲取其他請求狀態(tài)信息其他每個請求的狀態(tài)信息封裝在ExternalContext對象里,可以使用getExternalContext方法獲取該對
象:
public abstract ExternalContext
getExternalContext()ExternalContext放在下一節(jié)討論。