【问题标题】:c:forEach inside primefaces(e.g. p:panelgrid) inside ui:repeatc:forEach 里面 primefaces(例如 p:panelgrid) inside ui:repeat
【发布时间】:2014-02-11 08:49:47
【问题描述】:

我必须动态生成一个表格列表。每一个都有可变数量的列(具有固定的行)。

要执行此操作,我首先将<p:panelGrid> 放入<ui:repeat>:所以我正确地生成了一个表列表。

然后,为了动态地生成列,我尝试将<ui:repeat><c:forEach> 放在<p:panelGrid> 内。结果我没有得到任何行。

我在这里写了一个最小的例子。在 bean testBackingBean 中,我已经定义(并初始化)了变量 ArrayList<ArrayList<String>> tables。这是没有产生预期结果的 xhtml:

<ui:repeat var="table" value="#{testBackingBean.tables}">
    <p:panelGrid>
        <f:facet name="header">
            <p:row>
                <p:column >header of #{table}</p:column>
            </p:row>
        </f:facet>
        <p:row>
            <c:forEach var="row" items="${table}">
                <p:column>#{row}</p:column>
            </c:forEach>
        </p:row>
    </p:panelGrid>
</ui:repeat>

值得注意的是,标题行正确地将#{table} 转换为字符串。问题是我看不到任何数据行。

另外,如果我使用&lt;table&gt; 而不是&lt;p:panelGrid&gt;,一切都会按预期工作。

另外,我尝试了 &lt;c:forEach&gt;&lt;ui:repeat&gt; 的不同排列,但没有成功。

那么,我怎样才能动态地生成更多的表格(使用素面)并设置动态的列数?

谢谢!

编辑:我想使用两个&lt;c:forEach&gt;,但即使只有一个&lt;c:forEach&gt;,我也会得到一个空结果。事实上,如果我尝试以下 xhtml:

<c:forEach  items="${testBackingBean.tables}" var="tabella">
    current element: #{tabella}
</c:forEach>

然后我得到一个空的结果。 (我知道,这是一个不同的问题)

【问题讨论】:

    标签: jsf jsf-2 primefaces panelgrid


    【解决方案1】:

    从 XHTML 源代码到生成的 HTML 输出的转换是一个两步过程。

    1. 首先,在视图构建期间,XHTML 源代码被解析并转入代表 JSF UI 组件树的 Java UIComponent 实例树中,FacesContext#getViewRoot() 提供。

    2. 然后,在视图渲染期间,JSF UI 组件树生成 HTML 输出并将其写入 HTTP 响应,从 UIViewRoot#encodeAll() 方法开始。

    Taghandlers 与所有 JSTL &lt;c:xxx&gt; 标记、几个 JSF &lt;f:xxx&gt; 标记和只有几个 Facelets &lt;ui:xxx&gt; 标记一样在视图构建期间运行。 UI components 与所有 JSF &lt;h:xxx&gt; 标签、几个 Facelets &lt;ui:xxx&gt; 标签和只有少数 JSF &lt;f:xxx&gt; 标签一样在视图渲染期间运行。

    The &lt;c:forEach&gt; is a taghandlerthe &lt;ui:repeat&gt; is an UI component

    换句话说,在 &lt;c:forEach&gt; 中声明的 UI 组件在视图构建期间基于 &lt;c:forEach items&gt; 在 JSF 组件树中重新创建多次,这反过来又在视图渲染期间分别生成各自的 HTML 输出。在 &lt;ui:repeat&gt; 中声明的 UI 组件在视图构建期间仅在 JSF 组件树中创建一次,而在视图渲染期间基于 &lt;ui:repeat value&gt; 重复使用多次以生成 HTML 输出。

    您的具体问题是由于 &lt;ui:repeat var="table"&gt; 仅在视图渲染期间可用,而不是在视图构建期间可用。 &lt;c:forEach&gt; 基本上是在视图构建期间将要运行时检索 #{null} 作为值。

    您可以通过将外部&lt;ui:repeat&gt; 替换为&lt;c:forEach&gt; 来解决此问题。虽然我想知道您是否不能更好地使用&lt;ui:repeat&gt;&lt;p:dataTable&gt;&lt;p:columns&gt;

    另见:

    【讨论】:

    • 感谢您的快速回复。我将尝试使用动态列 &lt;p:dataTable&gt;。顺便说一句,如果我使用两个 c:forEach 则不会生成 panelGroups。
    • 现在我看到 &lt;p:dataTable&gt; 想要一个具有属性数组的 single bean。不幸的是,我的数据结构是一个 bean 数组,每个都有一些属性。
    • 感谢您的解释 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-06-29
    • 2011-04-02
    • 2014-02-04
    • 2012-01-02
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多