9

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

<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 值时,它是成功的。我哪里错了?以及如何解决这个问题?

4

2 回答 2

26

这确实是一个主要的皮塔饼。长期<c:forEach>支持。Map除了按照 McDowell 的建议提供另一个 getter 之外,您还可以通过自定义 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>
于 2011-05-14T13:55:32.613 回答
6

从value 属性的文档中:repeat

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

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

于 2011-05-14T12:22:54.333 回答