Start - Publikationen - Wissen - TOGAF - Impressum -

Tagfiles


Die JSP Include Direktive liefert eine Lösung für das Einbinden statischer Seitenfragmente zur Compilezeit. Mit der Include-Action können sogar JSP Fragmente dynamisch mit einfachen Parametern eingebunden werden. Es wäre schön, wenn statt einfacher Parameter auch JSP-Inhalte als Parameter möglich wären: Tagfiles leisten das. Tagfile werden bereitgestellt, indem eine Datei mit der Endung .tag irgendwo in WEB-INF/tags hinterlegt wird. Der Container sucht nach Tagfiles in WEB-INF/tags und in allen JARs unter WEB-INF/lib. In JARs müssen die Tagfiles dann aber in META-INF/tags untergebracht werden.

Ein Tagfile nutzt man in einer JSP, indem man mit der taglib Direktive eine Referenz definiert und diese dann als XML Element nutzt:

<%@ taglib prefix="mm" tagdir="/WEB-INF/tags/mm" %>
:
<mm:schnipp />
Parameterübergabe ist dabei möglich über Elementattribute:
<mm:schnipp message="Hallo" />
Damit das funktioniert, muss ein Tagfile, also ein JSP Fragment mit der Endung ".tag", geschrieben werden. Die Eigenschaften der Attribute eines Tagfiles werden nicht in einem TLD beschrieben, sondern in der Attribut-Direktive des Tagfiles:
File: schnipp.tag
:
<%@ attribute name="message" required="true" rtexprvalue="true" %>
:
Nachricht: ${message}
Die attribute Direktive definiert dabei den Parameter "message" und legt seine Eigenschaften fest, diese Direktiven sind die Schnittstelle für Nutzer des Tagfiles. Die Bedeutung der Werte und Inhalte für required und rtexprvalue sind exakt dieselben wie im TLD. Zur Laufzeit führt eine Brechung dieses Vertrags zu Ausnahmen!

Parameterübergabe im tag-body:

<%@ taglib prefix="mm" tagdir="/WEB-INF/tags/mm" %>
:
<mm:schnipp message="Hallo">
 Bodyinhalt
</mm:schnipp>
//
// oder alternativ als jsp:attribute
<mm:schnipp>
 <jsp:attribute name="message">Hallo</jsp:attribute>
</mm:schnipp>
File: schnipp.tag
<%@ attribute name="message" required="true" rtexprvalue="true" %>
<%@ tag body-content="tagdependent" %>
:
Nachricht: ${message}
Ausführlich: <jsp:doBody />
:

Standard für den Inhalt ist dabei body-content="scriptless". Hier alle Optionen

  • body-content="empty" - Ein Body ist nicht erlaubt. Ausnahme: -Elemente.
  • body-content="scriptless" - EL ist erlaubt, aber kein Direktiven, Expressions oder Skriptletts. Erzwingt skriptfreies Arbeiten.
  • body-content="tagdependent" - Body ist erlaubt, wird aber als plain Text behandelt.
Hinweis: Die Option body-content="JSP" ist nicht gestattet.

Tagfiles im JAR


Die Deklaration der Tag Files im TLD ist nur notwendig, wenn die Funktionalität in einem JAR File bereitgestellt wird. Tagfiles müssen unter /META-INF/tags liegen, der Inhalte von path beginnt deshalb immer mit /META-INF/tags:

:
<taglib>
 <tlib-version>0.4</tlib-version>
 <uri>http://some.tag.lib</uri>
 :
 <tag>
   // für Tag Handler
 </tag>
 :
 <tag-file>
  // für Tag Files, nur notwendig, wenn in JAR ausgeliefert
  <name>schnipp</name>
  <path>/META-INF/tags/schnipp.tag</path>
 </tag-file>
 :
 <function>
  // EL Function
 </function>
 :
</taglib>

Statt dem tagdir-Attribut verwendet man nun das uri-Attribut, um das Tagfile zu referenzieren:

<%@ taglib prefix="mm" uri="http://some.tag.lib" %>
:
<mm:schnipp />
Aus Nutzersicht ist es dann transparent, ob eine Funktion als Tagfile oder als Tag Handler bereitgestellt wird!
copyright © 2003-2021 | Dr. Christian Dürr | prozesse-und-systeme.de | all rights reserved