【问题标题】:<c:if test='${not empty "${records}"}'> never evaluates false<c:if test='${not empty "${records}"}'> 从不评估 false
【发布时间】:2012-02-11 20:16:52
【问题描述】:

我遇到了 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 是空的,所以在这些情况下我不想显示删除按钮,我争取实现这一点的最简单方法是使用这个空运算符。我在哪里犯错了?

我什至尝试手动将此属性设置为空:

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

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

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    &lt;c:if test='${not empty "${records}"}'&gt;&lt;c:if test="${!empty '${showWarning}'}"&gt;(来自您的评论)将 always 解析为 true,因为您实际上是在测试 String ${records} 是否为是否为空,显然不是。

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

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

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

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

    另外,request.setAttribute("records",null) 是删除属性的不好方法,因为empty 不仅测试请求范围,还测试页面、会话等。请改用&lt;c:remove var='records'/&gt;

    【讨论】:

    • 如果我尝试这段代码,则会引发异常:org.apache.jasper.JasperException: /WEB-INF/userrecords.jsp (line: 26, column: 15) 预期等号。有趣的是,在其他 .jsp 中我使用 ${showWarning} 和它工作正常(它显示什么时候应该)
    • 第 26 行是什么?改为双引号不能解决问题?
    • 在第 26 行我有这个 if 标记和空运算符,双引号没有帮助,老实说,我不完全掌握何时需要单引号和何时需要双引号,但我观察到当我使用那些空运算符,我必须使用双精度和单精度运算符,因为我说过它适用于我制作的其他 .jsp。
    • 答案已编辑,当您使用空运算符时,您不需要任何类型的 qoutes
    • 如果我写的总是结果为真,那为什么:${showWarning} 在其他文件中对我有用吗?正如我所说,如果我把 在我的代码中,我会得到异常。编辑:对不起它现在有效:D,但我想知道为什么我的方法以前有效。
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2012-05-13
    • 2015-03-15
    • 2015-04-05
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多