Jsf 2 不使用<;渲染二维阵列;h:dataTable/>;

Jsf 2 不使用<;渲染二维阵列;h:dataTable/>;,jsf-2,multidimensional-array,Jsf 2,Multidimensional Array,我正在尝试将2D数组显示为页面中的表。我知道这听起来像是我在重新发明轮子,但我必须处理的对象是一个自定义类型的2D数组,它也必须以特定的方式呈现(始终相同) 棘手的是,这个2D数组的某些索引中可能有空值。在这些情况下,必须呈现特定的“不可用”单元格。表结构(是…和)已经由设计团队定义,并得到客户的认可 我曾尝试使用,但由于JSTL和JSF标记的管理顺序,在尝试使其工作时遇到了麻烦。处理JSF标记时,会出现一些问题,包括过时的值和缺少的组件 调用时,数组(@ViewScopedbean的属性)始

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

棘手的是,这个2D数组的某些索引中可能有空值。在这些情况下,必须呈现特定的“不可用”单元格。表结构(是…
)已经由设计团队定义,并得到客户的认可


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

调用
时,数组(
@ViewScoped
bean的属性)始终为空,即使我强制创建数组:

public MyObject[][] getMatrix() {
    if(loadedMatrix == null)
        initializeMatrix();
    return loadedMatrix.getTable();
}
initializeMatrix()
方法从数据库获取相应的数据,并调用创建2D数组的逻辑,使
loadedMatrix
在创建后引用它(所有这些都有效,没有异常或错误)。当
initializeMatrix
完成时,
loadedMatrix
仍为
null

我选择了嵌套的
选项,因为我需要管理表的索引,以知道要呈现什么(如果对象为null,将可用性标志设置为false,或者是否可以正常呈现),但目前我认为最安全的解决方案是创建自定义组件


我的问题是:在知道正在呈现的索引的情况下,我必须以表的形式呈现2D数组的内容,有哪些替代方案


提前感谢

您可以使用
ui:repeat
而不是
c:forEach
,我用一个示例自己尝试了一下,它对我有效
c:foreach
是一个标记处理程序,请查看@BalusC的以下帖子,了解为什么不应将标记处理程序与视图范围的bean一起使用


#{vs.index}-#{secondLevel}
空的

您可以使用
ui:repeat
而不是
c:forEach
,我用一个示例自己尝试了一下,它对我有效
c:foreach
是一个标记处理程序,请查看@BalusC的以下帖子,了解为什么不应将标记处理程序与视图范围的bean一起使用


#{vs.index}-#{secondLevel}
空的

我对ViewScope+JSTL组合也有同样的怀疑,尤其是在阅读了一些关于JSTL中“我们认为他们做什么”和“他们实际做什么”之间差异的文章之后。我忽略了一个事实,即我能够使用第一个级别作为嵌套ui的值:repeat!我马上就试试这个,看看能不能用上。。。我仍然需要知道一个当前索引才能正确地标记表。我修改了“回答”以向您展示如何获取ui的当前索引:重复。varStatus属性保存该信息,但如果您指的是另一个索引,请忽略此部分=)我正是这么做的+我对ViewScope+JSTL组合也有同样的怀疑,尤其是在阅读了一些关于JSTL中“我们认为他们做什么”和“他们实际做什么”之间差异的文章之后。我忽略了一个事实,即我能够使用第一个级别作为嵌套ui的值:repeat!我马上就试试这个,看看能不能用上。。。我仍然需要知道一个当前索引才能正确地标记表。我修改了“回答”以向您展示如何获取ui的当前索引:重复。varStatus属性保存该信息,但如果您指的是另一个索引,请忽略此部分=)我正是这么做的+1.速度和实用性。
<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>