这是一个由两部分组成的问题。
我有一个名为“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>
这是我的问题:
- 我对字符比较的理解是否正确?如果是这样,有什么方法可以转换 JSTL 中的类型以便它们具有可比性吗?
- 当 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(使用前将#替换为@)