Module I-C3 : Applications Web IUT R&T 2e année

Slides:



Advertisements
Présentations similaires
JEE 5 - JSF F.Pfister 2 institut eerie Les technologies du web Servlets JSP MVC Model 1 : servlets + JSP MVC Model.
Advertisements

Le struts validator – framework de validation
Cours 5 : XML et les architectures N-tier Janvier Version 1.0 -
JEE Approfondi Frameworks : Maverick (MVC) JiBX (Persistance XML)
CASTEL Dennis SARZEAUD Floriane TAKAHASHI Atsushi.
Algorithmes et structures de données avancées Partie Conception de Sites Web dynamiques Cours 9 Patrick Reuter.
Serveurs web pour JSP et Servlets
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Exposé de Système - Informatique et Réseau
Programmation Web Les JSP.
Cours 5.3 : XML et les architectures N-tiers – Tier Présentation
Cours 6 : XML et les architectures N-tiers – Tier Applicatif
51 Les technologies XML Cours 7 : Utilisations dXML Janvier Version 1.0 -
UV JSP JSP : Java Server Page
JSP Java Server Pages. Introduction Afin dimplémenter les règles métiers, coté serveur dans une application Web, larchitecture Java propose trois solutions.
Servlet JAVA.
Projet J2EE Maverick XMLBeans Garcel Jean-Baptiste – Le Loc Martin – Muller Thibaut.
JSP 2 Crash Course Michel Buffa UNSA
Présentation des frameworks pour Java EE
Introduction aux CMS.
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
2006/2007Denis Cabasson – Programmation Web Cours de programmation web ENSAE
CPI/BTS 2 Programmation Web Introduction au PHP
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
pour les applications Web :
JAVASERVER FACES Un framework Java pour le développement Web.
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
Cours GLG203 Cours J2EE JDBC, RMI, IIOP, Sécurité, XML
SERVLETS PRESENTATION
Développement Web en J2EE (Servlet & JSP)
Développement Rapide dApplications Web avec.NET « Mon premier site »
Projet JAVA EE Approfondi
Projet poker 1/56. Introduction Présentation de léquipe Cadre du projet Enjeux Choix du sujet 2.
Composants web (web tiers)
Atelier « Créations de sites » : Les techniques de réalisation de sites EPN :...
Création d'un projet Web avec Netbeans
1. 2 PLAN DE LA PRÉSENTATION - SECTION 1 : Code HTML - SECTION 2.1. : CSS (Méthode 1) - SECTION 2.2. : CSS (Méthode 2) - SECTION 3 : JavaScript - SECTION.
JSTL JSP Standard Tag Library
JSP (Java Server Pages)
1 CSI 2532 Lab6 Application Web et DB Février 27, 2012.
Document élaboré à Centrale Paris par Pascal Morenton LES TECHNOLOGIES DU WEB 1. LES PHASES D UN DEPLOIEMENT DE RESEAUX 2. LE LANGAGE HTML 3. LE LANGAGE.
Adaptée du cours de Richard Grin
Chapitre 3 Les bibliothèques de balises JSP et la JSTL
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
BOUSQUET Alexis - GUILLEMIN Vincent - PETIT Cédric
PHP 1° PARTIE : LES BASES © BTS IRIS 2002 [tv] Présentation Historique
Module Internet (3) 1 Département Technologie de l’Information et de la Communication Internet.
Content Management System CMS. Pourquoi ? Obligation de ressaisir des contenus publiés à plusieurs endroits Pas d’outils de gestion de qualité de l’information.
Chapitre 2 Développement Web avec les technologies JSP/Servlets
Etude comparative JSP, ASP et PHP
Elabore par BELKADHI ABIR BEN HASSEN SALMA CHEBBI MARWA
UV J2EE Module Java Expert
0 Objectifs de la session n°1  Revenir sur toutes les bases théoriques nécessaires pour devenir un développeur Web,  Découvrir l’ensemble des langages.
T ECHNOLOGIES WEB CHAPITRE IV : L E LANGAGE PHP 1 Mme Amani JARRAYA & Mohamed MOHSEN.
ANTOINE CHEVERT , PASCAL LAMY
Conférence Technique Java 2 Frédéric Jacquet. Au programme  Présenter les différents outils  Découverte - Java coté serveur  Appréhender l ’existant.
Page 1Dernière mise à jour: 17 avril 2015 Service de l'enseignement des technologies de l'information, © HEC Montréal, Tous droits réservés.
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
Struts.
Module : Pages Web Dynamiques (Production Électronique Avancée)
Cours MIAGE « Architectures Orientées Services »Henry Boccon-GibodCours MIAGE « Architectures Orientées Services »Henry Boccon-Gibod 1 Architectures Orientées.
Les langages de programmation
13/07/2015 JSF Java Server Faces Master 2 Pro GLR TER David Mihura Eric Le Merdy.
Les Java Server Pages Dans ce chapitre, nous allons :
CPI/BTS 2 Programmation Web Les sites dynamiques Prog Web CPI/BTS2 – M. Dravet – 02/10/2003 Dernière modification: 02/10/2003.
{ Java Server Pages Par Billy et Mike.  Introduction  Qu’est-ce que JSP?  Pourquoi utiliser JSP?  Développement  Balises  Servlets  Conclusion.
Architectures Logicielles Java GLG203 GLG204
Créer un site avec Wordpress. 1. Principes généraux 2. Installation 3. Paramétrage de Wordpress 4. Les catégories des articles 5. Les articles 6. Les.
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
Transcription de la présentation:

Module I-C3 : Applications Web IUT R&T 2e année Cours 3 : Introduction au développement Web Java EE - Servlet, JavaServer Pages (JSP), JavaServer Tag Library (JSTL) - Module I-C3 : Applications Web IUT R&T 2e année David Mercier jeudi 6 avril 2017 IC3 : cours 3

Descriptif application web Java (Web Component) application Web (*.html, *.jsp, servlets, …) archivée dans un .jar (.war) paramétrée dans le fichier WEB-INF/web.xml installée dans le répertoire webapps du serveur web JavaEE Structure d’un .war (Web Application Archive) *.html, *.png, *.jsp, … WEB-INF/web.xml Fichier de déploiement : paramétrage des servlets, types MIME additionnels, … WEB-INF/classes/ .class des servlets et des classes (JavaBean, …) ressources additionnelles … WEB-INF/lib/ .jar additionnels provenant de tierce parties (comme des drivers JDBC, TagLib (jsf, …), … WEB-INF/tlds/ .tld décrivant les TagLibs jeudi 6 avril 2017 IC3 : cours 3

Servlets Définition : un programme Java exécuté sur le serveur qui permet de créer des réponses dynamiques. Exécutées dans un conteneur de servlets (par exemple Apache Tomcat) Indépendance vis à vis du serveur. Lancées une seule fois lors du lancement du conteneur (ou lors du premier appel) Pour plus d’informations : voir cours supplémentaire de F. Hemery sur les servlets disponibles sur le site du cours jeudi 6 avril 2017 IC3 : cours 3

JavaServer Pages (JSP) Développement des servlets : fastidieux. Le JavaServer Pages ou JSP est une technologie basée sur Java qui permet aux développeurs de générer dynamiquement du code HTML. La syntaxe du JSP ajoute au code HTML des balises appelées actions JSP. Les JSP sont compilées par un compilateur JSP pour devenir des servlets Java. jeudi 6 avril 2017 IC3 : cours 3

Syntaxe JSP jeudi 6 avril 2017 IC3 : cours 3 Page JSP peut être séparée en plusieurs parties : les données statiques comme le (X)HTML, les directives, les scripts, les variables, les actions, les balises personnalisées. jeudi 6 avril 2017 IC3 : cours 3

Directives JSP introduction jeudi 6 avril 2017 IC3 : cours 3 Contrôlent la manière dont le compilateur doit générer la servlet (ou <jsp:directive.nom_directive … />). Placées entre les symboles <%@ et %> Directives disponibles : include page taglib jeudi 6 avril 2017 IC3 : cours 3

Directives JSP Directive include Indique au compilateur d’inclure un autre fichier dans la page. Exemple <%@ include file="unFichier" %> jeudi 6 avril 2017 IC3 : cours 3

Directives JSP Directive page jeudi 6 avril 2017 IC3 : cours 3 Plusieurs options Exemples <%@ page import="java.util.*" %> // import paquetage (package) Java <%@ page contentType="text/html" %> // type de contenu de la page générée <%@ page isErrorPage=false %> // pas une page d'erreur <%@ page isThreadSafe=true %> // servlet résultante protégée pour les threads (fils d’exécution) … jeudi 6 avril 2017 IC3 : cours 3

Indique une bibliothèque de balises utilisée Directives JSP Directive taglib Indique une bibliothèque de balises utilisée Exemple <%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %> jeudi 6 avril 2017 IC3 : cours 3

Scripts Permettent d'insérer du code Java dans la servlet Déclaration : <%! Déclaration java %> Scriptlet : <% code java %> Expression : <%= variable %> (sert à afficher une expression) Commentaire : <%-- Voici un commentaire JSP --%> Attention : il ne faut pas mettre de ' ;' à la fin de l'expression jeudi 6 avril 2017 IC3 : cours 3

Exemple 1 Hello world <%@ page language="java" %> <html> <head> <title> JSP Page 2</title> </head> <body> <p> <%! int i = 0 ; %> <% i ++ ; %> Hello World ! <%= "Vous avez atteint ce JSP " + i + " fois" %> </p> <%@ include file="piedDePage.html" %> </body> </html> jeudi 6 avril 2017 IC3 : cours 3

Script JSP : Exemple 2 Script PHP : Affichage de la date en français Script PHP : <?php setlocale(LC_TIME, 'french'); echo "<p> Au moment de l'exécution de ce script PHP, nous sommes le ".strftime('%A %d %B %Y').".</p>"; ?> Script JSP : <% Date date = new Date(); DateFormat df = DateFormat.getDateInstance( DateFormat.FULL , Locale.FRANCE ); %> <p>Au moment de l’exécution de ce script nous sommes le <%= df.format(date)%>.</p> jeudi 6 avril 2017 IC3 : cours 3

Exemple 3 – première partie Réalisation d’un annuaire, la souplesse de l’objet Adresse.java Personne.java package coursic3; public class Adresse { int cp; int numero; String nomRue; String ville; … public Adresse(int n, String r, int cp, String v){ setCp(cp); setNumero(n); setVille(v); setNomRue(r); } package coursic3; public class Personne { String nom; String prenom; int age; Adresse adresse; … public Personne (String nom, String prenom, int age, Adresse adresse){ setNom(nom); setPrenom(prenom); setAge(age); setAdresse(adresse); } Méthodes set et get écrites d’une manière automatique jeudi 6 avril 2017 IC3 : cours 3

Exemple 3 – deuxième partie Réalisation d’un annuaire, la souplesse de l’objet annuaire.jsp <%@page import="coursic3.Adresse, coursic3.Personne, java.util.*" contentType="text/html; charset=iso-8859-15" %> <% Adresse ad1=new Adresse(12,"rue des platanes",33000,"Bordeaux"); Adresse ad2=new Adresse(1,"allée des peupliers",62400,"Béthune"); Adresse ad3=new Adresse(112,"rue des voitures",75010,"Paris"); Adresse ad4=new Adresse(122,"rue des cocos",59000,"Lille"); Personne p1=new Personne("Martin","André",62,ad1); Personne p2=new Personne("Martin","Martine",48,ad1); Personne p3=new Personne("Brethodot","Luc",42,ad2); Personne p4=new Personne("Terref","Léo",22,ad3); Personne p5=new Personne("Leblanc","Just",32,ad4); […] jeudi 6 avril 2017 IC3 : cours 3

Exemple 3 – troisième partie Réalisation d’un annuaire, la souplesse de l’objet […] Vector<Personne> listePersonnes = new Vector<Personne>(); listePersonnes.add(p1); listePersonnes.add(p2); listePersonnes.add(p3); listePersonnes.add(p4); listePersonnes.add(p5); %> <html> <body> <table> <tr> <th>N</th> <th>Nom</th> <th>Prénom</th> <th>Age</th> <th>Adresse complète</th> </tr> Remarque : on va, entre autre, chercher des styles CSS ici… jeudi 6 avril 2017 IC3 : cours 3

Exemple 3 – quatrième partie Réalisation d’un annuaire, la souplesse de l’objet […] <% for(int i=0;i<listePersonnes.size();i++){ Personne p = listePersonnes.elementAt(i); Adresse a = p.getAdresse(); out.println("<tr>"); out.println("<td>"+(i+1)+"</td>"); out.println("<td>"+p.getNom()+"</td>"); out.println("<td>"+p.getPrenom()+"</td>"); out.println("<td>"+p.getAge()+"</td>"); out.println("<td>"+a.getNumero()+" "+a.getNomRue()+"<br/>"+a.getCp()+"-"+a.getVille()+"</td>"); out.println("</tr>"); } %> </table> </body> </html> jeudi 6 avril 2017 IC3 : cours 3

Exemple 3 – un affichage Remarque : Réalisation d’un annuaire, souplesse de l’objet Remarque : En pratique les données proviennent généralement d’une BD. Architecture 3 tiers. Vous vous rappelez ? (voir cours précédent) jeudi 6 avril 2017 IC3 : cours 3

Variables prédéfinies = objets implicites Disponibles dans les scriptlets et les expressions. Pas besoin d’être déclarées ou instanciées. request de type HttpServletRequest response de type HttpServletResponse page de type Object, fait référence à l’objet courant session de type HttpSession application de type ServletContext out de type JspWriter (spécialisation de PrintWriter) config de type ServletConfig jeudi 6 avril 2017 IC3 : cours 3

Les actions <jsp:include> <jsp:param> <jsp:forward> Définition : balises spécifiques qui affectent le comportement du script JSP lors de son exécution ainsi que les réponses envoyées au client <jsp:include> <jsp:param> <jsp:forward> <jsp:params> <jsp:useBean> <jsp:setProperty> <jsp:getProperty> … Un bean est une classe java qui implémente un constructeur sans argument et un couple de méthodes get et set pour chaque attribut de la classe Remarque : on parle de "getter" et "setter". jeudi 6 avril 2017 IC3 : cours 3

jsp:include/forward/param Donne temporairement le contrôle à une autre page Après le traitement de l’autre page, le contrôle est redonné à la JSP en cours d'exécution (évite duplication de code) jsp:forward Donne définitivement le contrôle à une autre page jsp:param Peut être utilisé dans un bloc jsp:include, jsp:forward ou jsp:params Indique un paramètre à ajouter aux paramètres actuels de la requête <jsp:include page = "pageAInclure.jsp" > <jsp:param name="paramètre" value="valeur" /> </jsp:include> jeudi 6 avril 2017 IC3 : cours 3

Action <jsp:useBean> <jsp:useBean> : permet de créer ou de réutiliser un Java bean dans la page. Syntaxe : <jsp :useBean id="nomInstanceBean" scope="page|request|session|application" details /> où details : class="nomClasse" | type="nomType" Valeur Rôle (quelle est la portée du bean ?) page (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 JSP même session. La JSP ayant créé le bean doit avoir l'attribut session = "true" dans sa directive page. application Bean utilisable par JSP même application. Bean instancié que lors du rechargement de l'application. jeudi 6 avril 2017 IC3 : cours 3

Actions liées à un Java bean <jsp:getProperty> : permet d’accéder aux valeurs stockées dans un bean. <jsp:getProperty name="nomInstanceBean" property="nomPropriete" /> Une variable du bean <jsp:setProperty> : permet de fixer la valeur des propriétés simples ou indexées d’un bean. <jsp:setProperty name="nomInstanceBean" details /> où details : property="*"  property="nomPropriete" property="nomPropriete" value="uneValeur" jeudi 6 avril 2017 IC3 : cours 3

Exemple 4 BeanPersonne.java bean BeanPersonne package coursic3; public class BeanPersonne { String nom; String prenom; int age; Adresse adresse; [… (setters and getters) …] public BeanPersonne (){ setNom("Nom par défaut"); setPrenom("Prénom par défaut"); setAge(0); setAdresse(null); } jeudi 6 avril 2017 IC3 : cours 3

Exemple 4 Utilisation d’un bean dans une page JSP <%@ page contentType="text/html ; charset=ISO-8859-15"%> <html> […] <body> <p>Test d'utilisation d'un Bean dans une JSP </p> <hr /> <jsp:useBean id="personne" scope="request" class="coursic3.BeanPersonne" /> <p>nom initial = <%= personne.getNom() %></p> <p>age = <%= personne.getAge() %></p> <jsp:setProperty name="personne" property="nom" value="un nouveau nom" /> <jsp:setProperty name="personne" property="age" value="10" /> <p>nom mis à jour = <%= personne.getNom() %></p> <p>age mis à jour = <%= personne.getAge() %></p> </body> </html> jeudi 6 avril 2017 IC3 : cours 3

Exemple 4 Affichage jeudi 6 avril 2017 IC3 : cours 3

Exemple 5 Un formulaire avec le bean BeanPersonne <%@ page contentType="text/html;charset=ISO-8859-15"%> <jsp:useBean id="personne" scope="request" class="coursic3.BeanPersonne" /> <html> […] <body> <h1>Saisie d'une personne</h1> <form method="POST" action="personne.jsp"> Nom : <input type="text" size="20" name="nom" value='<jsp:getProperty property="nom" name="personne"/>'><br> Prénom : <input type="text" size="20" name="prenom" value='<jsp:getProperty property="prenom" name="personne"/>'><br> Age : <input type="text" size="2" name="age" value='<jsp:getProperty property="age" name="personne"/>'><br> <input type="submit" value="Envoyer"> </form> </body> </html> jeudi 6 avril 2017 IC3 : cours 3

Exemple 5 Affichage du formulaire jeudi 6 avril 2017 IC3 : cours 3

Exemple 5 Traitement du formulaire avec le bean BeanPersonne personne.jsp […] <body> <jsp:useBean id="personne" scope="request" class="coursic3.BeanPersonne" /> <jsp:setProperty name="personne" property="*" /> <p>La personne saisie s'appelle <jsp:getProperty property="prenom" name="personne"/> <%= personne.getNom()%> et a <%= personne.getAge()%> ans.</p> </body> </html> jeudi 6 avril 2017 IC3 : cours 3

Exemple 5 Affichage d’un résultat de traitement jeudi 6 avril 2017 IC3 : cours 3

personne.jsp (sans bean) Exemple 5 Traitement d’un formulaire par l’objet implicite request personne.jsp (sans bean) <p>La personne saisie s'appelle <%= request.getParameter("prenom")+" "+request.getParameter("nom")%> et a <%= request.getParameter("age")%> ans.</p> Remarque : comment afficher tous les paramètres d'une requête ? <% Enumeration en = request.getParameterNames(); while (en.hasMoreElements()) { String pName = (String) en.nextElement(); out.println(pName + "=" + request.getParameter(pName)); } %> jeudi 6 avril 2017 IC3 : cours 3

Script JSP : objet implicite request Résumé Traitement formulaire PHP /JSP Script PHP : tableaux associatifs $_POST, $_GET, $_REQUEST <?php foreach($_REQUEST as $nom => $val ) { echo "Nom du champ : $nom -"; echo "Valeur du champ : $val <br />"; } ?> Script JSP : objet implicite request <% for ( java.util.Enumeration e = request.getParameterNames(); e.hasMoreElements(); ) { String nom = (String) e.nextElement(); String val = request.getParameter(nom); out.print("Nom du champ : " + nom + " - "); out.println("Valeur du champ : " + val + " <br />"); } %> jeudi 6 avril 2017 IC3 : cours 3

getName.jsp nextPage.jsp saveName.jsp Session objet implicite session PHP : tableau associatif : $_SESSION | JSP : objet implicite session getName.jsp saveName.jsp <% String name=request.getParameter("nom"); session.setAttribute("sonNom",name); %> <html> <body> <a href="nextPage.jsp">vers une autre page</a> </body> </html> […] <body> <form method="post" action="saveName.jsp"> <p> Nom : <input type="text" name="nom" id="nom" size="20"/> <input type="submit" value="envoyer"/> </p> </form> </body> nextPage.jsp <body> <p> Bonjour <%= session.getAttribute("sonNom") %>! </p> </body> jeudi 6 avril 2017 IC3 : cours 3

Session getName.jsp : saveName.jsp : nextPage.jsp : Affichage de l’exemple getName.jsp : saveName.jsp : nextPage.jsp : jeudi 6 avril 2017 IC3 : cours 3

ni session.start() ni session.close() Ouverture, fermeture ? Il existe un moyen de supprimer une variable dans une session : session.removeAttribute(…) ni session.start() ni session.close() Pour capturer les évènements d’ouverture et de fin d’une session il faut créer une servlet : une classe java implémentant l’interface javax.servlet.http.HttpSessionListener Ce point sera détaillé en TP jeudi 6 avril 2017 IC3 : cours 3

Connexion à une BD PostGreSQL Chargement du pilote faisant le lien entre l’application java et le SGDB <%@ page import="java.sql.*" %> <% Connection c = null; try { Class.forName("org.postgresql.Driver"); c = DriverManager.getConnection ( "jdbc:postgresql://machineServeur/maBase", "user", "password"); System.out.println("Connexion à la base \"maBase\" réussie"); } catch(SQLException e) System.out.println("Connexion impossible : "+ e.toString() +"<br />"); %> Connexion à "maBase" Java DataBase Connectivity jeudi 6 avril 2017 IC3 : cours 3

Création d’une requête Une requête est créée par la méthode createStatement() de la classe Connection Statement stmt = c.createStatement() Il n’y a qu’une seule instance de la classe Statement par instance de la classe Connection. Suivant le type de requête : Modification : Consultation : Contrairement aux requêtes de modification, les requêtes de consultation ont besoin d’accéder au résultat de la requête. stmt.executeUpdate("CREATE TABLE agenda " + " (nom varchar (20) , prenom varchar (20) , " + " adresse varchar (50) , tel char (12) " ) ; stmt.executeQuery ( "SELECT * FROM agenda " ) ; jeudi 6 avril 2017 IC3 : cours 3

Traitement d’une requête Une instance de la classe ResultSet contient la table résultat d’une requête. Pour récupérer les données dans l’instance, on utilise un pointeur sur une ligne courante et un getter tel que ci dessous : int getInt (int i) int getInt (String nomCol) Renvoie l’entier stocké dans la ie colonne ou nom colonne String getString (int i) String getString (String Renvoie la chaîne de caractères stockée dans la ie col ou nom col Date getDate (int i) Date getDate (String Renvoie la date stockée dans la ie colonne ou nom colonne boolean next() Renvoie vrai si il y a encore une ligne à traiter, faux sinon. Fait aussi passer à la ligne suivante boolean first() Place le curseur sur la 1e ligne jeudi 6 avril 2017 IC3 : cours 3

Exemple 6 Clôture la connexion […] <% ResultSet rs = stmt.executeQuery("SELECT * FROM telephone order by nom, prenom"); while ( rs.next()){ System.out.println("Nom : \t" + rs.getString("nom")); System.out.println("Prenom : \t" + rs.getString(2)); System.out.println("telephone : \t" + rs.getString("telephone") + "\n"); } stmt.close(); Clôture la connexion jeudi 6 avril 2017 IC3 : cours 3

Pour aller plus loin Pour plus d’informations : La bibliothèque JSTL (Javaserver pages Standard Tag Library) contient un ensemble de balises qui peuvent être utilisées dans les pages JSP. Facilite la manipulation des variables utilisées dans la page JSP Exemple <c:if test="${livre.prix <= user.preferences.limiteDepenses}"> Le Livre ${livre.titre} rentre dans le budget! </c:if> Un autre exemple <c:forEach var= "produit" items= "${produits}" > <c:out value="Prix de ${produit.name} est ${produit.prix}" /> </c:forEach> Pour plus d’informations : Voir cours supplémentaire JSTL de F. Hemery disponible sur le site du cours jeudi 6 avril 2017 IC3 : cours 3