c:forui内部的每个内素数面(例如p:panelgrid):重复



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

为了执行此操作,我首先将<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输出的转换是一个分两步的过程。

  1. 首先,在视图构建期间,XHTML源代码被解析并在表示JSF UI组件树的JavaUIComponent实例树中转换,如FacesContext#getViewRoot()所示。

  2. 然后,在视图呈现期间,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。。。有道理吗

相关内容

  • 没有找到相关文章

最新更新