在没有<h:datatable> </h:datatable>的情况下渲染2D数组

时间:2013-01-08 14:34:28

标签: jsf-2 multidimensional-array

我试图将2D数组显示为页面中的表格。我知道这听起来好像我正在重新发明轮子,但我必须处理的对象是一个自定义类型的2D数组,也必须以特定方式呈现(总是相同)。

棘手的部分是这个2D数组在某些索引中可以有空值。在这些情况下,特定的&#34;不可用&#34;必须渲染单元格。表格结构(是...... <table> <tr><td>)已由设计团队定义并由客户接受。


我尝试使用<c:forEach/>,但由于JSTL和JSF标记的管理顺序,因此在尝试使其工作时遇到了麻烦。处理JSF标记时,存在一些问题,包括过时的值和缺少的组件。

当调用@ViewScoped时,即使我强制创建数组,数组(<c:forEach/> bean的属性)也始终为null:

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

initializeMatrix()方法从数据库中获取相应的数据并调用创建2D数组的逻辑,使loadedMatrix在创建后引用它(所有这些都有效,没有例外)或错误)。 initializeMatrix完成后,loadedMatrix仍为null

我选择了嵌套<c:forEach/>选项,因为我需要管理表的索引以了解要呈现的内容(如果对象为null,可用性标志设置为false或者是否可以正常呈现),但就目前而言,我认为最安全的解决方案是创建一个自定义组件。


我的问题是:在了解我正在渲染的索引的同时,我还有什么方法可以将2D数组的内容呈现为表格。

提前致谢

1 个答案:

答案 0 :(得分: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>