Jsf 如何根据数据表中另一个下拉列表的值填充下拉列表?

Jsf 如何根据数据表中另一个下拉列表的值填充下拉列表?,jsf,jsf-2,Jsf,Jsf 2,我有一个,在两列中有两个下拉列表。根据第一个下拉列表的值填充第二个下拉列表 <t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item"> <t:column> <h:selectOneMenu value="#{item.tabla}"> <f:selectItem itemLabel="SIN CORRESPONDENCIA" it

我有一个
,在两列中有两个
下拉列表。根据第一个下拉列表的值填充第二个下拉列表

<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax listener="#{tablaConfigBean.rellenaCampos}" render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.camposList}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>
<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.getCamposList(item.tabla)}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>
虽然第一个下拉列表没有任何值,但默认情况下总是加载它的
。如果我选择其中一个值,则填充第二个下拉列表的
。当两个
必须显示从数据库预初始化的值时,就会出现问题。正如我所写的,除非我在第一个下拉列表中手动选择值,否则第二个下拉列表不会加载相应的值。然后,出现预期值


我试过这样的方法,但没能成功。我如何才能做到这一点?

您的具体问题是因为最后一列中的第二个下拉列表绑定到一个相同的bean属性,并且与当前行无关

在此结构中,您的最佳选择是将当前选定的第一个下拉列表的值传递给第二个下拉列表的

<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax listener="#{tablaConfigBean.rellenaCampos}" render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.camposList}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>
<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.getCamposList(item.tabla)}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>

(我从第一个下拉列表中删除了
,并更改了第二个下拉列表中的

并将原始ajax侦听器方法的作业移动到
后面的getter

private Map<Tabla, List<Campo>> tablaCampos = new HashMap<Tabla, List<Campo>>();

public List<Campo> getCamposList(Tabla tablaParaCampos) {
    List<Campo> campos = tableCampos.get(tablaParaCampos);

    if (campos == null) {
        campos = cDAOtablaConfig.rellenaCamposTabla(idSistema, sistema.desEsquema, tablaParaCampos, 3);
        tableCampos.put(table, campos);
    }

    return campos;
}
private Map tablaCampos=new HashMap();
公共列表getCamposList(Tabla tablaParaCampos){
List campos=tableCampos.get(tablaParaCampos);
if(campos==null){
campos=cDAOtablaConfig.rellenaCamposTabla(idSistema,sistema.DESQUEMA,tablaParaCampos,3);
tableCampos.put(table,campos);
}
返回坎波斯;
}

注意,这里实现了延迟加载+缓存。还要注意,您应该确保
等于()
hashCode()
Tabla
类的
已正确实现。

您的具体问题是由于最后一列中的第二个下拉列表绑定到一个相同的
bean属性,并且与当前行无关

在此结构中,您的最佳选择是将当前选定的第一个下拉列表的值传递给第二个下拉列表的

<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax listener="#{tablaConfigBean.rellenaCampos}" render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.camposList}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>
<t:dataTable value="#{tablaConfigBean.tablaConfigList}" var="item">
    <t:column>
        <h:selectOneMenu value="#{item.tabla}">
            <f:selectItem itemLabel="SIN CORRESPONDENCIA" itemValue="SIN CORRESPONDENCIA"/> 
            <f:selectItems value="#{tablaConfigBean.tablasList}" var="tabla" itemLabel="#{tabla}"  itemValue="#{tabla}"/>
            <f:ajax render="seleccionCampoCorrespondido"/>
        </h:selectOneMenu>
    </t:column>
    <t:column>
        <h:selectOneMenu id="seleccionCampoCorrespondido" value="#{item.columnaCorr}">
            <f:selectItems id="listaCampoCorrespondido" value="#{tablaConfigBean.getCamposList(item.tabla)}" var="campo" itemValue="#{campo}"/>
        </h:selectOneMenu>
    </t:column>
</t:dataTable>

(我从第一个下拉列表中删除了
,并更改了第二个下拉列表中的

并将原始ajax侦听器方法的作业移动到
后面的getter

private Map<Tabla, List<Campo>> tablaCampos = new HashMap<Tabla, List<Campo>>();

public List<Campo> getCamposList(Tabla tablaParaCampos) {
    List<Campo> campos = tableCampos.get(tablaParaCampos);

    if (campos == null) {
        campos = cDAOtablaConfig.rellenaCamposTabla(idSistema, sistema.desEsquema, tablaParaCampos, 3);
        tableCampos.put(table, campos);
    }

    return campos;
}
private Map tablaCampos=new HashMap();
公共列表getCamposList(Tabla tablaParaCampos){
List campos=tableCampos.get(tablaParaCampos);
if(campos==null){
campos=cDAOtablaConfig.rellenaCamposTabla(idSistema,sistema.DESQUEMA,tablaParaCampos,3);
tableCampos.put(table,campos);
}
返回坎波斯;
}

注意,这里实现了延迟加载+缓存。还要注意的是,您应该确保
Tabla
类的
equals()
hashCode()
正确实现。

非常感谢@Balus。我需要这样做,但前提是我指定get函数
您正在运行哪个servlet容器?我现在看到您编辑了注释,并将其反过来切换。使用
{tablaConfigBean.getCamposList(item.tabla)}
绝对正确,而使用
{tablaConfigBean.camposList(item.tabla)}
则不正确。但我现在看到你实际上从我的回答中得到了这个。对不起,这是错误的。我已经找到答案了。啊,别担心。我也很抱歉,事实上,我的第一个评论是错误的。再次感谢!非常感谢@Balus。我需要这样做,但前提是我指定get函数
您正在运行哪个servlet容器?我现在看到您编辑了注释,并将其反过来切换。使用
{tablaConfigBean.getCamposList(item.tabla)}
绝对正确,而使用
{tablaConfigBean.camposList(item.tabla)}
则不正确。但我现在看到你实际上从我的回答中得到了这个。对不起,这是错误的。我已经找到答案了。啊,别担心。我也很抱歉,事实上,我的第一个评论是错误的。再次感谢!