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

nic*_*510 4 datatable jsf dynamic jsf-2

在我的应用程序中,我想显示一个<h:dataTable>带有托管bean的属性.目前这个表是从a创建的List<Folder>.现在我想改变Folder一些更有活力的东西.那是因为Folder如果我决定稍后添加另一个字段,我不想更改该类.我只需要添加另一个条目Map<String, Object>而不是引入一个新字段Folder.

那么,是否有可能绑定List<Map<String, Object>><h:dataTable>

Bal*_*usC 5

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

只有在<h:column>使用视图构建时标记(如JSTL)生成必要的标记时,才有可能<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>
Run Code Online (Sandbox Code Playgroud)

(如果你的环境不支持EL 2.2,你需要提供另一个getter,它将map键设置为a String[]或者List<String>;同时请记住a HashMap本质上是无序的,你可能想要使用它LinkedHashMap来维护插入顺序)

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

JSF组件库如PrimeFaces可以提供一个<x:columns>标签,这使得这更容易,如<p:dataTable><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>
Run Code Online (Sandbox Code Playgroud)