Comparar datas com JSTL

6 respostas
A

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

F

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

G

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.

G

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

P

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