如何使用FacesContext類{JSF}

 

(轉)如何使用FacesContext類{JSF}

在Faces API中有兩個類是要經常使用的. 一個是FacesContext 一個是ExternalContext, 本篇文章講解如何使用前者, 在下面的一篇文章中在繼續講解任何使用後者:

對每個JSF請求,FacesServlet對象都會爲其獲取一個javax.faces. context.
FacesContext類的實例。FacesServlet對象將下列3個取自Web容器的對象傳給javax.faces.context.FacesContextFactory對象的getFacesContext方法,以此來做到這一點:

●       javax.servlet.ServletContext
●       javax.servlet.ServletRequest
●       javax.servlet.ServletResponse

這意味着FacesContext的實例裏包含了所有處理JSF請求所需的每個請求的狀態信息。圖3-1展示了FacesContext實例裏封裝的其他一些對象。

3.2.1 獲取當前實例
一個經常用到的方法是靜態的getCurrentInstance方法,它返回當前的FacesContext實例。此方法的簽名如下:
public static FacesContext getCurrentInstance()
下面的代碼是一個用此方法獲取FacesContext當前實例的例子:
FacesContext facesContext = FacesContext.getCurrentInstance();
3.2.2 獲取和修改組件樹
FacesContext實例裏最重要的內容是請求頁面的組件樹。組件樹是由javax.faces.tree.Tree類來表示的(本章後面的“使用Tree類”一節會討論)。FacesContext實例的tree屬性就是Tree對象。
要獲取或修改Tree對象,可使用tree屬性的讀取方法和賦值方法:
public abstract Tree getTree()
public abstract void setTree(Tree tree)
3.2.3 添加和獲取消息
在請求處理生命週期裏,可能會遇到錯誤。比如,當驗證器執行輸入驗證時,因爲用戶輸入了不正確的值,驗證可能失敗;當組件試圖把輸入值轉換爲綁定到組件的模型對象所需的類型時,也可能會失敗。所有消息都必須存放到FacesContext實例裏以備後面進行處理。比如,您可能希望在頁面裏顯示錯誤消息,從而爲用戶更正錯誤提供幫助。
錯誤消息是由javax.faces.application.Message接口(第11章再詳細討論)來表示的,您可以通過使用FacesContext類的addMessage方法向FacesContext實例裏添加Message對象。這個方法的簽名如下:
public abstract void addMessage(UIComponent component, Message message)
如果component不爲空,新加入的message就關聯到component上。否則,它就不與任何特定組件的實例相關。
舉例來說,驗證器在驗證組件值失敗時可調用FacesContext的addMessage方法,傳入值無效的組件及一個包含特定錯誤消息的Message對象。
所有添加到FacesContext實例的Message對象都被加入到一個集合裏。可通過調用getMessages方法的兩個重載方法之一來獲取加入的Message對象:
public abstract Iterator getMessages()
public abstract Iterator getMessages(UIComponent component)
第一種形式的調用在一個Iterator裏返回所有Message對象,而第二種形式的調用則僅返回與給定UIComponent相關聯的Message對象。
3.2.4 添加和獲取請求處理事件
UIComponent可以生成FacesEvent對象。比如,當單擊一個UICommand組件時,它會生成一個ActionEvent對象(ActionEvent類是FacesEvent類的子類)。這個FacesEvent對象需要在FacesContext實例裏保存起來,以備請求處理生命週期裏的下一步處理事件時所用。
可通過使用FacesContext類的addFacesEvent方法向FacesContext實例添加FacesEvent對象。此方法的簽名如下:
public abstract void addFacesEvent(FacesEvent event)
要提取先前添加的FacesEvent對象,可調用getFacesEvents方法,其簽名如下:
public abstract Iterator getFacesEvents()
此方法返回FacesEvent時的順序與其在隊列中的順序一致。
3.2.5 向Response對象裏寫入信息
爲了向Response對象裏寫入信息,FacesContext類提供了兩個屬性,一個是javax.faces.Context.ResponseStream類型,另一個是javax.faces.context.ResponseWriter類型。ResponseStream類型的對象用於輸出二進制數據,而ResponseWriter類型的對象則用於輸出字符。這些屬性的讀取方法和賦值方法如下:
public abstract ResponseStream getResponseStream()
public abstract void setResponseStream(ResponseStream responseStream)
public abstract ResponseWriter getResponseWriter()
public abstract void setResponseWriter(ResponseWriter responseWriter)
3.2.6 獲取和設置地區
第11章將會討論到,JSF支持國際化和本地化。這意味着您可以根據用戶的地區決定發送什麼樣的迴應信息。locale屬性裏存放了當前處理中所用的Locale對象。
初始狀況下,locale屬性的值和網絡瀏覽器裏指定的地區是一樣的,但可以修改這個值,從而發送輸出所使用的地區將獨立於瀏覽器所使用的地區。此屬性的讀取方法和賦值方法如下:
public abstract Locale getLocale()
public abstract void setLocale(Locale locale)
3.2.7 操作請求處理生命週期
FacesContext類還提供了兩個方法與請求處理生命週期進行交互:
●       在當前階段的處理完成後,調用renderResponse方法通知JSF實現把控制權轉到呈現響應階段。也就是說,處於當前階段和呈現響應階段之間的所有其他階段都不再執行。
●       調用responseComplete方法,告訴JSF實現此次請求的HTTP響應已經完成(比如在使用了HTTP重定向的情況下)。因此,當前階段完成後,必須中止請求處理生命週期的處理。
這些方法的簽名如下:
public abstract void renderResponse()
public abstract void responseComplete()
3.2.8 獲取其他請求狀態信息
其他每個請求的狀態信息封裝在ExternalContext對象裏,可以使用getExternalContext方法獲取該對象:

public abstract ExternalContext getExternalContext()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章