【发布时间】:2011-06-17 02:48:51
【问题描述】:
我正在尝试 JSF 2.0(在过去几个月使用 ICEfaces 1.8 之后)并且我试图弄清楚为什么在 JSF 2.0 中我的支持 bean 构造函数被多次调用。
bean 应该在创建时被实例化一次,但是每当我单击 commandButton 时都会显示“Bean Initialized”文本,表明正在实例化一个新的 Bean 对象。
facelet 页面:
<?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,认为它不会在每次请求时调用构造函数并遇到相同的行为。我错过了什么?
【问题讨论】:
-
如果组件是会话范围的,它不会在每个会话中创建超过一次——因为这种行为被广泛使用,错误可能在您的代码中,而不是 JSF;你在使用正确包中的@SessionScoped 吗? (EE6中有两个)。
-
fdreger-我正在使用 javax.faces.bean.SessionScoped。我应该使用 javax.enterprise.context.SessionScoped 吗?