我想比较<c:if>JSP标记中的两种不同类型。基本上,左一个Number始终是一个字符串,而右一个总是一个字符串,如果该字符串可以解析为数字,我不会收到任何错误,但如果字符串不能解析为一个Number我,则会收到错误javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long。
<c:if>
Number
javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long
几乎:
$ {1 ==“”} //工作正常 $ {1 ==“ 4”} //工作正常 $ {1 ==“是”} //触发异常。
但是,即使第3个比较在以前的JSP版本中也能正常工作,但是现在它会导致异常。
行为==在一段时间内有变化吗?
==
任何建议都受到高度赞赏
的行为==未更改,但是的行为{expr}已更改…
{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
.equals
equals
关于比较:
在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,则应用运算符
如果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.
在内部类型转换的情况下,以上两种情况都将被强制为long。
但是在第三种情况下不是,${1=="Yes"}在第二种情况下,不能将字符串转换(强制)为Long,并且java.el.ELException将抛出消息“无法将类型java.lang.String类型的No转换为java.lang.Long类型”。
${1=="Yes"}
java.el.ELException