JSP - Balises personnalisées

Dans ce chapitre, nous aborderons les balises personnalisées dans JSP. Une balise personnalisée est un élément de langage JSP défini par l'utilisateur. Lorsqu'une page JSP contenant une balise personnalisée est traduite en servlet, la balise est convertie en opérations sur un objet appelé gestionnaire de balises. Le conteneur Web appelle ensuite ces opérations lorsque le servlet de la page JSP est exécuté.

Les extensions de balises JSP vous permettent de créer de nouvelles balises que vous pouvez insérer directement dans une page JavaServer. La spécification JSP 2.0 a introduit les gestionnaires de balises simples pour écrire ces balises personnalisées.

Pour écrire une balise personnalisée, vous pouvez simplement étendre SimpleTagSupport classe et remplacer le doTag() , où vous pouvez placer votre code pour générer du contenu pour la balise.

Créer une balise "Hello"

Considérez que vous souhaitez définir une balise personnalisée nommée <ex: Hello> et que vous souhaitez l'utiliser de la manière suivante sans corps -

<ex:Hello />

Pour créer une balise JSP personnalisée, vous devez d'abord créer une classe Java qui agit comme un gestionnaire de balises. Créons maintenant leHelloTag classe comme suit -

package com.tutorialspoint;

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 ci-dessus a un codage simple où le doTag() prend l'objet JspContext actuel à l'aide de la getJspContext() méthode et l'utilise pour envoyer "Hello Custom Tag!" au courant JspWriter objet

Compilons la classe ci-dessus et copions-la dans un répertoire disponible dans la variable d'environnement CLASSPATH. Enfin, créez le fichier de bibliothèque de balises suivant:<Tomcat-Installation-Directory>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.tutorialspoint.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

Utilisons maintenant la balise personnalisée définie ci-dessus Hello dans notre programme JSP comme suit -

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello/>
   </body>
</html>

Appelez le JSP ci-dessus et cela devrait produire le résultat suivant -

Hello Custom Tag!

Accéder au corps de l'étiquette

Vous pouvez inclure un message dans le corps de la balise comme vous l'avez vu avec les balises standard. Considérez que vous souhaitez définir une balise personnalisée nommée<ex:Hello> et vous souhaitez l'utiliser de la manière suivante avec un corps -

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

Faisons les changements suivants dans le code de la balise ci-dessus pour traiter le corps de la balise -

package com.tutorialspoint;

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

Ici, la sortie résultant de l'appel est d'abord capturée dans un StringWriteravant d'être écrit dans le JspWriter associé à la balise. Nous devons changer le fichier TLD comme suit -

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

Appelons maintenant la balise ci-dessus avec le corps approprié comme suit -

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

Vous recevrez le résultat suivant -

This is message body

Attributs de balise personnalisés

Vous pouvez utiliser divers attributs avec vos balises personnalisées. Pour accepter une valeur d'attribut, une classe de balise personnalisée doit implémenter lesetter méthodes, identiques aux méthodes de définition JavaBean comme indiqué ci-dessous -

package com.tutorialspoint;

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) {
         /* Use message from attribute */
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
         /* use message from the body */
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

Le nom de l'attribut est "message", donc la méthode setter est setMessage(). Ajoutons maintenant cet attribut dans le fichier TLD en utilisant le<attribute> élément comme suit -

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

Suivons JSP avec l'attribut message 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>

Cela produira le résultat suivant -

This is custom tag

Pensez à inclure les propriétés suivantes pour un attribut -

S.No. Propriété et objectif
1

name

L'élément name définit le nom d'un attribut. Chaque nom d'attribut doit être unique pour une balise particulière.

2

required

Ceci spécifie si cet attribut est obligatoire ou facultatif. Ce serait faux pour facultatif.

3

rtexprvalue

Déclare si une valeur d'expression d'exécution pour un attribut de balise est valide

4

type

Définit le type de classe Java de cet attribut. Par défaut, il est supposé commeString

5

description

Une description informative peut être fournie.

6

fragment

Déclare si cette valeur d'attribut doit être traitée comme un JspFragment.

Voici l'exemple pour spécifier les propriétés liées à un attribut -

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

Si vous utilisez deux attributs, vous pouvez modifier votre 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>
.....