我有这种行为我真的不明白
${someVar}
${someVar.class.name}
${someVar == 'error'}
输出
false
java.lang.Boolean
true
答案 0 :(得分:14)
A {==,!=,eq,ne} B
- 其他规则已删除
- 如果A或B为布尔值,则将A和B强制为布尔值,应用运算符
将A强制转换为布尔值
- 如果A为null或“”,则返回false
- 否则,如果A是布尔值,则返回A
- 否则,如果A是String,并且Boolean.valueOf(A)不抛出异常,则返回
- 否则,错误
因此,字符串文字被强制转换为Boolean.valueOf("error")
{{1}}的布尔值。
答案 1 :(得分:6)
如果EL中的一方是Boolean
(或boolean
)而另一方是String
,则String
将被解析为{ {1}} Boolean
javadoc说明以下内容:
返回一个
Boolean#valueOf()
,其值由指定的字符串表示。如果字符串参数不是Boolean
并且等于(忽略大小写)字符串“true”,则返回的Boolean
表示true
值。
因此,它返回null
,这确实等于false
。
你需要重写你的EL表达式,以考虑类型既可以是布尔值也可以是字符串,或者只是坚持单一类型而不是在单个属性中混合类型。
答案 2 :(得分:0)
至于第2点。
<c:set var="errorString" value="${'error'}" />
${someVar.class == errorString.class}
将检查这两个'事物'是同一个类的实例。
但是将someVar
转换为字符串,然后比较两个字符串可能会更好,因为(至少在我的情况下)someVar不能保证是String或Boolean,所以它可能是任何东西其他可以转换为String。
<c:set var="strsomeVar">${someVar}</c:set>
//${someVar}
//${someVar.class}
//${someVar == 'error'}
哪个输出
//false
//class java.lang.String
//false