import
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach var="contato" items="${dao.lista}">
${contato.nome}, ${contato.email},
${contato.endereco}, ${contato.dataNascimento}
</c:forEach>
nao tem else no jstl, pode usar not ou !
<td>
<c:if test="${not empty contato.email}">
<a href="mailto:${contato.email}">${contato.email}</a>
</c:if>
<c:if test="${empty contato.email}">
E-mail não informado
</c:if>
</td>
ou pode usar o choose, funciona como o else
Para simularmos switch/case com JSTL, utilizamos a tag c:choose e para cada caso do switch fazemos c:when. O default do switch pode ser representado através da tag c:otherwise
<c:choose>
<c:when test="${not empty contato.email}">
<a href="mailto:${contato.email}">${contato.email}</a>
</c:when>
<c:when test="${empty contato.email}">
<a href="mailto:${contato.email}">${contato.email}</a>
</c:when>
<c:otherwise>
E-mail não informado
</c:otherwise>
</c:choose>
Outro grande problema do mundo de desenvolvimento web é gerar URLs. URLs são sempre relativas ao lugar atual que elas estão. Por exemplo, se a URL atual do site for www.meusite.com.br/produto/lista, e tivermos um link que apontar para novo, essa URL é relativa ao caminho atual, e ao clicar no link, a nova URL será www.meusite.com.br/produto/novo.
Para resolver esse problema, o correto é sempre gerarmos URLs completas para nossa aplicação. Mas isso também pode ser difícil, já que no mundo Java é bem comum o "contexto" mudar. Contexto é como chamamos o "começo da URL", que diz ao Tomcat qual projeto deve rodar; no nosso caso, é "produtos". Se colocarmos na URL, por exemplo, "/produtos/produto/novo", ela funcionaria. O problema é que se "produtos" mudar, precisaremos mudar em todos os lugares.
Por esse motivo, a melhor maneira para se gerar uma URL é por meio da JSTL. Ela saberá sempre como montar a URL certa! Veja o HTML que temos, que gera a URL para a página de novo produto:
<a href="/produtos/produto/formulario">Adicionar um produto</a>
Vamos fazer agora com que esse link seja gerado de maneira inteligente. A tag que faz isso é a tag c:url. Ela recebe um link e o nome de uma variável que conterá o link gerado:
<c:url value="/produto/formulario" var="urlAdicionar" />
<a href="${urlAdicionar}">Adicionar um produto</a>
Repare que a URL que montamos começa com uma "/", e é relativo a raiz do projeto. Se você olhar o HTML gerado, verá que a URL será "/produtos/produto/formulario", pois a JSTL percebeu que existe um "context root" e automaticamente o colocou na URL!
Use sempre c:url para gerar seus links. Ele é extremamente útil quando esses links estão em componentes reutilizáveis. Aí, dependendo da página que você coloca o componente, a URL é diferente. Com a JSTL, isso deixa de ser um problema.
format
fmt
A data está mal formatada em nossa listagem. É comum querermos exibir a data em formato amigável, mais fácil de ser lido, por exemplo, dia/mês/ano.
A JSTL possui um outro pacote, focado nesse tipo de formatação. Esse é o pacote "fmt". Ele contém uma taglib chamada "formatDate", que faz isso para nós. Ela recebe o padrão que deve formatar a data (por exemplo, dd/MM/yyyy que representa dia/mês/ano) e a data a ser exibida.
Veja o código abaixo:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<td>
<fmt:formatDate pattern="dd/MM/yyyy" value="${p.dataInicioVenda.time}" />
</td>
Repare que fizemos ${p.dataInicioVenda.time}. Precisamos passar o time, porque o formatDate recebe um objeto do tipo Date, e nossa data está representada como um Calendar.
Outra coisa que podemos formatar são números. Exibimos ali o preço do produto. Podemos usar a taglib "formatNumber" para formatar o número:
<fmt:formatNumber value="${p.preco}" type="currency"/>
Ambas as funções podem receber diversos parâmetros e diferentes maneiras de formatar datas e números. Consultar a documentação oficial é importante e ajuda bastante.
Internacionalização
<fmt
Uma outra tarefa que é bastante simplificada pela JSTL é a internacionalização. Com ela, conseguimos colocar as mensagens das várias línguas em um arquivo, e ela é responsável por trocar a língua de acordo com o usuário que acessa o site.
Para isso, precisamos fazer algumas coisas. A primeira delas é definir o nome desse arquivo dentro do web.xml. Veja o trecho de configuração abaixo:
<context-param>
<param-name>
javax.servlet.jsp.jstl.fmt.localizationContext
</param-name>
<param-value>messages</param-value>
</context-param>
O parâmetro param-value contém o nome do arquivo que terá as frases em várias línguas. Esse arquivo deve ter a extensão .properties e deve ficar disponível no classpath. Para isso, salvaremos o messages.properties dentro da pasta src.
Vamos colocar o conteúdo desse arquivo:
mensagem.bemvindo=Bem vindo ao curso de JSTL
mensagem.novoProduto=Adicionar um novo produto
Repare que esse arquivo é composto de chave e valor. E é por meio da chave que capturaremos a mensagem que queremos exibir.
Se quisermos exibir a mensagem de bem vindo, faremos:
<fmt:message key="mensagem.bemvindo" />
O link, por exemplo, podemos alterar para:
<c:url value="/produto/formulario" var="linkProduto" />
<a href="${linkProduto}"><fmt:message key="mensagem.novoProduto" /></a>
Se quisermos que nosso site responda para inglês, precisamos ter um arquivo chamado messages_en.properties, com o mesmo conteúdo do original em português. O "en" indica que é o arquivo em inglês; se colocássemos "de", seria em alemão, e assim por diante. Por exemplo:
mensagem.bemvindo=Welcome to the JSTL course!
mensagem.novoProduto=Add a new product
Se você mudar a língua do seu browser e atualizar a página, repare que as mensagens virão em inglês! Veja só como a JSTL faz a parte de internacionalização ser simples!
c:import
Com a JSTL, podemos também reutilizar páginas já existentes. Um bom exemplo de uso são o cabeçalho e o rodapé das páginas. Elas geralmente são iguais entre todas as páginas.
Para isso, vamos criar o arquivo "rodape.jsp", na pasta /WEB-INF/jsp/_comum. Nele, colocaremos o seguinte conteúdo:
<hr/>
Cursos Online Alura
Agora, para utilizarmos ela na listagem, basta fazermos uso da tag import. Veja o código abaixo:
... pagina ...
<c:import url="../_comum/rodape.jsp" />
</body>
</html>
Veja que passamos a URL da JSP, em relação a JSP que estamos. Ou seja, voltamos um nível, e aí acessamos a pasta "_comum".
Um detalhe importante é que variáveis declaradas em uma página não são visíveis na outra, pois elas são processadas de forma separada pelo servlet container (Tomcat).