【问题标题】:Why doesn't String.equals() method work inside the JSTL Core tag <c:if>?为什么 String.equals() 方法在 JSTL Core 标记 <c:if> 中不起作用?
【发布时间】:2015-04-05 09:55:25
【问题描述】:

代码目的:验证来自用户的输入字符串。如果用户输入他的姓名,存储为“n”,如“James”,则消息“已验证!”被展示。 (一个单独的 HTML 表单负责输入字符串)

虽然没有任何错误,但标签内的测试失败,无论输入字符串是否为“James”,都不会显示消息。

<body>

    <%  String n = (String)request.getParameter("n");
           String t = "James";
    %>

    Message <!-- Default message displayed to show that HTML body is read. -->

    <c:if test="${t.equals(n)}"> 
        <c:out value="Validated!"/>
    </c:if>

</body>

如果我在花括号内将测试条件替换为 true,则 if 条件通过并且消息“已验证!”显示出来。

为什么equals() 方法在 JSTL 标记内不起作用?

【问题讨论】:

    标签: java html jsp jstl el


    【解决方案1】:
    1. 您没有将变量保存到范围

    您必须这样做才能让 EL 看到您的变量。

    将变量保存到请求范围

    <c:set var="n" value="${param.n}" scope="request"/>
    <c:set var="t" value="James" scope="request"/>
    
    1. 您需要使用 EL 的 eq 运算符,而不是 Java 的 .equals()

    像这样更改您的代码:

    <c:if test="${t eq n}"> 
      <c:out value="Validated!"/>
    </c:if>
    

    附:您的 JSP 文件包含不正确的做法和方法不安全的 scriptlet。

    您最好将逻辑和视图分开,如here所述

    【讨论】:

    • 为了比较两个字符串是否相似,我相信Java中使用了equals()方法而不是==操作符。据我了解 == 运算符比较两个操作数(变量)是否引用同一个对象。我错了吗?
    • 我认为 eq 转换为 == 所以我的问题仍然有效。无论如何,你能告诉我如何比较两个字符串在标签内是否具有相同的值吗?
    • @user3111418 如果我在 EL 世界中没记错的话,您假设原始类型不存在(即使 Beans 最常使用像 Integer 这样的包装类型而不是原始 int 来允许 unset state by using null) 所以== 等价于eq 代表equals 方法。
    • 感谢您的链接!这非常有用。
    • 在 EL 中,eq== 的工作方式与 Java 中的 .equals() 完全相同——它比较的是对象的值,而不是它们对对象的引用。
    【解决方案2】:

    你可以这样使用普通的==比较运算符:

    <c:if test="${t == n}"> 
        <c:out value="Validated!"/>
    </c:if>
    

    如果你需要比较字符串值而不是对象的属性,你可以这样做:

    <c:if test="${t == 'Any string can be here'}"> 
        <c:out value="Validated!"/>
    </c:if>
    

    【讨论】:

    • n 是变量,而不是字符串:)
    • 如果我们需要比较字符串值而不是它们是否引用同一个对象,您有什么建议?
    猜你喜欢
    • 2011-07-04
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多