1

我正在使用 JSF 2、PrimeFacces 3.4 和 CDI。我有 2 页:page1.xhtmlpage2.xhtml. 每个页面都有自己的托管 bean:Page1BeanPage2Bean.

page1.xhtml有一个<p:remoteCommand>谁的actionListener显示器page2.xhtml

page2.xhtml下包含 3 个组件<ui:include>和一个提交按钮。这 3 个组件中的每一个都绑定到不同的托管 bean Component1BeanComponent2Bean并且Component3Bean. 提交按钮显示page1.xhtml

这三个ComponentXBeans 有一个@PostConstruct带有一些初始化代码的方法。我在这些 bean 上尝试了以下范围:

  • @SessionScoped:单次提交操作一切正常。当我重复它时,这些 bean 不会被重新初始化,@PostConstruct因为它们是会话范围的。
  • @ViewScoped:@PostConstruct被多次调用。
  • @ConversationScoped: 与 . 相同的行为@ViewScoped

为什么@PostConstruct在视图和会话范围内多次调用?我怎样才能让他们每次提交操作只被调用一次?

4

1 回答 1

0

每次都在“preRender”下运行初始化代码可能不正确。由于初始化将清除您想要的数据。

preRender将您与初始化分开。您可以单独挂钩它们,也可以使用标志只调用一次 initialize()。

尽可能避免使用会话范围的 bean;会话范围是设计糟糕的 Web 应用程序的标志,并且(以最简单的形式)是实现页面间流的一种非常糟糕的方式。在网页之间传递 URL 或 POST 参数以实现流程。

如有必要,页间参数可以是存储在 HttpSession 中的对象的唯一句柄。但不要只是将内容转储到 Session 中,而它对于应用程序来说不是真正的全局(例如“loggedInUser”)或被唯一分配的句柄引用。

于 2013-08-24T11:58:40.593 回答