JSF - selectItems不会在列表中呈现列表

时间:2012-07-31 16:32:42

标签: java ajax jsf richfaces jstl

我有以下缺少的facelet代码:

<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!为什么会这样?

1 个答案:

答案 0 :(得分:2)

region中设置的变量f:selectItems仅在其范围内可用。 您必须将每个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