2010-06-01 40 views
15

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

从谷歌搜索,我读过的各种含糊的评论像'那不是这样做',但是我一直无法找到正确方法的特别引人注目的例子。有人提到在backing bean中构建DataTable,但我能找到的唯一例子是http://forums.sun.com/thread.jspa?threadID=577589。它的工作,但感觉有点笨拙,特别是因为使用的一些方法已被弃用。

目前,看起来我不太可能会使用除核心JSF以外的任何库,但如果绝对必要的话可能会更改。任何人都可以通过正确的方式解决问题吗?它看起来应该很简单,所以我确信我只是想念一些明显的东西。

回答

12

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

链接的主题确实提到了不推荐使用的方法,但该主题也是老化并讨论了传统的JSF 1.0/1.1。如果您探索上述方法的当前Javadoc,您会看到 - 通常 - 提到了替换方法。例如,Application#createValueBinding()提到下列:

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

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

对于第三方组件库,RichFaces有一个专门用于此目的的rich:columns组件。

0

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