我遇到了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:是的你是对的,之前它对我有用,因为我测试了属性是否属于我的方式,它总是如此,因为我使用了错误的构造,但它起作用,因为我只是想显示一个字符串,如果有的话没有字符串没有出现所以我认为一切正常。
答案 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'/>
。