我很好奇如何让JSF在页面加载时只加载某些业务逻辑,而当我单击按钮(ActionEvent
)或执行AjaxBehaviorEvent
时,不运行此代码。
我的bean是在@RequestScoped
,使用JSF 2.1和Primefaces。
因为ActionEvent
和AjaxBehaviorEvent
是在之后被调用的,我不知道如何告诉@PostConstruct
中的Bean它是由于事件而被调用的。
是因为bean放置在错误的作用域吗?
只在
上执行代码页面加载GET请求
如果FacesContext#isPostback()
返回false
,请检查(post)构造函数。
@PostConstruct
public void init() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
在即将到来的JSF 2.2中,您可以使用新的<f:viewAction>
来代替。
<f:viewAction action="#{bean.init}" onPostback="false" />
是因为bean放置在错误的作用域吗?
取决于具体的功能要求。参见如何选择正确的bean作用域?
我在viewscope中遇到了严重的问题。它总是需要一个序列化的类,我觉得很讨厌;)-此外,它会导致java的一些小问题。sql '
这表明您自己的代码设计有问题,而不是视图作用域有问题。JDBC代码不属于JSF托管bean。像Connection
这样的JDBC资源永远不应该被声明为实例变量。
RequestScoped bean在每个从客户端发送到服务器的请求上重新创建,这就是为什么每次单击按钮时执行@PostConstruct中的逻辑,我认为您应该使用ViewScoped bean代替,这是在每个页面加载上创建的。
你可以在这个链接上找到BalusC写的关于这个主题的很好的教程:http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes