Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EL集合#包含不工作的内容_Java_Spring_Jsp_Tomcat7_El - Fatal编程技术网

Java EL集合#包含不工作的内容

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

我在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

另外,
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