我在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的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}"/>
并在上面的循环中使用它们,或者是否有一种简洁的方法来避免该解析异常(如果值不可解析)?
答案 0 :(得分:1)
首先,如果我的JSP由于恶意用户更改参数值而生成异常,我根本不在意。
但是如果您使用MVC模式并且开始使用浏览器发送的参数填充命令/表单对象,则不会发生这种情况。这样,您可以使用类型化变量而不是字符串,并将这些类型变量与来自数据库的类型值进行比较。