这是一个由两部分组成的问题。
我有一个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>
以下是我的问题:
- 我对字符比较的理解正确吗?如果是,有没有办法转换JSTL中的类型,使它们具有可比性
- 当getActive()和isActive()都存在时,EL翻译会调用哪一个?isActive()似乎获得了优先权,但是否有官方记录的排序
我对字符比较的理解正确吗?如果是,有没有办法转换JSTL中的类型,使它们具有可比性
来自EL 2.2规范第1.8.2章(重点矿井):
1.8.2 nbsp;
A {==,!=,eq,ne} B
- 如果
A==B
,则应用运算符- 如果
A
是null
或B
是null
,则为==
或eq
返回false
,为!=
或ne
返回true
- 如果
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>()
;可以提供此"is<PropertyName>"方法,而不是"get<PropertyName>"方法,也可以在"get&lgt;PropertyName>"方法之外提供此方法。
在任何一种情况下,如果布尔属性存在"is<PropertyName>"方法,则我们将使用"is<PropertyName>"方法读取属性值
布尔属性的示例可能是:
public boolean isMarsupial(); public void setMarsupial(boolean m);
这与之前引用的EL规范第1.8.2章中强调的点之后的点相结合,
- 如果
A
或B
是Boolean
,则将A
和B
都强制为Boolean
,应用运算符
将赋予isXxx()
方法优先级。
您可以做的是测试字符的值,比如
<c:if test="${person.active.value == 1}">Active</c:if>
至于哪一个优先级是isXXX()还是getXXX(),这在很大程度上是特定于实现的。