8. A biblioteca de tags JSTL
8.0.1. Introdução
Consideremos a visualização [erreurs.jsp], que exibe uma lista de erros:

Existem várias maneiras de escrever uma página como essa. Aqui, estamos interessados apenas na parte que exibe os erros. Uma primeira solução é usar código Java, como foi feito:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page import="java.util.ArrayList" %>
<%
// recuperam-se os dados do modelo
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<%
for(int i=0;i<erreurs.size();i++){
out.println("<li>" + (String) erreurs.get(i) + "</li>\n");
}//for
%>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
<%= lienRetourFormulaire %>
</a>
</body>
</html>
A página JSP recupera a lista de erros da consulta (linha 8) e a exibe por meio de um loop Java (linhas 19-23). A página mistura código HTML e código Java, o que pode ser problemático se a página precisar ser mantida por um designer gráfico, que geralmente não compreenderá o código Java. Para evitar essa mistura, utilizam-se bibliotecas de tags que trarão novas possibilidades às páginas JSP. Com a biblioteca de tags JSTL (Java Standard Tag Library), a visualização anterior passa a ser a seguinte:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
A tag (linha 4)
indica o uso de uma biblioteca de tags cuja definição se encontra no arquivo [/WEB-INF/c.tld]. Essas tags serão utilizadas no código da página, precedidas pela letra c (prefix="c"). É possível utilizar qualquer prefixo de sua escolha. Aqui, c significa [core]. Os prefixos permitem utilizar bibliotecas de tags que possam ter os mesmos nomes para determinadas tags. O uso do prefixo elimina a ambiguidade. A nova página não possui mais código Java nos dois locais onde ele estava anteriormente:
- a recuperação do modelo da página [erreurs, lienRetourFormulaire] (parte removida)
- a exibição da lista de erros (linhas 13-15)
O loop de exibição de erros foi substituído pelo seguinte código:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- a tag <forEach> serve para delimitar um loop
- A notação ${variável} serve para escrever o valor de uma variável
A tag <forEach> possui aqui dois atributos:
- items="${erros}" indica a coleção de objetos sobre a qual se deve iterar. Aqui, a coleção é o objeto erros. Onde ele é encontrado? A página JSP procura um atributo chamado “erros” sucessivamente e na seguinte ordem:
- o objeto [request], que representa a solicitação enviada pelo controlador: request.getAttribute("erreurs")
- o objeto [session], que representa a sessão do cliente: session.getAttribute("erros")
- o objeto [application], que representa o contexto da aplicação web: application.getAttribute("erros")
A coleção designada pelo atributo items pode assumir diversas formas: tableau, ArrayList, objeto que implementa a interface List, ...
- var="erro" serve para atribuir um nome ao elemento atual da coleção que está sendo processada. O loop <forEach> será executado sucessivamente para cada elemento da coleção items. Dentro do loop, o elemento da coleção que está sendo processado será, portanto, designado aqui por erro.
A notação ${erreur} insere o valor da variável “erreur” no texto. Essa variável não é necessariamente uma sequência de caracteres. JSTL utiliza o método erreur.toString() para inserir o valor da variável “erreur”. Em vez da notação ${erro}, também é possível usar a tag <c:out value="${erro}"/>.
Voltando ao nosso exemplo de exibição de erros:
- o controlador incluirá na solicitação enviada à página JSP um ArrayList de mensagens de erro, ou seja, um ArrayList de objetos String: request.setAttribute("erros", erros), em que “erros” é o ArrayList;
- devido ao atributo items="${erros}", a página JSP procura um atributo chamado erros, sucessivamente na consulta, na sessão e no aplicativo. Ela o encontrará na solicitação: request.getAttribute("erros") retornará o ArrayList inserido na solicitação pelo controlador;
- a variável erreur do atributo var="erro" passará, portanto, a designar o elemento atual de ArrayList, ou seja, um objeto String. O método erreur.toString() irá inserir o valor desse String — neste caso, uma mensagem de erro — no fluxo HTML da página.
Os objetos da coleção processada pela tag <forEach> podem ser mais complexos do que simples sequências de caracteres. Tomemos como exemplo uma página JSP que exibe uma lista de artigos:
onde [listarticles] é um ArrayList de objetos do tipo [Article], que supomos ser um Javabean com os campos [id, nom, prix, stockActuel, stockMinimum], sendo que cada um desses campos é acompanhado por seus métodos get e set. O objeto [listarticles] foi inserido na solicitação pelo controlador. A página anterior JSP irá recuperá-lo no atributo items da tag forEach. O objeto atual “article” (var="article") designa, portanto, um objeto do tipo [Article]. Consideremos a tag da linha 3:
O que significa ${article.nom}? Na verdade, várias coisas, dependendo da natureza do objeto “artigo”. Para obter o valor de article.nom, a página JSP tentará duas coisas:
- article.getNom() — observe a grafia getNom para recuperar o campo “nom” (padrão JavaBean)
- article.get("nome")
O objeto [article] pode, portanto, ser um bean com um campo “nom” ou um dicionário com uma chave “nom”.
Não há limites para a hierarquia do objeto em questão. Assim, a tag
permite processar um objeto [individu] do seguinte tipo:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// métodos do padrão JavaBean
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
Para obter o valor de ${individu.enfants[1].nom}, a página JSP tentará vários métodos, incluindo este, que será bem-sucedido:
individu.getEnfants(1).getNom(), onde “indivíduo” designa um objeto do tipo Indivíduo.
8.0.2. Instalar e explorar a biblioteca JSTL
As explicações fornecidas anteriormente serão suficientes para a aplicação que nos interessa, mas a biblioteca de tags JSTL oferece outras tags além das apresentadas. Para conhecê-las, é possível instalar um tutorial fornecido no pacote da biblioteca.
Utilizaremos a implementação JSTL 1.1 do projeto [Jakarta Taglibs], disponível no URL [http://jakarta.apache.org/taglibs/] (maio de 2006):
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
O arquivo zip baixado tem um conteúdo semelhante ao seguinte:

Os dois arquivos com a extensão .war são arquivos compactados de aplicativos web:
- standard-doc: documentação sobre as tags JSTL
- standard-examples: exemplos de uso das tags
Vamos implantar esta última aplicação no Tomcat. Iniciamos o Tomcat por meio da opção adequada no menu [Démarrer], em seguida, digitamos a URL [http://localhost:8080] e seguimos o link [Tomcat Manager]:

Em seguida, é exibida uma página de autenticação. Fazemos o login como manager / manager ou admin / admin, conforme demonstrado no parágrafo 2.3.3.

Aparece uma página listando as aplicações atualmente implantadas no Tomcat:

Podemos adicionar uma nova aplicação por meio dos formulários localizados na parte inferior da página:

Usamos o botão [Parcourir] para selecionar um arquivo .war a ser implantado.

A captura de tela não mostra, mas selecionamos o arquivo [standard-examples.war] da distribuição JSTL baixada. O botão [Deploy] salva e implanta essa aplicação no Tomcat.

A aplicação [/standard-examples] foi implantada com sucesso. Vamos iniciá-la:

Recomenda-se ao leitor que acesse os diversos links disponibilizados nesta página ao procurar exemplos de uso das tags JSTL.
A aplicação [standard-doc] poderá ser implantada da mesma forma a partir do arquivo [standard-doc.war]. Ela fornece acesso a informações bastante técnicas sobre a biblioteca JSTL. Ela apresenta menos interesse para o iniciante.
8.0.3. Utilizando o JSTL em um aplicativo web
Nos exemplos fornecidos com a biblioteca JSTL 1.2, as páginas JSP possuem, no início do arquivo, a seguinte tag:
Já nos deparamos com essa tag no parágrafo 8.1.1 e fornecemos uma breve explicação:
- [uri]: URI (Uniform Resource Identifier), onde se encontra a definição das tags utilizadas na página. Essa URI será utilizada pelo servidor web quando a página JSP for convertida em código Java para se tornar um servlet. Ela também é utilizada por ferramentas de desenvolvimento de páginas da web para verificar a sintaxe correta das tags utilizadas na página ou para oferecer sugestões de preenchimento automático. Ao começar a digitar uma tag, uma ferramenta que conheça a biblioteca pode, então, sugerir ao usuário os atributos possíveis para essa tag.
- [prefix]: prefixo que identifica essas tags na página
A URI [http://java.sun.com/jsp/jstl/core] não pode ser utilizada se não houver conexão com a internet pública. Nesse caso, é possível armazenar localmente o arquivo de definição das tags. Vários desses arquivos são fornecidos com a distribuição JSTL 1.2 na pasta [tld] (Tag Language Definition):

JSTL é, na verdade, um conjunto de bibliotecas de tags. Utilizaremos apenas a biblioteca [c.tld], conhecida como biblioteca “core”. Colocaremos o arquivo [c.tld] acima na pasta [WEB-INF] de nossos aplicativos:
![]()
e inseriremos a seguinte tag em nossas páginas JSP para declarar o uso da biblioteca “core”:
Embora o uso de bibliotecas de tags nos permita evitar inserir código Java nas páginas JSP, essas tags são, naturalmente, convertidas em código Java durante a conversão da página JSP em um servlet Java. Elas utilizam classes definidas em dois arquivos [jstl.jar, standard.jar], que se encontram na pasta [lib] da distribuição JSTL:

Esses dois arquivos estão localizados na pasta [WEB-INF/lib] de nossos aplicativos:

Agora temos as bases para abordar a próxima versão do nosso aplicativo de exemplo.





