我很好奇如何让 JSF 仅在页面加载时加载某些业务逻辑,而不是在我单击按钮 ( ActionEvent
) 或执行AjaxBehaviorEvent
.
我的 bean@RequestScoped
使用 JSF 2.1 和 Primefaces。
因为ActionEvent
andAjaxBehaviorEvent
之后被调用,所以我不知道如何告诉 Bean@PostConstruct
因为事件而调用它。
是因为 bean 放置在错误的范围内吗?
我很好奇如何让 JSF 仅在页面加载时加载某些业务逻辑,而不是在我单击按钮 ( ActionEvent
) 或执行AjaxBehaviorEvent
.
我的 bean@RequestScoped
使用 JSF 2.1 和 Primefaces。
因为ActionEvent
andAjaxBehaviorEvent
之后被调用,所以我不知道如何告诉 Bean@PostConstruct
因为事件而调用它。
是因为 bean 放置在错误的范围内吗?
仅在页面加载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
等)永远不应该被声明为实例变量。
在从客户端发送到服务器的每个请求上都会重新创建一个 RequestScoped bean,这就是为什么每次单击按钮时都会执行 @PostConstruct 中的逻辑,我认为您应该改用 ViewScoped bean,它是在每个页面加载时创建的。
您可以在此链接上找到由 BalusC 编写的关于此主题的好教程:http: //balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes