Вывести коллекцию карт в гранях JSF 2

Я видел пару других примеров на SO, обсуждая некоторые странные обходные пути, но ни один из них не работает, и все они были рассмотрены в версиях до JSF 2. Итак, можно ли просто выводить ключи карты? Я пробовал ui: repeat и c: forEach, как показано ниже, без везения:

<c:forEach items="${myBean.myMap.keySet}" var="var">
   <h:outputText value="#{var}"/>
</c:forEach>

Ответ 1

Из вашего кода:

<c:forEach items="${myBean.myMap.keySet}" var="var">

Это не сработает. Для этого требуется getKeySet() метод интерфейс Map, но его нет.

Если ваша среда поддерживает EL 2.2 (контейнеры Servlet 3.0, такие как Tomcat 7, Glassfish 3 и т.д.), вы должны вызывать метод keySet() напрямую, а не называть его как свойство:

<c:forEach items="#{myBean.myMap.keySet()}" var="key">
    <h:outputText value="#{key}"/>
</c:forEach>

Или, если ваша среда еще не поддерживает EL 2.2, вы должны непосредственно перебирать непосредственно карту, которая дает Map.Entry экземпляр на каждой итерации, которая, в свою очередь, имеет getKey() метод, поэтому это также должно быть сделано:

<c:forEach items="#{myBean.myMap}" var="entry">
    <h:outputText value="#{entry.key}"/>
</c:forEach>

Ни одно из выше не работает с <ui:repeat>, поскольку оно не поддерживает Map и Set. Он поддерживает только List и массив. Разница между <c:forEach> и <ui:repeat> заключается в том, что <c:forEach> генерирует несколько компонентов JSF во время времени сборки и что <ui:repeat> создает один компонент JSF, который несколько раз генерирует свой вывод HTML во время просмотра рендеринга.

Ответ 2

Оказывается, правильный синтаксис для вывода ключей карты:

<ui:repeat value="#{myBean.myMap().keySet().toArray()}" var="var">
   <h:outputText value="#{var}"/><br/>
</ui:repeat>