【问题标题】:Scopes and @PostConstruct范围和@PostConstruct
【发布时间】:2013-08-24 11:38:52
【问题描述】:

我正在使用 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

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

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

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

【问题讨论】:

  • 在我清理了公式并改进了问题的格式之后,我开始相信您正在使用binding 属性将这些组件与bean 绑定。这是真的?而且您使用的是早于 2.1.18 的 Mojarra 版本?那么这完全解释了视图范围问题的原因。

标签: jsf postconstruct


【解决方案1】:

每次都在“preRender”下运行初始化代码可能不正确。因为初始化会清除你想要的数据。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多