Inhalt Abbildung PDF Source SCWCD
 |<    <     >    >|  Generated by CoCoDiL

12 Aufbau eigener Tag Libraries

12.1 Aufbau von Classic Tag Libraries

Describe the semantics of the "Classic" custom tag event model when each event method (doStartTag, doAfterBody, and doEndTag) is executed, and explain what the return value for each event method means; and write a tag handler class.

12.1.1 Überblick über die Tag Interfaces

Mit Einführung der JSP 2.0 sind die Classic Tag Libraries unbedeutender geworden, da mit den Simple Tag Libraries eine einfachere Möglichkeit zur Bildung eigener Tags eingeführt werden.

Für jedes eigene Tag, muss man eine Java Klasse beschreiben, die ein bestimmtes Interface erfüllen muss. In den TLD - Dateien wird der Bezug von den in der JSP verwendeten Tags und den Java Klassen hergestellt. Je nach Komplexität der Tags wird ein anderes Interface verwendet.


Abb. 12.1: Die Tag Interfaces

Hier ein Überblick

Für das Iteration Tag Interface und das Body Tag Interface gibt es Standard Implementierungen. Der Programmierer kann Unterklassen dafür bilden, um nicht alle notwendigen Methoden der Interfaces neu implementieren zu können.

12.1.2 Das TagInterface

Jeder TagHandler ist eine Java Klasse und muss alle Methoden des TagInterface implementieren. Hier eine Auflistung der Methoden und Konstanten des Tag Ingerfaces:

MethodeBeschreibung
int doStartTag()Wird nach dem Lesen des StartTags ausgeführt
int doEndTag()Wird nach dem Lesen des EndTags ausgeführt
Tag getParent()Gibt den TagHandler des direkt Eltern Tags zurück
void release()Wird vom TagHandler aufgerufen, wenn der Container den Handler nicht mehr benötigt
void setPageContext (PageContext)Dies wird nach dem Instantiieren eines TagHandlers aufgerufen Mit dem PageContext hat man Zugriff auf alle impliziten Objekten, und den Variablen in den Scopes
void setParent(Tag)Wird bei verschachtelten Tags verwendet, um auf den Handler des übergeordneten Tags zuzugreifen
KonstanteBeschreibung
EVAL_BODY_INCLUDERückgabewert für das doStartTag() <br> Der Body des Tags wird ausgewertet und in den Ausgabe eingefügt
SKIP_BODYRückgabewert für das doStartTag() <br> Der Body des Tags wird nicht ausgewertet
EVAL_PAGERückgabewert für das doEndTag() <br> Nach Auswertung des Tags wird der Rest der JSP Seite auch ausgewertet
SKIP_PAGERückgabewert für das doEndTag() <br> Verhindert die Auswertung der Rest der JSP Seite

Die folgende Abbildung zeigt, wann welche Methode bei der Bearbeitung eines Tags aufgerufen wird:


Abb. 12.2: Events beim Tag Interface

Entscheident sind die die Methoden doStartTag() und doEndTag(). Beide Methoden können eine JspException werfen. Die Methode doStartTag() wird u.a. zum initialisieren des TagHandlers verwendet. Sie sollte eine von 2 Integerkonstanten zurückgeben. Ist der Rückgabewert der Integer Tag.EVAL_BODY_INCLUDE so wird der Body der Aktion ausgewertet und in die Ausgabe eingefügt. Ist der Rückgabewert der Integer Tag.SKIP_BODY wird der Body nicht ausgewertet. Dies wird zum Beispiel bei der Implementierung eines if Tags benutzt.

Die Methode doEndTag() hat auch 2 mögliche Rückgabewerte. Bei Tag.EVAL_PAGE wird der Rest der JSP Seite ausgewertet. Ansonsten bei Rückgabewert Tag.SKIP_PAGE wird die weitere Auswertung der JSP Seite ignoriert.

Das folgende Bild fasst den Kontrollfluss bei Auswertung eines Tags zusammen:


Abb. 12.3: Flusskontrolle bei Abarbeitung eines Tag Interfaces

12.1.3 Das Iteration Tag Interface

Das IterationTag Interface erweitert das Tag Interface, um nur eine Methode und einer Konstante

Methode / KonstanteBeschreibung
int doAfterBody()Dies Methode wird nach der Ausführung des Bodys aufgerufen. Als möglicher Rückgabewert ist entweder der Integer IterationTag.EVAL_BODY_AGAIN oder Tag.SKIP_BODY
EVAL_BODY_AGAINMöglicher Rückgabewert von doAfterBody(). Bei diesem Rückgabewert wird die Auswertung des Bodys wiederholt

Der Methodenfluss wird duch die folgende Abbildung deutlich:


Abb. 12.4: Flusskontrolle bei Abarbeitung eines IterationTag Interfaces

Beispiel:

Zu entwickeln ist ein Tag loop das den Body mehrfach entsprechend der Variable count mehrfach ausgeführt wird.

Es muss eine Klasse mit dem IterationTag Interface implementiert werden. Die Klasse soll LoopTag heissen. Die Zuordnung des Tags <test:loop> zur Klasse LoopTag wird weiter unten erläutert.

Die Zuordnung des tags <test:loop> zur Klasse LoopTag muss in der TLD-Datei definiert werden:

12.1.4 Das BodyTag Interface

Das BodyTag Interface erweitert das IterationTag Interface. Es ermöglicht den Body, bevor er zur Ausgabe gesendet wird, zu bearbeiten.

Das BodyTag Interface erweitert das IterationTag um folgende Methoden und Konstanten:

Methode / KonstanteBeschreibung
void setBodyContent()Setzt eine Instanz der Klasse BodyContent.BodyContent enthält den Inhalt des Bodys, und hat Methoden um diesen zuzugreifen.
void doInitBody()Dies erlaubt bevor der Body bearbeitet wird, den BodyContent zu bearbeiten. Diese Methode wird direkt nach setBodyContent() aufgerufen. Diese Methode wird häufig reimplementiert.
EVAL_BODY_BUFFEREDMöglicher Rückgabewert von doStartTag() und doAfterBody(). Der Inhalt der Auswertung des Bodys wird gepuffert. Die Auswertung des Bodys wird nochmals wiederholt, allerdings mit dem Body der der Auswertung der letzten Iteration entspricht

Das folgende Bild zeigt, wann die Methoden setBodyContent() und doInitBody() vom Container ausgelöst werden.


Abb. 12.5: Events beim BodyTag Interface
Abb. 12.6: Flussdiagramm BodyTag Interface

Als konkrete Implementation des BodyTag Interfaces wird meistens eine Unterklasse von der Klasse BodyTagSupport gebildet.

Die Klasse BodyTagSupport bietet u.a. folgende Methoden:

setBodyContent( BodyContent )Setzt ein BodyContent Objekt
BodyContent getBodyContent()Gibt den BodyContent des Tags zurück
JSPWriter getPreviousOut()Gibt einen Writer zurück, um den Body zu bearbeiten. Dies entspricht bodyContent.getEnclosingWriter(). Der Inhalt dieses Writers wird nicht sofort ausgegeben, sondern erstmal für die Weiterverarbeitung (in der nächsten Iteration) gepuffert
Inhalt Abbildung PDF Source SCWCD
 |<    <     >    >|  Generated by CoCoDiL