2012-02-03 108 views
0

我有一個行爲,我不明白與selectonemenu。我會試着解釋它是否有人知道發生了什麼。我正在用glassfish3使用JSF2。 我的XHTML代碼如下:JSF生命週期 - selectonemenu

<h:selectOneMenu binding="#{cetBacking1.menuFamilies}" 
        valueChangeListener="#{cetBacking1.listenerFamilia}" 
        onchange="this.form.submit()"> 
    <f:selectItems value="#{cetBacking1.ompleFamiliesTemplate()}"></f:selectItems> 
</h:selectOneMenu> 
<h:commandButton value="Test" type="submit" action="#{cetBacking1.test()}"> </h:commandButton> 

我用綁定,因爲這取決於selectOneMenu用於值我將呈現一些其他的成分,但現在這是超出範圍。命令按鈕用於提交。 ompleFamiliesTemplate()返回選擇項列表。 和背bean是:

@ManagedBean(name="cetBacking1") 
@SessionScoped 
public class cetBacking1 extends AbstractEntityAccessor implements Serializable { 
private List<SelectItem> llistaFamilies = new ArrayList<SelectItem>(); 
private HtmlSelectOneMenu menuFamilies; 
{ 
    System.out.println("cetBacking1.init"); 
    ompleFamiliesTemplate(); 
} 


public void listenerFamilia(ValueChangeEvent event) { 
    String novaFamilia = (String) event.getNewValue(); 
    System.out.println("cetBacking1.listenerFamilia: " + novaFamilia); 
} 

public List ompleFamiliesTemplate() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    List<FamiliaTemplate> llistaFamiliestmp = new ArrayList<FamiliaTemplate>(); 
    System.out.println("cetBacking1.ompleFamiliesTemplate !!!!!!"); 
    if (context.getExternalContext().getSessionMap().containsKey("LlistaFamilies")) { 
     llistaFamiliestmp = (List<FamiliaTemplate>) context.getExternalContext().getSessionMap().get("LlistaFamilies"); 
     if (llistaFamilies.isEmpty()) { 
      for (Iterator it = llistaFamiliestmp.iterator(); it.hasNext();) { 
       FamiliaTemplate object = (FamiliaTemplate) it.next(); 
       llistaFamilies.add(new SelectItem(String.valueOf(object.getIdfamiliaTemplate()), object.getFamilia())); 
      } 
     } 
    } 
    return llistaFamilies; 
} 
public void submit() { 
    System.out.println("cetBacking1.submit !!"); 
} 

我把一些的System.out.println按照功能的不同來電,cetBacking1豆構造和ompleFamiliesTemplate(),和valueChangeListener。 該頁面第一次在服務器日誌加載出現下一個消息:

INFO: cetBacking1.init 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 

的{} bean的函數被調用,它調用cetBacking1.ompleFamiliesTemplate和第二cetBacking1.ompleFamiliesTemplate是由F稱爲:selectItems的。它按預期工作。現在我改變selectOneMenu用於臨屋區的價值和在日誌中出現:

INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 

到cetBacking1.ompleFamiliesTemplate的最後一個電話我認爲,由f稱爲:selectItems的。但我不是爲什麼在開始時調用cetBacking1.ompleFamiliesTemplate兩次,然後調用cetBacking1.listenerFamilia兩次。 但是下一個對我來說更加驚人。我再次更改selectOneMenu並在日誌中顯示: 信息:cetBacking1.ompleFamiliesTemplate !!!!!! 信息:cetBacking1.ompleFamiliesTemplate !!!!!! INFO:cetBacking1.listenerFamilia:3 INFO:cetBacking1.listenerFamilia:3 INFO:cetBacking1.listenerFamilia:3 INFO:cetBacking1.ompleFamiliesTemplate !!!!!!

cetBacking1.ompleFamiliesTemplate與前面一樣在開始時被調用兩次,但是偵聽器被調用了三次。每次我改變selectOneMenu時,都會再次調用監聽器。如果我改變了selectOneMenu用於值兩倍的日誌如下:

INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.listenerFamilia: 1 
INFO: cetBacking1.listenerFamilia: 1 
INFO: cetBacking1.listenerFamilia: 1 
INFO: cetBacking1.listenerFamilia: 1 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.listenerFamilia: 2 
INFO: cetBacking1.ompleFamiliesTemplate !!!!!! 

的問題是,爲什麼cetBacking1.ompleFamiliesTemplate被稱爲兩次當我改變selectOneMenu用於值,聽者執行之前。以及爲什麼第一次更改selectOneMenu值時偵聽器執行了兩次,並且每次更改該值時又多一次。

在此先感謝

+0

正如耶利米回答的那樣,你的具體問題是你在getter方法中做了業務邏輯。這是錯誤的。只是一個建議,如果你使用JSF 2.x,不要過分關注JSF 1.x目標書籍/資源。無論你想要達到什麼,都可以通過''來完成。 – BalusC 2012-02-03 19:07:51

回答

0

一個月前我有同樣的問題。 解決方法是,SessionScope和綁定不兼容。

你必須刪除你的jsf頁面的綁定,一切工作正常。 要填充SelectCombo,您可以使用List<SelectItem>和項目。