2012-07-31 40 views
0

我有失敗以下的facelet代碼:JSF - selectItems的不渲染列表內列表

<h:form> 
    <rich:select defaultLabel="Seleccionar región"> 
     <f:selectItems value="#{StaticInfo.regiones}" var="region" itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" /> 
     <a4j:ajax event="change" render="provs" /> 
    </rich:select> 
    <rich:select id="provs" defaultLabel="Seleccionar provincia"> 
    <f:selectItems value="#{region.provincias}" var="prov" itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" /> 
    </rich:select> 
</h:form> 

支持bean:

public class StaticInfoBean { 

    private ArrayList<Region> regiones; 

    public StaticInfoBean() { 
     try 
     { 
      RegionDAO regDao = new RegionDAO(); 
      regDao.prepareConnection(); 
      ProvinciaDAO provDao = new ProvinciaDAO(); 
      provDao.setCon(regDao.getCon()); 
      ComunaDAO comDao = new ComunaDAO(); 
      comDao.setCon(regDao.getCon()); 
      regiones = regDao.listaRegiones(); 
      for(Region r : regiones) 
      { 
       regDao.findProvincias(r); 
       for(Provincia p : r.getProvincias()) 
       { 
        provDao.findComunas(p); 
        for(Comuna c : p.getComunas()) 
        { 
         comDao.findColegios(c); 
        } 
       } 
      } 
      regDao.getCon().close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

    public ArrayList<Region> getRegiones() { 
     return regiones; 
    } 

    public void setRegiones(ArrayList<Region> regiones) { 
     this.regiones = regiones; 
    } 

    public String toString() { 
     return regiones.toString(); 
    } 

} 

Region

public class Region { 

    private String Reg_Cod; 
    private String Reg_Nombre; 
    private ArrayList<Provincia> provincias; 
//Getters and setters 

問題:第一個rich:select標籤工作得很好。但是第二個不顯示任何值。不僅如此,我還在NetBeans中工作,無論何時在EL中鍵入「prov」,它都不會顯示類Provincia的方法列表。

任何幫助表示讚賞。

編輯:我編輯我的代碼,做了以下內容:

<h:form> 
    <rich:select defaultLabel="Seleccionar región" value="#{StaticInfo.regionElegida}"> 
     <f:selectItems value="#{StaticInfo.regiones}" var="region" itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" /> 
     <a4j:ajax event="click" render="provs" execute="@this" /> 
     <a4j:ajax event="click" render="texto" execute="@this" /> 
    </rich:select> 
<h:outputText id="texto" value="#{StaticInfo.regionElegida.reg_Nombre}" /> 
    <rich:select id="provs" defaultLabel="Seleccionar provincia" value="#{StaticInfo.provinciaElegida}" rendered="#{not empty StaticInfo.regionElegida}"> 
     <f:selectItems value="#{StaticInfo.regionElegida.provincias}" var="prov" itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" /> 
    </rich:select> 
</h:form> 

讓人吃驚的是,沒有被顯示的outputText!爲什麼會發生?

+0

控制檯中是否顯示任何錯誤? – elias 2012-07-31 16:55:13

+0

不,我得到的只是一個「空」輸出。 – 2012-07-31 17:00:38

+0

你的bean的範圍是什麼? – elias 2012-07-31 17:09:52

回答

2

設置在f:selectItems中的變量region僅在其範圍內可用。 您必須將每個rich:select綁定到支持bean屬性。

所以,你需要改變你的bean的代碼,添加屬性爲所選區域的bean:

public class StaticInfoBean {  
    private ArrayList<Region> regiones; 
    private Region regionElegida; 
    private Provincia provinciaElegida; // <-- you'll probably want this too... 

    // ... getters and setters and your initialization code 

    // and you need something to find the real region object that 
    // used the reg_Cod value got from rich:select, for now you can try this: 
    public void updateRegionElegida(AjaxBehaviorEvent e){ 
     // set the chosen region to regionElegida, 
     // or the poor man's converter 
     for (Region region : regiones){ 
      if(regionElegida.getReg_Cod() == region.getReg_cod()) { 
       regionElegida = region; 
      } 
     } 
    } 
} 

,然後改變你的XHTML是這樣的:

<h:form> 
    <rich:select value="#{StaticInfo.regionElegida}" 
      defaultLabel="Seleccionar región"> 
     <f:selectItems value="#{StaticInfo.regiones}" var="region" 
      itemValue="#{region.reg_Cod}" itemLabel="#{region.reg_Nombre}" /> 
     <a4j:ajax event="change" render="provs" 
      listener="#{StaticInfo.updateRegionElegida}" /> 
    </rich:select> 
    <rich:select id="provs" value="#{StaticInfo.provinciaElegida}" 
      defaultLabel="Seleccionar provincia"> 
     <f:selectItems value="#{StaticInfo.regionElegida.provincias}" var="prov" 
      itemValue="#{prov.prov_Cod}" itemLabel="#{prov.prov_Nombre}" /> 
    </rich:select> 
</h:form> 

現在,執行該轉換的專業方式是使用自定義轉換器,該轉換器可以根據用於其選定小部件的表達式itemValue的值來找到Region對象的相應實例。檢查出this example from another question

請注意,rich:select只增加了功能默認h:selectOneMenu,你會做好檢查its info page這裏在SO。

+0

我很想說它的工作,但事實並非如此。我得到同樣的錯誤,第二個'rich:select'不顯示任何值。 – 2012-07-31 17:39:38

+0

仍然沒有在控制檯? – elias 2012-07-31 17:53:49

+0

仍然沒有什麼可悲的。 – 2012-07-31 18:15:56