我认为这是一个常见问题:某些托管bean有一个操作可以向上下文添加一些消息:
FacesMessage fm = new FacesMessage("didn't work");
fm.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, fm);
return "some-outcome";
然后我在faces-config.xml
中映射结果并将其配置为
<navigation-case>
<from-outcome>some-outcome</from-outcome>
<to-view-id>/view.xhtml</to-view-id>
<redirect/>
</navigation-case>
在view.xhtml
中,我提供了以下信息:
<h:message globalsOnly="true" />
但是,它不起作用,因为执行重定向时消息会丢失。
我该如何解决?我发现这个amazing post解释了如何使用PhaseListener
来解决这个问题,但我相信这种情况太常见了,不能用这种方式来解决。我错了吗?我应该创建PhaseListener
吗?或者是否有其他标准解决方案?
答案 0 :(得分:6)
BalusC像往常一样给出了很好的答案!
我只想添加,当我使用他的代码来设置keepMessages属性时,它没有为会话设置,而是仅针对此请求(尽管它在Javadocs中说的是什么)。
我在header.xhtml中添加了以下代码
<c:set target="#{flash}" property="keepMessages" value="true" />
现在它可以在每个页面上运行,而不必每次在支持bean中需要它时都设置它。
你需要JSTL,不要忘记将以下内容放在你的xhtml标题中:
xmlns:c="http://java.sun.com/jsp/jstl/core"
答案 1 :(得分:2)
JSF 2.2
进入bean:
FacesContext facesContext = FacesContext.getCurrentInstance();
Flash flash = facesContext.getExternalContext().getFlash();
flash.setKeepMessages(true);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "yourMessage", null));
return "namePage?faces-redirect=true";
进入namePage
更改
<h:message globalsOnly="true" />
到
<h:messages globalsOnly="true" />