如何使用FacesContext類

      在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()

相關文章
相關標籤/搜索