5

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

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

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

我在这里写了一个最小的例子。在 beantestBackingBean中,我已经定义(并初始化)了变量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}为字符串。问题是我看不到任何数据行。

此外,如果我使用<table>而不是<p:panelGrid>一切都按预期工作。

此外,我尝试了不同的排列,<c:forEach><ui:repeat>没有成功。

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

谢谢!

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

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

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

4

1 回答 1

13

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

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

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

像所有 JSTL标记<c:xxx>、几个 JSF<f:xxx>标记和只有几个 Facelets<ui:xxx>标记一样的标记处理程序在视图构建时运行。UI 组件(如所有 JSF<h:xxx>标记、几个 Facelets<ui:xxx>标记和只有少数 JSF<f:xxx>标记)在视图呈现期间运行。

<c:forEach>是一个标记处理程序<ui:repeat>一个 UI 组件

换句话说,在内部声明的 UI 组件会<c:forEach>根据视图构建期间在 JSF 组件树中多次重新创建,<c:forEach items>这反过来又会在视图渲染期间分别生成各自的 HTML 输出。在内部声明的 UI 组件在视图构建期间仅在 JSF 组件树中创建一次,而这些组件又在视图渲染期间<ui:repeat>基于生成 HTML 输出而被多次重用。<ui:repeat value>

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

您可以通过将外部替换<ui:repeat><c:forEach>. 虽然我想知道你是否不能更好地使用它<ui:repeat><p:dataTable><p:columns>

也可以看看:

于 2014-02-11T09:26:26.330 回答