JSF - 保持面消息从@PostConstruct重定向后(JSF - Keep Faces M

2019-09-23 10:07发布

我曾与第1页的按钮,导航到第2页第2页添加一些信息和导航回第1页。 我想显示第一页上的消息。 我尝试过多种解决方案,但没有工作。

示例代码page1.xhtml:

<p:commandButton value="edit" action="#{bean1.edit}"/>

在Managed Bean:

public String edit() {
  return "page2?faces-redirect=true";
}

第2页托管bean

@PostConstruct
private void postConstruct() {
  Faces.getFlash().setKeepMessages(true);
  Messages.addFlashGlobalError("cannot edit!");
  Faces.navigate("page1?faces-redirect=true");
}

两个豆视图作用域和两个页均具有<p:messages>在主体的端部。

Answer 1:

首先,我不完全肯定的@PostConstruct是执行重定向的最佳场所。 请参见本 。 话虽这么说,谷歌打开了这个 ,它看起来是合理的。 尝试Facelets页面本身重定向与preRender事件标签接近页面的顶部。 干杯



Answer 2:

如果可能发生@PostConstruct调用为时已晚。 显然,豆被引用并且如此构造的第一次比较(在最底部例如)在视图“迟到”。 在这一点上,响应可能已经犯下这是不归路。 您无法浏览到一个不同的看法了。

你基本上要调用init()方法之前渲染响应。 随着OmniFaces,您可以使用以下方法page2.xhtml

<f:metadata>
    <f:viewParam name="dummy" />
    <f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>

(你可以删除<f:viewParam name="dummy" />如果你已经有一个页面上你自己的视图参数,它只是确保INVOKE_ACTION执行阶段,也看到postInvokeAction演示页 )

并且只是一个简单<f:event listener>方法:

public void init() {
    Messages.addFlashGlobalError("cannot edit!");
    Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}

Faces.getFlash().setKeepMessages(true); 是不必要的,因为Messages#addFlashGlobalError()已经做到这一点。 请记住,在钻嘴鱼科,如果导航是在URL不同的文件夹中的Flash范围将无法正常工作。 在两个页面都必须在URL相同的文件夹。 这是固定在即将举行的钻嘴鱼科2.1.14。



Answer 3:

只需使用nevigation。 它肯定会工作。 检查下面的代码。 公共字符串重定向()抛出异常{FacesContext.getCurrentInstance()方法addMessage( “MSG1”,新的FacesMessage( “消息1是”))。 //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf"); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf“); return "page2"; 返回“第2页”; } }



文章来源: JSF - Keep Faces Messages after redirect from @PostConstruct