Jsf 如何将h:dataTable中h:selectBooleanCheckbox的值映射到h:dataTable中?

Jsf 如何将h:dataTable中h:selectBooleanCheckbox的值映射到h:dataTable中?,jsf,datatable,hashmap,Jsf,Datatable,Hashmap,有问题的h:SelectBoolean复选框位于h:dataTable(类别)中的h:dataTable(项目)中的h:dataTable(附加)中。将显示多个项目,每个项目可以有多个附加项目 <h:dataTable value="#{bean.categoryList}" var="category"> <h:column> <h:dataTable value="#{category.itemList}" var="item">

有问题的h:SelectBoolean复选框位于h:dataTable(类别)中的h:dataTable(项目)中的h:dataTable(附加)中。将显示多个项目,每个项目可以有多个附加项目

<h:dataTable value="#{bean.categoryList}" var="category">
    <h:column>
        <h:dataTable value="#{category.itemList}" var="item">
            <h:column>
                <h:dataTable value="#{item.extraList}" var="extra">
                    <h:column>
                        <!-- The h:selectBooleanCheckbox in question //-->
                        <h:selectBooleanCheckbox value="#{bean.extraSelectedMap[item.id][extra.id]}"/>
                    </h:column>
                    <h:commandLink action="#{bean.add}" value="Add">
                </h:dataTable>
            </h:column>
        </h:dataTable>
    </h:column>
</h:dataTable>

呈现页面后,我选中一个复选框,然后选择“添加”。在豆子里面。加上我的

Map<Integer, HashMap<Integer, Boolean>>
Map
有一个空HashMap,而我希望它将额外的id映射到值true

上面的代码或整个方法有什么不正确之处


非常感谢和问候。

首先,您的
h:dataTable
有三个层次。如果要将复选框附加到父托管bean属性,则需要考虑所有级别。所以

<h:selectBooleanCheckbox value="#{bean.extraSelectedMap[category.id][item.id][extra.id]}"/>

使用
映射作为属性。否则,将覆盖每个类别的选择,直到最后一个类别的选定项目在地图中结束

其次,还需要预创建贴图和所有嵌套贴图。JSF不会为您这样做。换句话说,

public Bean() {
    extraSelectedMap = new HashMap<Integer, Map<Integer, Map<Integer, Boolean>>>();
    for (Category category : categoryList) {
        Map<Integer, Map<Integer, Boolean>> selectedExtrasPerCategory = new HashMap<Integer, Map<Integer, Boolean>>();
        extraSelectedMap.put(category.getId(), selectedExtrasPerCategory);
        for (Item item : category.getItemList()) {
            Map<Integer, Boolean> selectedExtrasPerItem = new HashMap<Integer, Boolean>();
            selectedExtrasPerCategory.put(item.getId(), selectedExtrasPerItem);
        }
    }
publicbean(){
extraSelectedMap=新建HashMap();
用于(类别:类别列表){
Map selectedExtrasPerCategory=new HashMap();
extraSelectedMap.put(category.getId(),selectedExtrasPerCategory);
对于(项:category.getItemList()){
Map selectedExtrasPerItem=newhashmap();
selectedExtrasPerCategory.put(item.getId(),selectedExtrasPerCategory);
}
}

作为另一种选择,您也可以考虑只添加一个<代码>布尔< <代码>属性> <代码>额外>代码>,并绑定到它。