0

我有一个带有以下代码的 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。是否有可能numbervar 改变不影响number循环外的var?我相信该scope属性会解决这个问题。

4

1 回答 1

2

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>
于 2011-12-05T12:10:10.937 回答