2010-06-01 75 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組件用於從數據源動態生成列。