我使用的是JSF 2、PrimeFacces 3.4和CDI。我有两页:page1.xhtml和page2.xhtml。每个页面都有自己的托管bean:Page1Bean和Page2Bean。
page1.xhtml有一个<p:remoteCommand>,其actionListener显示page2.xhtml。
page2.xhtml包含<ui:include>下的3个组件和一个提交按钮。这三个组件中的每一个都绑定到不同的托管beans - Component1Bean、Component2Bean和Component3Bean。submit按钮显示page1.xhtml。
这三个ComponentXBean有一个带有一些初始化代码的@PostConstruct方法。我尝试了以下对这些bean的作用域:
@SessionScoped:对于单个提交操作,一切都很好。当我重复时,这些bean就不会被@PostConstruct重新初始化,因为这些bean是会话范围的。@ViewScoped:@PostConstruct被多次调用。@ConversationScoped:与@ViewScoped相同的行为。为什么在视图和会话范围内多次调用@PostConstruct?我如何才能让他们只被调用一次每次提交操作?
发布于 2013-08-24 11:58:40
每次在“preRender”下运行初始化代码,可能是不正确的。因为初始化将清除所需的数据。
将preRender与初始化分开。您可以分别将它们挂起,也可以有一个标志只调用初始化()一次。
如果可能的话,避免使用会话范围的bean;会话范围是设计糟糕的web应用程序的标志,而且(在最简单的形式中)是实现页间流的非常糟糕的方式。在网页之间传递URL或POST参数以实现流。
如果有必要,页间参数可以是存储在HttpSession中的对象的唯一句柄。但是,不要仅仅将内容转储到会话中,而不需要它对应用程序(如"loggedInUser")具有真正的全局性,或者由唯一分配的句柄引用。
https://stackoverflow.com/questions/18418156
复制相似问题