首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSP比较运算符行为

JSP比较运算符行为
EN

Stack Overflow用户
提问于 2014-07-11 12:33:24
回答 2查看 1.6K关注 0票数 8

我想比较一下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中也很好,但现在它会导致异常。

随着时间的推移,==的行为是否发生了变化?

如有任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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. 如果A为null或B为null,则返回==或eq的false,则为!=或ne
  2. 如果A或B是Byte、Short、Character、Integer或Long胁迫A和B都长,则应用运算符

所以,首先,

代码语言:javascript
运行
复制
${1 =="" } // ans is false as second one is null as per 1st rule.

第二种情况是,

代码语言:javascript
运行
复制
${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”。

票数 6
EN

Stack Overflow用户

发布于 2014-07-11 12:58:58

从JSP2.1开始,JSP使用统一表达式语言(unified ),它代表了JSP2.0提供的表达式语言和为JavaServer Faces技术创建的表达式语言的结合。

这种行为很可能有点不同。

有关完整的类型转换规则,请参阅JavaServer Pages 2.1表达式语言规范(可从这里获得)第1.18节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24697840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档