使用c:set in ui:repeat不起作用

时间:2011-12-05 10:55:23

标签: jsf jstl facelets uirepeat

我有一个带有以下代码的JSF 2应用程序:

<c:set var="number" value="0" scope="view" />
<ui:repeat value="${items}" var="item" varStatus="itemIndex">
    <c:if test="${item.boolProperty == true}">
        <c:set var="number" value="${number + 1}" scope="view" />
    </c:if>
    <h:outputText value="#{item.name}" />: <h:outputText value="#{number}" />
</ui:repeat>

我想根据循环中项目的属性增加数量。但是,条件似乎不起作用,因为number的值始终保持为0.如果我删除条件,number仅递增一次,或者在递增之前始终为0,因此它输出1. number var更改是否可能不会影响循环外的number var?我相信scope属性可以解决这个问题。

1 个答案:

答案 0 :(得分:2)

JSTL标记和JSF组件不会像编码所期望的那样同步运行。 JSTL标记在构建JSF视图期间运行,而JSF组件在呈现JSF视图期间运行。有关详细说明,请参阅JSTL in JSF2 Facelets... makes sense?

遗憾的是,JSF组件无法实现您想要实现的目标。 <ui:param>接近,但它仅仅作为更复杂的EL表达式的别名,而<c:set>实际上设置了所需范围内的某些内容(view范围,你在那里顺便说一句错误)。

最好的办法是更改模型或将模型包装在另一个模型中,以便最终成为

<ui:repeat value="${items}" var="item" varStatus="itemIndex">
    <h:outputText value="#{item.name}" />: <h:outputText value="#{item.number}" />
</ui:repeat>