Java - J2EE Java Server Pages (JSP)

publicité
Java - J2EE
Java Server Pages
(JSP)
Antoine WIDLÖCHER
Master MI3 - M2
Université de Caen
20 mars 2008
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
1
Plan
●
Principes
●
Structure d'une page JSP
●
Eléments de syntaxe
●
éléments de script
●
directives
●
actions
●
Expression Language (EL)
●
Utilisation des beans
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
2
Plan
●
●
Documents JSP (JSPX)
●
syntaxe
●
équivalences JSP/JSPX
Tag librairies
●
Principes
●
JSTL
●
JSTL Core
●
JSTL XML
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
3
Plan
Principes
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
4
Pages JSP
●
●
Objectif
–
une manière « déclarative »
–
pour écrire dynamiquement des servlets
Principes
–
la page JSP définit les éléments de la servlet
–
–
–
le « corps »
la méthode de « service »
à l'aide d'échappements dans du code statique
–
XML, HTML...
–
le container de servlets construit la servlet
–
rendue accessible comme une servlet quelconque
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
5
Principes
Client 1
Page JSP
Client 2
Client 3
Servlet.class
Servlet.java
...
Client n
Servlet
Servlet Container (Tomcat...)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
6
Plan
Structure d'une page JSP
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
7
Page JSP
●
Un page contient
–
du code statique (HTML...)
–
des échappements JSP
–
contenant les indications de construction de la servlet
<html>
<body>
Afficher la valeur paramètre blah:
<%= request.getParameter("blah") %>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
8
Page JSP
●
La page JSP sera convertie en Servlet
–
–
●
Rappel:
●
●
la méthode principale d'une servlet est la méthode
dite « service method » (doPost, doGet...)
cette méthode possède deux arguments:
–
–
●
lors du premier appel
cf. $CATALINA_HOME/work/.../org/apache/jsp
une requête
une réponse
Le contenu statique de la page
●
sera écrit tel quel sur la sortie, par la service method
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
9
Page JSP
●
Différents type d'eléments possibles:
–
les directives
●
–
les éléments de scripts
●
–
relatives au fonctionnement général de la servlet
code java à intégrer au code la servlet
les actions
●
définissent les relations avec les « objets » existants
●
paramètrent le fonctionnement du container
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
10
Plan
Eléments de syntaxe JSP
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
11
Plan
Eléments de script
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
12
Scriptlets
●
Eléments de script
–
dont le contenu est ajouté au corps de la service method
<% duCodeJava %>
<%
String resume = ''Du texte, du texte, du texte, du texte, du texte.''; %>
<html>
<body>
Le résumé:
<%= resume
</body>
%>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
13
Scriptlets
●
Une même bloc d'instructions
–
peut s'étendre sur plusieurs échappements
<html>
<body>
<%
%>
<%
for(int i=0; i<13; i++)
{
<span class=''number''><%= i %></span>
}
%>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
14
Expressions
●
Expressions
–
–
–
dont le contenu est affiché tel quel par la service method
par le biais de son objet Response
après évaluation et appel à toString()
<%= uneExpression %>
<html>
<body>
Un calcul idiot <%= 2 + 2 %>
Sur le serveur, nous sommes le
<%=
java.util.Calendar.getInstance().get(java.util.Calendar.DAY_OF_MONTH)
%>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
15
Implicit objects
●
Scriplets et expressions
–
sont au coeur de la service method
–
et peuvent accéder à un certain nombre de
variables prédéfinies correspondantes:
–
–
–
–
–
–
request (HttpServletRequest)
response (HttpServletResponse)
session (HttpSession)
out (PrintWriter)
application (ServletContext)
...
<body>
<%
%>
</body>
String leParametre = request.getParameter(''leParametre'');
out.println(leParametre);
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
16
Implicit objects
●
Utilisables par exemple pour les sessions
–
–
note: la session est partagée par servlets et JSP
elle est la relation entre l'application web et le client
<html>
<body>
Votre panier:
<%
Panier panier = (Panier)session.getAttribute(''panier'');
if(panier != null)
out.println(panier);
%>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
17
Implicit objects
●
Idem avec le ServletContext
–
–
contexte commun à tous les éléments de l'application web
représenté ici par la variable application
<html>
<body>
Le catalogue:
<%
Catalogue cat = (Catalogue)application.getAttribute(''catalogue'');
if(cat != null)
out.println(cat);
%>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
18
Expression Language (EL)
●
JSP 2.0 introduit un language permettant
–
–
–
–
●
Syntaxe de base:
–
–
●
l'évaluation d'expressions
l'accès simplifié à certaines informations
accessibles en différents lieux (session, contexte...)
en particulier en provenance des beans
${objet.propriété}
${map[élément]} ou ${map.élément}
Utilisable
–
–
dans le contenu statique
dans un attribut de tag autorisant la présence d'une expression
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
19
Expression Language
●
Un ensemble d'objets implicites est défini
–
–
–
–
–
param: Map des paramètres associés à la requête
pageScope: Map des éléments dont la portée est la page
requestScope: dont la portée est la requête
sessionScope: dont la portée est la session
applicationScope: dont la portée est l'application
<html>
<body>
Nom: ${sessionScope.user.name} <br />
Catalog size: <%=((Catalog)application.getAttribute("catalog")).getProductCount() %><br />
Catalog size (bis): ${applicationScope.catalog.discCount}<br />
Paramètre 'leParametre': ${param['leParametre']} <br />
Param 'leParametre': ${param.leParametre} <br />
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
20
Exemples d'expression
${param['leParametre']}
la valeur du paramètre
${param.leParametre}
la valeur du paramètre
${empty param.leParametre}
true si le paramètre vaut null ou chaîne vide
${4 > 3}
true
${param.leParametre > 3}
true si la valeur du paramètre > 3
${monBean.laPropriété}
la valeur de la propriété du bean (cf. ci-après)
${sessionScope.objet.laPropriété}
la valeur de la propriété de l'objet présent dans la session
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
21
Déclarations
●
Déclarations
–
–
dont le contenu est ajouté au corps de la servlet elle-même
peut être une méthode
●
en particulier jspInit() qui correspond au init() de la servlet
<%! duCodeJava %>
<%! int nombreDeVisiteurs = 0; %>
<% nombreDeVisiteurs++; %>
<html>
<body>
Vous êtes le <%= nombreDeVisiteurs %> ème visiteur.
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
22
Plan
Directives
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
23
Directives relatives à la page
●
Directives de configuration relatives à la page
<%@page attribut= ''valeur'' %>
●
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<body>
Blah blah blah blah.
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
où attribut peut être également:
–
import= ''java.util.*''
–
extends=''package.laclasse''
–
session=''true/false''
–
contentType=''text/html''
–
pageEncoding=''UTF-8''
–
...
24
Directives d'inclusion
●
Directives d'inclusion
–
à la compilation
–
et non lors de l'invocation de la servlet
<%@include file=''url'' %>
html/head.inc.html
<html>
<%@include file="html/head.inc.html" %>
<body>
Blah blah blah blah blah
</body>
<head>
<title>Test divers</title>
</head>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
25
Plan
Actions
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
26
Action d'inclusion
●
Action d'inclusion
●
parfois limitée à JSP et HTML (selon la configuration)
●
lors de l'exécution
●
et non lors de la compilation
<jsp:include page=''chemin'' />
html/head.inc.html
<html>
<jsp:include page="html/head.inc.html" />
<body>
Blah blah blah blah blah
</body>
<head>
<title>Test divers</title>
</head>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
27
Action de redirection
●
Rediriger une requête vers une autre page
–
par exemple à l'issue d'un traitement
<jsp:forward page=''chemin'' />
<%-- un traitement quelconque --%>
<jsp:forward page=''index.jsp'' />
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
28
Action de redirection
●
●
Lors d'un forward
●
l'objet ''Request'' est transmis
●
les paramètres reçus le sont donc également
Il est possible d'ajouter des paramètres
<%-- un traitement quelconque --%>
<jsp:forward page=''index.jsp''>
<jsp:param name="leParametre" value="saValeur" />
</jsp:forward>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
29
Actions relatives aux Beans
●
●
Pour la maniulation des Java Beans
–
jsp:useBean
–
jsp:setProperty
–
jsp:getProperty
Cf. ci-après
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
30
Plan
Autres...
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
31
Commentaires
●
Ne pas confondre
–
–
les commentaires JSP, du même niveau que les échappements
les commentaires Java, à l'intérieur des échappements
<%-- le commentaire JSP --%>
<%
%>
// le commentaire Java
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
32
Plan
Java Beans
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
33
Rappels sur les Java Beans
●
Un Java Bean est un objet quelconque
–
disposant d'un constructeur par défaut
–
d'accesseurs bien formés pour ses propriétés
●
pour une propriété X de type XType
–
–
–
●
(le nom de l'attribut est indifférent)
void setX(XType x)
XType getX()
Il est ainsi possible
–
de connaître les propriétés des objets
–
par introspection
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
34
Beans et JSP
●
L'utilisation des Beans avec JSP
–
permet d'automatiser la mise en relation entre
–
–
–
i.e. entre
–
–
–
un objet
un formulaire
les valeurs des paramètres des champs du formulaire
les propriétés des objets
et de manipuler simplement
–
–
de tels objets
et leurs propriétés
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
35
Accès à un bean
●
Pour accéder à un bean
–
on utilise l'action jsp:useBean
–
en précisant entre autres
–
–
–
sa classe
un identifiant utilisable par la suite
une portée (scope) pouvant être entre autres
●
page
●
session
●
application
<jsp:useBean id=''nomDuBean'' scope=''page'' class=''nomcomplet.du.bean'' />
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
36
Accès à un bean
●
La portée définit
–
–
–
●
S'il n'existe aucun bean
–
–
–
●
la visibilité du bean
sa durée de vie
potentiellement au-delà de la page
de même id
de même portée
il est instancié au besoin
Sinon
–
–
on utilise le bean existant
ce qui permet le partage d'un même bean dans l'application
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
37
Accès aux propriétés
●
Pour accéder aux propriétés du bean
–
on utilise les actions
●
jsp:setProperty
●
jsp:getProperty
<jsp:setProperty name=''nomDuBean'' property=''prop'' value=''val'' />
<jsp:setProperty name=''nomDuBean'' property=''prop'' param=''fromRequest'' />
<jsp:setProperty name=''nomDuBean'' property=''*'' />
<jsp:getProperty name="nomDuBean" property="nomDeLaPropriété" />
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
38
Accès aux propriétés
●
Récupération des données de formulaire
–
soit manuellement
●
on définit le mapping à la main entre
–
–
–
nom de propriétés
et paramètres
soit automatiquement
–
les noms doivent correspondre
processForm.jsp
<jsp:useBean id="user" ... />
<form action='processForm.jsp'>
Nom: <input type="text" name="name" />
<input type="submit" name="valider" />
</form>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
<jsp:setProperty name="user"
property="name"
param="name" />
<jsp:setProperty name="user"
property="*" />
39
Accès au propriétés
●
Pour récupérer la valeur d'une propriété
●
il suffit de préciser
–
–
le nom du bean
le nom de la propriété
<html>
<body>
<jsp:useBean id="user" scope="session" class="fr.unicaen.mi3.UserBean"/>
<jsp:setProperty name="user" property="name" value="jean" />
nom: <jsp:getProperty name="user" property="name" />
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
40
Accès au bean
●
Il est également possible
–
d'accéder directement au bean
–
en y faisant simplement référence
–
par le nom donné
–
par l'attribut ''id'' de l'action jsp:useBean
<html>
<body>
<jsp:useBean id="user" scope="session" class="fr.unicaen.mi3.UserBean"/>
<jsp:setProperty name="user" property="name" value="jean" />
nom: <%=user.getName()%>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
41
Plan
JSP Documents
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
42
JSP Documents
●
Un JSP Document
–
est une page JSP
–
écrite en respectant la syntaxe XML
–
–
i.e. devant être bien formé
●
pas de chevauchement
●
une racine unique ...
–
utilisant les tags JSP correspondant aux différents éléments
dont l'extension est .jspx
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
43
Equivalences
<%-- comment --%>
<!-- comment -->
<%= expression --%>
<jsp:expression> declaration </jsp:expression>
<%! declaration --%>
<jsp:declaration> declaration </jsp:declaration>
<% scriptlet --%>
<jsp:scriptlet> declaration </jsp:scriptlet>
<%@ page directive --%>
<jsp:directive.page ... />
<%@ include directive --%>
<jsp:directive.include ... />
<%@ taglib directive --%>
xmlns:préfixe=''url''
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
44
Exemple
<html xmlns:c="http://java.sun.com/jsp/jstl/core" >
<head>...</head>
<body>
<form method="get">
<input type="text" name="username" />
<input type="submit" value="Submit" />
</form>
<jsp:useBean id="userBean"
class="fr.unicaen.mi3.UserBean"
scope="session"/>
<jsp:setProperty name="userNameBean"
property="name"
value="${param.username}" />
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
45
JSP Documents
●
On peut « produire » le XML de sortie
–
–
à l'aide d'un ensemble d'éléments JSP
●
jsp:element
●
jsp:attribute
●
jsp:body
●
jsp:text
et éventuellement
●
produire dynamiquement les « noms » des objets
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
46
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/xml;charset=UTF-8"/>
<jsp:element name="html">
<jsp:body>
<jsp:element name="body">
<jsp:body>
<jsp:element name="div">
<jsp:attribute name="class">maDiv</jsp:attribute>
<jsp:body>
Le contenu
</jsp:body>
</jsp:element>
</jsp:body>
</jsp:element>
</jsp:body>
</jsp:element>
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
47
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/xml;charset=UTF-8"/>
<jsp:element name="${param.rootName}">
<jsp:body>
<jsp:element name="body">
<jsp:body>
<jsp:element name="div">
<jsp:attribute name="class">maDiv</jsp:attribute>
<jsp:body>
Le contenu
</jsp:body>
</jsp:element>
</jsp:body>
</jsp:element>
</jsp:body>
</jsp:element>
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
48
Plan
Tag Libraries
Java Server Pages Standard Tag Library (JSTL)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
49
TagLib
●
●
●
Une TagLib
●
est un ensemble de tags
●
permettant d'encapsuler certaines tâches redondantes
Provenance
●
on peut développer ses propres custom tags
●
utiliser des librairies fournies par des tiers
●
utiliser la librairie standard JSTL
Pour utiliser une taglib, on doit
●
déclarer cette lib
●
s'assurer qu'une implémentation est disponible
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
50
JSTL
●
La JavaServer Pages Standard Tag Library
●
offre un ensemble de fonctionnalités standard pour
–
–
–
–
–
●
la manipulation d'iterations
de traitements conditionnels
la manipulation de documents XML
l'accès SQL à des SGBD
...
Pour pouvoir les utiliser
●
l'application web doit disposer d'une
implémentation de cette librairie standard
●
●
soit pour elle seule
soir pour le serveur d'application dans son ensemble
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
51
Mise en oeuvre
●
choix d'une implémentation:
–
–
●
pour l'utiliser localement
–
–
–
●
http://jakarta.apache.org/taglibs/index.html
version 1.1.2
ie pour notre application web
on place les jar
●
jstl.jar
●
standard.jar
dans WEB-INF/lib/
dans les pages JSP concernées
–
–
on déclare les libs à utiliser
avec: xmlns:prefixe=''URI de la lib''
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
52
URIs
●
Core:
–
●
XML:
–
●
http://java.sun.com/jsp/jstl/fmt
SQL:
–
●
http://java.sun.com/jsp/jstl/xml
Internationalization:
–
●
http://java.sun.com/jsp/jstl/core
http://java.sun.com/jsp/jstl/sql
Functions:
–
http://java.sun.com/jsp/jstl/functions
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
53
Plan
JSTL: Core (quelques tags)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
54
Variables
●
le tag set permet
–
–
de donner une valeur
●
à une variable EL
●
à une proriété d'une variable EL
en précisant sa portée
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<c:set var=''userName'' scope=''session'' value=''jean'' />
<body>
${userName}
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
55
Variables
●
pour pouvoir accéder à une variable EL
–
–
–
depuis un élément de script
on doit utiliser l'élément jsp:useBean
pour déclarer une variable de script équivalente
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<c:set var=''userName'' scope=''session'' value=''jean'' />
<body>
${userName}
<jsp:useBean id="userName" scope="session" type="java.lang.String" />
<jsp:scriptlet>
out.println(userName);
</jsp:scriptlet>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
56
Traitements conditionnels
●
Le tag if
–
permet un traitement conditionnel
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<body>
<c:if test="${!empty param.afficheBonjourLeMonde}">
Bonjour le monde !
valeur du param: ${param.afficheBonjourLeMonde}
</c:if>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
57
Traitements conditionnels
●
les tag choose, when et otherwise
–
permettent un switch
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<body>
<c:choose>
<c:when test="${param.prenom == 'jean'}" >
Salut.
</c:when>
<c:when test="${param.prenom == 'john'}" >
Hello.
</c:when>
<c:otherwise>
Bonjour.
</c:otherwise>
</c:choose>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
58
Iterations
●
Le tag foreach
–
permet d'itérer sur des collections
–
–
–
–
–
–
Collection
Map (chaque item est alors un couple key/value)
Iterator (peu recommandé car pas de reset)
Enumeration (peu recommandé car pas de reset)
tableaux
String du type ''a,b,c,d,e''
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<body>
<c:forEach var="disc" items="${applicationScope.catalog.discs}">
${disc} <br />
${disc.title} <br />
</c:forEach>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
59
URL
●
le tag import
–
permet de récupérer une ressource
–
désignée par son URL
–
et éventuellement un ensemble de paramètres
–
précisés à l'aide du sous-tag
<prefixe:param name=''nom'' value=''valeur''/>
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
<body>
<c:import url="/config/menu.xml" var="xml" />
<!-- on pourra par exemple parser la ressource -->
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
60
Plan
JSTL: XML (quelques tags)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
61
JSTL: XML
●
La taglib XML
–
–
–
–
●
permet de manipuler des ressources XML
d'accéder à leur contenu
à l'aide d'expressions XPath
d'opérer certaines transformations
Les expressions XPath
–
–
sont localisées dans les attributs ''select''
et peuvent accéder à certaines informations de l'application:
●
$uneVariable
●
$param:
●
$pageScope:
●
$sessionScope:
●
$applicationScope:
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
62
Expressions XPath
●
Exemples d'expressions XPath
–
intégrant l'accès à des données de l'application web
$unNoeudXML/fils
$unNoeudXML/fils[@id='1']
$applicationScope:uneRessourceXML/racine/fils
$applicationScope:uneRessourceXML/racine/fils[id=$param:filsId]
$applicationScope:uneRessourceXML/racine/fils[id=$pageScope:objet.propriété]
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
63
Exemple de fichier XML
●
Pour la suite
–
on utilise un fichier XML de la forme suivante
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<item id="1">
<name>Catégorie 1</name>
<url>urlCatégorie1</url>
</item>
<item id="2">
<name>Catégorie 2</name>
<url>urlCatégorie2</url>
</item>
</menu>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
64
Parser un document XML
●
le tag parse
●
permet de parser un document xml
●
importé à l'aide du JSTL core tag import
●
placé dans une variable dont la portée est indiquée
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:x="http://java.sun.com/jsp/jstl/xml">
<body>
<c:import url="/config/menu.xml" var="xmlFile" />
<x:parse doc="${xmlFile}" var="menu" scope="application" />
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
65
Accéder au contenu
●
Les tags set et out
–
–
permettent de récupérer des éléments du contenu XML
de les afficher
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:x="http://java.sun.com/jsp/jstl/xml">
<body>
<c:import url="/config/menu.xml" var="xmlFile" />
<x:parse doc="${xmlFile}" var="menu" scope="application" />
<x:set var="firstItem" select="$applicationScope:menu/menu/item[@id=1]" />
FirstItem Name: <x:out select="$firstItem/name" />
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
66
Itération
●
Le tag forEach (de cette librairie)
–
–
permet d'itérer sur certains éléments XML
vérifiant un pattern donné par une expression XPath
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:x="http://java.sun.com/jsp/jstl/xml">
<body>
<c:if test="${applicationScope.menu == null}">
<c:import url="/config/menu.xml" var="xmlFile"/>
<x:parse doc="${xmlFile}" var="menu" scope="application" />
</c:if>
<x:forEach var="item" select="$applicationScope:menu/menu/item">
Nom de l'item: <x:out select="$item/name" />
Url de l'item: <x:out select="$item/url" />
</x:forEach>
</body>
</html>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
67
Plan
JSTL: FMT (quelques tags)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
68
JSTL: FMT
●
La taglib FMT
–
–
–
–
●
simplifie l'internationalisation des applications
la localisation et le formatage (fmt) des données
à la lumière de ResourceBundles
d'une Locale
Principe
●
le ResourceBundle
–
–
●
la Locale
–
●
définit un ensemble de « clefs » de messages
et différentes valeurs de ces messages en fonction des
langues et des pays
précise la langue attendue par l'utilisateur
les pages JSP
–
ne font référence qu'à des clefs
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
69
ResourceBundle
●
Le ResourceBundle
–
–
●
désigne un ensemble de fichiers *.properties
contenant les messages internationalisés
Chaque fichier
–
–
–
–
contient les messages liés à une langue (et un code de pays)
la langue et le code pays sont précisés par le nom
selon le schéma: MyMessages_langue_PAYS.properties
par ex:
●
MyMessages_en.properties
●
MyMessages_fr_CA.properties (français du Canada)
●
MyMessages_fr_FR.properties
Messages_en.properties
# home page
home.title=Welcome
home.links.search=Search
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
Messages_fr_FR.properties
# home page
home.title=Bienvenue
home.links.search=Rechercher
70
Utilisation
●
le ResourceBundle (ie les différents fichiers *.properties)
●
sont présents dans le classpath
–
●
on précise la Locale souhaitée
–
–
●
localement (page, session...) ou pour l'ensemble de l'applic°
par défaut la Locale demandée par le client web sera utilisée
on précise quel ResourceBundle on souhaite utiliser
–
●
Rq: ne pas oublier de les placer dans le WAR
localement (page, session...) ou pour l'ensemble de l'applic°
on fait appel aux clefs des messages qu'on souhaite
afficher à l'aide des tags dédiés
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
71
Utilisation
–
<fmt:setLocale> permet de préciser la locale
–
<fmt:setBundle> permet de préciser le bundle
–
<fmt:message> permet d'afficher un message
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<fmt:setLocale value="fr_FR" scope="session" />
<fmt:setBundle basename="fr.unicaen.mi3.bookstore.UI" />
<html>
<head><title><fmt:message key="home.title" /></title></head>
...
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
72
web.xml
●
on peut préciser locale et bundle
–
–
–
globalement pour l'ensemble de l'application
via le web.xml
valeurs qui pourront être différentes localement
<!-- RessourceBundle utilisé -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>fr.unicaen.mi3.bookstore.UI</param-value>
</context-param>
<!-- Locale (si celle demandée par le browser n'est pas supportée)-->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
<!-- Locale fixée quelle que soit la demande du browser -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en</param-value>
</context-param>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
73
Passages de paramètres
●
Les messages du bundle
–
–
peuvent être « paramétrés » en fonction du contexte
au moment de leur invocation
Messages_fr_FR.properties
# home page
home.welcome=Bienvenue Mr {0}. Votre email est: {1}
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<html>
<body>
<fmt:message key="home.welcome">
<fmt:param value="${sessionScope.user.name}"/>
<fmt:param value="${sessionScope.user.email}"/>
</fmt:message>
</body>
</html>
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
74
Dates
●
La taglib FMT
–
–
–
●
prend par ailleurs en charge le formatage des dates
en fonct° des conventions propres à chaque langue/pays
en fonction d'un fuseau horaire particulier
Principe
●
on définit une java.util.TimeZone
–
●
on récupère un objet java.util.Date
–
●
ex: GMT+2, Europe/Paris
éventuellement en parsant une chaîne représentant cette
date et en précisant le motif de cette représentation
on affiche les éléments de la date
–
–
en tenant compte de la TimeZone
et de la Locale
●
ex: 1 mai 2007 (fr) / May 1, 2007 (en)
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
75
Détermination de la TimeZone
●
La java.util.TimeZone peut être définie
–
–
–
●
globalement dans le web.xml
localement, en précisant une portée (scope)
localement, pour un ensemble donné d'instructions
Dans le web.xml
<!-- TimeZone -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.timeZone</param-name>
<param-value>GMT</param-value>
<!-- <param-value>Europe/Paris</param-value> -->
</context-param>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
76
Détermination de la TimeZone
●
Localement en spécifiant une portée
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<fmt:setTimeZone value="Europe/Paris" scope="session" />
<!-- affichage des données de dates, etc. -->
</jsp:root>
●
Localement pour un jeu d'instructions
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<fmt:timeZone value="GMT">
<!-- affichage des données de dates, etc. -->
</fmt:timeZone>
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
77
Récupération de la date
●
On peut utiliser directement java.util.Date
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<jsp:useBean id="now" class="java.util.Date" />
<!-- affichage des données de dates, etc. -->
</jsp:root>
●
ou parser une chaîne de caractères
–
motif exprimé dans la syntaxe java.text.SimpleDateFormat
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<fmt:parseDate value="01/05/2007" pattern="dd/MM/yyyy" var="now"/>
<!-- affichage des données de dates, etc. -->
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
78
Affichage de la date
●
le tag <fmt:formatDate> permet
–
–
–
–
d'afficher une date
ou de la stocker dans une variable
en précisant le éléments de la date devant être affichés
●
date, heure, date et heure (type=[date | time | both])
les styles d'affichage de la date et de l'heure
●
[timeStyle|dateStyle]=[default|short|medium|long|full])
●
dont le résultat dépend de la locale
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
...
<fmt:formatDate type="both" value="${now}" dateStyle="full" timeStyle="full"/>
</jsp:root>
WIDLOCHER Antoine – GREYC – CNRS UMR 6072
79
Téléchargement