71. Les JSP (Java Server Pages) 73. Struts Imprimer Sommaire Consulter avec table des matières
Développons en Java   v 2.10  
Copyright (C) 1999-2016 .  

 

72. JSTL (Java server page Standard Tag Library)

 

chapitre 7 2

 

Niveau : niveau 4 Supérieur 

 

JSTL est l'acronyme de Java server page Standard Tag Library. C'est un ensemble de tags personnalisés développé sous la JSR 052 qui propose des fonctionnalités souvent rencontrées dans les JSP :

JSTL nécessite un conteneur d'applications web qui implémente l'API servlet 2.3 et l'API JSP 1.2. L'implémentation de référence (JSTL-RI) de cette spécification est développée par le projet Taglibs du groupe Apache sous le nom " Standard ".

Il est possible de télécharger cette implémentation de référence à l'URL : hhttp://tomcat.apache.org/taglibs/

JSTL est aussi inclus dans le JWSDP (Java Web Services Developer Pack), ce qui facilite son installation et son utilisation. Les exemples de cette section ont été réalisés avec le JWSDP 1.001

JSTL possède quatre bibliothèques de tags :

Rôle TLD Uri
Fonctions de base c.tld http://java.sun.com/jstl/core
Traitements XML x.tld http://java.sun.com/jstl/xml
Internationalisation fmt.tld http://java.sun.com/jstl/fmt
Traitements SQL sql.tld http://java.sun.com/jstl/sql

JSTL propose un langage nommé EL (Expression Langage) qui permet de faire facilement référence à des objets Java accessibles dans les différents contextes de la JSP.

La bibliothèque de tags JSTL est livrée en deux versions :

Pour plus informations, il est possible de consulter les spécifications à l'url suivante : http://jcp.org/aboutJava/communityprocess/final/jsr052/

Ce chapitre contient plusieurs sections :

 

72.1. Un exemple simple

Pour commencer, voici un exemple et sa mise en oeuvre détaillée. L'application web d'exemple se nomme test. Il faut créer un répertoire test dans le répertoire webapps de tomcat.

Pour utiliser JSTL, il faut copier les fichiers jstl.jar et standard.jar dans le répertoire WEB-INF/lib de l'application web.

Il faut copier les fichiers .tld dans le répertoire WEB-INF ou un de ses sous-répertoires. Dans la suite de l'exemple, ces fichiers ont été placés dans le répertoire /WEB-INF/tld.

Il faut ensuite déclarer les bibliothèques à utiliser dans le fichier web.xml du répertoire WEB-INF comme pour toute bibliothèque de tags personnalisés.

Exemple : pour la bibliothèque Core
<taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location> 
</taglib>

L'arborescence des fichiers est la suivante :

Exemple :
webapps
      test
            WEB-INF
                  lib
                        jstl.jar
                        standard.jar
                  tld
                        c.tld
                  web.xml
            test.jsp

Pour pouvoir utiliser une bibliothèque personnalisée, il faut utiliser la directive taglib :

Exemple :
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

Voici les codes source des différents fichiers de l'application web :

Exemple : fichier test.jsp
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
  <head>
    <title>Exemple</title>
  </head>

  <body>
      <c:out value="Bonjour" /><br/>
  </body>
</html>

Exemple : le fichier WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app23.dtd">
 
<web-app>
  <taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location> 
  </taglib>
</web-app>

Pour tester l'application, il suffit de lancer Tomcat et de saisir l'url localhost:8080/test/test.jsp dans un browser.

 

72.2. Le langage EL (Expression Language)

JSTL propose un langage particulier constitué d'expressions qui permettent d'utiliser et de faire référence à des objets Java accessibles dans les différents contextes de la page JSP. Le but est de fournir un moyen simple d'accéder aux données nécessaires à une JSP.

La syntaxe de base est ${xxx} où xxx est le nom d'une variable d'un objet Java défini dans un contexte particulier. La définition dans un contexte permet de définir la portée de la variable (page, requête, session ou application).

EL permet facilement de s'affranchir de la syntaxe de Java pour obtenir une variable.

Exemple : accéder à l'attribut nom d'un objet personne situé dans la session avec Java
<%= session.getAttribute("personne").getNom() %>

Exemple : accéder à l'attribut nom d'un objet personne situé dans la session avec EL
${sessionScope.personne.nom}

EL possède par défaut les variables suivantes :

Variable Rôle
PageScope variable contenue dans la portée de la page (PageContext)
RequestScope variable contenue dans la portée de la requête (HttpServletRequest)
SessionScope variable contenue dans la portée de la session (HttpSession)
ApplicationScope variable contenue dans la portée de l'application (ServletContext)
Param paramètre de la requête http
ParamValues paramètres de la requête sous la forme d'une collection
Header en-tête de la requête
HeaderValues en-têtes de la requête sous la forme d'une collection
InitParam paramètre d'initialisation
Cookie cookie
PageContext objet PageContext de la page

EL propose aussi différents opérateurs :

Operateur Rôle Exemple
. Obtenir une propriété d'un objet ${param.nom}
[] Obtenir une propriété par son nom ou son indice ${param[" nom "]}
${row[1]}
Empty Teste si un objet est null ou vide si c'est une chaîne de caractère. Renvoie un booléen ${empty param.nom}
==
eq
teste l'égalité de deux objets  
!=
ne
teste l'inégalité de deux objets  
<
lt
test strictement inférieur  
>
gt
test strictement supérieur  
<=
le
test inférieur ou égal  
>=
ge
test supérieur ou égal  
+ Addition  
- Soustraction  
* Multiplication  
/
div
Division  
%
mod
Modulo  
&&
and
   
||
or
   
!
not
Négation d'une valeur  

EL ne permet pas l'accès aux variables locales. Pour pouvoir accéder à de telles variables, il faut obligatoirement en créer une copie dans une des portées particulières : page, request, session ou application

Exemple :
<%
  int valeur = 101;
%>
  valeur = <c:out value="${valeur}" /><BR/>

Résultat :
valeur =

Exemple : avec la variable copiée dans le contexte de la page
<%
  int valeur = 101;
  pageContext.setAttribute("valeur", new Integer(valeur));
%>
  valeur = <c:out value="${valeur}" /><BR/>

Résultat :
valeur = 101

 

72.3. La bibliothèque Core

Elle propose les tags suivants répartis dans trois catégories :

Catégorie Tag
Utilisation de EL set
out
remove
catch
Gestion du flux (condition et itération) if
choose
forEach
forTokens
Gestion des URL import
url
redirect

Pour utiliser cette bibliothèque, il faut la déclarer dans le fichier web.xml du répertoire WEB-INF de l'application web.

Exemple :
<taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location> 
</taglib>

Pour chaque JSP qui utilise un ou plusieurs tags, la bibliothèque doit être déclarée avec une directive taglib

Exemple :
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

 

72.3.1. Le tag set

Le tag set permet de stocker une variable dans une portée particulière (page, requête, session ou application).

Il possède plusieurs attributs :

Attribut Rôle
value valeur à stocker
target nom de la variable contenant un bean dont la propriété doit être modifiée
property nom de la propriété à modifier
var nom de la variable qui va stocker la valeur
scope portée de la variable qui va stocker la valeur

Exemple :
    <c:set var="maVariable1" value="valeur1" scope="page" />
    <c:set var="maVariable2" value="valeur2" scope="request" />
    <c:set var="maVariable3" value="valeur3" scope="session" />
    <c:set var="maVariable4" value="valeur4" scope="application" />

La valeur peut être déterminée dynamiquement.

Exemple :
    <c:set var="maVariable" value="${param.id}" scope="page" />

L'attribut target avec l'attribut property permettent de modifier la valeur d'une propriété (précisée avec l'attribut property) d'un objet (précisé avec l'attribut target).

La valeur de la variable peut être précisée dans le corps du tag plutôt que d'utiliser l'attribut value.

Exemple :
<c:set var="maVariable" scope="page">Valeur de ma variable</c:set>

 

72.3.2. Le tag out

Le tag out permet d'envoyer dans le flux de sortie de la JSP le résultat de l'évaluation de l'expression fournie dans le paramètre " value ". Ce tag est équivalent au tag d'expression <%= ... %> de JSP.

Il possède plusieurs attributs :

Attribut Rôle
value valeur à afficher (obligatoire)
default définir une valeur par défaut si la valeur est null
escapeXml booléen qui précise si les caractères particuliers (< > & ...) doivent être convertis en leurs équivalents HTML (&lt; &gt; &amp ; ...)

Exemple :
    <c:out value='${pageScope.maVariable1}' />
    <c:out value='${requestScope.maVariable2}' />
    <c:out value='${sessionScope.maVariable 3}' />
    <c:out value='${applicationScope.maVariable 4}' />

Il n'est pas obligatoire de préciser la portée dans laquelle la variable est stockée : dans ce cas, la variable est recherchée prioritairement dans la page, la requête, la session et enfin l'application.

L'attribut default permet de définir une valeur par défaut si le résultat de l'évaluation de la valeur est null. Si la valeur est null et que l'attribut default n'est pas utilisé alors c'est une chaîne vide qui est envoyée dans le flux de sortie.

Exemple :
   <c:out value="${personne.nom}" default="Inconnu" />

Le tag out est particulièrement utile pour générer le code dans un formulaire en remplaçant avantageusement les scriplets.

Exemple :
<input type="text" name="nom" value="<c:out value="${param.nom}"/>" />

 

72.3.3. Le tag remove

Le tag remove permet de supprimer une variable d'une portée particulière.

Il possède plusieurs attributs :

Attribut Rôle
var nom de la variable à supprimer (obligatoire)
scope portée de la variable

Exemple :
    <c:remove var="maVariable1" scope="page" />
    <c:remove var="maVariable2" scope="request" />
    <c:remove var="maVariable3" scope="session" />
    <c:remove var="maVariable4" scope="application" />

 

72.3.4. Le tag catch

Ce tag permet de capturer des exceptions qui sont levées lors de l'exécution du code inclus dans son corps.

Il possède un attribut :

Attribut Rôle
var nom d'une variable qui va contenir des informations sur l'anomalie

Si l'attribut var n'est pas utilisé, alors toutes les exceptions levées lors de l'exécution du corps du tag sont ignorées.

Exemple : code non protégé
<c:set var="valeur" value="abc" />
<fmt:parseNumber var="valeurInt" value="${valeur}"/>

Résultat : une exception est lévée
javax.servlet.ServletException: In <parseNumber>, value attribute can not be parsed: "abc"
        at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:
471)
        at org.apache.jsp.test$jsp.jspService(test$jsp.java:1187)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)

L'utilisation du tag catch peut empêcher le plantage de l'application.

Exemple :
<c:set var="valeur" value="abc" />
<c:catch var="erreur">
   <fmt:parseNumber var="valeurInt" value="${valeur}"/>
</c:catch>
<c:if test="${not empty erreur}">
   la valeur n'est pas numerique
</c:if>

Résultat :
la valeur n'est pas numerique

L'objet désigné par l'attribut var du tag catch possède une propriété message qui contient le message d'erreur

Exemple :
<c:set var="valeur" value="abc" />
<c:catch var="erreur">
   <fmt:parseNumber var="valeurInt" value="${valeur}"/>
</c:catch>
<c:if test="${not empty erreur}">
 <c:out value="${erreur.message}"/>
</c:if>

Résultat :
In &lt;parseNumber&gt;, value attribute can not be parsed: "abc"

Le souci avec ce tag est qu'il n'est pas possible de savoir quelle exception a été levée.

 

72.3.5. Le tag if

Ce tag permet d'évaluer le contenu de son corps si la condition qui lui est fournie est vraie.

Il possède plusieurs attributs :

Attribut Rôle
test condition à évaluer
var nom de la variable qui contiendra le résultat de l'évaluation
scope portée de la variable qui contiendra le résultat

Exemple :
<c:if test="${empty personne.nom}" >Inconnu</c:if>

Le tag peut ne pas avoir de corps s'il est simplement utilisé pour stocker le résultat de l'évaluation de la condition dans une variable.

Exemple :
<c:if test="${empty personne.nom}" var="resultat" />

Le tag if est particulièrement utile pour générer le code dans un formulaire en remplaçant avantageusement les scriplets.

Exemple : selection de la bonne occurrence dont la valeur est fournie en paramètre de la requête
<FORM NAME="form1" METHOD="post" ACTION="">
  <SELECT NAME="select">
    <OPTION VALUE="choix1" <c:if test="${param.select == 'choix1'}" >selected</c:if> >
      choix 1</OPTION>
    <OPTION VALUE="choix2" <c:if test="${param.select == 'choix2'}" >selected</c:if> >
      choix 2</OPTION>
    <OPTION VALUE="choix3" <c:if test="${param.select == 'choix3'}" >selected</c:if> >
      choix 3</OPTION>
  </SELECT>
</FORM>

Pour tester le code, il faut fournir en paramètre dans l'url select=choix2

Exemple :
http://localhost:8080/test/test.jsp?select=choix2

 

72.3.6. Le tag choose

Ce tag permet de traiter différents cas mutuellement exclusifs dans un même tag. Le tag choose ne possède pas d'attribut. Il doit cependant posséder un ou plusieurs tags fils « when ».

Le tag when possède l'attribut test qui permet de préciser la condition à évaluer. Si la condition est vraie alors le corps du tag when est évalué et le résultat est envoyé dans le flux de sortie de la JSP

Le tag otherwise permet de définir un cas qui ne correspond à aucun des autres cas inclus dans le tag. Ce tag ne possède aucun attribut.

Exemple :
<c:choose>
  <c:when test="${personne.civilite == 'Mr'}">
    Bonjour Monsieur
  </c:when>
  <c:when test="${personne.civilite == 'Mme'}">
    Bonjour Madame
  </c:when>
  <c:when test="${personne.civilite == 'Mlle'}">
    Bonjour Mademoiselle
  </c:when>
  <c:otherwise>
    Bonjour
  </c:otherwise>
</c:choose>

 

72.3.7. Le tag forEach

Ce tag permet de parcourir les différents éléments d'une collection et ainsi d'exécuter de façon répétitive le contenu de son corps.

Il possède plusieurs attributs :

Attribut Rôle
var nom de la variable qui contient l'élément en cours de traitement
items collection à traiter
varStatus nom d'une variable qui va contenir des informations sur l'itération en cours de traitement
begin numéro du premier élément à traiter (le premier possède le numéro 0)
end numéro du dernier élément à traiter
step pas des éléments à traiter (par défaut 1)

A chaque itération, la valeur de la variable dont le nom est précisé par la propriété var change pour contenir l'élément de la collection en cours de traitement.

Pour les attributs, la seule obligation est d'avoir défini soit l'attribut items, soit les attributs begin et end.

Le tag forEach peut aussi réaliser des itérations sur les nombres et non sur des éléments d'une collection. Dans ce cas, il ne faut pas utiliser l'attribut items mais uniquement utiliser les attributs begin et end pour fournir les bornes inférieures et supérieures de l'itération.

Exemple :
<c:forEach begin="1" end="4" var="i">
<c:out value="${i}"/><br>
</c:forEach>v

Résultat :
1
2
3
4

L'attribut step permet de préciser le pas de l'itération.

Exemple :
<c:forEach begin="1" end="12" var="i" step="3">
  <c:out value="${i}"/><br>
</c:forEach>

Exemple :
1
4
7
10

L'attribut varStatus permet de définir une variable qui va contenir des informations sur l'itération en cours d'exécution. Cette variable possède plusieurs propriétés :

Attribut Rôle
index indique le numéro de l'occurrence dans l'ensemble de la collection
count indique le numéro de l'itération en cours (en commençant par 1)
first booléen qui indique si c'est la première itération
last booléen qui indique si c'est la dernière itération

Exemple :
<c:forEach begin="1" end="12" var="i" step="3" varStatus="vs">
  index = <c:out value="${vs.index}"/> : 
  count = <c:out value="${vs.count}"/> : 
  value = <c:out value="${i}"/>
  <c:if test="${vs.first}">
     : Premier element
  </c:if>
  <c:if test="${vs.last}">
     : Dernier element
  </c:if>
  <br>
</c:forEach>

Résultat :
  index = 1 : count = 1 : value = 1 : Premier element 
  index = 4 : count = 2 : value = 4 
  index = 7 : count = 3 : value = 7 
  index = 10 : count = 4 : value = 10 : Dernier element

 

72.3.8. Le tag forTokens

Ce tag permet de découper une chaîne selon un ou plusieurs séparateurs donnés et ainsi d'exécuter de façon répétitive le contenu de son corps autant de fois qu'il y a d'occurrences trouvées.

Il possède plusieurs attributs :

Attribut Rôle
var variable qui contient l'occurrence en cours de traitement (obligatoire)
items la chaîne de caractères à traiter (obligatoire)
delims précise le ou les séparateurs
varStatus nom d'une variable qui va contenir des informations sur l'itération en cours de traitement
begin numéro du premier élément à traiter (le premier possède le numéro 0)
end numéro du dernier élément à traiter
step pas des éléments à traiter (par défaut 1)

L'attribut delims peut avoir comme valeur une chaîne de caractères ne contenant qu'un seul caractère (délimiteur unique) ou un ensemble de caractères (délimiteurs multiples).

Exemple :
<c:forTokens var="token" items="chaine 1;chaine 2;chaine 3" delims=";">
  <c:out value="${token}" /><br>
</c:forTokens>v

Exemple :
chaine 1
chaine 2
chaine 3

Dans le cas où il y a plusieurs délimiteurs, chacun peut servir de séparateur.

Exemple :
<c:forTokens var="token" items="chaine 1;chaine 2,chaine 3" delims=";,">
  <c:out value="${token}" /><br>
</c:forTokens>

Attention : Il n'y a pas d'occurrence vide. Dans le cas où deux séparateurs sont juxtaposés dans la chaîne à traiter, ceux-ci sont considérés comme un seul séparateur. Si la chaîne commence ou se termine par un séparateur, ceux-ci sont ignorés.

Exemple :
<c:forTokens var="token" items="chaine 1;;chaine 2;;;chaine 3" delims=";">
  <c:out value="${token}" /><br>
</c:forTokens>

Résultat :
chaine 1
chaine 2
chaine 3

Il est possible de ne traiter qu'un sous-ensemble des occurrences de la collection. JSTL attribut à chaque occurrence un numéro incrémenté à partir de 0. Les attributs begin et end permettent de préciser une plage d'occurrences à traiter.

Exemple :
<c:forTokens var="token" items="chaine 1;chaine 2;chaine 3" delims=";" begin="1" end="1" >
  <c:out value="${token}" /><br>
</c:forTokens>

Résultat :
chaine 2

Il est possible de n'utiliser que l'attribut begin ou l'attribut end. Si seul l'attribut begin est précisé alors les dernières occurrences seront traitées. Si seul l'attribut end est précisé alors seuls les premières occurrences seront traitées.

Les attributs varStatus et step ont le même rôle que ceux du tag forEach.

 

72.3.9. Le tag import

Ce tag permet d'accéder à une ressource grâce à son URL pour l'inclure ou l'utiliser dans les traitements de la JSP. La ressource accédée peut être dans une autre application.

Son grand intérêt par rapport au tag <jsp :include> est de ne pas être limité au contexte de l'application web.

Il possède plusieurs attributs :

Attribut Rôle
url URL de la ressource (obligatoire)
var nom de la variable qui va stocker le contenu de la ressource sous la forme d'une chaîne de caractères
scope portée de la variable qui va stocker le contenu de la ressource
context contexte de l'application web qui contient la ressource (si la ressource n'est pas l'application web courante)
charEncoding jeu de caractères utilisé par la ressource
varReader nom de la variable qui va stocker le contenu de la ressource sous la forme d'un objet de type java.io.Reader

L'attribut url permet de préciser l'URL de la ressource. Cette URL peut être relative à l'application web ou absolue.

Exemple :
<c:import url="/message.txt" /><br>

Par défaut, le contenu de la ressource est inclus dans la JSP. Il est possible de stocker le contenu de la ressource dans une chaîne de caractères en utilisant l'attribut var. Cet attribut attend comme valeur le nom de la variable.

Exemple :
<c:import url="/message.txt" var="message" />
<c:out value="${message}" /><BR/>

 

72.3.10. Le tag redirect

Ce tag permet de faire une redirection vers une nouvelle URL.

Les paramètres peuvent être fournis grâce à un ou plusieurs tags fils param.

Exemple :
<c:redirect url="liste.jsp">
  <c:param name="id" value="123"/>
</c:redirect>

 

72.3.11. Le tag url

Ce tag permet de formater une URL. Il possède plusieurs attributs :

Attribut Rôle
value base de l'URL (obligatoire)
var nom de la variable qui va stocker l'URL
scope portée de la variable qui va stocker l'URL
context  

Le tag url peut avoir un ou plusieurs tags fils « param ». Le tag param permet de préciser un paramètre et sa valeur pour qu'ils soient ajoutés à l'URL générée.

Le tag param possède deux attributs :

Attribut Rôle
name nom du paramètre
value valeur du paramètre

Exemple :
<a href="<c:url url="/index.jsp"/>"/>

 

72.4. La bibliothèque XML

Cette bibliothèque permet de manipuler des données en provenance d'un document XML.

Elle propose les tags suivants répartis dans trois catégories :

Catégorie Tag
Fondamentale parse
set
out
Gestion du flux (condition et itération) if
choose
forEach
Transformation XSLT transform

Les exemples de cette section utilisent un fichier xml nommé personnes.xml dont le contenu est le suivant :

Fichier utilisé dans les exemples :
<personnes>
  <personne id="1">
    <nom>nom1</nom>
    <prenom>prenom1</prenom>
  </personne>
  <personne id="2">
    <nom>nom2</nom>
    <prenom>prenom2</prenom>
  </personne>
  <personne id="3">
    <nom>nom3</nom>
    <prenom>prenom3</prenom>
  </personne>
</personnes>

L'attribut select des tags de cette bibliothèque utilise la norme Xpath pour sa valeur. JSTL propose une extension supplémentaire à Xpath pour préciser l'objet sur lequel l'expression doit être évaluée. Il suffit de préfixer le nom de la variable par un $

Exemple : recherche de la personne dont l'id est 2 dans un objet nommé listepersonnes qui contient l'arborescence du document xml.
$listepersonnes/personnes/personne[@id=2]

L'implémentation de JSTL fournie avec le JWSDP utilise Jaxen comme moteur d'interprétation XPath. Donc pour utiliser cette bibliothèque, il faut s'assurer que les fichiers saxpath.jar et jaxen-full.jar soient présents dans le répertoire lib du répertoire WEB-INF de l'application web.

Pour utiliser cette bibliothèque, il faut la déclarer dans le fichier web.xml du répertoire WEB-INF de l'application web.

Exemple :
  <taglib>
    <taglib-uri>http://java.sun.com/jstl/xml</taglib-uri>
    <taglib-location>/WEB-INF/tld/x.tld</taglib-location>
  </taglib>

Lorsqu'une JSP utilise un ou plusieurs tags de la bibliothèque, celle-ci doit être déclarée avec une directive taglib.

Exemple :
<%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %>

 

72.4.1. Le tag parse

Le tag parse permet d'analyser un document et de stocker le résultat dans une variable qui pourra être exploitée par la JSP ou une autre JSP selon la portée sélectionnée pour le stockage.

Attribut Rôle
xml contenu du document à analyser
var nom de la variable qui va contenir l'arbre DOM généré par l'analyse
scope portée de la variable qui va contenir l'arbre DOM
varDom variable de type Document pour le document XML analysé
scopeDom portée de la variable varDom
filter filtre à appliquer sur le document source
system URI du document XML en cours d'analyse

Exemple :
<c:import url="/personnes.xml" var="personnes" />
<x:parse xml="${personnes}" var="listepersonnes"  />

Dans cet exemple, il suffit simplement que le fichier personnes.xml soit dans le dossier racine de l'application web.

 

72.4.2. Le tag set

Le tag set est équivalent au tag set de la bibliothèque Core. Il permet d'évaluer l'expression Xpath fournie dans l'attribut select et de placer le résultat de cette évaluation dans une variable. L'attribut var permet de préciser la variable qui va recevoir le résultat de l'évaluation sous la forme d'un noeud de l'arbre du document XML.

Il possède plusieurs attributs :

Attribut Rôle
select expression XPath à évaluer
var nom de la variable qui va stocker le résultat de l'évaluation
scope portée de la variable qui va stocker le résultat

Exemple :
<c:import url="/personnes.xml" var="personnes" />
<x:parse xml="${personnes}" var="listepersonnes"  />
<x:set var="unepersonne" select="$listepersonnes/personnes/personne[@id=2]" />
<h1>nom = <x:out select="$unepersonne/nom"/></h1>

 

72.4.3. Le tag out

Le tag out est équivalent au tag out de la bibliothèque Core. Il permet d'évaluer l'expression Xpath fournie dans l'attribut select et d'envoyer le résultat dans le flux de sortie. L'attribut select permet de préciser l'expression Xpath qui doit être évaluée.

Il possède plusieurs attributs :

Attribut Rôle
select expression XPath à évaluer
escapeXML true par défaut, si le contenu comprend des tags HTML, XML ou autres ils seront affichés tels quels. A false c'est l'évaluation des tags qui sera affichée

Exemple : Afficher le nom de la personne dont l'id est 2
<c:import url="/personnes.xml" var="personnes" />
<x:parse xml="${personnes}" var="listepersonnes"  />
<x:set var="unepersonne" select="$listepersonnes/personnes/personne[@id=2]" />
<h1><x:out select="$unepersonne/nom"/></h1>

Pour stocker le résultat de l'évaluation d'une expression dans une variable, il faut utiliser une combinaison du tag x:out et c:set

Exemple :
<c:set var="personneId">
      <x:out select="$listepersonnes/personnes/personne[@id=2]" />
    </c:set>

 

72.4.4. Le tag if

Ce tag est équivalent au tag if de la bibliothèque Core sauf qu'il évalue une expression XPath

Il possède plusieurs attributs :

Attribut Rôle
select expression XPath à évaluer sous la forme d'un booléen
var nom de la variable qui va stocker le résultat de l'évaluation
scope portée de la variable qui va stocker le résultat de l'évaluation

 

72.4.5. Le tag choose

Ce tag est équivalent au tag choose de la bibliothèque Core sauf qu'il évalue des expressions XPath

 

72.4.6. Le tag forEach

Ce tag est équivalent au tag forEach de la bibliothèque Core. Il permet de parcourir les noeuds issus de l'évaluation d'une expression Xpath.

Il possède plusieurs attributs :

Attribut Rôle
select expression XPath à évaluer (obligatoire)
var nom de la variable qui va contenir le noeud en cours de traitement

Exemple :
<c:import url="/personnes.xml" var="personnes" />
<x:parse xml="${personnes}" var="listepersonnes"  />
<x:forEach var="unepersonne" select="$listepersonnes/personnes/*">
    <c:set var="personneId">
      <x:out select="$unepersonne/@id"/>
    </c:set>
    <c:out value="${personneId}" /> - <x:out select="$unepersonne/nom"/> &nbsp; 
       <x:out select="$unepersonne/prenom"/> <br>
</x:forEach>

 

72.4.7. Le tag transform

Ce tag permet d'appliquer une transformation XSLT à un document XML. L'attribut xsl permet de préciser la feuille de style XSL. L'attribut optionnel xml permet de préciser le document xml.

Il possède plusieurs attributs :

Attribut Rôle
xslt feuille se style XSLT (obligatoire)
xml nom de la variable qui contient le document XML à traiter
var nom de la variable qui va recevoir le résultat de la transformation
scope portée de la variable qui va recevoir le résultat de la transformation
xmlSystemId deprecated : utiliser l'attribut docSuystemId
docSystemId system identifier (URI) pour parser le document XML
xsltSystemId system identifier (URI) parser le document XSLT
result chaîne de caractères qui contient le résultat de la transformation

Exemple :
<x:transform xml='${docXml}' xslt='${feuilleXslt}'/>

Le document xml à traiter peut être fourni dans le corps du tag :

Exemple :
<x:transform xslt='${feuilleXslt}'>
  <personnes>
    <personne id="1">
      <nom>nom1</nom>
      <prenom>prenom1</prenom>
    </personne>
    <personne id="2">
      <nom>nom2</nom>
      <prenom>prenom2</prenom>
    </personne>
    <personne id="3">
      <nom>nom3</nom>
      <prenom>prenom3</prenom>
    </personne>
  </personnes>
</x:transform>

Le tag transform peut avoir un ou plusieurs noeuds fils param pour fournir des paramètres à la feuille de style XSLT.

 

72.5. La bibliothèque I18n

Cette bibliothèque facilite l'internationalisation d'une page JSP.

Elle propose les tags suivants répartis dans trois catégories :

Catégorie Tag
Définition de la langue setLocale
Formatage de messages bundle
message
setBundle
Formatage de dates et nombres formatNumber
parseNumber
formatDate
parseDate
setTimeZone
timeZone

Pour utiliser cette bibliothèque, il faut la déclarer dans le fichier web.xml du répertoire WEB-INF de l'application web.

Exemple :
<taglib>
    <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
    <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location> 
</taglib>

La bibliothèque doit être déclarée avec la directive taglib pour chaque JSP qui utilise un ou plusieurs tags.

Exemple :
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>

Le plus simple pour mettre en oeuvre la localisation des messages, c'est de définir un ensemble de fichiers qui est appelé bundle en anglais.

Il faut définir un fichier pour la langue par défaut et un fichier pour chaque langue particulière. Tous ces fichiers ont un préfixe commun appelé basename et doivent avoir comme extension .properties. Les fichiers pour les langues particulières utilisent le préfixe commun suivit d'un underscore puis du code langue et éventuellement d'un underscore suivi du code pays. Ces fichiers doivent être inclus dans le classpath : le plus simple est de les copier dans le répertoire WEB-INF/classes de l'application web.

Exemple :
message.properties
message_en.properties

Dans chaque fichier, les clés sont identiques, seule la valeur associée à la clé change.

Exemple : le fichier message.properties pour le français (langue par défaut)
msg=bonjour

Exemple : le fichier message_en.properties pour l'anglais
msg=Hello

Pour plus d'information, voir le chapitre «L'internationalisation». .

 

72.5.1. Le tag bundle

Ce tag permet de préciser un bundle à utiliser dans les traitements contenus dans son corps.

Il possède plusieurs attributs :

Attribut Rôle
basename nom de base de la ressource à utiliser (obligatoire)
prefix valeur préfixant chaque nom de clé pour les sous-attributs <fmt:message>

Exemple :
<fmt:bundle basename="message" > 
  <fmt:message key="msg"/>
</fmt:bundle>

 

72.5.2. Le tag setBundle

Ce tag permet de déclarer un bundle par défaut.

Il possède plusieurs attributs :

Attribut Rôle
basename nom de base de la ressource à utiliser (obligatoire)
var nom de la variable qui va stocker le nouveau bundle
scope portée de la variable qui va recevoir le nouveau bundle

Exemple :
mon message =
<fmt:setBundle basename="message" />
  <fmt:message key="msg"/>

 

72.5.3. Le tag message

Ce tag permet de localiser un message.

Il possède plusieurs attributs :

Attribut Rôle
key clé du message à utiliser
bundle bundle à utiliser
var nom de la variable qui va recevoir le résultat du formatage
scope portée de la variable qui va recevoir le résultat du formatage

Pour fournir chaque valeur, il faut utiliser un ou plusieurs tags fils param.

Exemple :
mon message =
<fmt:setBundle basename="message" /> 
  <fmt:message key="msg"/>

Résultat :
mon message = bonjour

Si aucune valeur n'est trouvée pour la clé fournie alors le tag renvoie ???XXX ??? où XXX représente le nom de la clé.

Exemple :
mon message =
<fmt:setBundle basename="message" /> 
  <fmt:message key="test"/>

Résultat :
mon message = ???test???

 

72.5.4. Le tag setLocale

Ce tag permet de sélectionner une nouvelle Locale.

Exemple :
<fmt:setLocale value="en"/>
mon message =
<fmt:setBundle basename="message" />
  <fmt:message key="msg"/>

Résultat :
mon message = Hello

 

72.5.5. Le tag formatNumber

Ce tag permet de formater des nombres selon la locale. L'attribut value permet de préciser la valeur à formater. L'attribut type permet de préciser le type de formatage à réaliser.

Il possède plusieurs attributs :

Attribut Rôle
value valeur à formater
type CURRENCY ou NUMBER ou PERCENT
pattern format personnalisé
currencyCode code de la monnaie à utiliser pour le type CURRENCY
currencySymbol symbole de la monnaie à utiliser pour le type CURRENCY
groupingUsed booléen pour préciser si les nombres doivent être groupés
maxIntegerDigits nombre maximum de chiffres dans la partie entière
minIntegerDigits nombre minimum de chiffres dans la partie entière
maxFractionDigits nombre maximum de chiffres dans la partie décimale
minFractionDigits nombre minimum de chiffres dans la partie décimale
var nom de la variable qui va stocker le résultat
scope portée de la variable qui va stocker le résultat

Exemple :
<c:set var="montant" value="12345.67" />
montant = <fmt:formatNumber value="${montant}" type="currency"/>

 

72.5.6. Le tag parseNumber

Ce tag permet de convertir une chaîne de caractères qui contient un nombre en une variable décimale.

Il possède plusieurs attributs :

Attribut Rôle
value valeur à traiter
type CURRENCY ou NUMBER ou PERCENT
parseLocale Locale à utiliser lors du traitement
integerOnly booléen qui indique si le résultat doit être un entier (true) ou un flottant (false)
pattern format personnalisé
var nom de la variable qui va stocker le résultat
scope portée de la variable qui va stocker le résultat

Exemple : convertir en entier un identifiant passé en paramètre de la requête
<fmt:parseNumber value="${param.id}" var="id"/>

 

72.5.7. Le tag formatDate

Ce tag permet de formater des dates selon la Locale.

Il possède plusieurs attributs :

Attribut Rôle
value valeur à formater
type DATE ou TIME ou BOTH
dateStyle FULL ou LONG ou MEDIUM ou SHORT ou DEFAULT
timeStyle FULL ou LONG ou MEDIUM ou SHORT ou DEFAULT
pattern format personnalisé
timeZone timeZone utilisée pour le formatage
var nom de la variable qui va stocker le résultat
scope portée de la variable qui va stocker le résultat

L'attribut value permet de préciser la valeur à formater. L'attribut type permet de préciser le type de formatage à réaliser. L'attribut dateStyle permet de préciser le style du formatage.

Exemple :
<jsp:useBean id="now" class="java.util.Date" />
Nous sommes le <fmt:formatDate value="${now}" type="date" dateStyle="full"/>.

 

72.5.8. Le tag parseDate

Ce tag permet d'analyser une chaîne de caractères contenant une date pour créer un objet de type java.util.Date.

Il possède plusieurs attributs :

Attribut Rôle
value valeur à traiter
type DATE ou TIME ou BOTH
dateStyle FULL ou LONG ou MEDIUM ou SHORT ou DEFAULT
timeStyle FULL ou LONG ou MEDIUM ou SHORT ou DEFAULT
pattern format personnalisé
parseLocale Locale utilisée pour le formatage
timeZone timeZone utilisée pour le formatage
var nom de la variable de type java.util.date qui va stocker le résultat
scope portée de la variable qui va stocker le résultat

 

72.5.9. Le tag setTimeZone

Ce tag permet de stocker un fuseau horaire dans une variable.

Il possède plusieurs attributs :

Attribut Rôle
value fuseau horaire à stocker (obligatoire)
var nom de la variable de stockage
scope portée de la variable de stockage

 

72.5.10. Le tag timeZone

Ce tag permet de préciser un fuseau horaire particulier à utiliser dans son corps.

Il possède plusieurs attributs :

Attribut Rôle
value chaîne de caractères ou objet java.util.TimeZone qui précise le fuseau horaire à utiliser

 

72.6. La bibliothèque Database

Cette bibliothèque facilite l'accès aux bases de données. Son but n'est pas de remplacer les accès réalisés grâce à des beans ou des EJB mais de fournir une solution simple, hélas non robuste, pour accéder à des bases de données. Ceci est cependant particulièrement utile pour développer des pages de tests ou des prototypes.

Elle propose les tags suivants répartis dans deux catégories :

Catégorie Tag
Définition de la source de données setDataSource
Exécution de requêtes SQL query
transaction
update

Pour utiliser cette bibliothèque, il faut la déclarer dans le fichier web.xml du répertoire WEB-INF de l'application web.

Exemple :
  <taglib>
    <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
    <taglib-location>/WEB-INF/tld/sql.tld</taglib-location> 
</taglib>

La bibliothèque doit être déclarée par la directive taglib pour chaque JSP qui utilise un ou plusieurs tags.

Exemple :
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

 

72.6.1. Le tag setDataSource

Ce tag permet de créer une connexion vers la base de données à partir des données fournies dans les différents attributs du tag.

Il possède plusieurs attributs :

Attribut Rôle
driver nom de la classe du pilote JDBC à utiliser
source URL de la base de données à utiliser
user nom de l'utilisateur à utiliser lors de la connexion
password mot de passe de l'utilisateur à utiliser lors de la connexion
var nom de la variable qui va stocker l'objet créé lors de la connexion
scope portée de la variable qui va stocker l'objet créé
dataSource nom JNDI de la datasource

Exemple : accéder à une base via ODBC dont le DNS est test
<sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver" url="jdbc:odbc:test" 
user="" password=""/>

 

72.6.2. Le tag query

Ce tag permet de réaliser des requêtes de sélection sur une source de données.

Il possède plusieurs attributs :

Attribut Rôle
sql requête SQL à exécuter
var nom de la variable qui stocke les résultats de l'exécution de la requête
scope portée de la variable qui stocke les résultats
startRow numéro de l'occurrence de départ à traiter
maxRow nombre maximum d'occurrences à stocker
dataSource connexion particulière à la base de données à utiliser

L'attribut sql permet de préciser la requête à exécuter :

Exemple :
<sql:query var="reqPersonnes" sql="SELECT * FROM personnes" />

Le résultat de l'exécution de la requête est stocké dans un objet qui implémente l'interface javax.servlet.jsp.jstl.sql.Result dont le nom est donné grâce à l'attribut var.

L'interface Result possède cinq getters :

Méthode Rôle
String[] getColumnNames() renvoie un tableau de chaines de caractères qui contient le nom des colonnes
int getRowCount() renvoie le nombre d'enregistrements trouvés lors de l'exécution de la requête
Map[] getRows() renvoie le résultat de la requête sous forme d'un tableau de Map. Chaque élément du tableau représente une rangée.
Object[][] getRowsByIndex() renvoie un tableau contenant les colonnes et leurs valeurs
boolean isLimitedByMaxRows() renvoie un booléen qui indique si le résultat de la requête a été limité

Exemple : connaitre le nombre d'occurrence renvoyées par la requête
<p>Nombre d'enregistrements trouvés : <c:out value="${reqPersonnes.rowCount}" /></p>

La requête SQL peut être précisée avec l'attribut sql ou dans le corps du tag :

Exemple :
<sql:query var="reqPersonnes" >
  SELECT * FROM personnes
</sql:query>

Le tag forEach de la bibliothèque Core est particulièrement utile pour itérer sur chaque occurrence retournée par la requête SQL.

Exemple :
<TABLE border="1" CELLPadding="4" cellspacing="0">
  <TR>
    <td>id</td>
    <td>nom</td>
    <td>prenom</td>
  </TR>

  <c:forEach var="row" items="${reqPersonnes.rows}" >
  <TR>
    <td><c:out value="${row.id}" /></td>
    <td><c:out value="${row.nom}" /></td>
    <td><c:out value="${row.prenom}" /></td>
  </TR>
  </c:forEach>
</TABLE>

Il est possible de fournir des valeurs à la requête SQL en remplaçant cette valeur par le caractère ?. Pour fournir la ou les valeurs, il faut utiliser un ou plusieurs tags fils param.

Le tag param possède un seul attribut :

Attribut Rôle
value valeur de l'occurrence correspondante dans la requête SQL

Pour les valeurs de type date, il faut utiliser le tag dateParam.

Le tag dateParam possède plusieurs attributs :

Attribut Rôle
value objet de type java.util.date qui contient la valeur de la date (obligatoire)
type format de la date : TIMESTAMP ou DATE ou TIME

Exemple :
<c:set var="id" value="2" />
 
<sql:query var="reqPersonnes" >
  SELECT * FROM personnes where id = ?
            <sql:param value="${id}" />
</sql:query>

 

72.6.3. Le tag transaction

Ce tag permet d'encapsuler plusieurs requêtes SQL dans une transaction.

Il possède plusieurs attributs :

Attribut Rôle
dataSource connexion particulière à la base de données à utiliser
isolation READCOMMITTED ou READUNCOMMITTED ou REPEATABLEREAD ou SERIALIZABLE

 

72.6.4. Le tag update

Ce tag permet de réaliser une mise à jour grâce à une requête SQL sur la source de données.

Il possède plusieurs attributs :

Attribut Rôle
sql requête SQL à exécuter
var nom de la variable qui stocke le nombre d'occurrences impactées par l'exécution de la requête
scope portée de la variable qui stocke le nombre d'occurrences impactées
dataSource connexion particulière à la base de données à utiliser

Exemple :
<c:set var="id" value="2" />
<c:set var="nouveauNom" value="nom 2 modifié" />

<sql:update var="nbRec">
UPDATE personnes
SET nom = ? 
WHERE id=?
<sql:param value="${nouveauNom}"/>
<sql:param value="${id}"/>
</sql:update>

<p>nb enregistrements modifiés = <c:out value="${nbRec}"/></p>

 


  71. Les JSP (Java Server Pages) 73. Struts Imprimer Sommaire Consulter avec table des matières Développons en Java   v 2.10  
Copyright (C) 1999-2016 .