当get和is同时存在时,JSTL EL访问器转换优先级



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

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

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

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

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

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

以下是我的问题:

  1. 我对字符比较的理解正确吗?如果是,有没有办法转换JSTL中的类型,使它们具有可比性
  2. 当getActive()和isActive()都存在时,EL翻译会调用哪一个?isActive()似乎获得了优先权,但是否有官方记录的排序

我对字符比较的理解正确吗?如果是,有没有办法转换JSTL中的类型,使它们具有可比性

来自EL 2.2规范第1.8.2章(重点矿井):

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

  • 如果A==B,则应用运算符
  • 如果AnullBnull,则为==eq返回false,为!=ne返回true
  • 如果ABBigDecimal,则将AB都强制为BigDecimal,然后:
    • 如果运算符为==eq,则返回A.equals(B)
    • 如果运算符为!=ne,则返回!A.equals(B)
  • 如果ABFloatDouble,则将AB都强制为Double,应用运算符
  • 如果ABBigInteger,则将AB都强制为BigInteger,然后:
    • 如果运算符为==eq,则返回A.equals(B)
    • 如果运算符为!=ne,则返回!A.equals(B)
  • 如果ABByteShortCharacterIntegerLong,则将AB都强制为Long,应用运算符
  • 如果ABBoolean,则将AB都强制为Boolean,应用运算符
  • 如果ABenum,则将AB都强制为enum,应用运算符
  • 如果ABString,则将AB都强制为String,进行词汇比较
  • 否则,如果调用A.equals(B)时发生错误,则错误
  • 否则,将运算符应用于A.equals(B)的结果

char/Character处于EL中,因此被强制并被评估为Long。这永远不可能等于'1'的字符串文字。


当getActive()和isActive()都存在时,EL翻译会调用哪一个?isActive()似乎获得了优先权,但是否有官方记录的排序

来自Javabeans规范第8.3.2章(强调矿):

8.3.2布尔属性

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

public boolean is<PropertyName>()

可以提供此"is<PropertyName>"方法,而不是"get<PropertyName>"方法,也可以在"get&lgt;PropertyName>"方法之外提供此方法。

在任何一种情况下,如果布尔属性存在"is<PropertyName>"方法,则我们将使用"is<PropertyName>"方法读取属性值

布尔属性的示例可能是:

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

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

  • 如果ABBoolean,则将AB都强制为Boolean,应用运算符

将赋予isXxx()方法优先级。

您可以做的是测试字符的值,比如

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

至于哪一个优先级是isXXX()还是getXXX(),这在很大程度上是特定于实现的。