看起来就像您的托管 Bean 一样,@SessionScoped
并且只有在使用 bean 时用户第一次访问页面时才会调用构造函数。
在 JSF 2 中,这可以通过将 Managed Bean 更改为@ViewScoped
.
@ManagedBean
@ViewScoped
public class Bean {
public Bean() {
}
@PostConstruct
public void init() {
clearMsg();
}
}
BalusC 在这个答案中对 JSF Managed Bean 范围给出了很好的解释:如何选择正确的 bean 范围?. 另外,我建议您阅读答案底部的链接,以更好地理解这些概念。
faces-config.xml
在 JSF 1.x 中,您应该将托管 Bean 配置为在文件中请求范围并clearMsg
在@PostConstruct public void init
方法中调用。请注意,这意味着clearMsg
将在涉及创建托管 bean 类的每个请求(甚至是 ajax 请求)上调用该方法。为了解决这个问题,您应该提供有关如何以及何时在 JSF 代码中调用此 bean 的更多信息。默认情况下,您可以通过在会话中设置一个标志并在调用clearMsg
方法(或只需要调用一次的方法)之前检查此标志来解决此问题。
public class Bean {
public Bean() {
}
@PostConstruct
public void init() {
HttpSession session = ((HttpRequest)FacesContext.getCurrentInstance().
getExternalContext().getRequest()).getSession();
if (session.getAttribute("flag") == null) {
clearMsg();
//other methods...
}
}
}
面配置
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>your.package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
有一种方法可以通过@ViewScoped
使用@KeepAlive
来自RichFaces 3
. 考虑到 bean 将一直处于活动状态,直到您通过显式重定向更改视图。基于此,代码将是这样的:
@KeepAlive
public class Bean {
public Bean() {
}
@PostConstruct
public void init() {
//no need to use session flags
clearMsg();
//other methods...
}
}