0

私のナビケースは以下の通りです。ランディング ページがあり、そこからストア ページに移動できます。このストア ページは、2 つの異なる製品カタログを扱うことができます。これは、特定の Retailer オブジェクトによって制御されます。

ストア ページ以降、セッション中の Retailer に依存する複数の Bean とページがあります。小売業者を切り替えるイベントは、ランディング ページからの新しい選択です。選択範囲でアクションを実行してストア ページに移動するだけで、セッション中の Retailer を制御できました。ただし、これは Bean のアクションで制御する必要があります。

私の問題は、ナビゲーション バーからストア ページへの直接ナビゲーションの場合です。そのため、ストア ページで特定の Retailer を初期化するメカニズムが必要です。そして、これは、このページが依存するすべての Bean で実行する必要があります。これは GET パラメータを介して行う必要があります。preRenderView リスナーで複雑な決定を行うことでこの動作を行うことができますが、これがよりエレガントな方法だとは思いません。

したがって、根本的な問題は、データが複数の Bean (それらのスコープに関係なく) によって管理されているページへの直接ナビゲーションをインターセプトし、これらの Bean がアクションで使用するものをセッションに導入する方法です。

私はこれを試しました(SessionScoped Beanで):

1) @PostConstruct + @ManagedProperty(with param) を使用すると、Bean が SessionScoped であるため、Bean のインスタンス化中にエラーが発生します。

2) viewParam + preRenderView イベントを使用すると、イベントの前にパラメーターが挿入され、目的の動作が得られますが、これはページが読み込まれるたびに発生します。

この初期化を 1 回だけ行い、GET パラメータを使用したいと考えています。

どうすればいいですか?

4

1 に答える 1

1

方法の 1 つは、f:viewParam値がまだの場合にのみジョブを実行することnullです。

public void init() {
    if (value == null) {
        // ...
    }
}

別の方法は、ポストバック以外でのみジョブを実行することです。

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

これは、同じセッション内で新しい GET リクエストが発行されたときにも実行されることに注意してください。通常@ViewScoped、これには Bean を使用して、複数のブラウザー タブ/ウィンドウが互いに干渉するのを防ぎます。

以下も参照してください。

于 2013-01-04T19:03:02.177 に答える