web-dev-qa-db-fra.com

<c: si test = '$ {non vide "$ {enregistrements}"}'> Ne jamais évaluer false

J'ai un problème avec JSTL et Opérateur vide. J'ai déjà fait quelques pages simples et tout a fonctionné bien, mais maintenant j'ai:

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

maintenant, peu importe si je définissais l'attribut Records ou non, le bouton Supprimer apparaît:

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

dans une situation normale pour enregistrer l'attribut, je passe une arraylist, puis utilisez-la, mais parfois une arracheListe est vide, donc dans ces situations, je ne veux pas que le bouton de suppression de la suppression, je me suis battu que le moyen le plus simple de réaliser cela serait d'utiliser cet opérateur vide . Où est-ce que je fais une erreur?

J'ai même essayé de définir manuellement cet attribut à NULL:

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

EDIT: @qwe: Oui, vous avez raison, cela a fonctionné pour moi avant parce que j'ai testé si l'attribut était vide dans mon chemin, c'était toujours vrai, car j'ai eu une mauvaise construction, mais cela a fonctionné parce que je voulais juste montrer une chaîne, si Il n'y avait aucune chaîne que rien ne se présentait alors je pensais que tout a bien fonctionné.

8
Andna

<c:if test='${not empty "${records}"}'> Ainsi que <c:if test="${!empty '${showWarning}'}"> (À partir de votre commentaire) sera toujours résolution true car vous testez réellement si une chaîne ${records} Est vide ou non, et évidemment ce n'est pas le cas.

Juste pour être sûr - par chaîne ${records} Je veux dire une valeur de chaîne, comme si vous l'attribuiez dans Java J'aime String foo = "${records}";.

La ligne de code suivante va tester si records variable (qui est levé vers le haut de la page, la demande, la session ou la portée de l'application) est vide ou non:

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

La ligne de code est garantie à 100% de travailler :)

En outre, request.setAttribute("records",null) est un mauvais moyen d'éliminer les attributs car empty tests non seulement de la portée, mais une page, une session, etc. Utilisez <c:remove var='records'/>.

25
Oleg Mikheev