<c:当test =“”>总是假的</c:when>时

时间:2013-11-11 13:54:12

标签: 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> 
....

结果:

  

0 - 1 - 不活跃

     

1 - 1 - 不活跃

     

2 - 1 - 不活跃

我原以为:

  

0 - 1 - 不活跃

     

     

ACTIVE

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

1 个答案:

答案 0 :(得分:6)

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

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

在效果方面,当JSTL运行时,至少#{cc.attrs.rowIndex} 总是 null

当您依赖于仅在视图渲染时间内可用的条件时,您应该使用JSF组件的rendered属性而不是JSTL <c:choose> / <c:if>

E.g。

<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的遗产,因此您应该优先使用#{}来避免自己和未来维护者的混淆。