19

ResponseStateManagerメソッドを持つJSFドキュメントを読みましたisPostBack()。のインスタンスをどのように (そしてどこで) 持つことができますResponseStateManagerか?

4

3 に答える 3

44

ポストバック中かどうかを知る方法は?

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();
}
于 2011-03-10T22:04:01.073 に答える
6

実際、jsf1.2 より前は、 isPostBack は FaceContextの現在のインスタンスの requestScopeを通じて取得されていました。

JSF1.2 以降、ResponseStateManager (RenderKit によって提供される、レスポンスの生成に使用される特定のレンダリング テクノロジを認識する StateManager へのヘルパー クラス、シングルトン抽象クラス)。

ライフ サイクルのビューの復元段階で、ViewHandler は ResponseStateManager オブジェクトを取得して、リクエストがポストバックか初期リクエストかをテストします。

リクエストがポストバックの場合、ViewHandler の restoreView メソッドが呼び出されます。このメソッドは、ResponseStateManager オブジェクトを使用してコンポーネント ツリーを再構築し、状態を復元します。ツリーが構築されて状態が復元された後、応答のレンダリング フェーズが再び発生するまで、ViewHandler インスタンスは必要ありません。

上記の記事 (カスタム レンダー キットの作成と使用) は、RenderKit (コンポーネントをレンダリングするタグを実装するタグ ハンドラーによって定義される) を介して ResponseStateManager を実装/取得する方法を示しています。
コンテキストで独自の ResponseStateManager を取得するには、これで十分でしょうか?

于 2009-01-09T07:32:01.680 に答える
2

JSF1.2の場合

public static boolean isPostback(){
    FacesContext context = FacesContext.getCurrentInstance();
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}
于 2011-03-10T21:37:56.773 に答える