Evaluar etiquetas JSTL c vacías o nulas

389

¿Cómo puedo validar si a Stringes nulo o está vacío usando las cetiquetas de JSTL?

Tengo una variable de nombre var1y puedo mostrarla, pero quiero agregar un comparador para validarla.

<c:out value="${var1}" />

Quiero validar cuando es nulo o vacío (mis valores son cadenas).

usuario338381
fuente

Respuestas:

763

¿Cómo puedo validar si una cadena es nula o está vacía usando las etiquetas c de JSTL?

Puede usar la emptypalabra clave en a <c:if>para esto:

<c:if test="${empty var1}">
    var1 is empty or null.
</c:if>
<c:if test="${not empty var1}">
    var1 is NOT empty or null.
</c:if>

O el <c:choose>:

<c:choose>
    <c:when test="${empty var1}">
        var1 is empty or null.
    </c:when>
    <c:otherwise>
        var1 is NOT empty or null.
    </c:otherwise>
</c:choose>

O si no necesita renderizar condicionalmente un montón de etiquetas y, por lo tanto, solo puede verificarlo dentro de un atributo de etiqueta, puede usar el operador condicional EL ${condition? valueIfTrue : valueIfFalse}:

<c:out value="${empty var1 ? 'var1 is empty or null' : 'var1 is NOT empty or null'}" />

Para obtener más información sobre esas ${}cosas (el Lenguaje de expresión , que es un tema separado de JSTL ), marque aquí .

Ver también:

BalusC
fuente
44
Para las personas que tienen problemas extraños con el cheque vacío, aquí hay una historia sospechosa con una posible causa: gayleforce.wordpress.com/2008/01/26/jstl-empty-operator
CodeReaper
99
Resumido: emptyno funciona Setcuando se usa el antiguo JSTL 1.0. Debería actualizar a JSTL 1.1 (que ya es de 2003).
BalusC
55
@BalusC - ¿El EL ${not empty var1}verifica tanto vacío como nulo simultáneamente? Quiero decir que la prueba se evalúa como verdadera si y solo si novar1 es nula y no está vacía. ¿No hay necesidad de verificar por separado? var1null
León
1
es emptyequivalente a ne ''
shareef
2
@shareef: no, no lo es. En caso de Stringvalores, es equivalente a var ne null and var ne ''. Además también es compatible Object, matriz Collectiony Map.
BalusC
25

para verificar también la cadena en blanco, sugiero seguir

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:if test="${empty fn:trim(var1)}">

</c:if>

También maneja nulos

andro83
fuente
7

si marca solo nulo o vacío, puede usar la opción predeterminada para esto: <c:out default="var1 is empty or null." value="${var1}"/>

Ankit Agarwal
fuente
6

Este código es correcto, pero si ingresó mucho espacio ('') en lugar de una cadena nula o vacía, devuelve falso.

Para corregir esto, utilice la expresión regular (este código a continuación verifique si la variable es nula o está vacía o en blanco igual que org.apache.commons.lang.StringUtils.isNotBlank):

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
        <c:if test="${not empty description}">
            <c:set var="description" value="${fn:replace(description, ' ', '')}" />
            <c:if test="${not empty description}">
                  The description is not blank.
            </c:if>
        </c:if>
Rija Ramampiandra
fuente
6

Aquí está el trazador de líneas.

Operador ternario dentro de EL

${empty value?'value is empty or null':'value is NOT empty or null'}
Clasificador
fuente
3

Puedes usar

    ${var == null}

alternativamente.

Supun Dharmarathne
fuente
No, desafortunadamente no puedes. "" sin ningún símbolo es una cadena vacía pero no es nula.
gdrt
1

Aquí hay un ejemplo de cómo validar un int y una cadena que pasa del controlador Java al archivo JSP.

MainController.java:

@RequestMapping(value="/ImportJavaToJSP")
public ModelAndView getImportJavaToJSP() {
    ModelAndView model2= new ModelAndView("importJavaToJSPExamples");

    int someNumberValue=6;
    String someStringValue="abcdefg";
    //model2.addObject("someNumber", someNumberValue);
    model2.addObject("someString", someStringValue);

    return model2;
}

importJavaToJSPExamples.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<p>${someNumber}</p>
<c:if test="${not empty someNumber}">
    <p>someNumber is Not Empty</p>
</c:if>
<c:if test="${empty someNumber}">
    <p>someNumber is Empty</p>
</c:if>
<p>${someString}</p>
<c:if test="${not empty someString}">
    <p>someString is Not Empty</p>
</c:if>
<c:if test="${empty someString}">
    <p>someString is Empty</p>
</c:if>
Gene
fuente
¿Cuál es el problema con mi comentario?
Gene
-1
In this step I have Set the variable first:

<c:set var="structureId" value="<%=article.getStructureId()%>" scope="request"></c:set>

In this step I have checked the variable empty or not:

 <c:if test="${not empty structureId }">
    <a href="javascript:void(0);">Change Design</a>
 </c:if>
ASR
fuente