比较表达式语言中的字符串和布尔值

时间:2011-11-17 14:32:46

标签: java jsp weblogic el

我有这种行为我真的不明白

${someVar}
${someVar.class.name}      
${someVar == 'error'}

输出

false
java.lang.Boolean
true
  1. 如何解释?
  2. 编写测试的正确方法是什么,以便首先测试两个“事物”是否具有相同类型,然后它们的值是否相同?

3 个答案:

答案 0 :(得分:14)

这是EL specification

中定义的语言行为
  

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