Blue Flower

Chercher

Les actions personnalisées

Présentation

Une page JSP est un document de type texte mélangeant du code HTML et du code java; ce dernier est, soit sous forme de scriptlet, d'expression, et/ou de directive( voir le cours JSP).
Le code java dans une JSP a besoin de marqueur permettant au serveur de le distinguer du code HTML. La spécification JSP 1.0, à l'aide de balises , a défini trois formes que peut prendre le code java.
Comme ces balises n'étaient pas compatibles avec XML, la spécification JSP 1.2 a remédié à cet inconvénient. Pour utiliser une action personnalisée c'est à dire du code java traitant d'une action particulière, on doit importer la bibliothèque de balises dans la page JSP à l'aide de la directive taglib. Cette directive a la forme suivante :

<%@ taglib uri="/WEB-INF/util.tld" prefix="u" %>

L'attribut uri défini ci-dessus fait référence à un fichier XML descripteur de librairies de tags; dans ce fichier, chaque tag fait référence à une classe java. Les classes sont réunies en bibliothèques et via un fichier descripteur dont l'extension est ".tld", on précise quelle classe est référencée par tel tag, à quelle adresse se trouve la classe en question, sans oublier d'autres informations qui sont utiles et que nous verrons dans la suite.
A l'intérieur de la JSP, chaque fois qu'on veut utiliser un tag référençant une classe de la librairie, on utilisera le préfixe de la façon suivante:

<u:nomActionPersonnalisée />
Ici on a la balise qui est d'ouverture et de fermeture combinée; le préfixe u se réfère à la bibliothèque, et le nom nomActionPersonnalisée au nom de l'action de la classe implémentant l'action mapée par le tag. ou bien
<u:nomActionPersonnalisée></u:nomActionPersonnalisée>
la balise dans ce cas est munie de la partie fermante qui est bien explicitée avec le préfixe u et le nom nomActionPersonnalisée représentant la même fonctionnalité que précédemment, ou bien enfin la troisième forme de balise

<u:nomActionPersonnalisée>
Corps de l'action
</u:nomActionPersonnalisée>

Ici le préfixe u se réfère à la bibliothèque, nomActionPersonnalisée au nom de l'action de la classe implémentant l'action mappée par le tag avec une particularité par rapport aux deux premières balises, le corps de l'action une fonctionnalité qu'on a vu dans le cours des JSP.

On a vu que la directive taglib, que ce soit avec la spécification JSP 1.1 ou la spécification JSP 1.2 ou JSP 2.0 permet de développer des actions personnalisées employées dans les JSP comme des balises XML. Les JSP Tag Librairies (JSTL), mettent aussi à la disposition des développeurs des tags que l'on peut utiliser au sein des pages JSP. Sun les a développés, a formalisé leur structure et a fourni les DTD des fichiers descripteur. Ainsi on a la possibilité de séparer la présentation d'une application de sa logique métier car celle-ci est traitée dans des classes qui sont accessibles via des tags.
Pour les initiés, l'implémentation d'une tag n'a rien à voir avec les JavaBean.
La classe java implémentant une action mappée par une balise dans une page JSP étend l'une des deux classes javax.servlet.jsp.tagext.TagSupport, javax.servlet.jsp.tagext.BodyTagSupport ou l'interface JspTag.
Lors de la compilation d'une page JSP, les balises sont remplacées par des appels vers la classe Java correspondante.

fichier descripteur

Qu'est ce qu'un fichier descripteur ?
Un fichier descripteur est un fichier d'extension ".tld"qui permet de définir les différentes balises qui seront "mappées" dans une application JSP. A partir des balises et leurs attributs, les classes encapsulées par les balises sont accessibles. Dans la première version des taglibs ce n'est rien qu'un fichier XML dont le DTD (Document Type Définition) est fourni par Sun.
Avec la version 1.2, les noms de balise ont été normalisés : les termes des noms de balises sont séparés par des tirets (exemple: jspversion devient jsp-version. Les anciens noms de balises sont indiqués entre parenthèses.
Les Taglibs 2.0 n'utilisent plus de fichier DTD (Document Type Definition) pour définir le descripteur de taglib. Désormais le format des descripteurs de taglib est défini par un fichier XSD (XML Schema Description)

Fichier descripteur :taglib 1.1
la syntaxe d'un fichier descripteur est:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
..........
</taglib> 

Entre les balises <taglib> et </taglib> se trouveront les différentes tags et attributs du fichier descripteur. Chaque version de taglib enrichit la précédente. Pour la version 1.1 on a les balises suivantes:
tlibversion:cette balise, obligatoire, précise la version de la taglib,
jspversion, qui est non obligatoire, donne la version de la JSP requise pour la librairie,
shortname(obligatoire), le prefixe de les tags de la librairie,
uri(obligatoire)
info(obligatoire)
tag

Un fichier de descripteur de tag : tagExampleLib.tld

Dans l'exemple ci-dessous, on met en application dans un fichier descripteur, les différentes balises de la taglib 1.0 et leurs attributs.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
   "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">
<taglib>
     <tlibversion>1.0</tlibversion>
     <jspversion>1.1</jspversion>
     <shortname>utility</shortname>
    <info>
       A simple tag library for the examples
     </info>
    <tag>
       <name>Hello</name>
       <tagclass>com.masslight.tagExampleClasses.HelloWorldTag</tagclass>
       <bodycontent>empty</bodycontent>
       <info>
         Print Hello World
       </info>
     </tag>
</taglib>

Fichier descripteur : taglib 1.2
La syntaxe d'un fichier descripteur est:

Le doctype d'une taglib 1.2 doit avoir le doctype suivant :
 <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	 ...
</taglib>

Fichier descripteur : taglib 2.0
La syntaxe d'un fichier descripteur est:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
	 version="2.0">
	 ...
</taglib>

les versions

Chaque version de J2EE apporte une nouvelle version de taglib; J2EE 1.2.1 avec une nouvelle version de JSP 1.1 impose la Taglib 1.1, J2EE 1.3 avec JSP 1.2 donne la tagLib 1.2 et J2EE 1.4 avec JSP 2.0 s'impose avec la Taglib 2.0
Ces différentes versions peuvent être combinées à des librairies de Tag qu'on peut crééer soit même et c'est là l' intérêt de cette technologie.

la version 1.0

Les JSP Taglibs 1.1 apportent un certain nombre de classes et d'interface Java permettant de réaliser des tags personnalisés. Ces derniers étant référencés dans un descripteur de Taglib.
Les principales classes/interfaces des taglibs 1.1 sont :
Tag qui est l'interface de base pour écrire un tag, et TagSupport qui correspond à son implémentation par défaut. BodyTag, une interface qui étend l'interface Tag en apportant une meilleure gestion du corps des tags (itérations, écriture bufférisée), et BodyTagSupport qui correspond à son implémentation par défaut. Enfin, la classe TagExtraInfo permet d'apporter des informations complémentaires sur les tags lors de la compilation des JSP.

la version 1.1

La version 1.2 des Taglibs apporte deux nouvelles interfaces :
IterationTag (qui étend de Tag) et permet d'effectuer des itérations. TryCatchFinally permet une meilleure gestion des exceptions. De plus, l'interface BodyTag n'hérite plus directement de l'interface Tag mais d'IterationTag. Enfin, la variable statique BodyTag.EVAL_BODY_TAG est dépréciée au profit de IterationTag.EVAL_BODY_BUFFERED et BodyTag.EVAL_BODY_AGAIN (respectivement pour la valeur de retour de doStartTag() et de doAfterBody()).

la version 2.0

...


Utilisation

Pour utiliser une tag ou une taglib (librairie de tags) on suit un protocole bien précis; dans la page JSP où est utilisé la taglib, on y fait appelle par la syntaxe suivante:
<%@ taglib uri="WEB-INF/lib/tag_library_name.tld" prefix="prefix_name" %>.
Dans cette instruction on précise un certain nombre de chose comme:
l'uri,l'endroit où se trouve le fichier de description, c'est à dire ici dans le répertoire WEB-INF/lib, le préfixe(voir la signification ultérieurement),
Le fichier "tag_library_name.tld" utilisé dans la déclaration du tag (voir ci-dessus), est le fichier XML descripteur du tag. On voit bien que ce fichier doit être placé dans le repertoire "WEB-INF/lib/". Le descripteur de taglib (*.tld) décrit les associations entre les balises et la classe Java.


Exemples

Exemples d'un tag simple

package com.masslight.tagExampleClasses;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class HelloWorldTag extends javax.servlet.jsp.tagext.TagSupport {
public int doStartTag() throws JspException {
  try {
   pageContext.getOut().print("Hello, World!");
  } catch (Exception ex) {
  throw new JspException("IO problems");
 }
 return SKIP_BODY;
}
}

précédent suivant