具有动态列的数据表

2022-09-03 15:16:26

我对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>

我想做的是添加一组标签,以迭代列数,但这不起作用 - 我尝试了各种组合,但我期望这样的东西起作用:<c:forEach...><h:column>...</h:column>

<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>

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

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


答案 1

JSTL 和 JSF 不会像您在编码中期望的那样同步运行。更重要的是,JSTL 首先从上到下处理整个页面,然后将结果交给 JSF 进行进一步处理。在 JSTL 繁忙时不可用,因此您的尝试确实不起作用。#{row}

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

已弃用。这已被调用getExpressionFactory()然后ExpressionFactory.createValueExpression(javax.el.ELContext,java.lang.String,java.lang.Class)所取代

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

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


答案 2

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