8. La libreria dei tag JSTL
8.0.1. Introduzione
Consideriamo la vista [erreurs.jsp] che visualizza un elenco di errori:

Esistono diversi modi per scrivere una pagina di questo tipo. In questa sede ci interessiamo esclusivamente alla parte relativa alla visualizzazione degli errori. Una prima soluzione consiste nell’utilizzare codice Java, come è stato fatto:
<%@ 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" %>
<%
// si recuperano i dati dal modello
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>
La pagina JSP recupera l'elenco degli errori dalla richiesta (riga 8) e lo visualizza utilizzando un ciclo Java (righe 19-23). La pagina mescola codice HTML e codice Java, il che può essere problematico se la pagina deve essere gestita da un grafico che, in genere, non comprenderà il codice Java. Per evitare questa commistione, si utilizzano librerie di tag che offriranno nuove possibilità alle pagine JSP. Con la libreria di tag JSTL (Java Standard Tag Library), la vista precedente diventa la seguente:
<%@ 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>
Il tag (riga 4)
indica l'utilizzo di una libreria di tag la cui definizione si trova nel file [/WEB-INF/c.tld]. Questi tag saranno utilizzati nel codice della pagina, preceduti dal prefisso c (prefix="c"). È possibile utilizzare qualsiasi prefisso a propria scelta. In questo caso, c sta per [core]. I prefissi consentono di utilizzare librerie di tag che potrebbero avere nomi identici per alcuni tag. L’uso del prefisso elimina l’ambiguità. La nuova pagina non contiene più codice Java nei due punti in cui era presente in precedenza:
- il recupero del modello della pagina [erreurs, lienRetourFormulaire] (parte rimossa)
- la visualizzazione dell'elenco degli errori (righe 13-15)
Il ciclo di visualizzazione degli errori è stato sostituito dal seguente codice:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- il tag <forEach> serve a delimitare un ciclo
- La notazione ${variabile} serve a scrivere il valore di una variabile
Il tag <forEach> presenta qui due attributi:
- items="${errori}" indica la collezione di oggetti su cui eseguire l'iterazione. In questo caso, la collezione è l'oggetto «errori». Dove si trova quest'ultimo? La pagina JSP cerca un attributo denominato «errori» in successione e nell'ordine in:
- l’oggetto [request] che rappresenta la richiesta trasmessa dal controller: request.getAttribute("errori")
- l’oggetto [session] che rappresenta la sessione del cliente: session.getAttribute("errori")
- l'oggetto [application] che rappresenta il contesto dell'applicazione web: application.getAttribute("errori")
La collezione indicata dall'attributo items può assumere diverse forme: tableau, ArrayList, oggetto che implementa l'interfaccia List, ...
- var="errore" serve ad assegnare un nome all'elemento corrente della collezione in fase di elaborazione. Il ciclo <forEach> verrà eseguito in successione per ciascun elemento della collezione items. All'interno del ciclo, l'elemento della collezione in fase di elaborazione sarà quindi indicato qui come errore.
La notazione ${erreur} inserisce il valore della variabile "erreur" nel testo. Questa variabile non è necessariamente una stringa di caratteri. JSTL utilizza il metodo erreur.toString() per inserire il valore della variabile "erreur". Al posto della notazione ${errore}, è possibile utilizzare anche il tag <c:out value="${errore}"/>.
Tornando al nostro esempio di visualizzazione degli errori:
- il controller inserirà nella richiesta trasmessa alla pagina JSP un ArrayList di messaggi di errore, quindi un ArrayList di oggetti String: request.setAttribute("errori", errori) dove "errori" è il ArrayList;
- a causa dell’attributo items="${errori}", la pagina JSP cercherà un attributo denominato "errori", in successione nella query, nella sessione e nell’applicazione. Lo troverà nella richiesta: request.getAttribute("errori") restituirà il ArrayList inserito nella richiesta dal controller;
- la variabile erreur dell’attributo var="errore" indicherà quindi l’elemento corrente di ArrayList, ovvero un oggetto String. Il metodo erreur.toString() inserirà il valore di questo String, in questo caso un messaggio di errore, nel flusso HTML della pagina.
Gli oggetti della collezione gestita dal tag <forEach> possono essere più complessi di semplici stringhe di caratteri. Prendiamo l’esempio di una pagina JSP che visualizza un elenco di articoli:
dove [listarticles] è un ArrayList di oggetti di tipo [Article], che si suppone essere un Javabean con i campi [id, nom, prix, stockActuel, stockMinimum], ciascuno dei quali è accompagnato dai relativi metodi get e set. L'oggetto [listarticles] è stato inserito nella richiesta dal controller. La pagina precedente JSP lo recupererà nell'attributo items del tag forEach. L'oggetto corrente «article» (var="article") indica quindi un oggetto di tipo [Article]. Consideriamo il tag della riga 3:
Cosa significa ${article.nom}? In realtà, diverse cose a seconda della natura dell'oggetto "articolo". Per ottenere il valore di article.nom, la pagina JSP proverà due cose:
- article.getNom() – si noti la grafia getNom per recuperare il campo «nome» (standard JavaBean)
- article.get("nome")
L'oggetto [article] può quindi essere un bean con un campo "nom" oppure un dizionario con una chiave "nom".
Non ci sono limiti alla gerarchia dell’oggetto trattato. Pertanto, il tag
consente di elaborare un oggetto [individu] del seguente tipo:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// metodi dello standard JavaBean
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
Per ottenere il valore di ${individu.enfants[1].nom}, la pagina JSP proverà diversi metodi, tra cui questo che avrà esito positivo:
individu.getEnfants(1).getNom(), dove «individuo» indica un oggetto di tipo Individuo.
8.0.2. Installare e scoprire la libreria JSTL
Le spiegazioni fornite in precedenza saranno sufficienti per l’applicazione che ci interessa, ma la libreria di tag JSTL offre altri tag oltre a quelli presentati. Per scoprirli, è possibile installare un tutorial fornito nel pacchetto della libreria.
Utilizzeremo l’implementazione JSTL 1.1 del progetto [Jakarta Taglibs] disponibile all’URL [http://jakarta.apache.org/taglibs/] (maggio 2006):
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Il file zip scaricato contiene quanto segue:

I due file con estensione .war sono archivi di applicazioni web:
- standard-doc: documentazione sui tag JSTL
- standard-examples: esempi di utilizzo dei tag
Distribuiremo quest'ultima applicazione all'interno di Tomcat. Avviamo Tomcat tramite l'opzione appropriata del menu [Démarrer], quindi inseriamo l'URL [http://localhost:8080] e seguiamo il link [Tomcat Manager]:

Viene quindi visualizzata una pagina di autenticazione. Effettuiamo l’accesso come manager / manager o admin / admin, come illustrato nel paragrafo 2.3.3.

Otteniamo una pagina che elenca le applicazioni attualmente distribuite in Tomcat:

Possiamo aggiungere una nuova applicazione tramite i moduli situati in fondo alla pagina:

Utilizziamo il pulsante [Parcourir] per selezionare un file .war da distribuire.

Lo screenshot non lo mostra, ma abbiamo selezionato il file [standard-examples.war] dalla distribuzione JSTL scaricata. Il pulsante [Deploy] salva e distribuisce questa applicazione all’interno di Tomcat.

L'applicazione [/standard-examples] è stata correttamente distribuita. La avviamo:

Si invita il lettore a seguire i vari link presenti in questa pagina quando cerca esempi di utilizzo dei tag JSTL.
L'applicazione [standard-doc] potrà essere distribuita allo stesso modo a partire dal file [standard-doc.war]. Essa fornisce accesso a informazioni piuttosto tecniche sulla libreria JSTL. Presenta minore interesse per i principianti.
8.0.3. Utilizzo di JSTL in un'applicazione web
Negli esempi forniti con la libreria JSTL 1.2, le pagine JSP contengono all’inizio del file il seguente tag:
Abbiamo già incontrato questo tag nel paragrafo 8.1.1, dove ne abbiamo fornito una breve spiegazione:
- [uri]: URI (Uniform Resource Identifier), dove si trova la definizione dei tag utilizzati nella pagina. Questo URI verrà utilizzato dal server web quando la pagina JSP verrà tradotta in codice Java per diventare un servlet. Viene inoltre utilizzato dagli strumenti di sviluppo di pagine web per verificare la corretta sintassi dei tag utilizzati nella pagina o per fornire un suggerimento durante la digitazione. Quando si inizia a digitare un tag, uno strumento che conosce la libreria può quindi suggerire all’utente gli attributi possibili per quel tag.
- [prefix]: prefisso che identifica questi tag nella pagina
L'URI [http://java.sun.com/jsp/jstl/core] non è utilizzabile se non si è connessi alla rete Internet pubblica. In questo caso, è possibile salvare localmente il file di definizione dei tag. Diversi file di questo tipo sono forniti con la distribuzione JSTL 1.2 nella cartella [tld] (Tag Language Definition):

JSTL è in realtà un insieme di librerie di tag. Utilizzeremo solo la libreria [c.tld], detta libreria "core". Inseriremo il file [c.tld] sopra indicato nella cartella [WEB-INF] delle nostre applicazioni:
![]()
e inseriremo il seguente tag nelle nostre pagine JSP per dichiarare l’utilizzo della libreria “core”:
Sebbene l’uso delle librerie di tag ci consenta di evitare di inserire codice Java nelle pagine JSP, tali tag vengono ovviamente tradotti in codice Java durante la conversione della pagina JSP in un servlet Java. Essi utilizzano classi definite in due file [jstl.jar, standard.jar] che si trovano nella cartella [lib] della distribuzione JSTL:

Questi due archivi si trovano nella cartella [WEB-INF/lib] delle nostre applicazioni:

Ora disponiamo delle basi per affrontare la versione successiva della nostra applicazione di esempio.





