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



我很好奇如何让JSF在页面加载时只加载某些业务逻辑,而当我单击按钮(ActionEvent)或执行AjaxBehaviorEvent时,不运行此代码

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

因为ActionEventAjaxBehaviorEvent是在之后被调用的,我不知道如何告诉@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

相关内容

  • 没有找到相关文章

最新更新