一尘不染

JSP比较运算符的行为

jsp

我想比较<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版本中也能正常工作,但是现在它会导致异常。

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

任何建议都受到高度赞赏


阅读 463

收藏
2020-06-08

共1个答案

一尘不染

的行为==未更改,但是的行为{expr}已更改…

关于版本:

JSP规范的向后兼容部分中

如果指定的版本小于2.1,则{expr}语法仅作为String文字处理。

因此,在EL 2.0之前,所有内容都将被视为字符串文字,并与.equalsas
==进行比较,然后将其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.

在第二种情况下

${1 =="4" } // ans is false as both are different after coercing to Long as per 2nd rule.

在内部类型转换的情况下,以上两种情况都将被强制为long。

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

2020-06-08