根据哈希映射列表动态生成h:列

时间:2012-11-01 12:13:58

标签: jsf dynamic jsf-2 datatable

在我的应用程序中,我想显示一个带有托管bean属性的<h:dataTable>。目前,此表是从List<Folder>创建的。现在我想将Folder更改为更具动态性的内容。那是因为如果我决定稍后添加另一个字段,我不想更改Folder类。我只需要在Map<String, Object>中添加另一个条目,而不是在Folder中引入新字段。

那么,是否可以将List<Map<String, Object>>绑定到<h:dataTable>

1 个答案:

答案 0 :(得分:5)

  

是否可以将HashMaps列表绑定到jsf组件h:dataTable?

只有在您使用视图构建时标记(例如JSTL <h:column>)生成必要的<c:forEach>标记时,才有可能。

这是一个具体的启动示例,假设您的环境支持EL 2.2:

<h:dataTable value="#{bean.listOfMaps}" var="map">
    <c:forEach items="#{bean.listOfMaps[0].keySet().toArray()}" var="key">
        <h:column>
            #{map[key]}
        </h:column> 
    </c:forEach>
</h:dataTable>

(如果您的环境不支持EL 2.2,则需要提供另一个getter,它将地图密钥设置为String[]List<String>;同时请记住HashMap本质上是无序的,您可能希望使用LinkedHashMap代替维护广告订单)

当您使用早于2.1.18的Mojarra版本时,缺点是#{bean}必须是请求范围(不是视图范围)。或者至少,<c:forEach items>应该引用请求范围的bean。当视图范围不可用时,在视图构建期间运行<c:forEach>时,将在每个HTTP请求上重新创建视图范围的bean。如果您绝对需要<h:dataTable>的视图范围bean,那么您始终可以专门为<c:forEach items>创建一个单独的请求范围bean。解决方案是升级到Mojarra 2.1.18或更新版本。有关某些背景信息,另请参阅JSTL in JSF2 Facelets... makes sense?

PrimeFaces等JSF组件库可能会提供<x:columns>标记,这样可以更加轻松,例如<p:dataTable> with <p:columns>

<p:dataTable value="#{bean.listOfMaps}" var="map">
    <p:columns value="#{bean.listOfMaps[0].keySet().toArray()}" var="key">
        #{map[key]}
    </p:columns>
</p:dataTable>