c:forEach总是运行相同数量的循环

时间:2013-07-31 08:48:00

标签: jsf jstl

您好我想在JSF中显示树结构

我想插入

的意图
<span class="intendWidth" />

这是我的jsf-code

<ui:repeat value="#{myHandler.entityTree}" var="entityDepthHolder">
    <p:commandLink action="#{myHandler.toggle(entityDepthHolder.entity)}">
        <div>
            <c:forEach begin="0" end="#{entityDepthHolder.depth}">
                <span class="intendWidth" />
            </c:forEach>
            #{entityDepthHolder.depth} #{entityDepthHolder.entity.title}
        </div>
    </p:commandLink>
</ui:repeat>

但由于某种原因,c:forEach总是运行一次,尽管只有一个entityDepthHolder.depth为1,其他所有都为0

如何在没有c:forEach的情况下插入标签n次的任何想法?

1 个答案:

答案 0 :(得分:5)

<c:forEach>在视图构建时(XHTML转换为JSF组件树的那一刻)运行,而<ui:repeat>在视图渲染时间(JSF组件树生成HTML输出的那一刻)运行

因此,当<c:forEach>运行时,#{entityDepthHolder}在EL范围内无处可用,并且评估为null,在这种情况下隐式强制转换为0。由于begin也是0end包含在内,因此您最终会得到1个项目。

在构建视图之后,JSF组件树的结尾如下:

<ui:repeat value="#{myHandler.entityTree}" var="entityDepthHolder">
    <p:commandLink action="#{myHandler.toggle(entityDepthHolder.entity)}">
        <div>
            <span class="intendWidth" />
            #{entityDepthHolder.depth} #{entityDepthHolder.entity.title}
        </div>
    </p:commandLink>
</ui:repeat>

在视图渲染时,重复生成相同的HTML。

你有2种方法可以解决这个问题:

  1. 在外部循环上使用<c:forEach>代替<ui:repeat>。警告是,这会破坏早于2.1.18的Mojarra版本中的视图范围内的bean。

  2. 在内循环上使用<ui:repeat>代替<c:forEach>。如果您碰巧使用JSF实用程序库OmniFaces,那么您可能会发现#{of:createArray()}函数对此有用。

    <ui:repeat value="#{of:createArray(entityDepthHolder.depth)}">
    
  3. 另见: