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

Décembre 2016


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.

A voir également :

Ce document intitulé «  Taglibs - Partie 2: Mise en place d’un TagLib  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.