2012-02-11 26 views
8

Tengo un problema con JSTL y el operador vacío. Ya he hecho algunas páginas simples y todo funcionaba bien, pero ahora tengo:

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

ahora no importa si me puse los registros atribuyen o no, el botón de borrar muestra arriba:

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

en condiciones normales situación al atributo de registros Paso ArrayList y luego uso foreach, pero a veces ArrayList está vacío, por lo que en esas situaciones no quiero que aparezca el botón Eliminar, luché de la manera más fácil para lograr esto sería usar este operador vacío. ¿Dónde estoy cometiendo un error?

Incluso he intentado configurar manualmente este atributo nulo:

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

EDIT: @Qwe: si usted está bien, a mí me funcionó antes, porque he comprobado si el atributo estaba vacío en mi manera, siempre fue cierto, porque utilicé construcciones incorrectas, pero funcionó porque solo quería mostrar una cadena, si no había String no aparecía nada, así que estaba pensando que todo funcionaba bien.

Respuesta

24

<c:if test='${not empty "${records}"}'>, así como <c:if test="${!empty '${showWarning}'}"> (de su comentario) se siempre determinación de cierto porque estás en realidad se está probando si una cadena ${records} está vacía o no, y, obviamente, no lo es.

Sólo para estar seguro - por String ${records} me refiero a un valor de cadena, como si estuviera asignándolo en Java como String foo = "${records}";.

La siguiente línea de código comprobará si records variable (que se levantó la vista de la página, solicitud, sesión o el alcance de la aplicación) está vacío o no:

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

La línea de código es 100% garantizado para trabajo :)

Además, request.setAttribute("records",null) es una mala manera de eliminar atributos porque empty pruebas no sólo solicitan alcance, pero la página, etc. Utilice sesión <c:remove var='records'/> lugar.

+0

Si intento este fragmento de código, se produce una excepción: org.apache.jasper.JasperException: /WEB-INF/userrecords.jsp (línea: 26, columna: 15) símbolo igual esperado. Lo curioso es que en otro .jsp utilizo $ {showWarning} y funciona bien (se nota cuando debería) – Andna

+0

y lo que está en la línea 26? cambiar a dobles comillas no lo arregla? –

+0

En la línea 26 tengo esto si la etiqueta y el operador vacío, las comillas dobles no ayudan, para ser honesto, no entiendo completamente cuando necesito comillas simples o dobles, pero observé que cuando uso esos operadores vacíos debo usa los dobles y los solos, como dije, funciona en otro .jsp que hice. – Andna