【发布时间】:2013-03-02 11:23:20
【问题描述】:
我在 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: 无法转换类型为 xxx 的类 java.lang.String 到类 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的值保证为Long,对应Oracle数据库中的Number数据类型。
param.edId 和/或param.id 的值不保证是数字,恶意用户可以更改。在这种情况下,可能会发生上述意外错误。
我真的需要为此设置两个额外的变量吗,
<c:set var="paramId" value="${param.id}"/>
<c:set var="paramEdId" value="${param.edId}"/>
并在上面的循环中使用它们,或者是否有一种简洁的方法来避免该解析异常(以防这些值不可解析)?
【问题讨论】: