为什么String.equals()方法不能在JSTL Core标记内部工作<c:if>?</c:if>

时间:2015-04-05 09:55:26

标签: java html jsp jstl el

代码的目的:验证用户的输入字符串。如果用户输入他的姓名,则存储为&#39; n&#39;,作为&#34; James&#34;然后消息&#34;验证!&#34;被展示。 (单独的HTML表单负责输入字符串)

虽然没有任何错误,但标签内的测试失败,无论输入字符串是否为&#34; James&#34;或不。

<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条件通过并且消息&#34; Validated!&#34;显示。

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

2 个答案:

答案 0 :(得分:2)

  1. 您没有将变量保存到范围
  2. 你要做到这一点让EL看到你的变量。

    将变量保存到请求范围

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

    2. 更改您的代码:

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

      P.S。您的JSP文件包含不良做法的scriptlet,并且方法不安全。

      最好按照here

      所述分隔逻辑和视图

答案 1 :(得分:1)

您可以通过以下方式使用普通==比较运算符:

<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>