这被称为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
我很无能为什么结果与我的预期有很大的不同。 所以我希望你能帮助我: - )
答案 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的遗产,因此您应该优先使用#{}
来避免自己和未来维护者的混淆。