我必须动态地生成一个表列表。其中每个都有可变数量的列(具有固定的行)。
为了执行此操作,我首先输入 <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}
成字符串。问题是我没有看到任何数据行。
此外,如果我使用<table>
而不是 <p:panelGrid>
一切都按预期进行。
此外,我尝试了 <c:forEach>
的不同排列和<ui:repeat>
没有成功。
那么,我如何动态地生成更多表格(使用素面)并设置动态的列数?
谢谢!
编辑:我想使用两个 <c:forEach>
,但即使只有一个<c:forEach>
我得到一个空结果。事实上,如果我尝试以下 xhtml:
<c:forEach items="${testBackingBean.tables}" var="tabella">
current element: #{tabella}
</c:forEach>
然后我得到一个空结果。 (我知道,这是一个不同的问题)
最佳答案
从 XHTML 源代码到生成的 HTML 输出的转换分为两步。
首先,在 View 构建期间,XHTML 源代码被解析并转换为 Java
UIComponent
树。表示 JSF UI 组件树的实例,可通过FacesContext#getViewRoot()
获取。 .然后,在 View 渲染期间,JSF UI 组件树生成 HTML 输出并将其写入 HTTP 响应,从
UIViewRoot#encodeAll()
开始。方法。
Taghandlers像所有 JSTL <c:xxx>
标签,几个 JSF <f:xxx>
标签和只有几个 Facelet <ui:xxx>
标签在 View 构建期间运行。 UI components与所有 JSF 一样 <h:xxx>
标签,几个 Facelet <ui:xxx>
标签和只有几个 JSF <f:xxx>
标签在 View 渲染期间运行。
The <c:forEach>
is a taghandler和 the <ui:repeat>
is an UI component .
换句话说,<c:forEach>
中声明的 UI 组件基于 <c:forEach items>
在 JSF 组件树中重新创建多次在 View 构建期间, View 渲染期间又分别生成各自的 HTML 输出。 <ui:repeat>
中声明的 UI 组件在 View 构建期间仅在 JSF 组件树中创建一次,然后根据 <ui:repeat value>
多次重复使用这些组件在 View 渲染期间生成 HTML 输出。
您的具体问题是由 <ui:repeat var="table">
引起的仅在 View 渲染期间可用,在 View 构建期间不可用。 <c:forEach>
基本上是检索 #{null}
作为 View 构建期间即将运行时的值。
您可以通过替换外部 <ui:repeat>
来解决此问题通过<c:forEach>
。虽然我想知道你是否不能更好地使用 <ui:repeat><p:dataTable><p:columns>
相反。
另请参阅:
关于jsf - c :forEach inside primefaces(e. g。 p:panelgrid)在ui内:重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21697024/