0

私のウェブサイトにAjaxベースのタブ付きインターフェースが欲しいのですが。

また、タブごとにBeanが必要です。これらのBeanは、タブに入るときに「生まれる」、タブを出るときに「死ぬ
」と 予想されます。

重要-タブ間の切り替えは、ページ全体の再描画ではなく、AJAXイベントである必要があります。

この種の動作には適切な範囲だと思い@ViewScopedましたが、タブを離れるときにBeanを強制終了するという問題に悩まされています。私の知る限り、@ViewScopedBeanはリダイレクト/ナビゲーションイベントでのみ死にます。

@ViewScopedBeanを死なせる適切な方法はありますか?別のスコープを使用する必要がありますか?

ありがとう!

アップデート

この質問に対するBalusCの回答を読むことは、良い兆候です。

ビュースコープのBeanは、同じビューを操作している限り存続します(つまり、Beanアクションメソッドでvoidまたはnullを返します)。リンクをクリックするか、別のアクション結果を返すなどして別のビューに移動すると、ビュースコープのBeanはレンダリング応答の終了までに破棄され、次のリクエストで使用できなくなります。

したがって、これによれば、アクションメソッドとは異なる結果を返し、@ViewScopedBeanを死なせることができます。
しかし、これを行うには、アクションメソッド(JSF 2暗黙的ナビゲーション)の結果の後にナビゲーションを無効にする必要があり、それを行う方法がわかりません(またはそれが私の目標を達成するための正しい方法であるかどうか)

4

1 に答える 1

1

単純なPOJOプロパティとして表示するデータを持つViewScopedBeanを1つだけ使用します。ページは怠惰に初期化されます。

@ManagedBean
@ViewScoped
public class BackingBean {

    private WizardData wizardData;

    public WizardData getWizardData() {
        if (wizardData == null) {
            wizardData = new WizardData();
        }
        return wizardData;
    }

    public void setWizardData(WizardData wizardData) {
        this.wizardData = wizardData;
    }
}

public class WizardData {
    private WizardPage1 page1;
    private WizardPage2 page2;

    public WizardPage1 getPage1() {
        if (page1 == null) {
            page1 = new WizardPage1();
        }
        return page1;
    }

    public void setPage1(WizardPage1 page1) {
        this.page1 = page1;
    }

    public WizardPage2 getPage2() {
        if (page2 == null) {
            page2 = new WizardPage2();
        }
        return page2;
    }

    public void setPage2(WizardPage2 page2) {
        this.page2 = page2;
    }
}

したがって、ページでは、pojoを使用するとpojoが作成されます。

<h:outputText value="#{backingBean.wizardData.page1.someTextToShow}"/>
于 2012-04-11T11:07:54.110 に答える