Applications Web Servlets, JSP Cours IHM Frédéric MOAL Université d’Orléans Master 1ère année année 2012/2013 1 Plan Introduction et rappels Applications Web – – – – Scripts cgi Servlets JSP Tag lib 2 1 Ressources Documentation Apache : http://tomcat.apache.org/ dans la version des servlets/de tomcat utilisé Introduction Le site officiel de Oracle/Sun Livres http://java.sun.com « Java - la synthèse », 4ème édition, Clavel… « Penser en Java vX», http://penserenjava.free.fr/ « Cours » en ligne: Richard GRIN, Université de Nice http://deptinfo.unice.fr/~grin/messupports/index.html Jean Michel DOUDOUX - "Développons en Java" (1000 pages) http://www.jmdoudoux.fr/ !! http://www.developpez.com, l'onglet java !! Blogs : Xebia, Ippon tech., SQLI, Le touilleur express, Java Posse, Bistro!, ... 3 Rappels Java (2, 5, 6 et 7) Html Eclipse Gestion de version (Subversion) … => Cf ressources et web 4 2 Plan Introduction Applications Web – – – – Scripts cgi Servlets JSP Tag lib 5 Applications Web Protocole http : pages web statiques .html stockées sur le disque du serveur Client http Envoi d’une commande get "/…/info.html" Serveur http Contenu du fichier /…/info.html 6 3 Pages dynamiques par script CGI Formulaire html : submit Les paramètres saisis dans le formulaire sont transmis au script Le script récupère les paramètres, effectue son traitement, et génère (imprime) la page html résultat 7 Pages dynamiques par script CGI Exemple simple avec un formulaire <html> <head> <title>Mon formulaire</title> </head> <body> <h1>Titre de page</h1> <form method="get" action="cgi-bin/Enreg"> Nom : <input type="text" name="nom"> <input type="submit" value="OK"> </form> </body> </html> 8 4 Pages dynamiques par script CGI 9 Servlets alternative de la technologie Java à la programmation avec CGI Il s'agit de programmes exécutés sur un serveur Web servent de couche intermédiaire entre une requête provenant d'un navigateur Web et un autre service HTTP, comme des bases de données ou des applications du serveur HTTP 10 5 Servlets Technologie Servlets – indépendant / OS et serveurs Web – peut produire du HTML coté serveur sur une base HTTP – mieux que CGI car prise en charge connexion des utilisateurs en multithread – peut dialoguer avec applets coté client via RMI 11 Servlets Différences Servlets / scripts CGI – Performances • une seule machine virtuelle Java sur le serveur • servlet reste placée en mémoire une fois appelée • servlet modifiée peut être réactivée sans redémarrage serveur ou application – Modularité • possibilité d’avoir plusieurs servlets, chacune pouvant accomplir une tâche spécifique 12 6 Servlets Architecture : 13 Servlets Tâches de la servlet : 1. 2. 3. 4. 5. 6. Lire toutes les données envoyées par l'utilisateur (d’un formulaire, d'une applet Java ou d'un prog. client HTTP) Chercher d'autres informations sur la requête, à l'intérieur de la requête HTTP (cookies, nom de l'hôte, …, etc. ) Générer des résultats (calculs, communication avec la base de données, …) Formater le résultat dans un document (incorporation des informations dans une page HTML) Définir les paramètres de la réponse HTTP appropriés (type de document, définir les cookies, mémoriser les paramètres… Renvoyer le document au client (au format texte (HTML), au format binaire (images GIF), ou dans un format compressé comme gzip 14 7 Servlets L ’API pour les servlets constituée de deux packages : – javax.servlet – javax.servlet.http – Librairie Servlet avec chaque serveur d’application Java <<interface>> Servlet GenericServlet <<interface>> ServletRequest <<interface>> ServletResponse HttpServlet <<interface>> HttpServletRequest <<interface>> HttpServletResponse MaServlet 15 Servlets : traitements Plusieurs méthodes sont fournies pour traiter les différents types de requêtes (GET, POST, …). Elles sont appelées méthodes de traitement de requêtes Elles ont un en-tête identique doXXX(…) où XXX correspond au type de requête doPost(…) est la méthode pour traiter les requêtes de type POST doGet(…) est la méthode pour traiter les requêtes de type GET doHead(…), doTrace(…), … Selon le type de requête (GET ou POST) le concepteur redéfinit la méthode concernée 16 8 Servlets : exemples Deux exemples simples pour illustrer l’écriture et le fonctionnement des servlets : – Sans paramètre – Avec des paramètres provenant de la saisie dans un formulaire html 17 Exemple simple de servlet import import import import import import java.io.IOException; Import des classes java.io.PrintWriter; de servlets javax.servlet.ServletException; javax.servlet.http.HttpServlet; Redéfinition javax.servlet.http.HttpServletRequest; de doGet(…) javax.servlet.http.HttpServletResponse; public class Premiere extends HttpServlet { Hérite de HttpServlet Request et Response : contexte d’appel et de retour protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Propagation des response.setContentType("text/html"); exceptions PrintWriter out = response.getWriter(); Réponse en out.println("<HTML>"); html out.println("<HEAD><TITLE>Première servlet</TITLE></HEAD>"); out.println("<BODY><H1>Ma première servlet</H1></BODY>"); URL d’accès out.println("</HTML>"); à la servlet } } Le code html renvoyé 18 9 Servlets Deuxième exemple : enchainement d’un formulaire html qui appelle une servlet en cas de validation (<form>) Page html [formulaire.html] -> Servlet [TraiteFormulaire.java] 19 Servlets Servlet TraiteFormulaire.java 20 10 Servlet : exemple de formulaire <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Un formulaire de saisie</title> </head> <body> <form method="get" action="TraiteFormulaire"> Titre : <select name="titre"> <option>Mr</option><option>Mme</option> </select><br> Prénom : <input name="prenom"><br> Nom : <input name="nom"><br> Mot de passe : <input name="motdepasse" type="password"><br> <input type="submit"><input type="reset"> </form> </body> </html> 21 Servlet : traitement du formulaire public class TraiteFormulaire extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>Deuxième servlet</TITLE></HEAD>"); out.println("<BODY><H1>Bonjour "); String titre = request.getParameter("titre"); if (titre.equals("Mr")) { out.println("monsieur "); } else if (titre.equals("Mme")) { out.println("madame "); } else throw new RuntimeException("Mauvais titre"); out.println(request.getParameter("nom")+",<br>"); String motdepasse = request.getParameter("motdepasse"); out.println("Votre mot de passe comprend "+motdepasse.length()+ " caractères."); out.println("</H1></BODY>"); out.println("</HTML>"); } } 22 11 Servlet : flux « binaire » 23 Servlets : contexte Request HttpServletRequest hérite de ServletRequest Cet objet encapsule la requête HTTP et fournit des méthodes pour accéder aux informations – du client – de l'environnement du serveur Exemples de méthodes String getMethod() : retourne le type de requête String getServerName() : retourne le nom du serveur String getParameter(String name) : retourne la valeur d'un paramètre String[ ] getParameterNames() : retourne le nom des les paramètres String getRemoteHost() : retourne l'IP du client String getServerPort() : retourne le port sur lequel le serveur écoute String getQueryString() : retourne la chaîne d’interrogation … (voir l'API Servlets pour le reste) 24 12 Servlets : exemple de contexte 25 Servlet : contexte Response HttpServletResponse hérite de ServletResponse Cet objet est utilisé pour construire un message de réponse HTTP renvoyé au client, il contient – les méthodes nécessaires pour définir le type de contenu, en-tête et code de retour – un flot de sortie pour envoyer des données (par exemple HTML) au client Exemples de méthodes – void setStatus(int) : définit le code de retour de la réponse – void setContentType(String) : définit le type de contenu MIME – ServletOutputStream getOutputStream() : flot pour envoyer des données binaires au client – void sendRedirect(String) : redirige le navigateur vers l'URL 26 13 Conteneur de Servlets Une application WEB peut contenir plusieurs Servlets Pour tester et déployer une Servlet, il faut un système d'exécution appelé conteneur de Servlets Le conteneur réalise le lien entre la Servlet et le serveur WEB – Transforme code Java (bytecode) en HTML – Associe à des URL's virtuels une Servlet 27 Conteneur de Servlets Une application WEB est contenue dans un répertoire physique sur le serveur, ou dans un WAR Une application WEB possède une hiérarchie de répertoires et de fichiers 28 14 Fichier de déploiement Le fichier web.xml (WebContent/WEB-INF) contient la description de toutes les servlets et JSP à déployer Il définit les URLs d’accès à ces éléments (mapping) Généré automatiquement (Eclipse…) ou défini « à la main » 29 Web.xml : exemple 30 15 Web.xml : exemple 31 Chemins virtuels 32 16 Déploiement : alternative Depuis la spécification des Servlets 3.0, possibilité de ne pas avoir de fichier web.xml [Tomcat 7] Utilisation d’annotations directement dans le code Exemples : URL de mapping @WebServlet("/TraiteFormulaire") @WebServlet(name="simpleservlet", urlPatterns={"/myservlet", "/simpleservlet"}) public class SimpleServlet { ... } 33 Servlet : cycle de vie Entre chaque requête du client les Servlets persistent sous forme d’instances d’objet Au moment où le code d’une Servlet est chargé, le serveur ne crée qu’une seule instance de classe L’instance (unique) traite chaque requête effectuée sur la Servlet Les avantages (rappels) – L’empreinte mémoire reste petite – Le surcoût en temps lié à la création d’un nouvel objet pour la Servlet est éliminé – La persistance est possible c’est-à-dire la possibilité de conserver l’état de l’objet à chaque requête (un exemple le compteur) 34 17 Servlet : cycle de vie A chaque rechargement d’une Servlet par le conteneur de Servlet, il y a création d’une nouvelle instance et donc destruction de l’ancienne Le rechargement d’une Servlet a lieu quand il y a : – Modification d’au moins une classe de l’application WEB – Demande explicite de l’administrateur du serveur WEB – Redémarrage du conteneur de Servlets CF problèmes en TP !!! 35 Servlet : cycle de vie Un constat : il n’y a pas de constructeur dans une Servlet L’initialisation des attributs se fait par l’intermédiaire de la méthode init() – Elle ne possède pas de paramètre – Définie et implémentée dans la classe abstraite GenericServlet La méthode init() peut être appelée à différents moments – Lorsque le conteneur de Servlets démarre – Lors de la première requête à la Servlet – Sur demande explicite de l’administrateur du serveur WEB 36 18 Servlet : cycle de vie Possibilité d’utiliser des paramètres d’initialisation exploités exclusivement par la méthode init() Les paramètres d’initialisation sont définis dans le fichier web.xml de l’application WEB 37 Servlet : cycle de vie Une Servlet doit libérer toutes les ressources qu’elle a acquises et qui ne pourront être passées au ramasse-miettes Exemples de ressources – Connexion à une base de données – Ouverture d’un fichier sur le disque serveur La méthode destroy() donne une dernière chance d’écrire les informations qui ne sont pas encore sauvegardées La méthode destroy() est également utilisées pour écrire les informations persistantes qui seront lues lors du prochain appel à init() 38 19 Servlets : deploiement Eclipse Utilisation sous Eclipse : plugin WTP 39 Servlets Limitations importante des servlets MAINTENANCE DES PAGES ! Par exemple pour un graphiste… => Introduction des JSP 40 20 JSP Séparation contenu statique/dynamique Manipulation des composants JavaBeans Extension standard aux Servlets Portabilité Equivalent JAVA de ASP (Application Server Pages de Microsoft) et de PHP 41 Fonctionnement 42 21 Tags JSP Trois types de tags <%@ … %> – Tags de directives – contrôlent la structure de la servlet générée <% … %> – Tags de scripting – insertion de code java dans la servlet <jsp:… > – Tags d’actions – facilitent l’utilisation de composants 43 Les directives Syntaxe : <%@directive attribut="valeur" …> Permettent de spécifier des informations globales sur la page 3 types de directives – page options de configuration de la page – include inclusions de fichiers statiques – taglib pour définir des tags d’actions personnalisées 44 22 La directive Page Principaux attributs de la directive page <%@page import="java.util.*,java.sql.Connection" %> <%@page contentType="text/html;charset=ISO-8859-1" %> <%@page session="true|false" %> Indique si la page est incluse ou non dans une session. Par défaut true, ce qui permet d’utiliser un objet de type HttpSession pour gérer des données de session <%@page errorPage="relativeURL" %> Précise la JSP appelée au cas où une exception est levée , URL relative par rapport au répertoire qui contient la page JSP ou relative par rapport au contexte de l’application Web si elle débute par / <%@page isErrorPage=" true|false" %> Précise si la page JSP est une page de gestion d’erreur (dans ce cas l’objet exception peut être utilisée dans la page), false par défaut. <%@page isThreadSafe=" true|false" %> Précise si la servlet générée est multithreadée ou non. … 45 La directive include Syntaxe : <%@include file="chemin relatif du fichier" %> – chemin relatif par rapport au répertoire qui contient la page JSP ou relatif par rapport au contexte de l’application Web si il débute par / Inclus le fichier dans le source JSP avant que celui-ci ne soit interprété (traduit en servlet) par le moteur JSP Le fichier peut être un fragment de code JSP, HTML ou Java Tag utile pour insérer un élément commun à plusieurs pages (en-tête, pied de page) Insertion à la compilation et non pas à l’exécution un changement du fichier inclus ne provoque pas une régénération de la servlet 46 23 Tags de scripting Permettent d’insérer du code Java qui sera inclus dans la servlet générée Trois formes de tags – <%! …%> tag de déclaration Code inclus dans le corps de la servlet (déclaration de membres, variables ou méthodes) – <%=expression%> tag d’expression L’évaluation de l’expression est insérée dans le flot de sortie dans la méthode service() de la servlet <==> out.println(expression) – <%...%> tag de scriptlet Le code Java est inclus dans la méthode service() de la servlet 47 Variables implicites Les spécifications des JSP définissent plusieurs objets implicite utilisables directement dans le code Java out : javax.servlet.jsp.JspWriter Flux en sortie de la page HTML générée request : javax.servlet.http.HttpServletRequest Contient les informations de la requête response : javax.servlet.http.HttpServletResponse Contient les informations de la réponse session : javax.servlet.http.HttpSession Gère la session Exception : java.lang.Throwable L'objet exception pour une page d'erreur 48 24 Exemple de page JSP <%@ page language="java" contentType="text/html; charset=ISO8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>JSP with the current date</title> </head> <body> <%java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy"); %> <h1>Current Date: <%= df.format(new java.util.Date()) %> </h1> </body> </html> 49 Exemple de page JSP Résultat 50 25 Tags de scripting Exemple de page JSP avec formulaire 51 Tags de scripting Exemple de page JSP avec formulaire 52 26 Commentaires <!-- ... --> – Commentaires HTML – Intégralement reconduits dans le fichier HTML généré <%-- ... --%> – Commentaires cachés – Contenu ignoré par le moteur JSP 53 Gestion des erreurs Si une exception est levée dans une page JSP et n'est pas capturée – Si pas de page d'erreur associée à la JSP : affichage de la pile d'exécution 54 27 Gestion des erreurs Si une exception est levée dans une page JSP et n'est pas capturée – Si une page d'erreur est associée : redirection vers cette page 55 JSP et Java Beans Un des objectif des JSP / Servlets : ne pas mélanger du code HTML au code Java des Servlets D’un autre coté si c’est pour mettre du code Java dans le code JSP qu’est ce qu’on y gagne ? Un point important dans la conception de pages JSP est de minimiser le code Java embarqué dans les pages 56 28 JSP et Java Beans Idée : déporter la logique métier dans des composants objets qui seront accédés depuis les pages JSP – Simplification des traitements inclus dans la JSP – Possibilité de réutilisation des composants depuis d’autres JSP ou d’autres composants Les spécifications JSP définissent une manière standard d’intérargir avec des composants Java Beans 57 Java Bean Un composant Java Bean c’est AU MOINS : Classe publique Possède un constructeur public sans arguments Regroupe un ensemble de propriétés – accessibles par des méthode de la forme getXXX() où XXX est le nom de la propriété – éventuellement modifiables par une méthode setXXX() où XXX est le nom de la propriété Implémente (en option) l’interface java.io.Serializable 58 29 Java Bean : exemple public class Personne { private String nom; private String prenom; private int age; public Personne() { // instanciation par défaut this.nom = "X"; this.prenom = "x"; this.age = 0; } public String getNom() { return (this.nom); } public void setNom(String nom) { this.nom = nom; } ... public int getAge () { return (this.ge); } public void setAge(int age) { this.age = age; } } 59 Utiliser un Bean dans les JSP Le tag <jsp:useBean> permet de localiser une instance ou bien d’instancier un bean pour l’utiliser dans la JSP Syntaxe <jsp:useBean id="beanInstanceName" class="package.class" type="package.class" scope="page|request|session|application" /> 60 30 Utiliser un Bean dans les JSP L’attribut scope : page [valeur par défaut] : bean utilisable dans toute la page JSP ainsi que dans les fichiers statiques inclus. request : bean accessible durant la durée de vie de la requête. La méthode getAttribute() de l'objet request permet d'obtenir une référence sur le bean. session : bean utilisable par toutes les JSP de la même session que la JSP qui a instanciée le bean. Le bean est utilisable tout au long de la session par toutes les pages qui y participent. La JSP qui créé le bean doit avoir l'attribut session = "true" dans sa directive page application : bean utilisable par toutes les JSP qui appartiennent à la même application que la JSP qui a instanciée le bean. Le bean n'est instancié que lors du rechargement de l'application 61 Utiliser un Bean dans les JSP Exemple : Avec TOMCAT, les beans doivent être nécessairement définis dans des packages 62 31 Accès aux propriétés Le tag <jsp:getProperty> permet d’obtenir la valeur d’un attribut d’un bean Syntaxe <jsp:getProperty name="beanInstanceName" property="propertyName" /> 63 Fixer des propriétés Le tag <jsp:setProperty> permet de mettre à jour la valeur de un ou plusieurs attributs d’un bean Syntaxe <jsp:setProperty name="beanInstanceName" property="propertyName" value="string|<%=expression%>" /> 64 32 Fixer des propriétés Exemple : <jsp:useBean id="utilisateur" class="test.Personne" scope="session"/> ... <jsp:setProperty name="utilisateur" property="nom" value="Toto"/> <jsp:setProperty name="utilisateur" property="age" value="34"/> Quand le type de la propriété du Bean n'est pas String une conversion automatique est effectuée en utilisant la méthode valueOf de la classe enveloppe : <%utilisateur.setAge(Integer.valueOf("34"));%> 65 Tag de redirection Le tag <jsp:forward> permet de rediriger la requête vers un fichier HTML, une autre page JSP ou une Servlet Syntaxe <jsp:forward page="relativeURL|<%=expression%>"/> – Si URL commence par un / elle est absolue (contexte de l'application) sinon elle est relative à la JSP – Ce qui suit l'action forward est ignoré, et tout ce qui a été généré dans cette page JSP est perdu 66 33 Tag de redirection Possibilité de passer un ou plusieurs paramètres vers la ressource appelée <jsp:forward page="relativeURL|<%=expression%>"> <jsp:param name="parametre" value="string|<%=expression%>"> ... </jsp:forward> 67 Tag d’inclusion Le tag <jsp:include> permet d'intégrer dynamiquement un contenu généré par une autre page JSP ou une autre servlet. Comme pour <jsp:forward> possibilité de passer un ou plusieurs paramètres vers la ressource incluse en utilisant le tag <jsp:param> Syntaxe <jsp:include page="relativeURL" flush="true|false"/> (flush spécifie si le tampon doit être envoyé au client et vidé) 68 34 Tags personnalisés Possibilité de définir ses propres tags basés sur XML : – tags personnalisés (custom tags) – regroupés dans des bibliothèques de tags (taglibs) Objectifs – Déporter dans des classes dédiées le code java contenu dans les scriptlets de la JSP et appeler ce code en utilisant des tags particuliers – Améliorer la séparation des rôles : • page JSP : présentation – concepteur de pages Web • scriplets / code Java – développeur Java Tags personnalisés / Java Beans – "philosophie" similaire – Java Beans : objets métier pour stocker et échanger des données – Tag personnalisé : interagit directement avec environnement JSP dans lequel il s'exécute 69 Tags personnalisés Les Tags personnalisés son regroupés en bibliothèques de Tag (Tag Lib). Définit par : Une classe Java (Gestionnaire de balise : Tag Handler) – code exécuté par le conteneur de JSP lorsque ce Tag est invoqué dans une page JSP – implémente interface javax.servlet.jsp.tagext.JSPTa – Accède à un objet javax.servlet.jsp.JSPWriter pour générer une réponse Une entrée dans le fichier de description de la bibliothèque à laquelle il est associé (document XML TLD Tag Library Descriptor) – la syntaxe du tags – Nom, attributs …. – La classe du Tag Handler associé 70 35 Tags personnalisés Utilisation : Pour pouvoir être utilisée dans une page JSP, une bibliothèque de Tags doit être déclarée avec la directive <%@ taglib> <%@taglib uri="/WEB-INF/tlds/MaTagLib.tld" prefix="maTagLib" %> Exemple : <%@taglib uri="/laTagLib" prefix="maTagLib" %> … <h1><maTagLib:HelloTag/></h1> 71 Tags personnalisés Deux manières de déployer des bibliothèques de Tags : Sans les packager – Le fichier .tld de description doit se trouver dans /WEB-INF où un de ses sous répertoire (/WEBINF/tlds) – Les classes (bytecode) des tag handlers doivent se trouver dans /WEB-INF/classes En les "packageant" dans un fichier jar – Le fichier jar doit être placé dans /WEB-INF/lib 72 36 Tags personnalisés Nombreuses bibliothèques de tags existantes (Libres, Commerciales) JSTL : Java Standard Tag Library for JavaServer Pages – – – – – Bibliothèque standard développée par JSR 052 Tags de structure (itération, conditions) Internationalisation Requêtes SQL … Nécessite conteneur Web implémentant au moins API 2.3 des servlets et l'API JSP 1.2 73 JSTL Fonctionnalités de JSTL regroupées dans 5 bibliothèques de tags – – – – – Rôle Tag Lib Descriptor uri Fonctions de base c.tld http://java.sun.com/jstl/core Internationalisation fmt.tld http://java.sun.com/jstl/fmt Traitements SQL sql.tld http://java.sun.com/jstl/sql Traitements XML x.tld http://java.sun.com/jstl/xml Fonctions fn.tld http://java.sun.com/jsp/jstl/functions fn En plus JSTL propose un langage d'expression (EL) permettant de référencer facilement les objets java accessibles dans le contexte de la JSP 74 37 JSTL : Core Exemple : appel avec paramètres : core.jsp?sayHello=true&name=Fred <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ... <html> <body> <h1> <c:if test="${param.sayHello}"> <!-- Let's welcome the user ${param.name} --> Hello ${param.name}! </c:if> </h1> </body> </html> http://docs.oracle.com/cd/E17802_01/products/products/jsp/jstl/1.1/docs/tlddocs/index.html 75 Autre exemple : Struts Tag Lib Exemple : Les tags HTML Struts prennent en charge l’initialisation des éléments du formulaire <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <html> <head> <title>Formulaire de saisie</title> </head> <body> <H1>Histogramme des notes</H1> <HR> <html:form action="notesAnneeMatiere.do"> Année : <html:text property="annee" size="6"/> … http://struts.apache.org 76 38 EL (Expression Language) langage particulier constitué d'expressions qui permet en particulier d'utiliser et de faire référence à des objets java accessibles dans les différents contextes (page, requête, session ou application) d'une JSP Initialement introduit avec la JSTL Supporté de manière standard à partir de la version 1.4 J2EE (Servlets 2.4, JSP 2.0) une expression EL peut être utilisée directement dans n'importe quelle page JSP (à la place d'une expression <%=expressionJava%> ) 77 EL (Expression Language) Exemple : accès à un attribut ... model.Utilisateur u = new model.Utilisateur(); u.setNom("DUPONT"); u.setPrenom("Jean"); request.setAttribute("utilisateur",u); getServletContext().getRequestDispatcher("/testE L.jsp").forward(request, response); ... public class Utilisateur { private String nom; private String prenom; public User() { } public String getNom() { return nom; } public void setNom(String name) { this.nom = nom; } public String getPrenom() { return prenom; } ... public void setPrenom(String prenom) <jsp:useBean id="utilisateur" type="model.Utilisateur" scope="session"/> { this.prenom = prenom; <H1 align="center">Au revoir<BR> ... EL recherche l'attribut suivant l'ordre : <%=user.getPrenom()%> <%=user.getNom()%> <H1 align="center">Au revoir<BR> - portée de</H1> la page ... ${user.prenom} ${user.nom} </H1> - portée de la requête ... - portée de la session - portée de l'application 78 39 EL (Expression Language) Accéder à une propriété d'un JavaBean ${user.prenom} Accéder à une propriété imbriquée ${user.adresse.ville} ${user.adresse} Accéder à une map ${map.a} ${map.u.prenom} Accéder à un tableau ou une liste ${array[3]} ${liste[5]} Les [ ] utilisables à la place du point ${user["prenom"]} ${map["a"]} 79 EL (Expression Language) Variables implicites EL pageContext objet PageContext de la page JSP pageScope Map pour accéder aux attributs définis dans la portée de la page (PageContext) requestScope Map pour accéder aux attributs définis dans la portée de la requête (HttpServletRequest) sessionScope Map pour accéder aux attributs définis dans la portée de la session (HttpSession) applicationScope Map pour accéder aux attributs définis dans la portée de l'application (ServletContext) param Map pour accéder aux paramètres de la requête http sous forme de String paramValues Map pour accéder aux paramètres de la requête http sous la forme de tableau de String header Map pour accéder aux valeurs de l'en-tête de la requête headerValues Map pour accéder aux valeurs de l'en-tête de la requête sous la forme de tableau de String initParam Map pour accéder aux paramètres d'initialisation (init-params du web.xml) cookie Map pour accéder aux cookies 80 40 EL (Expression Language) Opérateurs EL 81 EL : exemples EL Expression Result ${1 > (4/2)} false ${4.0 >= 3} true ${100.0 == 100} true ${(10*10) ne 100} false ${'a' < 'b'} true ${!empty param.Add} False ${pageContext.request.contextPath} ${sessionScope.cart.numberOfItems} ${param['mycom.productId']} ${header["host"]} ${departments[deptName]} #{customer.lName} #{customer.calcTotal} if the request parameter named Add is null or an empty string. The context path. The value of the numberOfItems property of the session-scoped attribute named cart. The value of the request parameter named mycom.productId. The host. The value of the entry named deptName in the departments map. Gets the value of the property lName from the customer bean during an initial request. Sets the value of lName during a postback. The return value of the method calcTotal of the customer bean. 82 41