2012-07-31 3 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> 

백업 콩 :

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

+0

아니, 나는 "null"출력입니다. –

+0

빈의 범위는 무엇입니까? – elias

답변

2

에 설정된 변수 region은 해당 범위 내에서만 사용할 수 있습니다. 각 rich:select을 backing bean 특성에 바인드해야합니다. ,

<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> 

을 지금 : 이런 식으로 XHTML을 변경 한 후

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; 
      } 
     } 
    } 
} 

과 :

그래서, 당신은 빈에 선택한 지역의 특성을 추가하여 빈 코드를 변경해야 해당 변환 작업을 수행하는 전문적인 방법은 해당 선택 위젯에 사용 된 표현식 itemValue 값을 기반으로 Region 객체의 해당 인스턴스를 찾을 수있는 사용자 정의 변환기를 사용하는 것입니다. this example from another question을 확인하십시오.

rich:select은 기능이 기본값 인 h:selectOneMenu에만 추가되므로 여기에서 its info page을 확인하는 것이 좋습니다.

+0

나는 그것이 작동한다고 말하고 싶지만 그렇지 않다. 두 번째'rich : select'는 값을 표시하지 않습니다. –

+0

아직 콘솔에 아무것도 없습니까? – elias

+0

여전히 슬프게도. –

관련 문제