c:在ui:repeat里面的forEach inside primefaces(例如p:panelgrid)

时间:2014-02-11 08:49:47

标签: jsf jsf-2 primefaces panelgrid

我必须以恐怖方式制作一份表格列表。每个列都有可变数量的列(具有固定行)。

要执行此操作,我首先将<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>

然后我得到一个空的结果。 (我知道,这是一个不同的问题)

1 个答案:

答案 0 :(得分:12)

从XHTML源代码到生成的HTML输出的转换分为两个步骤。

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

  2. 然后,在视图渲染时,JSF UI组件树生成HTML输出并将其写入HTTP resopnse,从UIViewRoot#encodeAll()方法开始。

  3. 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 taghandlerthe <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>

    另见: