如何使用JSF FacesContext
在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請求所需的每個請求的狀態信息。
FacesContext實例及其封裝的對象
獲取當前實例一個經常用到的方法是靜態的getCurrentInstance方法,它返回當前的FacesContext實例。
此方法的簽名如 下:public static FacesContext getCurrentInstance()
下面的代碼是一個用此方法獲取FacesContext當前實例的例子:
FacesContext facesContext = FacesContext.getCurrentInstance();
獲取和修改組件樹FacesContext實例里最重要的內容是請求頁面的組件樹。
組件樹是由javax.faces.tree.Tree類來表示的(本 章后面的“使用Tree類”一節會討論)。
FacesContext實例的tree屬性就是Tree對象。要獲取或修改Tree對象,可使用tree屬性 的讀取方法和賦值方法:
public abstract Tree getTree()public abstract void setTree(Tree tree)
添加和獲取消息在請求處理生命周期里,可能會遇到錯誤。比如,當驗證器執行輸入驗證時,因為用戶輸入了不正確的值,驗證可能失??;當組件試圖把輸入值轉換 為綁定到組件的模型對象所需的類型時,也可能會失敗。
所有消息都必須存放到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對象。
添加和獲取請求處理事件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時的順序與其在隊列中的順序一致。
向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)
獲取和設置地區,JSF支持國際化和本地化。這意味著您可以根據用戶的地區決定發送什么樣的回應信息。
locale屬性里存放了當前處 理中所用的Locale對象。初始狀況下,locale屬性的值和網絡瀏覽器里指定的地區是一樣的,但可以修改這個值,從而發送輸出所使用的地區將獨立于 瀏覽器所使用的地區。
此屬性的讀取方法和賦值方法如下:
public abstract Locale getLocale()
public abstract void setLocale(Locale locale)
操作請求處理生命周期FacesContext類還提供了兩個方法與請求處理生命周期進行交互:
● 在當前階段的處理完成后,調用renderResponse方法通知JSF實現把控制權轉到呈現響應階段。也就是說,處于當前階段和呈現響應階段之間的所 有其他階段都不再執行。
● 調用responseComplete方法,告訴JSF實現此次請求的HTTP響應已經完成(比如在使用了HTTP重定向的情況下)。
因此,當前階段完成 后,必須中止請求處理生命周期的處理。
這些方法的簽名如下:
public abstract void renderResponse()
public abstract void responseComplete()
獲取其他請求狀態信息其他每個請求的狀態信息封裝在ExternalContext對象里,可以使用getExternalContext方法獲取該對 象:
public abstract ExternalContext getExternalContext()ExternalContext放在下一節討論。
posted on 2008-05-08 15:21 gembin 閱讀(1298) 評論(0) 編輯 收藏 所屬分類: JSF