2

jsfライフサイクルでフラッシュがどのように機能するかを理解するのに問題があります。

通常のgetリクエストを介してフェーズリスナーから別のページにリダイレクトしようとしていますが、同時に新しいページに表示されるようにフラッシュメッセージ(もちろんflah.keepmessageを設定しています)を追加しています。しかし、メッセージは表示されません。私は何かが間違っていることを知っています、そして誰かが親切にもっと良い方法を実装するのを手伝ってくれるなら(フィルターなしでお願いします)感謝するでしょう。

phaseredirect1.html

    <h:body>
    <f:view>
        <f:phaseListener binding="#{testphase.testPL}"/>
        <div>Testing Phases Redirect 1</div>
    </f:view>
    </h:body>

TestPhaseRedirect.java

   @SessionScoped
   @ManagedBean(name="testphase")
   public class TestPhaseRedirect {
   private PhaseListener testPL;

   @PostConstruct
   private void initializeVar(){
    testPL = new PhaseListener() {
        @Override
        public void afterPhase(PhaseEvent event) {
        }
        @Override
        public void beforePhase(PhaseEvent event) {
            getFacesContext().addMessage(null, new FacesMessage("Faces Message: redirecting to page 2..."));
            getExternalContext().getFlash().setKeepMessages(true);
            ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)getFacesContext().getApplication().getNavigationHandler();
            nav.performNavigation("redirect-to-page2");
            getFacesContext().responseComplete();
            return;
        }
        @Override
        public PhaseId getPhaseId() {
            return PhaseId.RENDER_RESPONSE;
        }
    };
}    
public PhaseListener getTestPL() {
    return testPL;
}
}

phaseredirect2.html

    <h:body>
    <f:view>
        <div style="width:400px;">
            <p:messages autoUpdate="true" closable="true"/>
            <p>Testing Phases Redirect 2</p>
            <p> Did it display the message? </p>
        </div>
    </f:view>
    </h:body>

設定に直面

    <navigation-case>
        <from-outcome>redirect-to-page2</from-outcome>
        <to-view-id>/phaseredirect2.html</to-view-id>
        <redirect />
    </navigation-case>

親切に訂正してください。どうもありがとう。

4

1 に答える 1

2

レンダリング応答フェーズでは、フラッシュスコープを作成するには遅すぎます。遅くとも、アプリケーションの呼び出しフェーズで実行する必要があります。<f:event type="preRenderView">基本的に、この問題には、次の関連する質問ですでに回答されているように、でそうする場合と同じ理由があります。

特定のケースでは、アクションの呼び出しフェーズがトリガー<f:event type="postInvokeAction">されてから(カスタムイベントを自分で作成した後、または上記のリンクされた質問の回答に従ってOmniFacesをインストールした後)を使用するために、ダミーのビューパラメーターが必要です。

<f:metadata>
    <f:viewParam name="dummy" />
    <f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>

public void init() {
    FacesContext context = FacesContext.getCurrentInstance();
    context.addMessage(null, new FacesMessage("Faces Message: redirecting to page 2..."));
    context.getExternalContext().getFlash().setKeepMessages(true);
    ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)  context.getApplication().getNavigationHandler();
    nav.performNavigation("redirect-to-page2");
}

またはOmniFacesを選択した場合

public void init() {
    Messages.addFlashGlobalInfo("Faces Message: redirecting to page 2...");
    Faces.navigate("redirect-to-page2");
}
于 2013-02-06T16:29:54.260 に答える