【问题标题】:How to show hashmap values in jsf?如何在 jsf 中显示 hashmap 值?
【发布时间】:2011-05-14 12:13:07
【问题描述】:

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

【问题讨论】:

  • (@Aram:你需要在普通文本和代码块之间放一个空行,否则格式不正确)
  • @Mat:好的,谢谢。我不知道。

标签: java jsf hashmap uirepeat


【解决方案1】:

这确实是一个主要的皮塔饼。 &lt;c:forEach&gt; 长期支持 Map。除了按照 McDowell 的建议提供另一个 getter 之外,您还可以通过 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(由 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:这是一个 EL 函数:stackoverflow.com/questions/7079978/… 就像 JSTL 函数一样。 OmniFacesof 命名空间中也有一些,请参阅of:mapToList()
【解决方案2】:

来自documentationrepeat 值属性:

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

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

【讨论】:

  • @Aram Gevorgyan - 与dataTable 一样,repeat 是一个基于索引的组件(参见 offsetsize 属性)。 Adam Winer(JSF 专家组的成员)在这里讨论了一个类似的案例:Using Sets with UIData
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2015-08-27
  • 2011-10-30
  • 2013-01-19
  • 2015-05-12
  • 2012-12-12
相关资源
最近更新 更多