具有动态列的数据表

Posted

技术标签:

【中文标题】具有动态列的数据表【英文标题】:DataTable with dynamic columns 【发布时间】:2011-02-26 11:03:46 【问题描述】:

我对 JSF 完全陌生,只是尝试进行概念验证来确定它是否对项目有用。我的 POC 仅由一个页面和一个包含一些数据的表格组成。

列数(以及行数)是动态的,在页面呈现之前从数据库加载。

如下所示,我得到了两个具有适当行数的静态列,正如我所期望的那样:

<h:dataTable id="data" value="#viewDataBean.dataRows" var="row">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Col 1"/>
        </f:facet>
        <h:outputText value="#row.values[0].value"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Col 2"/>
        </f:facet>
        <h:outputText value="#row.values[1].value"/>
    </h:column>
</h:dataTable>

我想做的是在一组 &lt;h:column&gt;...&lt;/h:column&gt; 标记周围添加一个 &lt;c:forEach...&gt;,以迭代列数,但这不起作用 - 我尝试了多种组合,但我期待这样的事情:

<h:dataTable id="data" value="#viewDataBean.dataRows" var="row">
    <c:forEach items="#row.values" var="val">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Col 1"/>
            </f:facet>
            <h:outputText value="#val.value"/>
        </h:column>
    </c:forEach>
</h:dataTable>

从谷歌搜索中,我读到了各种模糊的 cmets,例如“这不是这样做的方法”,但我无法找到任何特别引人注目的正确方法示例。有人提到在支持 bean 中构建 DataTable,但我能找到的唯一示例是 http://forums.sun.com/thread.jspa?threadID=577589。它有效,但感觉有点笨拙,尤其是因为使用的某些方法已被弃用。

目前,我似乎不太可能使用核心 JSF 以外的任何库,但如果绝对必要的话,这可能会改变。任何人都可以阐明正确的方法吗?看起来应该很简单,所以我确定我只是遗漏了一些明显的东西。

【问题讨论】:

【参考方案1】:

JSTL 和 JSF 不会像您对编码所期望的那样同步运行。更多的是JSTL先从上到下先处理整个页面,然后将结果交给JSF做进一步处理。 #row 在 JSTL 忙时不可用,因此您的尝试确实行不通。

链接的主题确实提到了不推荐使用的方法,但该主题也已过时并讨论了遗留 JSF 1.0/1.1。如果您浏览所提到方法的当前 Javadocs,您会看到 - 像往常一样 - 提到了替换方法。例如,Application#createValueBinding() 提到以下内容:

已弃用。这已被替换为调用getExpressionFactory() 然后ExpressionFactory.createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class)

您可以在this article 中找到一些以这种方式动态填充数据表的具体示例。

至于第 3 方组件库,RichFaces 有一个 rich:columns 组件,正是为此目的而设计的。

【讨论】:

【参考方案2】:

第三方库 PrimeFaces 具有 p:columns 组件,用于从数据源动态生成列。

【讨论】:

以上是关于具有动态列的数据表的主要内容,如果未能解决你的问题,请参考以下文章

具有动态列的 MySQL 数据透视表查询

具有动态列的 MySQL 数据透视表查询

ASP.Net MVC:具有动态列的 Jquery 数据表与 JSON 绑定

WPF DataGrid 将单元格绑定到具有动态列的数据模型

SQL Server 中具有动态列的数据透视表

导入具有动态列的文件