【问题标题】:Comparing numeric values in JSTL/EL比较 JSTL/EL 中的数值
【发布时间】: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.E​​LException: 无法转换类型为 xxx 的类 java.lang.String 到类 java.lang.Long

因为字符串无法解析为Long。比较是按字典顺序进行的。

这可以通过使用 EL 来避免,如下所示。

<c:set var="testValue" value="${xxx}"/>

在这种情况下,&lt;c:otherwise&gt; 部分中的文本将被显示。


我在从数据库中检索数据时使用了这样的结构,

<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}"/>

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

【问题讨论】:

    标签: jsp jstl el


    【解决方案1】:

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

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

    【讨论】:

    • 这是关于 Spring/Hibernate 的,是的,我正在为此使用自定义属性编辑器,但是在问题中的两个参数中,param.id 在必要时作为查询字符串提供。因此,即使是普通用户,也很有可能取代它的价值。
    • 我的意思是,当收到请求时,您的操作/servlet 应该做的第一件事就是将此 ID 转换为 Long(以及其他参数转换为相应的类型:日期、整数、布尔值) , ETC。)。如果此转换失败,则应显示验证错误消息(如果参数由用户输入),或应显示通用错误页面(如果参数不是由用户手动输入,而是从列表中选择选项、链接、复选框、隐藏字段……)
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多