0

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

棘手的部分是这个二维数组在它的一些索引中可以有空值。在这些情况下,必须呈现特定的“不可用”单元格。表结构(是的......<table> <tr><td>)已经由设计团队定义并被客户接受。


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

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

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

initializeMatrix()方法从数据库中获取相应的数据并调用创建二维数组的逻辑,loadedMatrix一旦创建就引用它(所有这些都有效,没有异常或错误)。initializeMatrix结束时,loadedMatrix静止null

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


我的问题是:在知道我正在渲染的索引的同时,我必须将二维数组的内容渲染为表格吗?

提前致谢

4

1 回答 1

3

您可以使用ui:repeat代替c:forEach,我自己尝试了一个示例,它对我有用。c:foreach是一个标签处理程序,请查看@BalusC 的以下帖子,以了解更多关于为什么不应该将标签处理程序与视图范围的 bean 一起使用的信息。

JSF2 Facelets 中的 JSTL...有意义吗?

<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>
于 2013-01-08T15:54:11.123 回答