如何在JSF中显示哈希表的值?

9

我有一个名为"MyBean"的bean,它有一个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值时,它是成功的。我错在哪里?如何修复这个问题?


以下是有关编程的内容:我们需要在代码中添加一些新功能。这将涉及到修改现有代码、创建新类和函数,以及对数据库进行更改。为此,我们将采用敏捷开发方法,在小组中分配任务,并定期举行 SCRUM 会议。我们还将利用持续集成工具来确保代码的质量和稳定性。最后,我们将进行单元测试和集成测试,以确保新功能与现有系统完全兼容。 - Mat
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>

嗨,BalusC,你的语法 #{util:toList(bean.map)}util 是托管 bean 吗,BalusC?我以前从未见过这种语法。 - Thang Pham
@Thang:这是一个EL函数:https://dev59.com/qmw05IYBdhLWcg3wsz7N#7080174 它类似于JSTL函数。OmniFaces也在of命名空间中提供了一些函数,例如of:mapToList() - BalusC

6
根据 repeat 值属性的文档:

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

因此,将var设置为你的HashMap,并尝试在其上查找键"value"。你需要将entry set公开为List

@Aram Gevorgyan - 就像 dataTable 一样,repeat 是一个基于索引的组件(请参见 offsetsize 属性)。Adam Winer(曾在 JSF 专家组中)在这里讨论了类似的情况:Using Sets with UIData - McDowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接