Benutzerdefinierte Tags sind benutzerdefinierte JSP-Sprachelemente. Wenn eine JSP-Seite ein benutzerdefiniertes Tag enthält, das in ein Servlet konvertiert wird, wird das Tag in Operationen für ein Objekt namens Tag-Handler umgewandelt, das der Webcontainer aufruft, wenn das Servlet ausgeführt wird.
Mit der JSP-Tag-Erweiterung können Sie neue Tags erstellen und diese direkt in eine JSP-Seite einfügen. In der JSP 2.0-Spezifikation wurden einfache Tag-Handler eingeführt, um diese benutzerdefinierten Tags zu schreiben.
Sie können die SimpleTagSupport-Klasse erben und die doTag()-Methode überschreiben, um das einfachste benutzerdefinierte Tag zu entwickeln.
Als Nächstes möchten wir ein benutzerdefiniertes Tag namens <ex:Hello> mit dem folgenden Format erstellen:
<ex:Hallo />
Um benutzerdefinierte JSP-Tags zu erstellen, müssen Sie zunächst die Java-Klasse erstellen, die die Tags verarbeitet. Erstellen wir also eine HelloTag-Klasse wie folgt:
package com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag erweitert SimpleTagSupport { public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Hallo benutzerdefiniertes Tag!" }}
Der folgende Code schreibt die Methode doTag() neu, die die Methode getJspContext() verwendet, um das aktuelle JspContext-Objekt abzurufen, und „Hello Custom Tag!“ an das JspWriter-Objekt übergibt.
Kompilieren Sie die obige Klasse und kopieren Sie sie in das Verzeichnis der Umgebungsvariablen CLASSPATH. Erstellen Sie abschließend die folgende Tag-Bibliothek: <Tomcat-Installationsverzeichnis> webappsROOTWEB-INFcustom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Beispiel-TLD</short-name> <tag> <name>Hallo</name > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>empty</body-content> </tag></taglib>
Als nächstes können wir das Hello-Tag in der JSP-Datei verwenden:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Ein Beispiel für ein benutzerdefiniertes Tag</title> </head> <body> <ex:Hallo /> </body></html>
Die Ausgabe des obigen Programms ist:
Hallo Custom Tag!
Sie können Nachrichteninhalte wie in der Standard-Tag-Bibliothek in Tags einbinden. Wenn wir Inhalte in unser angepasstes Hello einbinden möchten, ist das Format wie folgt:
<ex:Hello> Dies ist der Nachrichtentext</ex:Hello>
Wir können die Etikettenverarbeitungsklassendatei ändern. Der Code lautet wie folgt:
package com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag erweitert SimpleTagSupport { StringWriter sw = new StringWriter(); public void doTag( ) löst JspException aus, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); }}
Als nächstes müssen wir die TLD-Datei wie folgt ändern:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Beispiel-TLD mit Body</short-name> <tag> <name>Hallo< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> </tag></taglib>
Jetzt können wir das geänderte Tag in JSP wie unten gezeigt verwenden:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Ein Beispiel für ein benutzerdefiniertes Tag</title> </head> <body> <ex:Hallo > Dies ist der Nachrichtentext </ex:Hello> </body></html>
Die Ausgabe des obigen Programms ist wie folgt:
Dies ist der Nachrichtentext
Sie können verschiedene Attribute in benutzerdefinierten Standards festlegen. Um Attribute zu erhalten, muss die benutzerdefinierte Tag-Klasse die Setter-Methode implementieren. Die Setter-Methode in JavaBean lautet wie folgt:
package com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag erweitert SimpleTagSupport { private String message; public void setMessage(String msg) { this.message = msg; } StringWriter sw = new StringWriter(); public void doTag() throws JspException, IOException { if (message != null) { /* Verwenden Sie die Nachricht aus dem Attribut */ JspWriter out = getJspContext().getOut(); out.println( message } else { /* Verwenden Sie die Nachricht aus dem Inhaltskörper */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() } }}
Der Name der Eigenschaft ist „message“, daher ist die Setter-Methode setMessage(). Fügen wir nun dieses Attribut dem in der TLD-Datei verwendeten <attribute>-Element hinzu:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Beispiel-TLD mit Body</short-name> <tag> <name>Hallo< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag></taglib>
Jetzt können wir das Nachrichtenattribut in der JSP-Datei wie folgt verwenden:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Ein Beispiel für ein benutzerdefiniertes Tag</title> </head> <body> <ex:Hallo message="Dies ist ein benutzerdefiniertes Tag" /> </body></html>
Das Ausgabeergebnis der obigen Beispieldaten ist:
Dies ist ein benutzerdefiniertes Tag
Sie können auch die folgenden Attribute einschließen:
Eigentum | beschreiben |
---|---|
Name | Definiert den Namen des Attributs. Der Attributname muss für jedes Tag eindeutig sein. |
erforderlich | Gibt an, ob das Attribut erforderlich oder optional ist. Wenn es auf „false“ gesetzt ist, ist es optional. |
rtexprvalue | Deklariert, ob das Label-Attribut beim Ausführen des Ausdrucks gültig ist. |
Typ | Der Java-Klassentyp, der diese Eigenschaft definiert. Standardmäßig als String angegeben |
Beschreibung | Beschreibungsinformationen |
Fragment | Wenn dieses Attribut deklariert ist, wird der Attributwert als JspFragment behandelt. |
Das Folgende ist ein Beispiel für die Angabe relevanter Eigenschaften:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute>.. ...
Wenn Sie beide Attribute verwenden, ändern Sie die TLD-Datei wie folgt:
..... <attribute> <name>attribute_name1</name> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute > <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute>.....