Menu
Donnez votre avis

Taglibs - Partie 2: Mise en place d’un TagLib

Posez votre question

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.
Jean-François Pillou

Cet article est régulièrement mis à jour par des experts sous la direction de Jean-François Pillou, fondateur de CommentCaMarche et directeur délégué au développement numérique du groupe Figaro.

En savoir plus sur l'équipe CCM

Ajouter un commentaire

Commentaires

Commenter la réponse de Utilisateur anonyme