ResponseStateManager
メソッドを持つJSFドキュメントを読みましたisPostBack()
。のインスタンスをどのように (そしてどこで) 持つことができますResponseStateManager
か?
3 に答える
ポストバック中かどうかを知る方法は?
JSF のバージョンに依存します。
JSF 1.0/1.1 では、ResponseStateManager#isPostback()
使用できるメソッドはありません。javax.faces.ViewState
パラメータが で利用可能なリクエスト パラメータ マップに存在するかどうかを確認します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 は FaceContextの現在のインスタンスの requestScopeを通じて取得されていました。
JSF1.2 以降、ResponseStateManager (RenderKit によって提供される、レスポンスの生成に使用される特定のレンダリング テクノロジを認識する StateManager へのヘルパー クラス、シングルトン抽象クラス)。
ライフ サイクルのビューの復元段階で、ViewHandler は ResponseStateManager オブジェクトを取得して、リクエストがポストバックか初期リクエストかをテストします。
リクエストがポストバックの場合、ViewHandler の restoreView メソッドが呼び出されます。このメソッドは、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);
}