【问题标题】:Iterating through List<Map<String, String>> in primefaces datatable?遍历 Primefaces 数据表中的 List<Map<String, String>>?
【发布时间】:2013-05-17 07:37:53
【问题描述】:

我正在尝试遍历 Map 项列表,即 HashMaps 的 ArrayList 或类似的东西,并且我正在尝试在 primefaces 数据表中执行此操作。这基本上就是我想要做的:

<body>
    <h:form>
        <p:dataTable value="#{customerBean.list}" var="map">
            <c:forEach items="#{map}" var="entry">
                <p:column headerText="#{entry.key}">
                    #{entry.value}
                </p:column>
            </c:forEach>
        </p:dataTable>
    </h:form>
</body>

在这种情况下,customerBean.list 是 List&lt;Map&lt;String, String&gt;&gt;,条目是 Map&lt;String, String&gt;。

我想要做的是根据Map&lt;String, String&gt; 中的条目数量创建动态数量的列,同时使用映射条目的键作为标题名称,并将值作为输出。当我使用硬编码的Map&lt;String, String&gt; 时,c:forEach 的东西似乎工作正常,但显然它不能循环遍历p:dataTable 的 var。我假设程序采取了预防措施,以避免遍历不同大小的地图。那么我怎样才能使这项工作呢?如何根据地图中的条目数量创建任意数量的列?请注意,我 100% 确定每个 Map&lt;String, String&gt; 在我的 List&lt;Map&lt;String, String&gt;&gt; 中的大小相同

编辑:

这是我的 bean 来源。代码工作正常,一切正常,问题只是循环不愿意通过我的地图:

@ManagedBean
@SessionScoped
public class CustomerBean {

    private List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    private Mapper mapper = new Mapper();

    public CustomerBean() {
        list = mapper.all(); //gets data from database
    }

    public List<Map<String, String>> getList() { 
        return list;
    }

    public void setList(List<Map<String, String>> list) { 
        this.list = list;
    } 
}

【问题讨论】:

标签: jsf loops map primefaces datatable


【解决方案1】:

该问题与此上下文中的 Map 用法无关。问题是你试图获得一个#{map} 变量,该变量仅在视图被呈现时可用,但你现在依赖于它的值正在构建视图。后者是在较早的生命周期阶段执行的,所以当你需要它时它基本上是不可用的。

不过,标签处理程序或视图构建标签,如 &lt;c:forEach&gt;,是填充可变列数的唯一方法,因为在构建组件树时会评估 &lt;p:column&gt;。

还有一点值得注意的是,绑定到&lt;c:forEach&gt;标签属性的bac​​king bean,比如items,必须是视图范围之外的任何东西,比如请求范围,否则它将在每次请求时重新创建,这会带来意外/不希望的结果,因为当您尝试访问其属性时,所需的 bean 不存在。还有一些其他的设置星座可以解决这个问题,但它们不是这里讨论的主题。

<p:dataTable value="#{customerBean.list}" var="map">
    <c:forEach items="#{forEachBean.columnsMap}" var="entry">
        <p:column headerText="#{entry.key}">
            #{map[entry.key]}
        </p:column>
    </c:forEach>
</p:dataTable>

另外值得注意的是,有一个帮助器&lt;p:columns&gt; 组件的作用大致相同。

【讨论】:

  • 我只是在 customerBean 本身中放置了一个包含列的变量。它就像一个魅力。我不知道可以按照您的方式访问地图的价值(#{map[entry.key]},但显然效果很好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2020-08-01
  • 2020-04-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多