【问题标题】:Rendering 2D array without <h:dataTable/>渲染没有 <h:dataTable/> 的二维数组
【发布时间】:2013-01-08 14:34:27
【问题描述】:

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

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


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

&lt;c:forEach/&gt; 被调用时,数组(@ViewScoped bean 的属性)始终为空,即使我强制创建数组:

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

initializeMatrix() 方法从数据库中获取相应的数据并调用创建二维数组的逻辑,使loadedMatrix 在创建后引用它(所有这些都有效,没有异常或错误)。当initializeMatrix 结束时,loadedMatrix 仍然是null

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


我的问题是:在知道我正在渲染的索引的同时,我有哪些替代方法可以将 2D 数组的内容渲染为表格?

提前致谢

【问题讨论】:

    标签: jsf-2 multidimensional-array


    【解决方案1】:

    您可以使用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>
    

    【讨论】:

    • 我对 ViewScope + JSTL 组合产生了同样的怀疑,特别是在阅读了一些关于 JSTL 中“我们认为他们做什么”和“他们实际做什么”之间差异的文章之后。我错过了这样一个事实,即我能够将第一级用作嵌套 ui:repeat 的值!我会马上试试这个,看看我能不能让它工作......很难,我仍然需要知道当前索引才能正确标记表格。
    • 我修改为向您展示如何获取当前 ui:repeat 的索引。 varStatus 属性保存该信息,但如果您指的是另一个索引,请忽略这部分 =)
    • 我正在尝试这样做。 +1 速度和实用性。
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多