Java EL集合#包含不工作的内容
我在Spring、JSP和Tomcat环境中工作,servlet版本为3.0。我试图使用Java EL集合#包含不工作的内容,java,spring,jsp,tomcat7,el,Java,Spring,Jsp,Tomcat7,El,我在Spring、JSP和Tomcat环境中工作,servlet版本为3.0。我试图使用集合#contains方法(据我所知,该方法已添加到servlet 3.0中)。它似乎不起作用,在调试过程中,我提出了以下奇怪的情况,似乎可以指出问题所在: ${priority[0] == 1} ${priority[0] eq 1} ${priority.contains(priority[0])} ${priority.contains(1)} 这是打印出来的 true-false 另外,priori
集合#contains
方法(据我所知,该方法已添加到servlet 3.0中)。它似乎不起作用,在调试过程中,我提出了以下奇怪的情况,似乎可以指出问题所在:
${priority[0] == 1}
${priority[0] eq 1}
${priority.contains(priority[0])}
${priority.contains(1)}
这是打印出来的
true-false
另外,priority
是一个包含整数1,2,3
的列表
所以,问题是,最后一次检查如何/为什么会打印false
编辑以响应注释:是从Intellij调试器中调用时,列表包含1
。我编写了一个小类:
public static class Test {
public String contains(Object value) {
return value.getClass().toString();
}
}
将其作为名为test
的JSP属性添加到,然后:
${test.contains(1)}
生成:
class java.lang.Long
class java.lang.Long
class java.lang.Long
class java.lang.Integer
true
Long
不是整数
,因此在列表中找不到
更新
下面的代码是在Tomcat 8上运行的,不会像在旧版本上那样工作,但用于说明非浮点文本是一个Long
,而不是Integer
(浮点文本是Double
),但是=
仍然进行数值比较,所以Long value==Integer值工作正常
${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.Long
class java.lang.Integer
true
在最后一个例子中,尝试将其强制转换为整数,我打赌当它需要一个对象时,在输入int时会出现问题。在普通java中,当您不在jsp文件中时,您是否也有同样的问题?@jwill如果是这样的话,那么${priority[0]==1}
这应该也会失败,但不会。顺便说一句,这在技术上是一个重复,这一切与Servlet 3.0中添加的Collection#contains()
无关(它从Java 1.2开始就存在),但它只是新的EL 2.2特性,能够使用带括号的method()
语法调用非getter方法。因为priority[0]
被扩展为long
。另请参见第1.8.2章“A{==,!=,eq,ne}B”点“如果A或B是字节、短字符、整数或长强制A和B都是长的,则应用运算符”注意,更新部分中的示例不适用于Servlet 3.0/EL 2.2,而仅适用于Servlet 3.1/EL 3.0。仅因为java.lang.*
包的EL 3.0类隐式导入EL范围。因此,在OP使用Tomcat 7的情况下,此代码将失败。您对==
的推理不正确/不完整。请参阅我对这个问题的评论。@BalusC您是对的,“数值比较”是JSP实际工作的非常长的描述的超级速记。存在歧义,因为EL在应用=
运算符时实际使用了对象#equals()
。当应用于Integer
和Long
时,这显然会失败。因此,当考虑到正在使用Object#equals()
时,您的推理是不正确的。请注意,这一切不是由JSP完成的,而是由EL完成的。嗯,那条评论包含一个链接。如果您感到好奇,请阅读:)不要开始长时间的讨论,但我的意思是,我的短语“数值比较”是指对数字进行比较,而不是对象进行比较,JSP EL通过遵循第1.8.2节中定义的逻辑(感谢链接)完成了这项工作。它适用于Integer
和Long
,因为Integer
被强制为Long
。JSP EL错误的地方在于BigDecimal
,因为1.0==1.00
,1.0<1.00
和1.0>1.00
都是false
!