gpt4 book ai didi

jsf - evaluates always false

转载 作者:行者123 更新时间:2023-12-05 00:27:51 25 4
gpt4 key购买 nike

这称为 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 - INACTIVE

1 - 1 - INACTIVE

2 - 1 - INACTIVE


我会期望:

0 - 1 - INACTIVE

NONE

ACTIVE


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

最佳答案

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

JSTL 标记在 View 构建期间执行,即基于 XHTML 源代码构建 JSF 组件树的那一刻。然而,var重复组件的属性仅在 View 渲染时可用,即基于 JSF 组件树生成 HTML 输出的那一刻。

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

当您依赖仅在 View 渲染期间可用的条件时,您应该使用 rendered JSF 组件的属性而不是 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 的遗产,您应该更喜欢专门使用 #{}避免您和您 future 的维护者混淆。

关于jsf - <c :when test> evaluates always false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19908094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com