当 get 和 is 都存在时,JSTL EL 访问器翻译优先级?

2023-12-04

这是一个由两部分组成的问题。

我有一个名为“active”的带有 char 属性的 person 对象。 Person 有一个 getActive() 方法,它按预期返回一个 char。在我的 JSTL EL 中,我有以下内容:

<c:if test="${person.active == '1'}">Active</c:if>

这永远不会过去。我的理解是,JSTL 中带引号的文字是字符串(无论单引号还是双引号),并且 char 类型是从 getActive 调用中保留的,因此当 getActive() 返回字符“1”时,这两个值不相等。

作为替代方案,我添加了一个返回布尔值的 isActive() 方法。在这种情况下,可以执行以下操作:

<c:if test="${person.active == true}">Active</c:if>

这是我的问题:

  1. 我对字符比较的理解是否正确?如果是这样,有什么方法可以转换 JSTL 中的类型以便它们具有可比性吗?
  2. 当 getActive() 和 isActive() 都存在时,EL 翻译会调用哪一个?似乎 isActive() 具有优先权,但是是否有正式记录的顺序?

我对字符比较的理解是否正确?如果是这样,有什么方法可以转换 JSTL 中的类型以便它们具有可比性吗?

来自第 1.8.2 章EL 2.2 规范(强调我的):

1.8.2A {==,!=,eq,ne} B

  • If A==B, 应用运算符
  • If A is null or B is null return false for == or eq, true for != or ne.
  • If A or B is BigDecimal, coerce both A and B to BigDecimal and then:
    • 如果运算符是== or eq, 返回A.equals(B)
    • 如果运算符是!= or ne, 返回!A.equals(B)
  • If A or B is Float or Double胁迫两者A and B to Double, 应用运算符
  • If A or B is BigInteger, coerce both A and B to BigInteger and then:
    • 如果运算符是== or eq, 返回A.equals(B)
    • 如果运算符是!= or ne, 返回!A.equals(B)
  • If A or B is Byte, Short, Character, Integer, or Long胁迫两者A and B to Long, 应用运算符
  • If A or B is Boolean胁迫两者A and B to Boolean, 应用运算符
  • If A or B is an enum, 强制两者A and B to enum, 应用运算符
  • If A or B is String胁迫两者A and B to String, 词法比较
  • 否则如果调用时发生错误A.equals(B), error
  • 否则,将运算符应用于A.equals(B)

The char/Character因此在 EL 中被强制并评估为Long。它永远不能等于字符串文字'1'.


当 getActive() 和 isActive() 都存在时,EL 翻译会调用哪一个?似乎 isActive() 具有优先权,但是是否有正式记录的顺序?

来自第 8.3.2 章Javabean 规范(强调我的):

8.3.2 布尔属性

此外,对于布尔属性,我们允许 getter 方法来匹配模式:

public boolean is<PropertyName>();

这个“是属性名称可以提供“>”方法来代替“get属性名称>”方法,或者除了“get属性名称>”方法。

无论哪种情况,如果“是属性名称>”方法存在于布尔属性中,那么我们将使用“is属性名称>”方法读取属性值。

布尔属性的示例可能是:

    public boolean isMarsupial();
    public void setMarsupial(boolean m);

这一点,结合前面引用的 EL 规范第 1.8.2 章中强调的一点之后的一点,

  • If A or B is Boolean胁迫两者A and B to Boolean, 应用运算符

将给出isXxx()方法优先级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 get 和 is 都存在时,JSTL EL 访问器翻译优先级? 的相关文章

随机推荐