jsf2-flash消息在从f:phasestener重定向后不显示



我在理解flash在jsf生命周期中的工作方式时遇到了问题。

我试图通过正常的get请求从阶段侦听器重定向到另一个页面,同时添加一条在新页面上显示的flash消息(当然我已经设置了flah.keepmessage)。但这条信息没有出现。我知道有些地方出了问题,如果有人能帮助实施更好的方法(请不要使用过滤器),我将不胜感激。

phaseRirect1.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;
}
}

phaseRirect2.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>

请纠正我。非常感谢。

在渲染响应阶段,创建flash范围为时已晚。您最晚需要在调用应用程序阶段执行此操作。基本上,这个问题与在<f:event type="preRenderView">中这样做的理由相同,正如在以下相关问题中已经回答的那样:

  • 使用ExternalContext.redirect()将faces消息添加到重定向页面
  • Mojarra 2.1.14闪烁范围消息并重定向到不同路径

在您的特定情况下,您需要一个伪视图参数,以便触发调用操作阶段,然后使用<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");
}

相关内容

  • 没有找到相关文章

最新更新