获取时是否存在JSTL EL访问器转换优先级?

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

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

Active 

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

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

 Active 

这是我的问题:

  1. 关于char比较我的理解是否正确? 如果是这样,有没有办法转换JSTL中的类型,以便它们具有可比性?
  2. 当getActive()和isActive()都存在时,EL翻译会调用哪一个? 似乎isActive()获得了优先权,但是有正式的文件订购吗?

关于char比较我的理解是否正确? 如果是这样,有没有办法转换JSTL中的类型,以便它们具有可比性?

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

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

  • 如果A==B ,则应用运算符
  • 如果AnullBnull对于==eq返回false ,对于!=ne ,则返回false
  • 如果ABBigDecimal ,则将AB强制转换为BigDecimal ,然后:
    • 如果运算符是==eq ,则返回A.equals(B)
    • 如果运算符是!=ne ,则返回!A.equals(B)
  • 如果ABFloatDoubleAB强制为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 >”方法而不是“get < PropertyName >”方法,或者除了“get < PropertyName >”方法之外还可以提供它。

在任何一种情况下,如果布尔属性存在“is < PropertyName >”方法,那么我们将使用“is < PropertyName >”方法来读取属性值。

示例布尔属性可能是:

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

这与之前引用的EL规范1.8.2中的重点之后的点相结合,

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

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

你可以做的是测试角色的价值,比如

 Active 

至于哪一个获得优先级是xXX()或getXXX(),它几乎是特定于实现的。