我有一个两级地图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>
处理地图时遇到任何问题。
由于
答案 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;
}
}