我有一個行爲,我不明白與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值時偵聽器執行了兩次,並且每次更改該值時又多一次。
在此先感謝
正如耶利米回答的那樣,你的具體問題是你在getter方法中做了業務邏輯。這是錯誤的。只是一個建議,如果你使用JSF 2.x,不要過分關注JSF 1.x目標書籍/資源。無論你想要達到什麼,都可以通過''來完成。 –
BalusC
2012-02-03 19:07:51