Как показать значения hashmap в jsf? - PullRequest
9 голосов
/ 14 мая 2011

У меня есть бин "MyBean", который имеет свойство HashMap - "map", типом значений которого является MyClass Я хочу показать некоторые свойства карты в jsf, используя ui: repeat. Но эти коды:

<ui:repeat  var="var"  value="#{mybean.map}" >
<tr> 
<td> <h:outputText value="#{var.value.property1}"></h:outputText> </td>
<td><h:outputText value="#{var.value.property2}"></h:outputText></td>
</tr>
</ui:repeat>

Но этот код ничего не показывал. Хотя, когда я пытаюсь показать значения hashmap в jsp таким образом, это было успешно. Где я не прав? И как это исправить?

Ответы [ 2 ]

25 голосов
/ 14 мая 2011

Это действительно большая пита.<c:forEach> поддерживается Map долго.Помимо предоставления другого геттера, предложенного Макдауэллом, вы также можете обойти это с помощью пользовательской функции EL .

<ui:repeat value="#{util:toList(bean.map)}" var="entry">
    #{entry.key} = #{entry.value} <br/>
</ui:repeat>

, где функция EL выглядит следующим образом

public static List<Map.Entry<?, ?>> toList(Map<?, ?> map) {
    return = map != null ? new ArrayList<Map.Entry<?,?>>(map.entrySet()) : null;
}

Или, если вы уже используете EL 2.2 (предоставляется серверами, совместимыми с Servlet 3.0, такими как Glassfish 3, Tomcat 7 и т. Д.), Просто используйте Map#entrySet(), а затем Set#toArray().

<ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry">
    #{entry.key} = #{entry.value} <br/>
</ui:repeat>
5 голосов
/ 14 мая 2011

Из документации для атрибута значения repeat:

Имя коллекции элементов, для которой этот тег повторяется. Коллекция может быть List, массивом java.sql.ResultSet или отдельным java Object. Если коллекция пуста, этот тег ничего не делает.

Итак, var установлен как HashMap, и EL пытается найти ключ "value" на нем. Вам нужно будет выставить вашу запись, установленную как List.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...