Primefaces数据表的p:列不迭代Map

时间:2014-09-14 14:31:11

标签: jsf jsf-2 primefaces datatable

我有一个两级地图Map<String,HashMap<String,String>>我需要使用<p:dataTable>来显示。托管bean的代码如下:

@ManagedBean(name="MyBean")
public class MyBean{
    private Map<String,HashMap<String,String>> twoDimentionalMap;
    public void getMapData(){
       twoDimentionalMap=getDataFromDataStore();
    }

}

现在我在我的view.xhtml文件中使用此地图,如下所示:

<p:dataTable var="entrySet1" value="#{MyBean.twoDimentionalMap.entrySet()}">
    <p:columns var="entrySet2" value="#{entrySet1.getValue()}">
         #{entrySet2.getKey()} - #{entrySet2.getValue()}
    </p:columns>
</p:dataTable>

我也尝试过使用

<p:dataTable var="entrySet1" value="#{MyBean.twoDimentionalMap.entrySet()}">
    <p:columns var="entrySet2" value="#{MyBean.twoDimentionalMap.get(entrySet1.getKey()).getValue()}">
         #{entrySet2.getKey()} - #{entrySet2.getValue()}
    </p:columns>
</p:dataTable>

我甚至尝试将外部地图转换为列表:

List<HashMap<String,String>> twoDimentionalMap;

但是数据表中没有显示任何内容。执行没有显示错误,但页面上没有显示任何内容。

请提示我是否做错了或<p:columns>处理地图时遇到任何问题。

由于

1 个答案:

答案 0 :(得分:4)

由于外部地图的键没有意义,将外部地图转换为列表是正确的。

但您从xhtml检索列名的方法似乎无效。您需要独立于当前迭代变量entrySet1获取它们,否则您将为操作添加第三个维度,该数据表无法处理。

我们需要假设列出的地图中的所有键都相同。

这是xhtml的代码:

<p:dataTable var="entrySet1" value="#{testMB.twoDimensionalMap}">
    <p:columns var="keySet2" value="#{testMB.columnNames}">
         #{keySet2} - #{entrySet1[keySet2]}
    </p:columns>
</p:dataTable>

和bean:

@Named
@ViewScoped
public class TestMB implements Serializable {

    private List<HashMap<String,String>> twoDimensionalMap;

    public TestMB()
    {
        getMapData();
    }

    private void getMapData(){
        //twoDimentionalMap=getDataFromDataStore();
        twoDimensionalMap = new ArrayList<HashMap<String,String>>();
        twoDimensionalMap.add(new HashMap<String,String>());
        twoDimensionalMap.get(0).put("key0", "value00");
        twoDimensionalMap.get(0).put("key1", "value01");
        twoDimensionalMap.add(new HashMap<String,String>());
        twoDimensionalMap.get(1).put("key0", "value10");
        twoDimensionalMap.get(1).put("key1", "value11");
    }

    public Set<String> getColumnNames()
    {
        return twoDimensionalMap.size() > 0 ? twoDimensionalMap.get(0).keySet() : new HashSet<String>();
    }

    public List<HashMap<String, String>> getTwoDimensionalMap() {
        return twoDimensionalMap;
    }
}