4

在我的应用程序中,我想显示一个<h:dataTable>托管 bean 属性。目前,此表是从List<Folder>. 现在我想把它改成Folder更动态的东西。Folder那是因为如果我决定稍后添加另一个字段,我不想更改类。我只需要在 中添加另一个条目,Map<String, Object>而不是在Folder.

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

4

1 回答 1

5

是否可以将 HashMap 列表绑定到 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>

(如果您的环境不支持 EL 2.2,您需要提供另一个 getter,它将映射键集返回为 a String[]or List<String>;还要记住 aHashMap本质上是无序的,您可能希望使用它LinkedHashMap来维护插入顺序)

当您使用早于 2.1.18 的 Mojarra 版本时,缺点是#{bean}必须是请求范围(而不是视图范围)。或者至少,<c:forEach items>应该引用一个请求范围的 bean。<c:forEach>否则,当视图范围尚不可用时,视图范围 bean 将在视图构建期间运行时在每个单个 HTTP 请求上重新创建。如果您绝对需要一个视图范围的 bean <h:dataTable>,那么您总是可以专门为<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>
于 2012-11-01T12:40:30.517 回答