我必须定期生成一个表列表。其中每一个都有可变数量的列(具有固定行)。
为了执行此操作,我首先将<p:panelGrid>
放入<ui:repeat>
中:这样我就正确地生成了一个表列表。
然后,为了正常生成列,我尝试将<ui:repeat>
或<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>
那么我得到一个空的结果。(我知道,这是另一个问题)
从XHTML源代码到生成的HTML输出的转换是一个分两步的过程。
-
首先,在视图构建期间,XHTML源代码被解析并在表示JSF UI组件树的Java
UIComponent
实例树中转换,如FacesContext#getViewRoot()
所示。 -
然后,在视图呈现期间,JSF UI组件树生成HTML输出,并将其写入HTTP resopnse,从
UIViewRoot#encodeAll()
方法开始。
像所有JSTL<c:xxx>
标记、几个JSF<f:xxx>
标记和只有几个Facelets<ui:xxx>
标记这样的标记处理程序在视图构建时运行。UI组件,如所有JSF<h:xxx>
标记、几个Facelets<ui:xxx>
标记和只有几个JSF<f:xxx>
标记,都在视图渲染时运行。
CCD_ 24是标签处理程序,而CCD_ 25是UI组件。
换言之,在视图构建期间,基于<c:forEach items>
在JSF组件树中多次重新创建在<c:forEach>
内部声明的UI组件,从而在视图呈现期间分别产生各自的HTML输出。在视图构建期间,在<ui:repeat>
内部声明的UI组件仅在JSF组件树中创建一次,这些组件又基于<ui:repeat value>
被多次重用,以在视图呈现期间产生HTML输出。
您的具体问题是由于<ui:repeat var="table">
仅在视图渲染时可用,而在视图构建时不可用。<c:forEach>
基本上是在视图构建期间运行时检索#{null}
作为值。
可以通过将外部<ui:repeat>
替换为<c:forEach>
来解决此问题。尽管我想知道你是否不能更好地使用<ui:repeat><p:dataTable><p:columns>
。
另请参阅:
- JSF2 Facelets中的JSTL。。。有道理吗