托管Bean - 仅在页面加载时执行代码

时间:2013-04-09 12:15:40

标签: java jsf jsf-2 primefaces javabeans

我很好奇如何让JSF仅在页面加载时加载某些业务逻辑,并且当我点击按钮时不运行此代码({{ 1}})或执行ActionEvent

我的bean在AjaxBehaviorEvent,使用JSF 2.1和Primefaces。

由于之后调用了@RequestScopedActionEvent,我不知道如何告诉AjaxBehaviorEvent中的Bean因为事件而调用它。

是因为bean放在错误的范围内吗?

2 个答案:

答案 0 :(得分:7)

  

仅在页面加载执行代码 GET请求

如果FacesContext#isPostback()返回false,则只需签入(发布)构造函数。

@PostConstruct
public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

在即将推出的JSF 2.2中,您可以使用新的<f:viewAction>代替。

<f:viewAction action="#{bean.init}" onPostback="false" />

  

是因为bean放在错误的范围内了吗?

取决于具体的功能要求。另请参阅How to choose the right bean scope?


  

我遇到了严重的ViewScoped问题。它总是需要一个序列化的类,我发现它很烦人;) - 另外它会导致'java.sql'的错误问题

这表明您自己的代码设计存在问题,而不是视图范围。 JDBC代码不属于JSF托管bean。像Connection等JDBC资源应该never, never声明为实例变量。

答案 1 :(得分:1)

在从客户端发送到服务器的每个请求上重新创建一个RequestScoped bean,这就是为什么每次单击按钮时都会执行@PostConstruct中的逻辑,我认为你应该使用ViewScoped bean,它在每个页面上创建负荷。

您可以在此链接上找到关于BalusC撰写的关于此主题的优秀教程:http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes