我正在尝试使用JSF 2.0(之前使用ICEfaces 1.8几个月),并且我正在努力弄清楚为什么在JSF 2.0中我的后备bean构造函数会被多次调用。
该Bean应在创建时实例化一次,但是每当我单击commandButton时,“Bean Initialized”文本就会显示,表示正在实例化新的Bean对象。
面部页面:
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<div id="content">
<h:form id="form">
<h:commandButton value="Toggle" action="#{bean.toggleShowMe}"/>
</h:form>
<h:panelGrid rendered="#{bean.showMe}">
<h:outputText value="Show me!"/>
</h:panelGrid>
</div>
</h:body>
</html>
支持Bean:
@ManagedBean
@RequestScoped
public class Bean {
private boolean showMe = false;
public boolean isShowMe() {
return showMe;
}
public void setShowMe(boolean showMe) {
this.showMe = showMe;
}
public void toggleShowMe(){
System.out.println(showMe);
if(showMe==true){
showMe=false;
}else{
showMe=true;
}
}
/** Creates a new instance of Bean */
public Bean() {
System.out.println("Bean Initialized");
}
}
这只是一个简单的测试。如果我使用ICEfaces 2.0并且在panelGrid的位置上使用另一种方式,相同的行为会表现出来:
<ice:panelPopup visible="#{bean.showMe}">
我希望能得到任何帮助。我无法解释这个问题。
更新: 回应Aba Dov的建议,我将bean设置为@SessionScoped,认为它不会在每个请求时调用构造函数,但遇到了相同的问题。我错过了什么吗?