JSP - Greyc
Transcription
JSP - Greyc
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