我想比较一下JSP的<c:if>
标记中的两种不同类型。基本上,左一个是Number
,但右边是一个字符串,如果该字符串可以解析为一个数字,我不会收到错误,但是如果不能将该字符串解析为Number
,则接收javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long
。
实战:
${1 ==“}//工作正常 ${1 =="4“}//工作正常 ${1 =="Yes“}//触发异常。
但是,即使是第三个比较,在早期版本的JSP中也很好,但现在它会导致异常。
随着时间的推移,==
的行为是否发生了变化?
如有任何建议,将不胜感激。
发布于 2014-07-11 13:01:49
==
的行为没有改变,但{expr}
的行为发生了变化。
关于版本:
在JSP规范的向后兼容性部分中
如果版本specified小于2.1,则{expr}语法仅作为字符串文本处理。
因此,在EL 2.0之前,all将被视为字符串文本,并将.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 =="" } // 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类型的No转换为类java.lang.Long”。
发布于 2014-07-11 12:58:58
从JSP2.1开始,JSP使用统一表达式语言(unified ),它代表了JSP2.0提供的表达式语言和为JavaServer Faces技术创建的表达式语言的结合。
这种行为很可能有点不同。
有关完整的类型转换规则,请参阅JavaServer Pages 2.1表达式语言规范(可从这里获得)第1.18节。
https://stackoverflow.com/questions/24697840
复制相似问题