質問
ResponseStateManager
には isPostBack()
メソッド。 ResponseStateManager
のインスタンスはどのように(そしてどこで)取得できますか?
解決
ポストバックしているかどうかを知る方法
JSFバージョンに依存。
JSF 1.0 / 1.1には、 ResponseStateManager#isPostback()
メソッドが利用可能です。 ExternalContext#getRequestParameterMap()
。
public static boolean isPostback() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
return externalContext.getRequestParameterMap().contains("javax.faces.ViewState");
}
JSF 1.2では、実際に ResponseStateManager#isPostback()
を使用します。これは、リクエストパラメータマップ内の javax.faces.ViewState
パラメータの存在を実際に確認します。
public static boolean isPostback() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getRenderKit().getResponseStateManager().isPostback(context);
}
JSF 2.0では、代わりに FacesContext#isPostback()
。これは実際には ResponseStateManager#isPostback()
に委任されます。
public static boolean isPostback() {
return FacesContext.getCurrentInstance().isPostback();
}
他のヒント
実際、jsf1.2より前のisPostBackは、現在のインスタンスの requestScopeを通じて取得されました。 FaceContextの。
JSF1.2以降、ResponseStateManager(応答の生成に使用されている特定のレンダリングテクノロジーを知っているStateManagerのヘルパークラス、シングルトン抽象クラス、RenderKitによって販売)
ライフサイクルのビューの復元フェーズでは、 ViewHandlerがResponseStateManagerを取得します。オブジェクトを使用して、リクエストがポストバックまたは初期リクエストであるかどうかをテストします。
リクエストがポストバックの場合、ViewHandlerのtherestoreViewメソッドが呼び出されます。このメソッドは、ResponseStateManagerオブジェクトを使用して、コンポーネントツリーを再構築し、状態を復元します。ツリーが構築され、状態が復元された後、レンダリング応答フェーズが再び発生するまで、ViewHandlerインスタンスは必要ありません。
上記の記事(カスタムレンダーキットの作成と使用)RenderKit(コンポーネントをレンダリングするタグを実装するタグハンドラーで定義)を使用して、ResponseStateManagerを実装/取得する方法を示します。
コンテキストで独自のResponseStateManagerを取得するにはこれで十分ですか?
JSF1.2の場合
public static boolean isPostback(){
FacesContext context = FacesContext.getCurrentInstance();
return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}