<c:当test>评估总是false

W v*_*d L 4 jsf jstl facelets composite-component

这被称为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> 
....
Run Code Online (Sandbox Code Playgroud)

结果:

0 - 1 - 不活跃

1 - 1 - 不活跃

2 - 1 - 不活跃

我原以为:

0 - 1 - 不活跃

没有

活性

我很无能为什么结果与我的预期有很大的不同.所以我希望你能帮助我:-)

Bal*_*usC 6

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

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

在效果,至少#{cc.attrs.rowIndex}始终 null JSTL运行时.

当您依赖于仅在视图渲染时间期间可用的条件时,您应该使用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}" />
Run Code Online (Sandbox Code Playgroud)

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