如何在jsf中显示hashmap值?

时间:2011-05-14 12:13:07

标签: java jsf hashmap uirepeat

我有bean“MyBean”,它有属性HashMap - “map”,其值类型是MyClass。我想使用ui:repeat在jsf中显示map的一些属性。 但是这些代码:

<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>

但是这段代码没有显示任何内容。虽然当我尝试以这种方式在jsp中显示hashmap值时,它是成功的。哪里错了?如何解决这个问题?

2 个答案:

答案 0 :(得分:25)

这确实是一个主要的皮塔饼。 <c:forEach>支持Map很长时间了。除了提供McDowell建议的另一个吸气剂之外,您还可以通过custom EL function来解决这个问题。

<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(由Servfish 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>

答案 1 :(得分:5)

来自repeat值属性的documentation

  

此标记迭代的项目集合的名称。该集合可以是List,数组,java.sql.ResultSet或单个java Object。如果集合为null,则此标记不执行任何操作。

因此,var设置为HashMap,EL尝试在其上查找键"value"。您需要将条目集公开为List