Tag-Libraries
• seit JSP Version 1.1
• Sammlung selbst definierter Tags (Custom Tags)
• Tagdefinition:
<Präfix: Tagname attr1=“wert1“ attr2=“wert2“ ...>
Body
</Präfix>
<Präfix: Tagname />
• Tags halten sich an XML-Konvention
• Präfix bezeichnet Namensraum  Vermeidung
von Namenskonflikten
Tag-Libraries
1
Motivation
• Vorteile:
– Gute Wiederverwendbarkeit und Qualität (Test)
– Lesbare und übersichtliche Struktur (Java
ausgelagert)
– Wissens- und Rollenaufteilung (EntwicklerDesigner)
• Anwendung:
– Mehrsprachige JSP-Seiten
– Datenbankzugriffe
– Automatische Generierung von Emails
Tag-Libraries
2
Funktionsweise
Tag-Library
= Tag-LibraryDeskriptor
+
Tag-Handler
• Tag-Library-Deskriptor (TLD)
– XML-Datei
– Beschreibt, welche Tags Tag-Library bereitstellt
– Legt für jedes Tag Tag-Handler-Klasse fest
• Tag-Handler (in WEB-INF/classes | lib)
– Javaklassen (eine Klasse pro Tag)
– Implementieren Aktionen, die beim Auftreten des
Tags ausgeführt werden
Tag-Libraries
3
Einbindung in JSP
• mit taglib-Direktive:
<%@ taglib uri=“Taglib-Uri“ prefix=“Präfix“ %>
<%@ taglib uri=“WEB-INF/etis.tld“ prefix=“lib“ %>
– uri:
uniform resource identifier - eindeutige
Identifizierung der genutzten Tag-Library
– prefix: beliebiges Präfix, um Namenskonflikte zu
vermeiden
• Tag kann dann eingebunden werden:
<prefix:tag-name/>
<lib:welcome/>
Tag-Libraries
4
Tag-Library-Deskriptor (I)
• TLD ist XML-Dokument:
<?xml version=“1.0“ encoding=“ISO-8859-1“ ?>
<!DOCTYPE taglib ...>
<taglib>
<!--beschreibt Tag-Library-->
• <taglib>-Elemente:
<tlibversion>
<jspversion>
<shortname>
<tag>
Tag-Libraries
<!--Version der Tag-Library-->
<!--Version der JSP-API-->
<!--Kurzname der Library-->
<!--deklariert Tag-->
5
Tag-Library-Deskriptor (II)
• <tag>-Elemente:
<name>
<!-- Name des Tags -->
<tagclass>
<!--Tag-Handler-Klasse -->
<bodycontent><!-- legt fest, ob Body ausgewertet -->
<info>
<!-- optionale Beschreibung des Tags
-->
<attribute>
<!-- ggf. Attribut eines Tags -->
Tag-Libraries
6
Tag-Library-Deskriptor (III)
• <attribute>-Elemente:
<name>
<required>
<!-- Name des Attributes -->
<!-- legt fest, ob Attribut vorhanden
sein muss, true|false -->
<rtexprvalue> <!-- legt fest, ob Attributwert zur
Laufzeit auswertbar ist, true|false,
z.B.
<mylib:tagName attr1 =
<%=request.getParameter(“n“)%>/>
-->
Tag-Libraries
7
Tag-Handler
• Tag-Handler legt Semantik selbstdefinierter Tags
fest
• wird zur Laufzeit eines JSPs instanziiert
• an bestimmten Stellen der Tag-Bearbeitung werden bestimmte Tag-Handler-Methoden aufgerufen
– deshalb Implementierung von Interface Tag bzw.
BodyTag aus javax.servlet.jsp.tagext
– einfacher verwendbare Defaultimplementationen:
Klassen TagSupport bzw. BodyTagSupport
Tag-Libraries
8
Arten von Tags
• Einfaches Tag
– Body 1x oder gar nicht ausgegeben
• Iterierendes Tag
– Body mehrfach ausgegeben
• BodyTag
– manipuliert Body oder erzeugt ihn komplett neu
vor Ausgabe
• Tag-Arten bauen aufeinander auf
Tag-Libraries
9
Einfache Tags
TAG
Tag-Handler
vor Tag
Objekt erzeugen
public int doStartTag();
Aktion implementieren + Rückgabe von:
1. EVAL_BODY_INCLUDE: (Body
ausgewertet + in Ausgabe eingefügt) oder
2. SKIP_BODY: (Bodyauswertung unterdrückt)
public int doEndTag();
Aktion implementieren + Rückgabe von:
1. EVAL_PAGE: (Seitenverarbeitung
fortgesetzt) oder
2. SKIP_PAGE: (Seitenverarbeitung beendet)
<mail:send to=“...“>
An Alle...
</mail:send>
nach Tag
Tag-Libraries
public void release() + Objekt zerstören
10
Tags mit Attributen
• Attribute dienen Anpassung des Tagverhaltens
<meinPräfix:meinTag size=“23“/>
<meinPräfix:meinTag size=“<%= groesse %>“/>
• Definition von Property + zugehörigen get/setMethoden in Tag-Handler
private int size;
public void setSize(int size){this.size = size;}
public int getSize(){return this.size;}
• <attribute>-Element in TLD deklarieren
Tag-Libraries
11
Iterierende Tags
• geben Body mehrfach aus
• z.B. um mehrere Ergebniszeilen einer DBAnfrage zu formatieren und auszugeben
• neue Methode: doAfterBody()
– nach Bearbeitung des Bodys aufgerufen
– Rückgabewert entscheidet, ob Body noch einmal
zu bearbeiten (arbeitet wie do...while)
EVAL_BODY_AGAIN: noch einmal iteriert
SKIP_BODY: Schluss
Tag-Libraries
12
Tags mit Body-Verarbeitung(I)
• Tag liest Body vor Verarbeitung aus, verändert
ihn oder erzeugt ihn komplett selbst
• erbt von BodyTagSupport (alle Methoden von
TagSupport auch hier gültig)
• um Body auszuwerten, muss doStartTag()
EVAL_BODY_TAG zurückgeben
• Tag-Handler implementiert i.d.R. doInitBody()
und doAfterBody()
Tag-Libraries
13
Tags mit Body-Verarbeitung(II)
• neue Methode: doInitBody()
– für vom Body abhängige Initialisierungen
– nach Setzen des Bodyinhaltes, aber vor
Bodybearbeitung aufgerufen
– nur bearbeitbar, wenn Rückgabewert doStartTag()
EVAL_BODY_BUFFERED
• wenn Argument einfacher String oder einfacher
Ausdruck, dann: Argument als Attribut, nicht als
Body übergeben
– einfachere Implementierung + Nutzung von Tags
mit Attributen als Bodytags
Tag-Libraries
14
Zusammenfassung
• weitere Möglichkeiten:
– Java-Variable definieren, Wert abfragen, ändern
– Kooperation von Tags über gemeinsam genutzte
Objekte, z.B. bei verschachtelten Tags
• sehr gut geeignet, um in JSP-Anwendungen
Präsentationsschicht und Logik zu trennen
• existieren schon viele vordefinierte Tag-Libraries
– z.B. unter http://jakarta.apache.org/taglibs oder
http://jsptags.com
Tag-Libraries
15
Quellen
• Wille, S., Go To Java Server Pages, Addison-Wesley,
München, 2001
• Bohlen, M.: Die Jakarta Custom Tag Libraries,
JavaSPEKTRUM, 3/2002, S.39
• http://java.sun.com/products/jsp/tutorial/TagLibraries.
pdf
Tag-Libraries
16

ppt - ITI