如何在jsf中显示hashmap值?

Ara*_*yan 9 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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 26

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

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

EL功能看起来像这样

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

或者,如果您已经使用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>
Run Code Online (Sandbox Code Playgroud)


McD*_*ell 6

文档repeat价值属性:

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

因此,将var设置为您,HashMap并且EL尝试在其上查找键"value".您需要将输入集公开为List.