<c:if test =“$ {not empty”$ {records}“}”>从不评估false </c:if>

时间:2012-02-11 20:16:53

标签: 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>

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

<c:if test='${not empty "${records}"}'>
           <input type="submit" name="delete" value="delete selected"/>
    </c:if>

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

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

if (ar.size() != 0)
    request.setAttribute("records", ar);
else
    request.setAttribute("records",null);

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

1 个答案:

答案 0 :(得分:25)

<c:if test='${not empty "${records}"}'>以及<c:if test="${!empty '${showWarning}'}">(来自您的评论)将始终解析为 true ,因为您实际上正在测试是否为字符串${records}是空的或不是,显然不是。

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

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

<c:if test="${not empty records}">

代码行100%保证可以正常工作:)

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