【问题标题】:Comparing string and boolean in Expression language比较表达式语言中的字符串和布尔值
【发布时间】:2011-12-31 09:56:35
【问题描述】:

我有这种行为我不太明白

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

输出

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

【问题讨论】:

  • 删除了旧的测试用例并替换为更紧凑和直接的测试用例。

标签: java jsp weblogic el


【解决方案1】:

这是EL specification中定义的语言行为:

A {==,!=,eq,ne} B

  • 省略了其他规则
  • 如果 A 或 B 是布尔值,则将 A 和 B 都强制为布尔值,应用运算符

将 A 强制转换为布尔值

  • 如果 A 为 null 或 "",则返回 false
  • 否则,如果 A 是布尔值,则返回 A
  • 否则如果A是String,并且Boolean.valueOf(A)没有抛出异常,则返回
  • 否则,错误

因此,字符串文字通过 Boolean.valueOf("error") 强制转换为布尔值 returns false

【讨论】:

    【解决方案2】:

    如果 EL 中的两边之一是Boolean(或boolean),另一边是String,则String 将被Boolean#valueOf() 解析为Boolean,其@ 987654321@ 说:

    返回一个Boolean,其值由指定字符串表示。如果字符串参数不是null,则返回的Boolean 表示true 值,并且忽略大小写等于字符串“true”。

    所以,它返回false,这确实等于false

    您需要重写您的 EL 表达式以考虑到类型既可以是布尔值也可以是字符串,或者只是坚持单一类型而不是在单一属性中混合类型。

    【讨论】:

      【解决方案3】:

      至于第 2 点。

      <c:set var="errorString" value="${'error'}" />
      ${someVar.class == errorString.class}
      

      将检查这两个“事物”是否是同一类的实例。

      但最好将someVar 转换为字符串,然后比较两个字符串,因为(至少在我的情况下) someVar 不能保证是字符串或布尔值,所以它可以是其他任何可以转换成字符串。

      <c:set var="strsomeVar">${someVar}</c:set>
      //${someVar}
      //${someVar.class}
      //${someVar == 'error'}
      

      哪些输出

      //false
      //class java.lang.String
      //false 
      

      【讨论】:

        猜你喜欢
        • 2021-11-05
        • 2011-08-21
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2015-02-24
        • 1970-01-01
        相关资源
        最近更新 更多