Les balises personnalisées sont des éléments de langage JSP définis par l'utilisateur. Lorsqu'une page JSP contient une balise personnalisée convertie en servlet, la balise est convertie en opérations sur un objet appelé gestionnaire de balises, ce que le conteneur Web appelle lorsque le servlet est exécuté.
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.
Ensuite, nous souhaitons créer une balise personnalisée appelée <ex:Hello> avec le format suivant :
<ex:Bonjour />
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.tutorialspoint;importer javax.servlet.jsp.tagext.*;importer javax.servlet.jsp.*;importer java.io.*;classe publique HelloTag extends SimpleTagSupport { public void doTag() lance JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Bonjour la balise personnalisée !" }}
Le code suivant réécrit la méthode doTag(), qui utilise la méthode getJspContext() pour obtenir l'objet JspContext actuel et transmet « Hello Custom Tag ! » à 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 Tomcat> webappsROOTWEB-INFcustom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemple TLD</short-name> <tag> <name>Bonjour</name > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>vide</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>Un exemple de balise personnalisée</title> </head> <body> <ex:Bonjour /> </body></html>
Le résultat du programme ci-dessus est :
Bonjour étiquette personnalisée !
Vous pouvez inclure le contenu du message dans des balises, tout comme la bibliothèque de balises standard. Si nous souhaitons inclure du contenu dans notre Hello personnalisé, le format est le suivant :
<ex:Bonjour> Ceci est le corps du message</ex:Bonjour>
On peut modifier le fichier de classe de traitement des étiquettes, le code est le suivant :
package com.tutorialspoint;importer javax.servlet.jsp.tagext.*;importer javax.servlet.jsp.*;importer java.io.*;classe publique HelloTag extends SimpleTagSupport { StringWriter sw = new StringWriter(); ) lance JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() }}
Ensuite, nous devons modifier le fichier TLD comme suit :
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemple TLD avec corps</short-name> <tag> <name>Bonjour< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>sans script</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>Un exemple de balise personnalisée</title> </head> <body> <ex:Bonjour > Ceci est le corps du message </ex:Bonjour> </body></html>
Le résultat du programme ci-dessus est le suivant :
Ceci est le corps du message
Vous pouvez définir divers attributs dans les normes personnalisées. Pour recevoir des attributs, la classe de balise personnalisée value doit implémenter la méthode setter dans JavaBean :
package com.tutorialspoint; importer javax.servlet.jsp.tagext.*; importer javax.servlet.jsp.*; importer java.io.*; classe publique HelloTag extends SimpleTagSupport { message de chaîne privé ; public void setMessage (String msg) { this.message = msg; } StringWriter sw = new StringWriter(); public void doTag() lance JspException, IOException { if (message != null) { /* Utiliser le message de l'attribut */ JspWriter out = getJspContext().getOut(); out.println( message } else { /* Utiliser le message de l'attribut corps du contenu */ 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 dans l'élément <attribute> utilisé dans le fichier TLD :
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemple TLD avec corps</short-name> <tag> <name>Bonjour< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>sans script</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>Un exemple de balise personnalisée</title> </head> <body> <ex:Bonjour message="Ceci est une balise personnalisée" /> </body></html>
Le résultat de sortie des exemples de données ci-dessus est :
Ceci est une balise personnalisée
Vous pouvez également inclure les attributs suivants :
propriété | décrire |
---|---|
nom | Définit le nom de l'attribut. Le nom de l'attribut doit être unique pour chaque balise. |
requis | Spécifie si l'attribut est obligatoire ou facultatif. S'il est défini sur false, il est facultatif. |
valeur rexpr | Déclare si l'attribut label est valide lors de l'exécution de l'expression. |
taper | Type de classe Java qui définit cette propriété. Valeur par défaut spécifiée en tant que chaîne |
description | Informations descriptives |
fragment | Si cet attribut est déclaré, la valeur de l'attribut sera traitée comme un JspFragment . |
Voici un exemple de spécification de propriétés pertinentes :
..... <attribut> <nom>nom_attribut</nom> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute>.. ...
Si vous utilisez les deux attributs, modifiez le fichier TLD comme suit :
..... <attribut> <nom>nom_attribut1</nom> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribut > <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute>.....