English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP-eigene-Tag

Benutzerdefinierte Tags sind JSP-Sprachelemente, die von Benutzern definiert werden. Wenn eine JSP-Seite einen benutzerdefinierten Tag enthält, wird dieser in ein Servlet umgewandelt, und der Tag wird in Operationen umgewandelt, die auf den    Der Operationen des Objekts, das als tag handler bezeichnet wird, d.h. die Operationen, die der Web Container aufgerufen, wenn der Servlet ausgeführt wird.

JSP-Tag-Erweiterungen ermöglichen es Ihnen, neue Tags zu erstellen und diese direkt in eine JSP-Seite einzufügen. JSP 20-Spezifikation einführt Simple Tag Handlers, um diese benutzerdefinierten Tags zu schreiben.

Sie können die Klasse SimpleTagSupport erben und die Methode doTag() überschreiben, um eine einfache benutzerdefinierte Tag zu entwickeln.

Erstellen Sie den "Hello"-Tag

Als nächstes möchten wir einen benutzerdefinierten Tag namens <ex:Hello> erstellen, der Format ist wie folgt:

<ex:Hello />

Um benutzerdefinierte JSP-Tags zu erstellen, müssen Sie zunächst eine Java-Klasse zum Verarbeiten des Tags erstellen. also, lassen Sie uns eine HelloTag-Klasse erstellen, wie folgt:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    JspWriter out = getJspContext().getOut();
    out.println("Hello Custom Tag!");
  }
}

Der folgende Code überschreibt die doTag()-Methode, die die Methode getJspContext() verwendet, um den aktuellen JspContext-Objekt zu erhalten und "Hello Custom Tag!" an das JspWriter-Objekt zu übergeben.

Kompilieren Sie die obigen Klassen und kopieren Sie sie in das Verzeichnis der Umgebungsvariable CLASSPATH. Erstellen Sie abschließend die folgende Tag-Bibliothek: <Tomcat-Installationsverzeichnis>webapps\ROOT\WEB-INF\custom.tld。

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Nun können wir den Hello-Tag im JSP-Datei verwenden:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello/>
  </body>
</html>

Die Ausgabe des obigen Programms ist wie folgt:

Hello Custom Tag!

Zugriff auf den Tag-Body

Sie können wie die Standard-Tag-Bibliothek Nachrichteninhalt in Tags einfügen. Wenn wir den Inhalt in unserem benutzerdefinierten Hello enthalten möchten, ist das Format wie folgt:

<ex:Hello>
   This is message body
</ex:Hello>

Wir können die Datei der Tag-Verarbeitungsklasse ändern, der Code ist wie folgt:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       getJspBody().invoke(sw);
       getJspContext().getOut().println(sw.toString());
    }
}

Als nächstes müssen wir die TLD-Datei ändern, wie folgt:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Jetzt können wir den geänderten Tag in JSP verwenden, wie folgt:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello>
        This is message body
    </ex:Hello>
  </body>
</html>

Die Ausgabe des obigen Programms ist wie folgt:

This is message body

Benutzerdefinierte Tag-Eigenschaften

Sie können verschiedene Eigenschaften in den benutzerdefinierten Standards einstellen. Um Eigenschaften zu empfangen, muss die Klasse mit benutzerdefinierten Beschriftungstags die setter-Methode implementieren. Der setter-Methode in JavaBean ist wie folgt gezeigt:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends 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) {
          /* Nehmen Sie die Nachricht aus dem Attribut */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* Nehmen Sie die Nachricht aus dem Inhalt */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }
}

Der Name des Attributes ist "message", daher ist der Setter-Methodenname setMessage(). Lassen Sie uns nun das Attribute in das <attribute>-Element im TLD-Datei hinzufügen:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

Nun können wir die message-Eigenschaft in JSP-Dateien verwenden, wie folgt:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello message="Dies ist ein benutzerdefiniertes Tag" />
  </body>
</html>

Die folgenden Beispiel-Daten geben das folgende Ausgabeergebnis zurück:

Dies ist ein benutzerdefiniertes Tag

Sie können auch die folgenden Attribute enthalten:

EigenschaftBeschreibung
nameDefiniert den Namen der Eigenschaft. Der Name eines jeden Attributs muss einzigartig sein.
requiredBestimmt, ob das Attribut obligatorisch oder optional ist. Wenn auf false gesetzt, ist es optional.
rtexprvalueErklärung, ob die Eigenschaft bei der Ausführung des Ausdrucks gültig ist.
typeDefiniert den Java-Klassentyp der Eigenschaft. Standardmäßig wird String
descriptionBeschreibungsinformation
fragmentWenn diese Eigenschaft deklariert wurde, wird der Wert der Eigenschaft als JspFragment

Nachstehend sind Beispiele für angegebene Attribute aufgeführt:

.....
    <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
    </attribute>
.....

Wenn Sie zwei Attribute verwendet haben, ä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>
.....