<c:if test ='$ {not empty"$ {records}"}'>从不评估false

And*_*dna 8 java jsp jstl

我遇到了JSTL和空操作符的问题.我已经做了一些简单的页面,一切正常,但现在我有:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <body>

     <form action="/Projekt/myaccount" method="post">
    <table border="1">
        <tr>
                 <td>Artist</td>
                 <td>Record Name</td>
                 <td>Delete</td>
         </tr>
        <c:forEach var="item" items="${records}">
         <tr>
                 <td>${item.artist}</td>
                 <td>${item.recordName}</td>
                 <td>
                    <input type="checkbox" name='${item.recordName}|${item.recordName}'/>
                 </td>
         </tr>
        </c:forEach>
    </table>
    <hr/>
        <input type="submit" name="back" value="back"/>
        <c:if test='${not empty "${records}"}'>
               <input type="submit" name="delete" value="delete selected"/>
        </c:if>
     </form>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

现在无论我是否设置了记录属性,都会显示删除按钮:

<c:if test='${not empty "${records}"}'>
           <input type="submit" name="delete" value="delete selected"/>
    </c:if>
Run Code Online (Sandbox Code Playgroud)

在正常情况下记录属性我传递ArrayList然后使用foreach,但有时ArrayList是空的,所以在那些情况下我不希望删除按钮显示,我打了最简单的方法来实现这个就是使用这个空操作符.我哪里弄错了?

我甚至尝试手动将此属性设置为null:

if (ar.size() != 0)
    request.setAttribute("records", ar);
else
    request.setAttribute("records",null);
Run Code Online (Sandbox Code Playgroud)

编辑:@Qwe:是的你是对的,它之前对我有用,因为我测试了属性是否为空,它总是如此,因为我使用了错误的构造,但它起作用,因为我只是想显示一个字符串,如果没有任何字符串没有出现所以我认为一切正常.

Ole*_*eev 25

<c:if test='${not empty "${records}"}'>以及<c:if test="${!empty '${showWarning}'}">(从你的评论中)将始终解析为true,因为你实际上正在测试String ${records}是否为空,显然它不是.

只是为了确定 - 通过String ${records}我的意思是一个String值,就像你用Java一样分配它String foo = "${records}";.

下一行代码将测试records变量(从页面,请求,会话或应用程序范围查找)是否为空:

<c:if test="${not empty records}">
Run Code Online (Sandbox Code Playgroud)

代码行100%保证工作:)

此外,request.setAttribute("records",null)删除属性是一种糟糕的方法,因为empty测试不仅要求范围,还要求页面,会话等.请<c:remove var='records'/>改用.