2013-01-08 39 views
0

我試圖顯示一個2D數組作爲一個頁面中的表。我知道這聽起來好像我重新發明了輪子,但是我必須處理的對象是一個自定義類型的二維數組,它也必須以特定方式呈現(始終相同)。呈現2D陣列沒有<h:dataTable />

棘手的部分是,這個二維數組在其某些索引中可能具有空值。在這些情況下,必須呈現特定的「不可用」單元格。表結構(是... <table><tr><td>)已經由設計團隊定義並被客戶接受。


我試着使用<c:forEach/>但得到了麻煩,因爲試圖在JSTL和JSF標籤管理的秩序,使其工作。處理JSF標記時,會出現一些問題,包括過期的值和缺少的組件。

陣列(一個@ViewScoped豆的屬性)始終爲空時<c:forEach/>被調用時,甚至當我迫使陣列的創建:

public MyObject[][] getMatrix() { 
    if(loadedMatrix == null) 
     initializeMatrix(); 
    return loadedMatrix.getTable(); 
} 

initializeMatrix()方法從數據庫獲取,並調用相應的數據創建二維數組的邏輯,使loadedMatrix一旦創建就可以引用它(所有這些工作,沒有例外或錯誤)。當initializeMatrix完成時,loadedMatrix仍然是null

我去嵌套<c:forEach/>選項,因爲我需要管理表的索引,以知道要呈現什麼(如果對象爲空,有一個可用性標誌設置爲false或如果它可以正常呈現),但至於現在我認爲最安全的解決方案是創建一個自定義組件。


我的問題是:做什麼選擇我有一個二維數組的內容呈現爲一個表,同時意識到我渲染指標?

在此先感謝

回答

3

可以使用ui:repeat代替c:forEach,我想自己一個樣本,它爲我工作。 c:foreach是一個標籤處理程序,請看看@BalusC的以下帖子,以瞭解更多關於爲什麼您不應該將標籤處理程序與視圖範圍的bean一起使用。

JSTL in JSF2 Facelets... makes sense?

<table> 
<ui:repeat value="#{sampleBean.twodarray}" var="firstLevel" varStatus=#{vs}> 
    <tr> 
    <ui:repeat value="#{firstLevel}" var="secondLevel" rendered="#{!empty firstLevel}"> 
     <td>#{vs.index} - #{secondLevel}</td> 
    </ui:repeat> 
    <h:panelGroup rendered="#{empty firstLevel}"> 
     <td colspan="3">empty</td> 
    </h:panelGroup> 
    </tr> 
</ui:repeat> 
</table> 
+0

我懷疑很多有關ViewScope + JSTL的組合,尤其是閱讀有關JSTL之間「我們認爲他們做什麼」和「他們實際上做」的差別一些文章之後。我錯過了能夠使用第一層作爲嵌套ui的值的事實:重複!我會立即嘗試這一個,看看我是否能夠實現它......艱難的我仍然需要知道一個當前的索引來正確地標記表。 – Gamb

+0

我修改後回答,以向您展示如何獲取當前ui的索引:repeat。 varStatus屬性保存該信息,但如果你的意思是另一個索引,只需忽略這部分=) – cubbuk

+0

我正在嘗試。 +1的速度和實用性。 – Gamb