在Faces API中有兩個類是要常常使用的,一個是FacesContext ;一個是ExternalContext。本篇文章講解如何使用FacesContext。 java
對每一個JSF請求,FacesServlet對象都會爲其獲取一個javax.faces.context.FacesContext類的實例。FacesServlet對象將下列3個取自Web容器的對象傳給javax.faces.context.FacesContextFactory對象的getFacesContext方法,以此來作到這一點: 瀏覽器
● javax.servlet.ServletContex 網絡
t● javax.servlet.ServletRequest app
● javax.servlet.ServletResponse spa
這意味着FacesContext的實例裏包含了全部處理JSF請求所需的每一個請求的狀態信息。圖3-1展現了FacesContext實例裏封裝的其餘一些對象。 component
圖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類來表示的。FacesContext實例的tree屬性就是Tree對象。要獲取或修改Tree對象,可以使用tree屬性的讀取方法和賦值方法:
public abstract Tree getTree()
public abstract void setTree(Tree tree)
3.2.3 添加和獲取消息
在請求處理生命週期裏,可能會遇到錯誤。好比,當驗證器執行輸入驗證時,由於用戶輸入了不正確的值,驗證可能失敗;當組件試圖把輸入值轉換爲綁定到組件的模型對象所需的類型時,也可能會失敗。全部消息都必須存放到FacesContext實例裏以備後面進行處理。好比,您可能但願在頁面裏顯示錯誤消息,從而爲用戶更正錯誤提供幫助。錯誤消息是由javax.faces.application.Message接口來表示的,您能夠經過使用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 獲取和設置地區
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()