3

我很好奇如何让 JSF 仅在页面加载时加载某些业务逻辑,而不是在我单击按钮 ( ActionEvent) 或执行AjaxBehaviorEvent.

我的 bean@RequestScoped使用 JSF 2.1 和 Primefaces。

因为ActionEventandAjaxBehaviorEvent之后被调用,所以我不知道如何告诉 Bean@PostConstruct因为事件而调用它。

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

4

2 回答 2

7

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

FacesContext#isPostback()如果返回,只需签入(后)构造函数false

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

在即将到来的 JSF 2.2 中,您可以顺便使用 new<f:viewAction>来代替。

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

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

取决于具体的功能要求。另请参阅如何选择正确的 bean 范围?


我在使用 ViewScoped 时遇到了严重问题。它总是需要一个序列化的类,我觉得这很烦人;)——此外,它还会导致“java.sql”出现轻微问题

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

于 2013-04-09T12:23:15.763 回答
1

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

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

于 2013-04-09T12:23:56.617 回答