Comparar datas com JSTL

6 respostas
andreiribas

seguinte galera… tenho um bean que tem um atributo dataFinal.
Pego a data atual do sistema com

<jsp:useBean id="dataAgora" class="java.util.Date"/> <c:set var="agora" scope="page"><fmt:formatDate type="date" pattern="dd/MM/yyyy" value="${dataAgora}"/></c:set>

agora nessa parte seto a variável dtFinal do meu bean em uma variavel temporária.

<c:set var="dtFinal" scope="page"> <fmt:formatDate type="date" pattern="dd/MM/yyyy" value="<c:out value="dataFinal"/>"/> </c:set>

o problema é que não está comparando, ou seja, o teste não é executado:

<c:when test="${agora <= dtFinal}">

alguém sabe alguma maneira melhor de fazer isso… ou vou ter que apelar pros scriptlets?

6 Respostas

felipealbuquerque

NUNCA apele para os scriptlets… faça esse tipo de validação no controlador (Servlet, Action, etc.) ou crie uma tag personalizada.

gleise

Porque você não cria uma propriedade no seu bean que testa as datas, ou cria um outro bean para testar a data ?
Tipo:

class ValidaBean {

 private Date data;
 private boolean agoraPosterior;

 (... sets e gets ...)

 private boolean isAgoraPosterior(){
   Date agora = new Date();
   if(agora &lt;= data)
      agoraPosterior = false;
   else
      agoraPosterior = true;
   return agoraPosterior;
 }

}

Daí, no jsp:

&lt;jsp:useBean id="validaBean" class="ValidaBean"/&gt;

&lt;c:set target="validaBean" property="data" value="${seuBean.dtFinal}"/&gt;

&lt;c:when test="${!agoraPosterior}"&gt;

Bom, interpretei que seu bean é um simples bean (com propriedades e gets e sets).
Era isso que você queria ? :slight_smile:

R

Cria um metodo public e static que compara as datas e escreve um TLD para disponibilizar essa funcao via EL aos JSP’s.

gleise

Rafael,

Tem algum tutorial/tópico que fale como fazer isso ?

R

Rafael,

Tem algum tutorial/tópico que fale como fazer isso ?

Se tem, nao sei. Basicamente eh:

  1. Cria um método public e static em uma classe.
  2. Escreve um arquivo com a extensao TLD mais ou menos como esse (e coloca embaixo de WEB-INF):
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">

<tlib-version>1.0</tlib-version>
<uri>uri_da_taglib</uri>

  <function>
    <name>nomeFuncao</name>
    <function-class>nome_totalmente_qualificado_classe</function-class>
    <function-signature>tipo_retorno nome_metodo()</function-signature>
  </function>
</taglib>
  1. No JSP coloca a diretiva taglib e chama a função através de EL:
<%@ taglib uri="uri_da_taglib" prefix="prefixo"%>

Resultado da minha função: ${prefixo:nomeFuncao()}

Se n conseguir, posta ae as duvidas.

[]'s

pierobom

Pessoal,

O post é meio antigo, mas como passei agora por esta situação acho que vale à pena esclarecer. Os operadores < e > funcionam sim para comparar datas em JSTL, bem como os respectivos le e gt.

O problema aí é a forma como está sendo contruído o objeto que vai passar pela comparação. Troque isto:
<fmt:formatDate type="date" pattern="dd/MM/yyyy" value="<c:out value="dataFinal"/>"/>
Por isto:
<fmt:formatDate type="date" pattern="dd/MM/yyyy" value="${dataFinal}/>"/>

… que deve funcionar.

Até mais,
Jean Pierobom

Criado 7 de dezembro de 2007
Ultima resposta 15 de set. de 2008
Respostas 6
Participantes 5