我必须以恐怖方式制作一份表格列表。每个列都有可变数量的列(具有固定行)。
要执行此操作,我首先将<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>
的不同排列,没有成功。
那么,我怎样才能以更多的方式制作更多的表格(使用素数面)并设置一个dinamical数量的列?
谢谢!
编辑:我想使用两个<c:forEach>
,但即使只有一个<c:forEach>
,我也会得到一个空的结果。事实上,如果我尝试以下xhtml:
<c:forEach items="${testBackingBean.tables}" var="tabella">
current element: #{tabella}
</c:forEach>
然后我得到一个空的结果。 (我知道,这是一个不同的问题)
答案 0 :(得分:12)
从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 <c:forEach>
is a taghandler和the <ui:repeat>
is an UI component。
换句话说,在视图构建时间内基于<c:forEach>
在JSF组件树中多次重新创建在<c:forEach items>
内声明的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>
。