获取时是否存在JSTL EL访问器转换优先级?
这是一个由两部分组成的问题。
我有一个person对象,其上有一个名为“active”的char属性。 Person有一个getActive()方法,它按预期返回一个char。 在我的JSTL EL中,我有以下内容:
Active
这永远不会过去。 我的理解是JSTL中引用的文字是字符串(不管是单引号还是双引号),并且从getActive调用中保留了char类型,因此当getActive()返回字符’1’时,这两个值不相等。
作为替代方案,我添加了一个返回布尔值的isActive()方法。 在这种情况下,以下工作:
Active
这是我的问题:
- 关于char比较我的理解是否正确? 如果是这样,有没有办法转换JSTL中的类型,以便它们具有可比性?
- 当getActive()和isActive()都存在时,EL翻译会调用哪一个? 似乎isActive()获得了优先权,但是有正式的文件订购吗?
关于char比较我的理解是否正确? 如果是这样,有没有办法转换JSTL中的类型,以便它们具有可比性?
从EL 2.2规范的第1.8.2章(强调我的):
1.8.2
A {==,!=,eq,ne} B
- 如果
A==B
,则应用运算符- 如果
A
为null
或B
为null
对于==
或eq
返回false
,对于!=
或ne
,则返回false
。- 如果
A
或B
是BigDecimal
,则将A
和B
强制转换为BigDecimal
,然后:
- 如果运算符是
==
或eq
,则返回A.equals(B)
- 如果运算符是
!=
或ne
,则返回!A.equals(B)
- 如果
A
或B
是Float
或Double
将A
和B
强制为Double
,则应用运算符- 如果
A
或B
是BigInteger
,则将A
和B
强制转换为BigInteger
,然后:
- 如果运算符是
==
或eq
,则返回A.equals(B)
- 如果运算符是
!=
或ne
,则返回!A.equals(B)
- 如果
A
或B
是Byte
,Short
,Character
,Integer
或Long
强制A
和B
强制为Long
,则应用运算符- 如果
A
或B
是Boolean
则将A
和B
强制为Boolean
,则应用运算符- 如果
A
或B
是enum
,则将A
和B
强制为enum
,请应用运算符- 如果
A
或B
是String
则将A
和B
强制转换为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中的重点之后的点相结合,
- 如果
A
或B
是Boolean
则将A
和B
强制为Boolean
,则应用运算符
将赋予isXxx()
方法优先权。
你可以做的是测试角色的价值,比如
Active
至于哪一个获得优先级是xXX()或getXXX(),它几乎是特定于实现的。