Evaluate empty or null JSTL c tags
Asked Answered
U

8

427

How can I validate if a String is null or empty using the c tags of JSTL?

I have a variable named var1 and I can display it, but I want to add a comparator to validate it.

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

I want to validate when it is null or empty (my values are string type).

Uncap answered 11/5, 2010 at 14:40 Comment(0)
E
829

How can I validate if a String is null or empty using the c tags of JSTL?

You can use the empty keyword in a <c:if> for this:

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

Or the <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>

Or if you don't need to conditionally render a bunch of tags and thus you could only check it inside a tag attribute, then you can use the EL conditional operator ${condition? valueIfTrue : valueIfFalse}:

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

To learn more about those ${} things (the Expression Language, which is a separate subject from JSTL), check here.

See also:

Exorcism answered 11/5, 2010 at 14:47 Comment(9)
For people who are having odd problems with the empty check, here's a fishy story with a possible cause: gayleforce.wordpress.com/2008/01/26/jstl-empty-operatorMercier
Summarized: empty doesn't work on Set when using the ancient JSTL 1.0. You'd need to upgrade to JSTL 1.1 (which is from 2003 already).Exorcism
@Exorcism - Does the EL ${not empty var1} check for both empty and null simultaneously? I mean the test is evaluated to true if and only if var1 is not null and var1 is not empty. Is there no need to check for null separately?Chaste
@Exorcism - Thank you. I had already checked what you mentioned in your answer prior to my comment though I just wanted to clarify once, since a null value and an empty string are treated differently at many places (almost everywhere).Chaste
is empty equvilant to ne ' 'Unofficial
@shareef: no, it isn't. In case of String values, it's equivalent to var ne null and var ne ''. Further it also supports Object, array, Collection and Map.Exorcism
@Exorcism empty var1 was extremely useful instead of boolean Java.Marmoreal
@Exorcism If this answer https://mcmap.net/q/80813/-evaluate-empty-or-null-jstl-c-tags is copy pasted in the edit, please give proper attribution. Thanks. You will always be our hero.Siclari
Slightly off-topic, but what if ... c:choose was replaced with c:if, taking the test from the c:when tag, and the c:when became c:then (without the 'test') and the c:otherwise became c:else? We would then have an if-then-else construct.Shearin
N
28

to also check blank string, I suggest following

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

It also handles nulls

Network answered 20/5, 2013 at 9:54 Comment(0)
R
8

if you check only null or empty then you can use the with default option for this: <c:out default="var1 is empty or null." value="${var1}"/>

Rhineland answered 11/9, 2015 at 10:38 Comment(0)
B
6

This code is correct but if you entered a lot of space (' ') instead of null or empty string <c:if test="${empty var1}"> return false.

To correct this use regular expresion (this code below check if the variable is null or empty or blank the same as 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>
Badr answered 13/12, 2012 at 7:25 Comment(0)
S
6

Here's the one liner.

Ternary operator inside EL

${empty value?'value is empty or null':'value is NOT empty or null'}
Siclari answered 6/2, 2015 at 7:36 Comment(0)
H
3

You can use ${var == null} alternatively.

Honky answered 30/11, 2016 at 9:28 Comment(1)
No, unfortunately, you can't. "" without any symbols in it is an empty string but is not null.Eugenieeugenio
L
1

Here's an example of how to validate an int and a String that you pass from the Java Controller to the JSP file.

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>
Ludvig answered 12/4, 2017 at 1:19 Comment(1)
What's the issue with my comment?Ludvig
L
-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>
Late answered 28/7, 2015 at 7:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.