范围和@PostConstruct

时间:2013-08-24 11:38:53

标签: jsf postconstruct

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

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

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

这三个ComponentXBean的{​​{1}}方法带有一些初始化代码。我在这些bean上尝试了以下范围:

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

为什么在视图和会话范围内多次调用@ViewScoped?如何在每次提交操作时只让它们被调用一次?

1 个答案:

答案 0 :(得分:0)

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

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

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

如果需要,页面间参数可以是唯一句柄到存储在HttpSession中的对象。但是,如果没有对应用程序真正全局化(例如“loggedInUser”)或者由唯一分配的句柄引用,则不要将内容转储到Session中。