我有一个带有以下代码的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
属性可以解决这个问题。
答案 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>