我在理解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");
}