比较JSTL / EL中的数值

时间:2013-03-02 11:23:20

标签: jsp jstl el

我在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.E​​LException:无法转换类型为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}"/>

并在上面的循环中使用它们,或者是否有一种简洁的方法来避免该解析异常(如果值不可解析)?

1 个答案:

答案 0 :(得分:1)

首先,如果我的JSP由于恶意用户更改参数值而生成异常,我根本不在意。

但是如果您使用MVC模式并且开始使用浏览器发送的参数填充命令/表单对象,则不会发生这种情况。这样,您可以使用类型化变量而不是字符串,并将这些类型变量与来自数据库的类型值进行比较。