【问题标题】:EL Collection#contains not workingEL Collection#contains 不工作
【发布时间】:2015-11-28 09:36:21
【问题描述】:

我正在使用 servlet 3.0 版的 Spring、JSP、Tomcat 环境中工作。我正在尝试使用Collection#contains 方法(据我所知已添加到servlet 3.0)。它似乎不起作用,在调试中,我想出了以下奇怪的情况,似乎可以确定问题所在:

${priority[0] == 1}
${priority[0] eq 1}
${priority.contains(priority[0])}
${priority.contains(1)}

打印出来

true true true false

另外,priority 是一个包含整数 1,2,3List<Integer>

所以,问题是,最后一次检查如何/为什么打印false

编辑回复评论:是的,当从 Intellij 调试器中调用时,列表包含 1

【问题讨论】:

  • 在最后一种情况下,尝试将其转换为 Integer,我敢打赌当它需要一个对象时输入一个 int 时会出现问题。
  • 当您不在 jsp 文件中时,您在常规 java 中是否有同样的问题?
  • @jwill 如果这是真的而不是${priority[0] == 1} 这也应该失败,但它不会。
  • 这在技术上是 stackoverflow.com/q/12247806 的骗子EL 2.2 能够使用带括号的 method() 语法调用非 getter 方法的特性。
  • 因为priority[0] 扩大到long。另请参阅EL 2.2 specification 第 1.8.2 章“A {==,!=,eq,ne} B”点“如果 A 或 B 是字节、短整型、字符、整数或长整型,则将 A 和 B 强制转换为长整型,应用运营商”

标签: java spring jsp tomcat7 el


【解决方案1】:

我写了一个小班:

public static class Test {
    public String contains(Object value) {
        return value.getClass().toString();
    }
}

将其添加为名为@9​​87654322@ 的JSP 属性,然后:

${test.contains(1)}

生成:

class java.lang.Long

Long 不是Integer,因此在List<Integer> 中找不到。


更新

以下是在 Tomcat 8 上运行的,在旧版本上无法按原样运行,但用于说明非浮点文字是 Long,而不是 Integer(浮点文字是 @ 987654330@),但 == 仍然进行数值比较,因此 Long value == Integer value 可以正常工作。

${test.contains(1)}
${test.contains(Long.valueOf('1'))}
${test.contains(Integer.valueOf('1'))}
${Long.valueOf('1') == Integer.valueOf('1')}

生成:

class java.lang.Long
class java.lang.Long
class java.lang.Integer
true

【讨论】:

  • 请注意,更新部分中的示例不适用于 Servlet 3.0 / EL 2.2,而仅适用于 Servlet 3.1 / EL 3.0。仅因为 java.lang.* 包的 EL 3.0 类被隐式导入到 EL 范围内。因此,对于 Tomcat 7 的 OP,此代码将失败。
  • 您对== 的推理不正确/不完整。请参阅我对这个问题的评论。
  • @BalusC 你说得对,“数字比较”是对 JSP 实际作用的很长描述的超级简写
  • 存在歧义,因为 EL 在应用 == 运算符时实际上使用了 Object#equals()。当应用于IntegerLong 时,这显然会失败。因此,在考虑使用 Object#equals() 时,您的推理是不正确的。请注意,这一切都不是由 JSP 完成的,而是由 EL 完成的。好吧,该评论包含一个链接。如果您好奇,请阅读它:)
  • 不想开始冗长的讨论,但我的意思是我的短语“数字比较”是指对数字而不是对象进行比较,JSP EL 遵循第 1 节中定义的逻辑1.8.2(感谢链接)。它对IntegerLong 有效,因为Integer 被强制转换为Long。 JSP EL 出错的地方是BigDecimal,因为1.0 == 1.001.0 < 1.001.0 > 1.00 都是false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多