在ui:repeat中嵌套primefaces的c:forEach(例如p:panelgrid)

5
我需要动态生成一个表格列表。每个表格都有可变数量的列(行数固定)。
为了实现这个目标,我首先把一个 <p:panelGrid> 放在一个 <ui:repeat> 中:这样我正确地生成了一个表格列表。
然后,为了动态生成列,我尝试在 <p:panelGrid> 中放置 <ui:repeat><c:forEach>。结果没有显示任何行。
在这里我写了一个最小化示例。在名为 testBackingBean 的 bean 中,我定义了(并初始化了)变量 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>,但都没有成功。
那么,如何使用prime-faces动态生成更多的表格并设置动态列数?
谢谢!
编辑:我想使用两个<c:forEach>,但即使只有一个<c:forEach>,我也得到了一个空结果。实际上,如果我尝试以下xhtml:
<c:forEach  items="${testBackingBean.tables}" var="tabella">
    current element: #{tabella}
</c:forEach>

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

13
The transition from the XHTML source code to the generated HTML output is a two-step process.
1. 首先,在视图构建期间,XHTML源代码会被解析并转换为Java的UIComponent实例树,表示JSF UI组件树,可通过FacesContext#getViewRoot()获取。 2. 然后,在视图呈现期间,JSF UI组件树生成HTML输出,并将其写入HTTP响应,从UIViewRoot#encodeAll()方法开始。

Taghandlers 像所有的 JSTL <c:xxx> 标签、一些 JSF <f:xxx> 标签和仅有少数的 Facelets <ui:xxx> 标签在视图构建时运行。UI components 像所有的 JSF <h:xxx> 标签、一些 Facelets <ui:xxx> 标签和仅有少数的 JSF <f:xxx> 标签在视图渲染时运行。

<c:forEach>是一个标签处理器<ui:repeat>是一个UI组件

换句话说,在<c:forEach items>期间,声明在其中的UI组件会基于JSF组件树在视图构建时被多次重建,因此在视图渲染时它们各自产生自己的HTML输出。在<ui:repeat value>的基础上,声明在其中的UI组件仅在JSF组件树中在视图构建时被创建一次,并在视图渲染时基于<ui:repeat>被多次重用以产生HTML输出。

您的具体问题是由于<ui:repeat var="table">仅在视图渲染时可用,而不是在视图构建时可用所致。当<c:forEach>在视图构建期间运行时,它基本上检索到一个#{null}值。
您可以通过将外部的<ui:repeat>替换为<c:forEach>来解决此问题。尽管我想知道您是否不能更好地使用<ui:repeat><p:dataTable><p:columns>
另请参阅:

感谢您的快速回复。我将尝试使用动态列的<p:dataTable>。顺便说一下,如果我使用两个c:forEach,那么panelGroup将不会被生成。 - Antonio Ragagnin
现在我发现<p:dataTable>需要一个具有属性数组的单个bean。不幸的是,我的数据结构是由一组具有某些属性的bean组成的数组。 - Antonio Ragagnin
谢谢你的解释 :) - aimhaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接