Я хотел бы отображать клавиши HashMap и связанное с ним значение в интерфейсе JSF.
Как я могу это достичь? Как я могу выполнять итерацию по HashMap на странице JSF с помощью некоторого компонента итератора, такого как <h:datatable>?
Я хотел бы отображать клавиши HashMap и связанное с ним значение в интерфейсе JSF.
Как я могу это достичь? Как я могу выполнять итерацию по HashMap на странице JSF с помощью некоторого компонента итератора, такого как <h:datatable>?
Только <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>
Отмечается, что a HashMap по своей природе неупорядочен. Если вы хотите сохранить порядок вставки, например, как List, вместо этого используйте LinkedHashMap.
С помощью <ui:repeat> (JSF 2.2 и выше):
<ui:repeat var="entry" value="#{map.entrySet().toArray()}">
key:#{entry.key}, Id: #{entry.value.id}
</ui:repeat>