在ui:repeat中使用c:set不起作用



我有一个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变量的变化是否可能不影响循环外的number变量?我相信scope属性会照顾到这一点

JSTL标记和JSF组件不像您期望的那样同步运行。JSTL标签在构建JSF视图期间运行,而JSF组件在呈现JSF视图期间运行。参见JSF2 Facelets中JSTL的详细解释。有道理吗?

不幸的是,您想要实现的是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>

最新更新