JSP比较运算符行为

Sac*_*rma 7 java spring jsp el

我想比较<c:if>JSP标签中的两种不同类型.基本上左边的一个Number总是正确的,一个是字符串,如果该字符串可以解析为数字,我收不到错误,但如果字符串不能被解析为Number我收到的javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long.

几乎:

$ {1 ==""} //工作正常
$ {1 =="4"} //工作正常
$ {1 =="是"} //触发异常.

但即便是第3次比较在以前版本的JSP中也能正常工作,但现在它会导致异常.

==一段时间内的行为有变化吗?

任何建议都非常感谢

Not*_*bug 5

行为==没有改变,但行为{expr}改变了......

关于版本:

JSP Specification的向后兼容部分,

如果指定的版本小于2.1,则{expr}语法只是作为字符串文字处理.

所以,直到EL 2.0都将被视为一个字符串字面量,并与.equals作为==将被转换为equals内部(这里参考),但在2.1它将不会被转换为字符串,并会抛出异常说javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long

关于比较:

在EL版本2.1的JSP规范JSP.2.3.5.7中,指定了以下内容......

  1. 如果A为null或B为null,则为==或eq返回false,对于!=或ne,则返回true

  2. 如果A或B是Byte,Short,Character,Integer或Long强制A和B强制为Long,则应用运算符

所以,在第一种情况下,

${1 =="" } // ans is false as second one is null as per 1st rule.
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,

${1 =="4" } // ans is false as both are different after coercing to Long as per 2nd rule.
Run Code Online (Sandbox Code Playgroud)

在上述情况下,两者都将被强制转换为内部类型转换.

但不是在第三种情况下, ${1 =="Yes" }其中第二个是字符串无法转换(强制)为Long并将java.el.ELException抛出消息"无法将类型类java.lang.String转换为类java.lang.Long".