5

这被称为 3 次,每行一次。(示例表有 3 行)

....
<ui:param name="rowIndex"   value="#{cc.attrs.rowIndex}" />
<ui:param name="rowActive"  value="#{cc.attrs.activeRow}" />
<c:set var="index"          value="#{rowIndex}"  type="java.lang.Long"/>
<c:set var="activeRowIndex" value="#{rowActive}" type="java.lang.Long"/>

<c:choose>
    <c:when test="${index == 2}">
        ACTIVE
    </c:when>
    <c:when test="${index != activeRowIndex}">
       ${index} - ${activeRowIndex} - INACTIVE
    </c:when>
    <c:otherwise>
       NONE
    </c:otherwise>
</c:choose> 
....

结果:

0 - 1 - 不活动

1 - 1 - 不活动

2 - 1 - 不活动

我本来期望:

0 - 1 - 不活动

没有任何

积极的

我很不知道为什么结果与我的预期如此不同。所以我希望你能帮助我:-)

4

1 回答 1

9

使用的变量名称表明您在重复组件内使用复合,例如<h:dataTable>or <ui:repeat>

JSTL 标记在视图构建期间执行,即基于 XHTML 源代码构建 JSF 组件树的时刻。但是,var重复组件的属性仅在视图呈现期间可用,即基于 JSF 组件树生成 HTML 输出的那一刻。

#{cc.attrs.rowIndex}实际上,至少在 JSTL 运行时总是如此。 null

当您依赖于仅在视图呈现期间可用的条件时,您应该使用renderedJSF 组件的属性而不是 JSTL <c:choose>/ <c:if>

例如

<c:set var="active" value="#{cc.attrs.rowIndex == 2}" />
<c:set var="inactive" value="#{not active and cc.attrs.rowIndex != cc.attrs.activeRow}" />
<c:set var="none" value="#{not active and not inactive}" />

<h:outputText value="ACTIVE" rendered="#{active}" />
<h:outputText value="#{index} - #{activeRowIndex} - INACTIVE" rendered="#{inactive}" />
<h:outputText value="NONE" rendered="#{none}" />

请注意,此问题不会影响<c:set>. 它只是创建一个 EL 变量映射(一个“别名”),它不会立即评估 EL 表达式并将其结果存储在某处(只要scope未定义)。另请注意,当使用 Facelets 而不是 JSP 时${},其#{}行为完全相同。由于${}它基本上是遗留 JSP 的遗产,因此您应该更喜欢专门使用#{},以避免您自己和您未来的维护者混淆。

于 2013-11-11T14:11:26.693 回答