8. Die Tag-Bibliothek JSTL
8.0.1. Einführung
Betrachten wir die Ansicht [erreurs.jsp], die eine Fehlerliste anzeigt:

Es gibt mehrere Möglichkeiten, eine solche Seite zu erstellen. Wir konzentrieren uns hier ausschließlich auf den Teil, der die Fehler anzeigt. Eine erste Lösung besteht darin, Java-Code zu verwenden, wie es hier geschehen ist:
<%@ 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" %>
<%
// Daten aus der Vorlage abrufen
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>
Die Seite JSP ruft die Fehlerliste aus der Abfrage ab (Zeile 8) und zeigt sie mithilfe einer Java-Schleife an (Zeilen 19–23). Die Seite vermischt HTML-Code und Java-Code, was problematisch sein kann, wenn die Seite von einem Grafikdesigner gepflegt werden muss, der den Java-Code in der Regel nicht versteht. Um diese Vermischung zu vermeiden, werden Tag-Bibliotheken verwendet, die den JSP-Seiten neue Möglichkeiten eröffnen. Mit der Tag-Bibliothek JSTL (Java Standard Tag Library) sieht die vorherige Ansicht nun wie folgt aus:
<%@ 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>
Das Tag (Zeile 4)
kennzeichnet die Verwendung einer Tag-Bibliothek, deren Definition sich in der Datei [/WEB-INF/c.tld] befindet. Diese Tags werden im Code der Seite verwendet, wobei ihnen das Wort „c“ vorangestellt wird (prefix="c"). Es kann ein beliebiges Präfix verwendet werden. Hier steht „c“ für [core]. Präfixe ermöglichen die Verwendung von Tag-Bibliotheken, die bei bestimmten Tags möglicherweise dieselben Namen haben. Durch die Verwendung des Präfixes wird die Mehrdeutigkeit beseitigt. Die neue Seite enthält an den beiden Stellen, an denen zuvor Java-Code vorhanden war, nun keinen mehr:
- das Abrufen der Vorlage der Seite [erreurs, lienRetourFormulaire] (entfernte Stelle)
- die Anzeige der Fehlerliste (Zeilen 13–15)
Die Schleife zur Anzeige der Fehler wurde durch den folgenden Code ersetzt:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- Das Tag <forEach> dient zur Abgrenzung einer Schleife
- Die Schreibweise ${Variable} dient dazu, den Wert einer Variablen auszugeben
Das Tag <forEach> hat hier zwei Attribute:
- items="${erreurs}" gibt die Sammlung von Objekten an, über die iteriert werden soll. Hier ist die Sammlung das Objekt „erreurs“. Wo wird dieses gefunden? Die Seite JSP sucht nacheinander und in der folgenden Reihenfolge nach einem Attribut namens „erreurs“ in:
- dem Objekt [request], das die vom Controller übermittelte Anfrage darstellt: request.getAttribute("erreurs")
- dem Objekt [session], das die Sitzung des Kunden darstellt: session.getAttribute("Fehler")
- das Objekt [application], das den Kontext der Webanwendung darstellt: application.getAttribute("Fehler")
Die durch das Attribut „items“ bezeichnete Sammlung kann verschiedene Formen annehmen: tableau, ArrayList, ein Objekt, das die Schnittstelle List implementiert, ...
- var="Fehler" dient dazu, dem aktuellen Element der gerade verarbeiteten Sammlung einen Namen zu geben. Die Schleife <forEach> wird nacheinander für jedes Element der Sammlung „items“ ausgeführt. Innerhalb der Schleife wird das gerade verarbeitete Element der Sammlung daher hier als „Fehler“ bezeichnet.
Die Schreibweise ${erreur} fügt den Wert der Variablen „erreur“ in den Text ein. Diese Variable muss nicht unbedingt eine Zeichenkette sein. JSTL verwendet die Methode erreur.toString(), um den Wert der Variablen „erreur“ einzufügen. Anstelle der Notation ${erreur} kann auch das Tag <c:out value="${erreur}"/> verwendet werden.
Um auf unser Beispiel zur Fehleranzeige zurückzukommen:
- Der Controller fügt in die an die Seite JSP übermittelte Anfrage einen ArrayList mit Fehlermeldungen ein, also einen ArrayList mit Objekten vom Typ String: request.setAttribute("Fehler", Fehler), wobei „Fehler“ das ArrayList ist;
- Aufgrund des Attributs „items=“${Fehler}““ sucht die Seite JSP nacheinander in der Abfrage, der Sitzung und der Anwendung nach einem Attribut namens „Fehler“. Sie findet es in der Anfrage: request.getAttribute("Fehler") liefert das vom Controller in die Anfrage eingefügte ArrayList;
- Die Variable erreur des Attributs var="erreur" verweist somit auf das aktuelle Element von ArrayList, also auf ein Objekt String. Die Methode erreur.toString() fügt den Wert dieses String – in diesem Fall eine Fehlermeldung – in den Datenstrom HTML der Seite ein.
Die Objekte der vom Tag <forEach> verarbeiteten Sammlung können komplexer sein als einfache Zeichenfolgen. Nehmen wir das Beispiel einer Seite JSP, die eine Liste von Artikeln anzeigt:
wobei [listarticles] ein ArrayList von Objekten des Typs [Article] ist, bei dem es sich vermutlich um ein Javabean mit den Feldern [id, nom, prix, stockActuel, stockMinimum] handelt, wobei jedes dieser Felder über seine eigenen get- und set-Methoden verfügt. Das Objekt [listarticles] wurde vom Controller in die Anfrage eingefügt. Die vorherige Seite JSP ruft es im Attribut „items“ des Tags forEach ab. Das aktuelle Objekt „article“ (var="article") bezeichnet somit ein Objekt vom Typ [Article]. Betrachten wir das Tag in Zeile 3:
Was bedeutet ${article.nom}? Tatsächlich verschiedene Dinge, je nach Art des Objekts „article“. Um den Wert von article.nom zu erhalten, wird die Seite JSP zwei Dinge versuchen:
- article.getNom() – man beachte die Schreibweise getNom, um das Feld „name“ abzurufen (JavaBean-Standard)
- article.get("name")
Das Objekt [article] kann also entweder eine Bean mit einem Feld „name“ oder ein Dictionary mit einem Schlüssel „name“ sein.
Es gibt keine Einschränkungen hinsichtlich der Hierarchie des verarbeiteten Objekts. So kann das Tag
ermöglicht die Verarbeitung eines Objekts vom Typ [individu] wie folgt:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// Methoden des JavaBean-Standards
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
Um den Wert von ${individu.enfants[1].nom} zu ermitteln, probiert die Seite JSP verschiedene Methoden aus, darunter auch diese, die erfolgreich sein wird:
individu.getEnfants(1).getNom(), wobei „Individu“ ein Objekt vom Typ „Individu“ bezeichnet.
8.0.2. Installieren und Entdecken der Bibliothek JSTL
Die zuvor gegebenen Erläuterungen reichen für die Anwendung, die uns interessiert, aus, doch die Tag-Bibliothek JSTL bietet weitere Tags als die vorgestellten. Um diese zu entdecken, kann man ein im Bibliothekspaket enthaltenes Tutorial installieren.
Wir verwenden die Implementierung JSTL 1.1 des Projekts [Jakarta Taglibs], die unter der URL [http://jakarta.apache.org/taglibs/] (Mai 2006) verfügbar ist:
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Die heruntergeladene ZIP-Datei enthält in etwa folgende Inhalte:

Die beiden Dateien mit der Endung .war sind Webanwendungs-Archive:
- standard-doc: Dokumentation zu den Tags JSTL
- standard-examples: Anwendungsbeispiele für die Tags
Wir werden diese letzte Anwendung in Tomcat bereitstellen. Wir starten Tomcat über die entsprechende Option im Menü [Démarrer], geben dann die URL [http://localhost:8080] ein und folgen dem Link [Tomcat Manager]:

Daraufhin wird eine Anmeldeseite angezeigt. Wir melden uns mit den Zugangsdaten „manager / manager“ oder „admin / admin“ an, wie in Abschnitt 2.3.3 beschrieben.

Wir gelangen auf eine Seite, auf der die derzeit in Tomcat bereitgestellten Anwendungen aufgelistet sind:

Über die Formulare am Ende der Seite können wir eine neue Anwendung hinzufügen:

Über die Schaltfläche [Parcourir] wählen wir eine .war-Datei aus, die bereitgestellt werden soll.

Auf dem Screenshot ist es nicht zu sehen, aber wir haben die Datei [standard-examples.war] aus der heruntergeladenen Distribution JSTL ausgewählt. Die Schaltfläche [Deploy] speichert diese Anwendung und stellt sie in Tomcat bereit.

Die Anwendung [/standard-examples] wurde erfolgreich bereitgestellt. Wir starten sie:

Der Leser wird gebeten, den verschiedenen Links auf dieser Seite zu folgen, wenn er nach Anwendungsbeispielen für die Tags JSTL sucht.
Die Anwendung [standard-doc] kann auf dieselbe Weise aus der Datei [standard-doc.war] bereitgestellt werden. Sie bietet Zugang zu recht technischen Informationen über die Bibliothek JSTL. Für Anfänger ist sie weniger interessant.
8.0.3. Verwendung von JSTL in einer Webanwendung
In den mit der Bibliothek JSTL 1.2 gelieferten Beispielen enthalten die JSP-Seiten am Anfang der Datei das folgende Tag:
Wir sind diesem Tag bereits in Abschnitt 8.1.1 begegnet und haben eine kurze Erklärung dazu gegeben:
- [uri]: URI (Uniform Resource Identifier), in dem die Definitionen der auf der Seite verwendeten Tags zu finden sind. Dieser URI wird vom Webserver verwendet, wenn die Seite JSP in Java-Code übersetzt wird, um zu einem Servlet zu werden. Er wird auch von Tools zur Webseitenentwicklung verwendet, um die korrekte Syntax der auf der Seite verwendeten Tags zu überprüfen oder eine Eingabehilfe anzubieten. Wenn man mit der Eingabe eines Tags beginnt, kann ein Tool, das die Bibliothek kennt, dem Benutzer dann die möglichen Attribute für dieses Tag vorschlagen.
- [prefix]: Präfix, das diese Tags auf der Seite identifiziert
Die URI [http://java.sun.com/jsp/jstl/core] kann nicht verwendet werden, wenn keine Verbindung zum öffentlichen Internet besteht. In diesem Fall kann die Datei mit den Tag-Definitionen lokal gespeichert werden. Mehrere solcher Dateien werden mit der Distribution JSTL 1.2 im Ordner [tld] (Tag Language Definition) bereitgestellt:

JSTL ist eigentlich eine Sammlung von Tag-Bibliotheken. Wir werden nur die Bibliothek [c.tld] verwenden, die als „Core“-Bibliothek bezeichnet wird. Wir werden die oben genannte Datei [c.tld] im Ordner [WEB-INF] unserer Anwendungen ablegen:
![]()
und fügen den folgenden Tag in unsere Seiten ein: JSP, um die Verwendung der „Core“-Bibliothek zu deklarieren:
Die Verwendung von Tag-Bibliotheken erspart uns zwar das Einfügen von Java-Code in die Seiten JSP, doch diese Tags werden natürlich bei der Übersetzung der Seite JSP in ein Java-Servlet in Java-Code umgewandelt. Sie verwenden Klassen, die in zwei Archiven [jstl.jar, standard.jar] definiert sind, die sich im Ordner [lib] der Distribution JSTL befinden:

Diese beiden Archive befinden sich im Ordner „[WEB-INF/lib]“ unserer Anwendungen:

Wir verfügen nun über die Grundlagen, um die nächste Version unserer Beispielanwendung in Angriff zu nehmen.





