我在 JSTL 中以下列方式比较数值。
<c:set var="testValue" value="10"/>
<c:choose>
<c:when test="${testValue==10}">
<c:out value="Test is successful."/>
</c:when>
<c:otherwise>
<c:out value="Test is unsuccessful."/>
</c:otherwise>
</c:choose>
条件被评估为真并显示 - “测试成功”。
如果变量的值testValue
不是数字,例如,
<c:set var="testValue" value="xxx"/>
然后测试失败,但出现以下异常。
javax.el.ELException:无法将 java.lang.String 类型的 xxx 转换为 java.lang.Long 类
因为字符串无法解析为Long
. 比较是按字典顺序进行的。
这可以通过使用 EL 来避免,如下所示。
<c:set var="testValue" value="${xxx}"/>
在这种情况下,<c:otherwise>
将显示该部分中的文本。
我在从数据库中检索数据时使用了这样的结构,
<c:forEach var="row" items="${list}" varStatus="loop">
<c:choose>
<c:when test="${param.edId==row.id || row.id==param.id}">
// Do something.
</c:when>
<c:otherwise>
// Do something.
</c:otherwise>
</c:choose>
</c:foreach>
在上面的代码中,row.id
保证的值与 Oracle 数据库中Long
的数据类型相对应。Number
param.edId
然而,和/或的值param.id
不保证是数字,并且可以被恶意用户更改。在这种情况下,可能会发生上述意外错误。
我真的需要为此设置两个额外的变量吗?
<c:set var="paramId" value="${param.id}"/>
<c:set var="paramEdId" value="${param.edId}"/>
并在上面的循环中使用它们,或者是否有一种简洁的方法来避免该解析异常(以防这些值不可解析)?