JSP比较运算符行为
我想在JSP的标签中比较两种不同的类型。 基本上左边的一个是
Number
总是但是右边的一个是字符串,如果那个字符串可以解析为一个数字我收不到错误但是如果字符串不能被解析为一个Number
我收到javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long
。
几乎:
$ {1 ==“”} //工作正常
$ {1 ==“4”} //工作正常
$ {1 ==“是”} //触发exception。
但即便是第3次比较在以前版本的JSP中也能正常工作,但现在它会导致exception。
==
的行为是否在一段时间内发生了变化?
任何建议都非常感谢
==
行为不会改变,但{expr}
行为会发生变化……
关于版本:
在JSP Specification的向后兼容部分中,
如果指定的版本小于2.1,则{expr}语法只是作为String文字处理。
所以,直到EL 2.0都将被视为字符串文字,并与.equals
进行比较,因为==
将在内部转换为equals
( 此处为引用 ),但在2.1中它将不会转换为字符串,并将抛出exception说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中,指定了以下内容……
如果A为null或B为null,则对于==或eq返回false,对于!=或ne,则返回true
如果A或B是Byte,Short,Character,Integer或Long强制A和B强制为Long,则应用运算符
所以,在第一种情况下,
${1 =="" } // ans is false as second one is null as per 1st rule.
在第二种情况下,
${1 =="4" } // ans is false as both are different after coercing to Long as per 2nd rule.
在上述情况下,两者都将被强制转换为内部类型转换。
但不是在第三种情况下, ${1 =="Yes" }
其中第二个是字符串,无法转换(强制)为Long,而java.el.ELException
将抛出消息“无法转换类型java的类型。 lang.String to class java.lang.Long“。
从JSP 2.1开始,JSP使用统一表达式语言(统一EL),它表示JSP 2.0提供的表达式语言与为JavaServer Faces技术创建的表达式语言的联合。
行为很可能有点不同。
有关完整的类型转换规则,请参阅JavaServer Pages 2.1表达式语言规范的1.18节(可从此处获得 )。