我有一个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>