$KK(Das Tag File Model) $R(Objective) Describe the semantics of the Tag File model; describe the web application structure for tag files; write a tag file; and explain the constraints on the JSP content in the body of the tag. $R\ $KKK(Tag Dateien) Es gibt seit JSP 2.0 ein Verfahren ohne Java-Kenntnisse eigene Tags für JSP zu entwickeln. Dem Tag werden keine Java Klassen zugeordnet, sondern direkt JSP Codefragmente. Diese Codefragmente werden in sogenannten .tag Dateien abgelegt. Sind diese Tag-Dateien in XML Syntax geschrieben, so wird die Endung .tagx benutzt. TagDateien können wiederum aus Fragmenten von tag-Dateien zusammengesetzt sein. Solche Fragmente haben die Endung .tagf $KKK(Tag Dateien in der Web Application Structure) Tag Dateien können entweder als jar-File gepackt, oder ungepackt abgelegt werden. TagFiles ungepackt ablegen Es wird innerhalb des WEB-INF Ordners ein Ordner tags angelegt. Die tag-Dateien werden einfach ungepackt in dieses Verzeichnis abgelegt. $S() /WEB-INF/tags/ /WEB-INF/tags/a.tag /WEB-INF/tags/b.tag /WEB-INF/special/ /WEB-INF/special/c.tag $S\ Werden die TagFiles ungepackt verwendet, muss in der Taglib Direktive der JSP statt des Attributs uri das Attribut tagdir verwenden. $S() <%@ taglib prefix="myPrefix" tagdir="/WEB-INF/tags/special/" %> $S\ Man muss keinen TagFileDescriptor (tld Datei) anlegen, da dies der Container selber macht. Tag Dateien gepackt ablegen Wenn die Tag Dateien als jar-Files gespeichert werden, sollten diese innerhalb des Verzeichnisses /WEB-INF/LIB abgelegt werden. Das packen der Tag Dateien erleichtert das Deployment, erfordert aber einen zusätzlichen höheren Aufwand * Die Tag-Dateien müssen in einem Verzeichnis META-INF/tags zusammengestellt werden. * Es muss auch ein Tag File Descriptor für die TagDateien geschrieben werden. Dieser Tag File Descriptor wird mit den Tag Dateien gepackt. Beispiel: Vor dem Packen werden die oben genannten Tags folgendermassen abgelegt $S() helloapp | | ... | |_ META-INF | | | |_ myTags.tld | | | |_ tags | | | |_ a.tag | |_ b.tag | |_ special | |_ c.tag | | |_ WEB-INF | ... $S\ Die Dateien im META-INF Verzeichnis sollten vor dem Deployment gepackt werden. $S() jar -cvf myTags.jar META-INF $S\ Die erhaltene Datei myTags.jar kann bei der Ausführung in das Verzeichnis WEB-INF/TAG Es fehlt noch den Aufbau der tagLib Descriptor Datei: $S() 1.0 myDefaultPrefixName mytaglib a /META-INF/tags/a.tag b /META-INF/tags/b.tag c /META-INF/tags/special/c.tag $S\ $KKK(Aufbau der Tag Dateien) $KKKK(Zugriff auf Body und Attributübergabe) Mit der tag Direktive und ihrem Attribut body-content wird die Art des Bodys des Tags festgelegt. $S() <%@ tag body-content="empty" %> $S\ Folgende Werte kann das Attribut body-content annehmen $T(simple,ll,20.80) empty | Der Tag darf kein Body haben, ansonsten gibt es einen Syntaxfehler ||| scriptless | Dies ist der Standard. Ein Body ist erlaubt, darf aber keine Skripts enthalten || tagdependent | Hier werden bei Auswertung des Bodys die EL Ausdrücke oder die Aktionen nicht ausgewertet, sondern als reinen Text gewertet || $T\ Innerhalb eines Tags kann man mit der Aktion veranlassen dass der Body des Tags von der aufrufenden Seite ausgewertet wird. Hier ein Beispiel greet.tag: $S() <%@ tag body-content="scriptless" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Hallo $S\ So kann greet in einer Jsp aufgerufen werden: $S() <%@ page contentType="text/html" %> <%@ taglib="my" tagdir=/WEB-INF/tags/myTags" %> Klaus $S\ Die Aktion ohne Attribut gibt den Body der aufrufenden Seite aus. Ansonsten wird der Body der aufrufenden Seite in die Variable var gespeichert. Die Ausgabe erfolgt erst bei expliziter Auswertung der Variable var. Ist der auszulesender Body gross, so kann man auch einen varReader benutzen. Die Aktion hat folgende optionale Attribute $T(caption,ll,20.80) Attribut | Beschreibung || scope | Der Scope der Variable. Standard ist page || var | Name der Variable in der die Auswertung des Bodys geschrieben wird || varReader | Ein Reader Objekt mit der man auf die Auswertung des Bodys zugreifen kann || $T\ Mit der Direktive attribute werden von der aufrufenden Seite Attribute mit übergeben. Die Direktive attribute hat selbst folgende Attribute $T(caption,ll,20.80) name | Eindeutiger Name für das Attribut || required | false falls Attribut optional ist || fragment | true falls der Wert des Attributs nicht ausgewertet wird. So kann man auch JSP Elemente übergeben || rtexprvalue | Kann der Wert des Attributs dynamisch berechnet werden. Falls true ist z.B ein EL Ausdruck erlaubt || type | Laufzeittyp des Attributwerts. Standard ist String || description | Beschreibung des Attributs || $T\ Beispiel: $S() <%@ tag body-content="scriptless" %> <%@ attribute name="sex" required=true%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> $S\ Eine weitere Möglichkeit der Ausgabe ist die Aktion . Diese Aktion wertet ein Fragment aus Beispiel: $S() <%@ attribute name="pattern" fragment="true" %> <%-- Auswertung und Ausgabe des Fragments --%> <%-- Auswertung in eine Variable speichern --%> $S\ $KKKK(Outputparamter) Die Direktive variable, die nur innerhalb Tag Dateien erlaubt sind, ermöglicht dass die aufrufende Seite auf Variable zugreifen können, die innerhalb der Tag Dateien gesetzt werden. Eine Direktive variable hat folgenden Attribute: $T(simple,ll,30.70) name-given | Definiert eine Variable die von der aufrufenden Seite verwendet werden kann || name-from-attribute | Nur im Zusammenhang mit dem Attribut alias möglich. Es ist der Name eines Attributs das die aufrufende Seite verwendet, um den in der Tag-Datei gesetzten Wert auszulesen. In der Tag-Datei selber wird der gesetzte Wert an die in gebundene Variable weitergegeben. Das Attribut alias In diesem Attribut wird d|| alias | Dies ist der Name der Variable innerhalb des Tags dessen Wert der aufrufende Seite übergeben wird. Dieser Wert wird in die Variable kopiert, die im Attribut name-from-attibute spezifiziert ist. || variable-class | Klassenname der Variable. Vorgabe String || declare | gibt an ob die Variable deklariert ist oder nicht. Vorgabe true || scope | Eine der Wert AT_END, AT_BEGIN oder NESTED, Vorgabe NESTED || description | Beschreibung || $T\ Die Attribute variable-class,declare,scope und description sind optional. Ansonsten gibt es 2 Formen der Verwendung der Direktive variable. $S() <%@ variable name-given="x" %> oder <%@ variable name-from-attribute="einAttributname" alias="x" %> $S\ Das Attribut sope hat nichts mit den Sopes wie page,application usw. zu tun. Es difiniert die Sichtbarkeit der auszulesenden Variablen in der aufrufenden Seite. scope kann folgende Werte annehmen: $T(simple,ll,20.80) AT_BEGIN | Die Variable ist gleich nach dem StartTag sichtbar || AT_END | Die Variable ist erst nach Abarbeitung des Tags sichtbar || NESTED | Die Variable ist im TagBody sichtbar. Nach dem Tag nicht mehr || $T\ $KKKK(Erlaubte Direktiven innerhalb einer Tag Datei) Die meisten direktiven einer JSP Seite, sind auch in einer Tag Datei nutzbar. Nicht möglich in Tags ist die page Direktive, als Ersatz gibt es dafür die tag-Direktive $T(caption,ll,30.70) Direkive | Bedeutung || taglib | wie bei JSP || include | wie bei JSP, die includierten Dateien muessen der Syntax der Tag-Dateien entsprechen || tag | Ersatz für die page-Direktive bei JSP || attribute | Nur für Tags, handelt die Attributübergabe eines Tags || variable | Nur für Tags, dient dazu Werte von innen (Bearbeitung des Tags) nach aussen (Aufrufende JSP Seite) zu geben. || $T\ $KKKK(Implizite Variablen in einer Tag Datei) Ein Tag kann auf folgende impliziten Variablen zugreifen: $T(caption,ll,30.70) Object | Type || request | javax.servlet.http.HttpServletRequest || response | javax.servlet.http.HttpServletResponse || out | javax.servlet.jsp.JspWriter || session | javax.servlet.http.HttpSession || application | javax.servlet.ServletContext || config | javax.servlet.ServletConfig || jspContext | javax.servlet.jsp.JspContext || $T\ Beachte das es innerhalb von Tags kein Zugriff auf eine pageContext Variable gibt, sondern auf die allgemeinere jspContext Variable. Es gibt auch kein Zugriff auf das page und das exception Objekt.