我正在使用JSF 2,PrimeFacces 3.4和CDI。我有2页:page1.xhtml
和page2.xhtml
。每个页面都有自己的托管bean:Page1Bean
和Page2Bean
。
page1.xhtml
有一个<p:remoteCommand>
,actionListener
显示page2.xhtml
。
page2.xhtml
包含<ui:include>
下的3个组件和一个提交按钮。这3个组件中的每一个都绑定到不同的托管bean Component1Bean
,Component2Bean
和Component3Bean
。提交按钮显示page1.xhtml
。
这三个ComponentXBean
的{{1}}方法带有一些初始化代码。我在这些bean上尝试了以下范围:
@PostConstruct
:单项提交操作一切正常。当我重复它时,那些bean不会被@SessionScoped
重新初始化,因为它们是会话作用域。@PostConstruct
:多次调用@ViewScoped
。@PostConstruct
:与@ConversationScoped
相同的行为。为什么在视图和会话范围内多次调用@ViewScoped
?如何在每次提交操作时只让它们被调用一次?
答案 0 :(得分:0)
每次在'preRender'下运行初始化代码可能不正确。由于初始化将消除您想要的数据。
将preRender
与初始化分开。您可以单独挂钩,也可以只使用一次调用initialize()一次。
尽可能避免使用会话范围的bean;会话范围是设计糟糕的Web应用程序的标记,并且(以最简单的形式)是实现页间流的非常糟糕的方式。在网页之间传递URL或POST参数以实现流程。
如果需要,页面间参数可以是唯一句柄到存储在HttpSession中的对象。但是,如果没有对应用程序真正全局化(例如“loggedInUser”)或者由唯一分配的句柄引用,则不要将内容转储到Session中。