ОБНОВЛЕНИЕ: JSF 2.3 (с 2017 года) поддерживает это из коробки .
К сожалению, UIData
и UIRepeat
не поддерживают итерации по карте в JSF.
Если это вас беспокоит (я полагаю, это так), пожалуйста, проголосуйте за следующую проблему и, если возможно, оставьте комментарий, который объясняет, как вы к этому относитесь:
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479
А пока вы можете перебирать карту с помощью небольшого вспомогательного кода:
/**
* Converts a Map to a List filled with its entries. This is needed since
* very few if any JSF iteration components are able to iterate over a map.
*/
public static <T, S> List<Map.Entry<T, S>> mapToList(Map<T, S> map) {
if (map == null) {
return null;
}
List<Map.Entry<T, S>> list = new ArrayList<Map.Entry<T, S>>();
list.addAll(map.entrySet());
return list;
}
Затем определите функцию EL в файле *-taglib.xml
следующим образом:
<namespace>http://example.com/util</namespace>
<function>
<function-name>mapToList</function-name>
<function-class>com.example.SomeClass</function-class>
<function-signature>java.util.List mapToList(java.util.Map)</function-signature>
</function>
И, наконец, используйте его на Facelet, как это:
<html xmlns:util="http://example.com/util">
<ui:repeat value="#{util:mapToList(someDate)}" var="entry" >
Key = #{entry.key} Value = #{entry.value} <br/>
</ui:repeat>