2

我对理解 flash 在 jsf 生命周期中的工作方式有疑问。

我正在尝试通过正常的 get 请求从阶段侦听器重定向到不同的页面,同时添加要在新页面上显示的 flash 消息(当然我已经设置了 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

在渲染响应阶段,创建 Flash 范围为时已晚。您最迟需要在调用应用程序阶段执行此操作。<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 回答