我有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值时,它是成功的。哪里错了?如何解决这个问题?
答案 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
或单个javaObject
。如果集合为null,则此标记不执行任何操作。
因此,var设置为HashMap
,EL尝试在其上查找键"value"
。您需要将条目集公开为List
。