Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |
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.
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.
Jeder TagHandler ist eine Java Klasse und muss alle Methoden des TagInterface implementieren. Hier eine Auflistung der Methoden und Konstanten des Tag Ingerfaces:
Methode | Beschreibung |
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 |
Konstante | Beschreibung |
EVAL_BODY_INCLUDE | Rückgabewert für das doStartTag() <br> Der Body des Tags wird ausgewertet und in den Ausgabe eingefügt |
SKIP_BODY | Rückgabewert für das doStartTag() <br> Der Body des Tags wird nicht ausgewertet |
EVAL_PAGE | Rückgabewert für das doEndTag() <br> Nach Auswertung des Tags wird der Rest der JSP Seite auch ausgewertet |
SKIP_PAGE | Rü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:
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:
Das IterationTag Interface erweitert das Tag Interface, um nur eine Methode und einer Konstante
Methode / Konstante | Beschreibung |
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_AGAIN | Möglicher Rückgabewert von doAfterBody(). Bei diesem Rückgabewert wird die Auswertung des Bodys wiederholt |
Der Methodenfluss wird duch die folgende Abbildung deutlich:
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:
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 / Konstante | Beschreibung |
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_BUFFERED | Mö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.
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 | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |