Voir la première partie de l'astuce
Taglibs (Partie 1): Présentation
Taglibs [Partie 2]: Mise en place d’un TagLib
Un fichier XML qui est le descripteur de Taglib est obligatioire pour utiliser une TagLib. Ce fichier définie les balises (tags) de la librairie. Ci-dessous un exemple :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>montagamoi</short-name>
<uri>http://www.owliance.com/taglibs/montagamoi-1.0</uri>
<description>Bibliothèque de taglibs</description>
<tag>
<name>switchtag</name>
<tag-class>monpackage.SwitchTag</tag-class>
<description>Tag qui affiche le corps ...</description>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>casetag</name>
<tag-class>monpackage.CaseTag</tag-class>
<description>Tag qui affiche le corps ...</description>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>iteratetag</name>
<tag-class>monpackage.IterateTag</tag-class>
<description>Tag qui affiche le corps ...</description>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
</tag>
</taglib>
Dans ce fichier exemple, nous trouvons trois tags :
- Switchtag et Casetag : pour la simulation d’un bloc « switch … case »
- Iteratetag : pour la simulation d’un itérateur.
Les informations de la première partie du fichier tld sont :
- <tlib-version> : obligatoire, elle concerne la version de la librairie.
- <jsp-version> : Obligatoire, définie la version JSP.
- <short-name> : Obligatoire , définie le nom de la librairie.
- <description> : optionnelle, c’est la description de la de la librairie
- <tag> : cette balise doit exister à chaque fois qu’on définie une Tag de la librairie
En ce qui concerne les balises qui composent la librairie :
- Tag : pour déclarer un nouveau tag.
- Name : nom de Tag et c’est ce nom qui sera utilisé dans les pages JSP.
- Tag-Class : définie la classe du TagLib.
- body-content : Optionnel, définie le type du corps du tag
- JSP : le corps de tag contient des tag JSP
- tagdependent : l’interprétation du corps se fait par le tag
- empty : le corps doit être vide
- Description : description de tag.
- Attribute : c’est la liste des attributs du tag.
Le Tag « attribute » contient les balises suivantes :
*
- Name : nom d’attribut
- Required :
- true : attribut est obligatoire
- false : optionnel.
- Rtexprvalue : définie si l’attribut peut être le résultat d’une tag expression.
- Type : type de l’attribut, par défaut, c’est java.lang.String.
Dans la page JSP qui utilise la Taglib:
<%@ taglib uri="http://www.owliance.com/taglibs/montagamoi-1.0" prefix="montagamoi"%>
<br/>
<br/>
<montagamoi:iteratetag count="10">
<br/>
<montagamoi:switchtag test="3">
<montagamoi:casetag value="0">Zéro</montagamoi:casetag>
<montagamoi:casetag value="1">Un</montagamoi:casetag>
<montagamoi:casetag value="2">Deux</montagamoi:casetag>
<montagamoi:casetag value="3">Trois</montagamoi:casetag>
</montagamoi:switchtag>
</montagamoi:iteratetag>
Ci-dessous le contenu de la classe IterateTag.java
package monpackage;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IterateTag extends BodyTagSupport {
/**
*
*/
private static final long serialVersionUID = 9368853820192946960L;
private int count = 0;
private int current;
public void setCount(int i) {
count = i;
}
public int doStartTag() throws JspException {
current = 0;
if (current < count) {
return EVAL_BODY_INCLUDE;
} else {
return SKIP_BODY;
}
}
public int doAfterBody() throws JspException {
current++;
if (current < count) {
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
}
}
Ci-dessous le contenu de la classe CaseTag
package monpackage;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class CaseTag extends TagSupport {
public String value;
public void setValue(String p_value) {
this.value = p_value;
}
public int doStartTag() throws JspException {
if (this.getParent() instanceof SwitchTag) {
SwitchTag parent = (SwitchTag) getParent();
if (parent.isValid(this.value))
return EVAL_BODY_INCLUDE;
else
return SKIP_BODY;
} else {
throw new JspException(
"Le Tag case doit être à l'intérieur du tag Switch");
}
}
}
Ci-dessous le contenu de la classe SwitchTag
package monpackage;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class SwitchTag extends TagSupport {
/**
*
*/
private static final long serialVersionUID = 3752830055610590228L;
private String test;
public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;
}
public void setTest(String p_value) {
test = p_value;
}
public boolean isValid(String caseValue) {
if (test == null)
return false;
return (test.equals(caseValue));
}
}
*
- doStartTag() est appelée lors de la rencontre de la balise d’ouverture, elle retourne un entier
- EVAL_BODY_INCLUDE : traitement continu avec évaluation du corps
- SKIP_BODY : poursuite du traitement sans évaluation du corps
- doEndTag() est appelée lors de la rencontre de la balise de fermeture, elle retourne un entier
- EVAL_PAGE : poursuivre le traitement de la JSP
- SKIP_PAGE : interrompre le traitement du reste de la JSP.