有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    从XHTML源代码到生成的HTML输出的转换过程分为两步

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

    2. 然后,在视图呈现期间,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 taghandlerthe ^{} 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>

    另请参见: