Balise personnalisée JSP


Les balises personnalisées sont des éléments du langage JSP définis par l'utilisateur. Lorsqu'une page JSP contient une balise personnalisée, elle sera convertie en servlet, et la balise sera convertie en un Les opérations d'un objet appelé gestionnaire de balises sont les opérations que le conteneur Web appelle lors de l'exécution du servlet.

L'extension de balise JSP vous permet de créer de nouvelles balises et de les insérer directement dans une page JSP. Des gestionnaires de balises simples ont été introduits dans la spécification JSP 2.0 pour écrire ces balises personnalisées.

Vous pouvez hériter de la classe SimpleTagSupport et remplacer la méthode doTag() pour développer la balise personnalisée la plus simple.


Créer une balise "Bonjour"

Ensuite, nous souhaitons créer une balise personnalisée appelée <ex:Hello>, avec le format de balise :

<ex:Hello />

Pour Pour créer des balises JSP personnalisées, vous devez d'abord créer la classe Java qui gère les balises. Créons donc une classe HelloTag comme suit :

package com.php;

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!");
  }
}

Le code suivant remplace la méthode doTag(), qui utilise la méthode getJspContext() pour obtenir l'objet JspContext actuel et remplacer "Hello Custom Tag is!" transmis à l'objet JspWriter.

Compilez la classe ci-dessus et copiez-la dans le répertoire de la variable d'environnement CLASSPATH. Enfin, créez la bibliothèque de balises suivante : <Répertoire d'installation de Tomcat>webappsROOTWEB-INFcustom.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.php.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Ensuite, nous pouvons utiliser la balise Hello dans le fichier JSP :

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

Le résultat de sortie du programme ci-dessus est :

Hello Custom Tag!

Corps de la balise d'accès

Vous pouvez inclure le contenu du message dans des balises, tout comme la bibliothèque de balises standard. Si nous voulons inclure du contenu dans notre Hello personnalisé, le format est le suivant :

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

Nous pouvons modifier le fichier de classe de traitement des balises, le code est le suivant :

package com.php;

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());
    }

}

Ensuite, nous devons modifiez le fichier TLD, comme suit Comme indiqué :

<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.php.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Nous pouvons maintenant utiliser la balise modifiée dans JSP, comme indiqué ci-dessous :

<%@ 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>

Le résultat de sortie du programme ci-dessus est le suivant :

This is message body

Attributs de balise personnalisée

Vous pouvez définir divers attributs dans des normes personnalisées pour recevoir des attributs et des valeurs, la classe de balise personnalisée doit implémenter la méthode setter dans JavaBean. suit :

package com.php;

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) {
          /* 从属性中使用消息 */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* 从内容体中使用消息 */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }

}

Le nom de la propriété est "message", donc la méthode setter est setMessage(). Ajoutons maintenant cet attribut à l'élément <attribute> utilisé dans le fichier TLD :

<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.php.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

Nous pouvons maintenant utiliser l'attribut message dans le fichier JSP comme suit :

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

Ci-dessus L'instance le résultat de la sortie des données est :

This is custom tag

Vous pouvez également inclure les attributs suivants :

属性描述
name定义属性的名称。每个标签的是属性名称必须是唯一的。
required指定属性是否是必须的或者可选的,如果设置为false为可选。
rtexprvalue声明在运行表达式时,标签属性是否有效。
type定义该属性的Java类类型 。默认指定为 String
description描述信息
fragment如果声明了该属性,属性值将被视为一个 JspFragment

Ce qui suit est un exemple de spécification d'attributs associés :

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

Si vous utilisez deux attributs, modifiez le fichier TLD comme suit :

.....
    <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>
.....