我想比较JSP的<c:if>
标签中的两种不同类型。基本上左边一个是Number
总是正确但是一个是字符串,如果该字符串可以解析为数字我没有收到错误但是如果字符串不能被解析为Number
我收到{{1} }。
实际上:
$ {1 ==“”} //工作正常¥$ 1 ==“4”} //工作正常¥$ 1 ==“是”} //触发异常。
但即使是第3次比较在以前版本的JSP中也能正常工作,但现在它会导致异常。
javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long
的行为是否在一段时间内发生了变化?
非常感谢任何建议
答案 0 :(得分:5)
==
的行为未发生变化,但{expr}
的行为发生了变化......
关于版本:
的向后兼容性部分如果指定的版本小于2.1,则{expr}语法为 简单地处理为字符串文字。
因此,直到EL 2.0所有将被视为字符串文字并与.equals
进行比较,因为==
将在内部(Reference here)转换为equals
,但是2.1它不会被转换为字符串,并会抛出javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long
关于比较:
在EL版本2.1的JSP specification JSP.2.3.5.7中,指定了以下内容......
- 为true
如果A为null或B为null,则为==或eq返回false,对于!=或ne
- 醇>
如果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转换为类java.lang.Long”
答案 1 :(得分:1)
从JSP 2.1开始,JSP使用统一表达式语言(统一EL),它表示JSP 2.0提供的表达式语言与为JavaServer Faces技术创建的表达式语言的联合。
行为很可能有点不同。
有关完整的类型转换规则,请参阅JavaServer Pages 2.1表达式语言规范的1.18节(可从here获得)。