0

失敗している次のファセットコードがあります。

<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タグは問題なく機能します。ただし、2番目のものは値を表示しません。それだけでなく、私はNetBeansで作業してProvinciaおり、ELで「prov」と入力するたびにクラスのメソッドのリストが表示されません。

どんな助けでも大歓迎です。

編集:私は自分のコードを編集し、次のことを行いました:

<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が表示されていません。なぜこれが起こるのでしょうか?

4

1 に答える 1

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さて、その変換を行う専門的な方法は、selectウィジェットに使用される式の値に基づいてRegionオブジェクトの適切なインスタンスを見つけることができるカスタムコンバーターを使用することです。別の質問からこの例をチェックしてください。

rich:selectデフォルトに機能​​を追加するだけであることに注意してください。ここSOの情報ページh:selectOneMenuをチェックしてください。

于 2012-07-31T17:29:37.650 に答える