通过JSF </h:message>中的<h:message>重定向演示后保留FacesMessage

时间:2011-02-28 02:12:17

标签: java jsf redirect jsf-2

我认为这是一个常见问题:某些托管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吗?或者是否有其他标准解决方案?

2 个答案:

答案 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" />