Avaliar tags JSTL c vazias ou nulas

389

Como posso validar se a Stringé nulo ou vazio usando as ctags de JSTL?

Eu tenho uma variável de nome var1e posso exibi-la, mas quero adicionar um comparador para validá-la.

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

Quero validar quando é nulo ou vazio (meus valores são cadeias).

user338381
fonte

Respostas:

763

Como posso validar se uma String é nula ou vazia usando as tags c do JSTL?

Você pode usar a emptypalavra - chave em a <c:if>para isso:

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

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

Ou, se você não precisar renderizar um monte de tags condicionalmente e, portanto, você só poderá verificá-lo dentro de um atributo de tag, poderá usar o operador condicional EL ${condition? valueIfTrue : valueIfFalse}:

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

Para saber mais sobre essas ${}coisas (a Expression Language , que é um assunto separado do JSTL ), verifique aqui .

Veja também:

BalusC
fonte
4
Para as pessoas que estão tendo problemas estranhos com o cheque vazio, aqui está uma história duvidoso com uma possível causa: gayleforce.wordpress.com/2008/01/26/jstl-empty-operator
CodeReaper
9
Resumido: emptynão funciona Setao usar o antigo JSTL 1.0. Você precisaria atualizar para o JSTL 1.1 (que já é de 2003).
BalusC
5
@BalusC - O EL ${not empty var1}verifica se há vazio e nulo simultaneamente? Quero dizer que o teste é avaliado como verdadeiro se e somente se nãovar1 for nulo e nãovar1 estiver vazio. Não há necessidade de verificar separadamente? null
Lion
11
é emptyequivalente a ne ''
shareef 17/01
2
@ Shareef: não, não é. Em caso de Stringvalores, é equivalente a var ne null and var ne ''. Além disso, ele também suporta Object, array CollectioneMap .
precisa saber é o seguinte
25

para verificar também a string em branco, sugiro 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>

Ele também lida com nulos

andro83
fonte
7

se você marcar apenas nulo ou vazio, poderá usar a opção with default para isso: <c:out default="var1 is empty or null." value="${var1}"/>

Ankit Agarwal
fonte
6

Este código está correto, mas se você inseriu muito espaço ('') em vez de uma cadeia nula ou vazia, retorne false.

Para corrigir isso, use a expressão regular (este código abaixo, verifique se a variável é nula ou vazia ou em branco, igual a 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
fonte
6

Aqui está o forro.

Operador ternário dentro do EL

${empty value?'value is empty or null':'value is NOT empty or null'}
Classificador
fonte
3

Você pode usar

    ${var == null}

alternativamente.

Supun Dharmarathne
fonte
Não, infelizmente, você não pode. "" sem nenhum símbolo, é uma string vazia, mas não é nula.
GDRT
1

Aqui está um exemplo de como validar um int e uma String que você passa do Java Controller para o arquivo 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
fonte
Qual é o problema do meu comentário?
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
fonte