2

Primefaces 3.4.1、Jboss AS 7.1、および MyFaces CODI を使用してアプリケーションを作成しています。私が得た問題は、CODI が提供する会話スコープを使用していて、会話が終了したらブラウザーの [戻る] ボタンを処理する方法が必要なことです。

より正確には、会話が終了し、ユーザーが別のページにいるとき (ウィザードが終了してデータベースにコミットするようなものだと考えてください)、戻るボタンが押された場合、次の例外を受け取ります。

javax.ejb.EJBTransactionRolledbackException

理想的には、会話が終了したので、これを別のページ (メニュー、ダッシュボード) にリダイレクトしたいと考えています。

これは JSF 2.0 ナビゲーション ルールで実行できますか?

編集:

次のようなナビゲーション ルールを作成しました。

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>outcome1</from-outcome>
            <to-view-id>/page2.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
        <navigation-case>
            <from-outcome>*</from-outcome>
            <to-view-id>/dashboard.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
</navigation-rule>

戻るボタンを押すと、dashboard.xhtml にリダイレクトされることを期待しています。押すと、バックエンドで別のアクションが発生すると想定しました。明らかに私は間違っていると思いました。これらのケースを使用して bakc ボタンによって送信されたものをキャッチする方法はありますか? もしかしてタグ付き?

更新 1:

どうやらブラウザの戻るボタンは JSF ナビゲーション ケースをトリガーしません。それが何を引き起こすかは明らかですか?次のフィルターを実装しました: https://stackoverflow.com/a/10305799/1611957今何がトリガーされますか? それはそれを捕まえる仕事をより簡単にしますか?

4

3 に答える 3

4

私は最終的に問題を解決することができました。他の人にとっては役立つかもしれません:

最初に行うことは、ページをキャッシュしていないことを確認することです。ここで説明されているフィルターを使用してそれを行うことができます。

https://stackoverflow.com/a/10305799/1611957

その後、ページがレンダリングされることがわかるので、会話 Bean が正しくインスタンス化されているかどうかをレンダリングする前にチェックする必要があります。このようなチェックを行う方法は、次のとおりです。

https://stackoverflow.com/a/7294707/1611957

私が使用したコードは、この質問で BalusC によって投稿されたコードに似ています。

<f:metadata>
    <f:event type="preRenderView" listener="#{authenticator.check}" />
</f:metadata>

Java コードの場合:

public void check() {
    if (someCondition) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        NavigationHandler navigationHandler =
            facesContext.getApplication().getNavigationHandler();
        navigationHandler.handleNavigation(facesContext, null, "outcome");
    }
}

これで、「結果」の JSF ナビゲーション ルールをディスパッチします。

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>outcome</from-outcome>
        <to-view-id>/defaultPage.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

これが、JSF2 で戻るボタンを適切に処理する方法です。

于 2012-10-26T12:51:26.540 に答える
1

これには @ConversationRequired を使用しています。

于 2012-10-28T20:09:26.887 に答える