0

JSF2.0 の新しい ViewScope には次の問題があります。

@PostConstruct メソッドでビュー スコープ Bean として注釈が付けられたクラスがあります。

@ManagedBean(name = "userListController")
@ViewScoped
public class UserListController {

    private String text = "myText";

    @PostConstruct
    public void init() {
       System.out.println("init") ;
    }
}

メイン ページ (/pages/main.xhtml) には、UserListController Bean のプロパティ「テキスト」を出力する 2 番目のページ (/pages/user/list.xhtml) に移動するためのボタンがあります。

ボタンは次のとおりです。

<h:commandButton value="Manage Users" action="gotoUsers"/>

faces-config.xml のナビゲーション ケースは次のとおりです。

<navigation-rule>
    <from-view-id>/pages/main.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>gotoUsers</from-outcome>
        <to-view-id>/pages/user/list.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

Firefox/Chrome を使用してボタンをクリックすると、 @ViewScoped Bean の @PostConstruct メソッドが 2 回呼び出されるのに対し、IE8 を使用するとメソッドは 1 回だけ呼び出されます。

私が見る単純なフェーズトラッカーで(FF / Chromeの例で):

DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - AFTER - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - BEFORE - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - AFTER - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - BEFORE - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - AFTER - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - BEFORE - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - AFTER - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6

私は何か間違ったことをしていますか?

このフォーラムから、コンポーネント バインディングが含まれている場合に ViewScope にバグがあることがわかりますが、私の Bean は実際には文字列にすぎません (もちろん、問題は非常に複雑な例に由来します。 @PostConstruct メソッドですが、例を最小限に抑えようとしました)

4

1 に答える 1

0

まず第一に、ナビゲーション ルールは JSF 2.0 ではオプションです。現在取り組んでいるかなり大きなプロジェクトがあり、それらを使用していません。これがあなたのために何をするか見てください。

<h:commandButton value="Manage Users" action="list?faces-redirect=true"/>

これは、ナビゲーションを行う方法、または単にメソッドが文字列として返す方法です。

<h:commandButton value="Manage Users" action="#{backingBean.doList}"/>


  public String doList() {
 return "list?faces-redirect=true";
}

JSF のナビゲーション ルールには、多くの要望が残されています。本当に制御が必要な場合は、Spring Web Flow を調べてください。これは JSF との統合です。

于 2011-04-21T03:31:41.083 に答える