1

我在 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:无法将 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}"/>

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

4

1 回答 1

1

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

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

于 2013-03-02T11:30:43.957 回答