【发布时间】:2011-06-03 10:06:47
【问题描述】:
我想在 JSF UI 中显示 HashMap 键及其关联值。
我怎样才能做到这一点?如何使用 <h:datatable> 之类的迭代器组件在 JSF 页面中迭代 HashMap?
【问题讨论】:
我想在 JSF UI 中显示 HashMap 键及其关联值。
我怎样才能做到这一点?如何使用 <h:datatable> 之类的迭代器组件在 JSF 页面中迭代 HashMap?
【问题讨论】:
使用<ui:repeat>(JSF 2.2 及更高版本):
<ui:repeat var="entry" value="#{map.entrySet().toArray()}">
key:#{entry.key}, Id: #{entry.value.id}
</ui:repeat>
【讨论】:
value="#{map.entrySet().toArray()} 替换为value="#{map} 以获得相同的结果。
只有<c:forEach> 支持Map。每次迭代都会返回一个 Map.Entry 实例(就像在普通 Java 中的 for 循环中一样)。
<c:forEach items="#{yourBean.map}" var="entry">
<li>Key: #{entry.key}, value: #{entry.value}</li>
</c:forEach>
<h:dataTable>(和<ui:repeat>)仅支持List(JSF 2.2 将支持Collection)。您可以将所有键复制到单独的 List 中,然后对其进行迭代,然后使用迭代的键在 EL 中使用 [] 获取关联的值。
private Map<String, String> map;
private List<String> keyList;
public void someMethodWhereMapIsCreated() {
map = createItSomeHow();
keyList = new ArrayList<String>(map.keySet());
}
public Map<String, String> getMap(){
return map;
}
public List<String> getKeyList(){
return keyList;
}
<h:dataTable value="#{yourBean.keyList}" var="key">
<h:column>
Key: #{key}
</h:column>
<h:column>
Value: #{yourBean.map[key]}
</h:column>
</h:dataTable>
注意HashMap 本质上是无序的。如果您想保持插入顺序,例如使用List,请改用LinkedHashMap。
【讨论】: