English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Les balises personnalisées sont des éléments du langage JSP définis par l'utilisateur. Lorsque une page JSP contient une balise personnalisée, elle est transformée en servlet, et la balise est transformée en une Les opérations de l'objet appelé tag handler, c'est-à-dire les opérations appelées par le conteneur Web lorsque le servlet s'exécute.
Les extensions de balises JSP vous permettent de créer de nouvelles balises et de les insérer directement dans une page JSP. JSP 2Les Simple Tag Handlers ont été introduits dans la version 2.0 de la norme pour écrire ces balises personnalisées.
Vous pouvez hériter de la classe SimpleTagSupport et redéfinir la méthode doTag() pour développer une balise personnalisée la plus simple.
Ensuite, nous voulons créer une balise personnalisée appelée <ex:Hello>, le format de la balise est :
<ex:Hello />
Pour créer une balise JSP personnalisée, vous devez d'abord créer une classe Java pour traiter la balise. Donc, créons une classe HelloTag, comme suit :
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!"); } }
Le code suivant redéfinit la méthode doTag(), qui utilise la méthode getJspContext() pour obtenir l'objet JspContext courant et transmet "Hello Custom Tag!" à l'objet JspWriter.
Compilez les classes ci-dessus, et copiez-les dans le répertoire CLASSPATH de l'environnement variable. Enfin, créez la bibliothèque de balises suivante : <Répertoire d'installation de Tomcat>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>
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 la sortie du programme est le suivant :
Hello Custom Tag!
Vous pouvez inclure du contenu dans la balise comme la bibliothèque de balises standard. Par exemple, pour inclure du contenu dans notre balise personnalisée Hello, le format est le suivant :
<ex:Hello> Ceci est le corps du message </ex:Hello>
Nous pouvons modifier le fichier de classe du traitement de balise, le code est le suivant :
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()); } }
Ensuite, nous devons modifier 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.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
Maintenant, nous pouvons utiliser la balise modifiée dans JSP, comme suit :
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> body> <ex:Hello> Ceci est le corps du message </ex:Hello> </body> </html>
Le résultat de la sortie du programme est affiché comme suit :
Ceci est le corps du message
Vous pouvez configurer divers attributs dans les normes personnalisées, pour recevoir des attributs, la classe de balise personnalisée doit implémenter la méthode setter, voici l'exemple de méthode setter dans JavaBean :
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) { /* Utiliser le message à partir de l'attribut */ JspWriter out = getJspContext().getOut(); out.println( message ); } else { /* Utiliser le message à partir du contenu */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } } }
Le nom de l'attribut est "message", donc la méthode setter est setMessage(). Maintenant, ajoutons cet attribut à l'élément <attribute> du 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.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
Maintenant, nous pouvons utiliser l'attribut message dans les fichiers 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>
Les résultats de sortie des exemples ci-dessus sont les suivants :
This is custom tag
Vous pouvez également inclure les attributs suivants :
attribut | description |
---|---|
name | Définir le nom de l'attribut. Le nom de l'attribut de chaque balise doit être unique. |
required | Spécifier si l'attribut est obligatoire ou optionnel. Si réglé sur false, il est optionnel. |
rtexprvalue | Déclarer si l'attribut est valide lors de l'exécution de l'expression. |
type | Définir le type de classe Java de l'attribut. Le type par défaut est String |
description | description information |
fragment | Si cette propriété est déclarée, la valeur de l'attribut sera considérée comme un JspFragment。 |
Voici des exemples d'attributs pertinents :
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
Si vous avez utilisé 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> .....