4

我正在寻找一种优雅的 JSF 方式来执行此操作,并且想知道是否有任何普遍接受的做法来执行此操作。

当我从一个页面导航到另一个页面时,我希望新页面在从最后一页传输的h:message组件(实际上是p:message但它应该是同一件事)中 显示一个 FacesMessage 。

例如,如果用户单击“创建文档”按钮,它会在成功时导航到新页面,并在新页面上显示成功消息。我希望我所有的数据库更改操作都以这种方式运行。

FacesContext似乎清除了导航上的所有消息,所以我最接近的解决方案如下所示:

  1. 将 FacesMessage 对象存储在会话 bean 中。
  2. 在消息 bean 中创建一个方法checkMessage ,该方法调用FacesContext.getCurrentInstance().addMessage(..)并从消息 bean 中删除消息。
  3. 在目标页面中放置一个对checkMessage的 EL 引用。
  4. 在目标页面中 放置一个p:message 。

这似乎有点强迫 - 有没有更好的方法来做到这一点?

4

2 回答 2

13

Faces 消息确实是请求范围的。

只需使用新的 JSF 2.0 Flash 范围Flash#setKeepMessages()

context.addMessage(clientId, message);
context.getExternalContext().getFlash().setKeepMessages(true);
// ...

这在当前的 Mojarra 2.1.13 版本中只有一个警告:重定向必须发生在 URL 中的相同“文件夹”中。这在即将到来的 2.1.14 中得到修复。另见问题 2136

于 2012-09-18T21:31:47.223 回答
1

http://ocpsoft.org/java/persist-and-pass-facesmessages-over-page-redirects/

http://balusc.blogspot.se/2007/03/post-redirect-get-pattern.html

也许其中之一会有所帮助?

于 2012-09-18T18:48:50.450 回答