jsf c:forEach-inside-primeface(例如p:panelgrid)inside-ui:repeat
我得拿出一张桌子的清单。每一个都有不同数量的列(固定行)
为了执行这个操作,我首先在一个<ui:repeat>
中放入一个<p:panelGrid>
:因此我正确地生成了一个表列表
然后,为了直观地生成列,我尝试在<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>
然后我得到一个空结果。(我知道,这是另一个问题)
# 1 楼答案
从XHTML源代码到生成的HTML输出的转换过程分为两步
首先,在视图构建期间,XHTML源代码被解析并在代表JSF UI组件树的Java
UIComponent
实例树中转换,如FacesContext#getViewRoot()
所示然后,在视图呈现期间,JSF UI组件树生成HTML输出并将其写入HTTP resopnse,从
UIViewRoot#encodeAll()
方法开始Taghandlers与所有JSTL
<c:xxx>
标记一样,几个JSF<f:xxx>
标记和只有几个Facelets<ui:xxx>
标记在视图构建期间运行UI components与所有JSF<h:xxx>
标记一样,几个Facelets<ui:xxx>
标记和只有几个JSF<f:xxx>
标记在视图渲染期间运行The ^{} is a taghandler 和the ^{} is an UI component
换句话说,在视图构建期间,
<c:forEach>
内声明的UI组件会在JSF组件树中基于<c:forEach items>
多次重新创建,然后在视图呈现期间分别生成各自的HTML输出。在视图构建期间,在<ui:repeat>
内声明的UI组件在JSF组件树中只创建一次,然后根据<ui:repeat value>
重用多次,以在视图呈现期间生成HTML输出具体问题是因为
<ui:repeat var="table">
仅在视图渲染时可用,而不是在视图构建时可用。当<c:forEach>
即将在视图构建期间运行时,它基本上是在检索#{null}
as值可以通过将外部
<ui:repeat>
替换为<c:forEach>
来解决这个问题。尽管我想知道你是否能更好地使用<ui:repeat><p:dataTable><p:columns>
另请参见: