5

当页面第一次加载时,@PostConstruct会调用,但是当我在这个页面上执行回发时,@PostConstruct会再次调用。

我怎样才能让它只在初始请求时运行,而不是在每次回发时运行?

@PostContruct
public void init() {
    // charge combos....
}

public void submit() { 
    // action 
}
4

2 回答 2

7

显然,您的 bean 是请求范围的,因此在每个 HTTP 请求上都会重新构建。我不完全确定您为什么要阻止@PostConstruct再次调用,否则您最终会得到一个“空”bean 状态,这可能会导致表单提交错误,但是好的,您可以添加一个检查 if当前请求不是发。

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // charge combos....
    }
}

这样就不会在回发时调用“收费组合”部分。

或者,也许您的实际问题不是“如何防止在回发时调用 postconstruct?”,而是更多“如何在回发时保留相同的 bean 实例?”。在这种情况下,您需要将 bean 放在视图范围而不是请求范围中。

@ManagedBean
@ViewScoped
public class Bean implements Serializable {
    // ...
}

只要您null从操作方法返回,只要您通过回发与同一个视图交互,同一个 bean 实例就会一直存在。这样@PostConstruct就不会被调用(仅仅因为 bean 没有被重构)。

也可以看看:

于 2012-11-06T13:53:59.013 回答
-2

使用此导入:

导入 javax.faces.view.ViewScoped;对于@ViewScoped

于 2017-06-28T13:28:20.317 回答