我正在嘗試使用JSF 2.0(在過去幾個月使用ICEfaces 1.8之後),我試圖弄清楚爲什麼在JSF 2.0中我的後臺bean構造函數被多次調用。多次調用JSF Backing Bean構造函數
bean應該在創建時被實例化,但是每當我點擊commandButton時,「Bean初始化」文本就會顯示出來,表明新的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的迴應,我@SessionScoped這個bean,認爲它不會在每個請求中調用構造函數並且遇到相同的行爲。我錯過了什麼?
如果組件是會話作用域,它將不會在每個會話中創建超過一次 - 因爲這個beahviour被廣泛使用,該錯誤可能在您的代碼中,而不是在JSF中;你是否使用了正確的包裝中的@SessionScoped? (EE6中有兩個)。 – fdreger 2011-01-28 14:13:00
fdreger -Im使用javax.faces.bean.SessionScoped。我應該使用javax.enterprise.context.SessionScoped嗎? – TheDream34 2011-01-29 00:04:11