Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |
Describe the semantics of the "Simple" custom tag event model when the event method (doTag) is executed; write a tag handler class; and explain the constraints on the JSP content within the tag. |
Das SimpleTag Interface ist seit JSP 2.0 eingeführt, und vereinfacht die Programmierung von eigengeschreibenen Tags.
Es hat folgende Vorteile:
Es hat auch ein paar Nachteile:
Der Programmierer schreibt Klassen, die das SimpleTag Interface erfüllen. Meist entwickelt er eine Unterklasse der abstrakten Klasse SimpleTagSupport. Diese Unterklasse überschreibt dann meistens nur die doTag() Methode.
Während bei den Classic Custom Tags es verschiedene Arten von Events gibt (doStartTag(), doEndTag() und doAfterBody() wird bei dieser Version nur der doTag() bei der Bearbeitung des Bodys ausgelöst.
I.a. wird der Programmierer eine Unterklasse von SimpleTagSupport schreiben. In dieser Unterklasse schreibt er für jedes übergebene Attribut eine entsprechende setter-Methode und überschreibt die doTag() Methode.
Die Klasse SimpleTagSupport bietet einige Methoden, die die Implementierung des Tags erleichtern.
Dies ist i.a. die einzigste Methode die der Programmierer überschreibt, und wird beim Lesen des Bodys des Tags aufgerufen. Mit dem Werfen einer SkipPageException wird veranlasst dass der Rest der JSP Seite nicht weiter bearbeitet wird (entspricht TAG.SKIP_BODY Konstante, bei den Classic Custom Tag Interfaces).
Dies gibt den TagHandler des übergeordneten Tags zurück. JspTag ist das Interface das alle TagHandler erfüllen, hat aber keine eigenen Methoden. D.h der Programmierer muss nach Anwendung der getParent() Methode das erhaltene Objekt auf die konkrete TagHandler Klasse casten. Hat der Tag keinen übergeordneten Tag, so wird null zurückgegeben
Diese Methode wird meistens nur vom Container verwendet.
Findet den nächsten Vater des Tags from, der der Klasse klass entspricht. Intern wird die getParent() Methode verwendet.
Enthält den Body des Tags in Form eines JspFragment Tags. Die Verwendung wird weiter unten erklärt
Diese Methode wird meistens nur vom Container verwendet.
Dies ist eine abstrakte Klasse. Die Klasse PageContext ist i.a. die einzigste konkrete Unterklasse von JspContext. JspContext dient zum Zugriff auf die Attribute der Scopes, und mit getOut() erhält man die aktuelle Ausgabe. Diese Methode wird sehr häufig angewendet.
Diese Methode wird vom Container verwendet, und selten vom Programmierer direkt benutzt.
Es wird bewusst ein Beispiel mit einem Tag ohne Body genommen. Der Tag hat folgenden Aufbau
Es wird ausgegeben:
Der TagHandler wird folgendermassen programmiert
Ein TagHandler der das SimpleTag Interface erfüllt, getJspBody() und sollte ein JspFragment Objekt zurückgeben. Das JspFragment kapselt den Body und hat nur 2 Methoden.
Die Methode invoke(Writer) schreibt die Auswertung des Body in das Argument Writer. Ist der Wert des Arguments null so wo wird der Body, in den Writer, der sich durch getJspContext().getOUt() ergibt, ausgegeben. In diesem Fall wird der Body in die normale Ausgabe geleitet. Immer dann wenn den Body selbst nicht bearbeiten will, übergibt man den null Wert als Argument der invoke() Methode.
Immer dann wenn man den Body bearbeiten will, kann man ein eigenes Writer Objekt erzeugen, und darin die Ausgabe puffern, und dann in die Ausgabe zurückgeben.
Schleifen werden intern in der doTag() Methode implementiert. Ein einfaches Beispiel verdeutlicht dies.
Der entsprechende TagHandler kann folgendermassen implementiert werden:
Beachte:
Inhalt | Abbildung | Source | SCWCD | |||
|< | < | > | >| | Generated by CoCoDiL |