Redirect JSF-从@PostConstruct重定向后保留Faces消息
我有一个page1按钮,导航到page2,第2页添加一些消息并导航回page1。我想在第1页显示这些消息。我尝试过很多解决方案,但都不管用 示例代码page1.xhtml:Redirect JSF-从@PostConstruct重定向后保留Faces消息,redirect,jsf-2,java-ee-6,omnifaces,Redirect,Jsf 2,Java Ee 6,Omnifaces,我有一个page1按钮,导航到page2,第2页添加一些消息并导航回page1。我想在第1页显示这些消息。我尝试过很多解决方案,但都不管用 示例代码page1.xhtml: <p:commandButton value="edit" action="#{bean1.edit}"/> 第2页托管bean @PostConstruct private void postConstruct() { Faces.getFlash().setKeepMessages(true); M
<p:commandButton value="edit" action="#{bean1.edit}"/>
第2页托管bean
@PostConstruct
private void postConstruct() {
Faces.getFlash().setKeepMessages(true);
Messages.addFlashGlobalError("cannot edit!");
Faces.navigate("page1?faces-redirect=true");
}
两个bean都是视图范围,两个页面的正文末尾都有
。首先,我不完全确定@PostConstruct
是否是执行重定向的最佳位置。看见尽管如此,谷歌还是出现了,而且看起来很合理。尝试在靠近页面顶部的preRender
事件标记的facelets页面内重定向。干杯就用它吧。这肯定会奏效。检查以下代码。
公共字符串重定向()引发异常
{
FacesContext.getCurrentInstance().addMessage(“Msg1”,新的FacesMessage(“消息1是”);
//FacesContext.getCurrentInstance().getExternalContext().redirect(“/Sam/page2.jsf”);
返回“第2页”;
}如果调用
@PostConstruct
太晚,可能会发生这种情况。显然,bean是被引用的,因此第一次在视图中相对“晚”地构造(例如,在最底层)。此时,响应可能已经提交,这是一个无法返回的点。您无法再导航到其他视图
基本上,您希望在呈现响应之前调用init()
方法。对于OmniFaces,您可以在page2.xhtml
中使用以下方法:
<f:metadata>
<f:viewParam name="dummy" />
<f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>
Faces.getFlash().setKeepMessages(true)代码>是不必要的,因为消息#addFlashGlobalError()
已经这样做了。请记住,在Mojarra中,如果导航到URL中的其他文件夹,Flash示波器将无法工作。这两个页面必须位于URL中的同一文件夹中。这在即将发布的Mojarra 2.1.14中得到了修复。您尝试过使用导航吗?起初我使用了,但不起作用,我必须更改afterPhase()
,现在一切正常。但我需要从PostConstruct或preRenderView重定向,这些都是无效的方法。。。
<f:metadata>
<f:viewParam name="dummy" />
<f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>
public void init() {
Messages.addFlashGlobalError("cannot edit!");
Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}