以下代码段在Tomcat 6中运行正常,
<c:set var="abc" value="$12,345" />
<c:choose>
    <c:when test="${abc ne 0}">
        <c:out value="PASS"></c:out>
    </c:when>
    <c:otherwise>
        <c:out value="FAIL"></c:out>
    </c:otherwise> 
</c:choose>
但在Tomcat 7中抛出异常.
javax.el.ELException: Cannot convert $1,2345 of type class java.lang.String to class java.lang.Long
    at org.apache.el.lang.ELSupport.coerceToNumber(ELSupport.java:304)
    at org.apache.el.lang.ELSupport.coerceToNumber(ELSupport.java:283)
    at org.apache.el.lang.ELSupport.equals(ELSupport.java:143)
    at org.apache.el.parser.AstNotEqual.getValue(AstNotEqual.java:40)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026)
    at org.apache.jsp.WEB_002dINF.jsp.web.statussummary.status_005fsummary_jsp._jspx_meth_c_005fwhen_005f0(status_005fsummary_jsp.java:290)
貌似存在方式的差异表达${abc ne 0}中的Tomcat 7的evaulted在Tomcat中6都${abc}和${0}比较字符串,但在Tomcat的7我得到这个例外.我不知道为什么会发生这种情况以及哪个API的哪个类文件对此负责.
这是怎么造成的,我该如何解决?
这是因为您正在尝试将字符串与 int 进行比较。根据EL 文档,第 1.9.2 节:
1.9.2
A {==,!=,eq,ne} B
- 如果
A==B,应用运算符- 如果
A是null或B是null返回false或==,或eqtrue!=ne- 如果
A或B是BigDecimal,则强制A和B到BigDecimal和 然后:
- 如果运算符是
==oreq,则返回A.equals(B)- 如果运算符是
!=orne,则返回!A.equals(B)- 如果
A或B是Float或强制Double两者A和BDouble,则应用运算符- 如果
A或B是BigInteger,则强制A和B到BigInteger和 然后:
- 如果运算符是
==oreq,则返回A.equals(B)- 如果运算符是
!=orne,则返回!A.equals(B)- 如果
A或B是Byte、Short、Character、Integer或强制Long两者A和BLong,则应用运算符- 如果
AorB是Boolean强制的A并且BBoolean应用运算符- 如果
AorB是一个枚举,则强制A和B强制转换为枚举,应用运算符- if
AorB是字符串强制转换为A和BString,则进行词法比较- 否则如果调用时发生错误
A.equals(B),则错误- 否则,将运算符应用于
A.equals(B)
您的测试的问题在于您试图将"$12,345"(字符串)与0(整数)进行比较。由于是一个整数,因此它属于他们的文档(上面)中的0粗体If ,其中A 或 B是一个整数。两者都试图强制转换为 Long,Java 不会转换 String 值"$12,345"为 long。如果您将代码更改为以下任一内容,您将看到它有效:
字符串比较:
<c:set var="abc" value="$12,345" />
<c:choose>
    <c:when test="${abc ne '0'}"> <!-- Change Integer to String -->
        <c:out value="PASS"></c:out>
    </c:when>
    <c:otherwise>
        <c:out value="FAIL"></c:out>
    </c:otherwise> 
</c:choose>
整数比较:
<c:set var="abc" value="12345" /> <!-- Change String to Integer -->
<c:choose>
    <c:when test="${abc ne 0}">
        <c:out value="PASS"></c:out>
    </c:when>
    <c:otherwise>
        <c:out value="FAIL"></c:out>
    </c:otherwise> 
</c:choose>