2011-01-28 71 views
4

我正在嘗試使用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,認爲它不會在每個請求中調用構造函數並且遇到相同的行爲。我錯過了什麼?

+0

如果組件是會話作用域,它將不會在每個會話中創建超過一次 - 因爲這個beahviour被廣泛使用,該錯誤可能在您的代碼中,而不是在JSF中;你是否使用了正確的包裝中的@SessionScoped? (EE6中有兩個)。 – fdreger 2011-01-28 14:13:00

+0

fdreger -Im使用javax.faces.bean.SessionScoped。我應該使用javax.enterprise.context.SessionScoped嗎? – TheDream34 2011-01-29 00:04:11

回答

6

您已經聲明放置在請求範圍豆和你開火的命令按鈕新的HTTP請求每次。真正的bean將在每個請求中創建。如果你希望bean的存在時間與視圖本身一樣長(就像IceFaces在所有ajax的東西下做的那樣),那麼你需要聲明bean視圖的作用域(這在JSF 2.0中是新的) 。

@ManagedBean 
@ViewScoped 
public class Bean implements Serializable {} 
+0

感謝您的解釋!有用。有什麼建議可以幫助你理解什麼是新的JSF 2.0?規格非常繁重。 – TheDream34 2011-01-29 01:11:18

0

每次有頁面請求時都會調用bean。

當您單擊 <h:commandButton>表單提交和請求是爲了防止它,你可以使用 <t:saveState><a4j:keepAlive>標籤爲您已經發送到服務器

例如<a4j:keepAlive beanName="YourBean" />

這些標籤存儲組件樹bean實例。

還請確保您的班級implements Serializable。因此它可以被序列化

希望這有助於

+0

在JSF 2中,viewscope執行keepAlive或saveState的工作 – 2013-02-01 08:31:37

1

這個bean應該在ViewScoped中。