Développons en Java v 2.40 Copyright (C) 1999-2023 Jean-Michel DOUDOUX. |
|||||||
Niveau : | 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 : https://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 :
https://jcp.org/aboutJava/communityprocess/final/jsr052/
Ce chapitre contient plusieurs sections :
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.
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
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" %>
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>
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 (< > & ; ...) |
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}"/>" />
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" />
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 <parseNumber>, 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.
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
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>
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
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.
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/>
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>
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"/>"/>
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" %>
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.
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>
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>
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 |
Ce tag est équivalent au tag choose de la bibliothèque Core sauf qu'il évalue des expressions XPath
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"/>
<x:out select="$unepersonne/prenom"/> <br>
</x:forEach>
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.
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». .
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>
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"/>
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???
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
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"/>
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"/>
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"/>.
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 |
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 |
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 |
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" %>
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=""/>
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>
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 |
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>
Développons en Java v 2.40 Copyright (C) 1999-2023 Jean-Michel DOUDOUX. |