Java EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdfJava EE _ JSP.pdf
1. JSP – JAVA SERVER PAGES
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 98
2. Contenu
• Introduction
• Fonctionnement
• Syntaxe
◦ Balises simples
◦ Directives
◦ Actions standards
◦ Expression language EL
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 99
3. Introduction
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 100
• Éviter le code java sur les vues
• Une page JSP contient :
◦ du contenu statique
◦ du code JSP : produit dynamiquement du contenu
5. Fonctionnement
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 102
• Traduction : JSP en servlet
• Fonctionnement :
◦ Étape 1 :
◦ Requête sur une JSP
◦ Étape 2 :
◦ une servlet compare les dates de la JSP et de sa servlet
◦ si la servlet de la JSP est plus ancienne que la page :
◦ traduction de la JSP en servlet
◦ compilation de la servlet
◦ Étape 3 :
◦ si la servlet de la page n'a pas encore été chargée
◦ chargement de la servlet
◦ instanciation
◦ initialise la servlet avec la méthode jspInit
◦ Étape 4 :
◦ invocation de la méthode jspService
◦ Étape 5 :
◦ Appel de jspDestroy lors du déchargement de la servlet
6. Fonctionnement
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 103
Requête client – JSP sollicitée
Serveur
Fichier chargé?
Création du code source depuis la JSP
Compilation du code Exécution de la Servlet
non
oui
7. Cycle de vie d’une JSP
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 104
jspInit()
jspDestroy()
jspService()
Servlet de la JSP
Request
Response
8. Éléments prédéfinis
• request – HttpServletRequest (paramètres de la requête, entête HTTP,
cookies, …), correspondant à la requête
• response – HttpServletResponse, correspondant à la réponse renvoyée
• out – PrintWriter, le flot de sortie de la réponse
• session – HttpSession, permet de gérer une session
• application - ServletContext partagée par toutes les servlettes en cours, ;
contient, entre autres, la méthode log() pour écrire dans le chier log
• config - ServletConfig
• pageContext - PageContext dans la JSP comme unique point d’accès,
permet la gestion du contexte et des attributs de la JSP
• page – variable synonyme de cet objet (this)
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 105
9. Porté des objets
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 106
• Il existe au total quatre portées différentes dans une application :
◦ page : les objets dans cette portée sont uniquement accessibles dans la page
JSP en question ;
◦ requête : les objets dans cette portée sont uniquement accessibles durant
l'existence de la requête en cours ;
◦ session : les objets dans cette portée sont accessibles durant l'existence de la
session en cours ;
◦ application : les objets dans cette portée sont accessibles durant toute
l'existence de l'application
11. Exercice
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 108
• Ajouter le code nécessaire au projet test pour garder trace dans un
fichier log des paramètres passés à la servlet depuis la JSP (seulement
dans le cas où des paramètres sont utilisés).
12. Initialisation et finalisation :
paramétrage
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 109
• Initialisation lors du chargement par le serveur d'application :
◦ public void jspInit()
• Finalisation lors du déchargement par le serveur d'application :
◦ public void jspDestroy()
• Paramétrage à placer dans une balise de déclaration
13. Balises simples
• Balises de commentaire
◦ <%-- et --%>
• Balise de déclaration
◦ Syntaxe :
◦ <%! Type nomVar = initialisation; %>
◦ Exemple :
◦ <%! String chaine = "azerty"; %>
◦ Exemple de bloc de déclaration :
◦ <%! String test = null;
◦ public boolean fct() { if (test==null) return true; else return false; }
◦ %>
◦ Traduction :
◦ Déclarations : placées dans la classe au moment de la traduction de la JSP en Servlet
◦ variables = attributs
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 110
14. Autres balises simples
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 111
• Balise de scriptlet :
◦ Mélange de script et de servlet
◦ Exemple :
◦ <%
◦ String attributChaine = (String) request.getAttribute("attribut1Chaine");
◦ out.println( attributChaine );
◦ %>
• Balise d’expression :
◦ <%= " Chaine à afficher" %>
◦ Correspond à : <% out.println(" Chaine à afficher "); %>
15. Directives
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 112
• Les directives JSP permettent :
◦ d'importer un package ;
◦ d'inclure d'autres pages JSP ;
◦ d'inclure des bibliothèques de balises ;
◦ de définir des propriétés et informations relatives à une page JSP.
• Comprises entre les balises <%@ et %>
• Emplacement des directives :
◦ La directive d'inclusion de page : peut être placée n'importe où
◦ Les autres directives : doivent être en tête de page JSP.
19. Exemple de directive de page
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 116
• <%@ page errorPage="le_nom_de_la_page"%>
◦ spécifie la page vers laquelle le serveur d'application renvoie lorsqu'une
exception non gérée est lancée par la JSP.
• <%@ page isErrorPage="true|false"%>
◦ spécifie si la page à renvoyer est une page d'erreur et lui autorise ainsi la
transmission de l'exception pour un éventuel traitement.
20. Exercice
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 117
• Créer une page html ayant pour titre « Erreur !!! » qui affiche un texte
rapportant la présence d’une erreur sur la JSP,
• Ajouter à Test.jsp la directive permettant l’affichage de cette page html
si une exception se présente,
• Dans un bloc de scriptlet faire une opération de division par 0,
• Tester le projet.
21. Directive et action standard
d’inclusion
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 118
• Principe :
◦ Inclusion d'une page statique ou dynamique dans la JSP
• Syntaxe :
◦ Inclusion à la traduction en servlet (par directive)
◦ <%@ include directive %>
◦ Inclusion à l’exécution (par action standard)
◦ Sans paramètres :
◦ <jsp:include page="fichier " />
◦ Avec paramètres :
◦ <jsp:include page="fichier ">
◦ <jsp:param name="nom " value="valeur "/>
◦ ...
◦ </jsp:include>
22. Exercice
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 119
• Implémenter les fichiers suivants avec de nouvelles JSP (ne pas oublier la
configuration dans web.xml) :
◦ inclusion.jsp
◦ <html>
◦ <head><t i t l e>JSP ave c i n c l u s i o n</ t i t l e></ head>
◦ <body><%@ i n c l u d e f i l e=" t i t r e . t x t " %>
◦ <p><j s p : i n c l u d e page=" t e x t e . j s p " /></p>
◦ <p><j s p : i n c l u d e page=" par ame t r e . j s p ">
◦ <j s p : param name="nom" v a l u e="Bob" />
◦ </ j s p : i n c l u d e>
◦ </p>
◦ </ body>
◦ </ html>
◦ titre.txt
◦ <h1>Ti t r e de l a JSP , i n c l u s a p a r t i r d ' un f i c h i e r t e x t e </h1>
◦ texte.jsp
◦ <% out . p r i n t l n ( "Texte g ene r e par l a JSP t e x t e . j s p " ) ; %>
◦ parametre.jsp
◦ <%
◦ S t r i n g nom = r e q u e s t . ge tPa r ame t e r ( "nom" ) ;
◦ out . p r i n t l n ( " S a l u t " + nom) ;
◦ %>
23. Action standard : forward
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 120
• Permet d'effectuer une redirection vers une autre page
• Action effectuée côté serveur, donc pas possible de rediriger vers une
page extérieure à l'application
• Action limitée aux pages présentes dans le contexte de la servlet ou de
la JSP utilisée
• Syntaxe :
◦ <jsp:forward page="/nouvelle_page.jsp" />
24. Inclusion pour la délégation
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 121
• Principe :
◦ Délégation à un autre composant web
• Syntaxe :
◦ Sans paramètres :
◦ <jsp:forward page="fichier " />
◦ Avec paramètres :
◦ <jsp:forward page="fichier " >
◦ <jsp:param name="nom " value="valeur "/>
◦ ...
◦ </jsp:forward>
25. Exercice
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 122
• Implémenter les fichiers suivants avec de nouvelles JSP (ne pas oublier la
configuration dans web.xml) :
◦ delegation.jsp
◦ <html>
◦ <head><t i t l e>JSP ave c d e l e g a t i o n</ t i t l e></ head>
◦ <body>
◦ <j s p : f o rwa r d page=" parame t r e . j s p ">
◦ <j s p : param name="nom" v a l u e="Bob" />
◦ </ j s p : f o rwa r d>
◦ </ body>
◦ </ html>
◦ parametre.jsp
◦ <html>
◦ <head><t i t l e>Af f i c h a g e d e l e g u e</ t i t l e></ head>
◦ <body>
◦ <%
◦ S t r i n g nom = r e q u e s t . ge tPa r ame t e r ( "nom" ) ;
◦ out . p r i n t l n ( "<p>S a l u t " + nom + " !</p>" ) ;
◦ %>
◦ </ body>
◦ </ html>
26. Standard Tag Library
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 123
• Les JSP fournissent une bibliothèque de balises standards répondant à
des besoins de base.
• Quelques domaines :
◦ Core : balises permettant des fonctionalités de base
◦ XML : balises permettant de manipuler des données XML
◦ I18n : balises permettant de traiter l'internationalisation
◦ Database : balises permettant d'exectuer des requêtes SQL (travail
normalement dédié aux JavaBeans)
• Il est possible d'étendre le langage en créant d'autre balises
29. Action standard : getProperty
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 126
• Obtenir la valeur d’une des propriétés d’un bean utilisé dans une JSP
• Syntaxe :
◦ <jsp:getProperty name="nom_obj_bean" property="nom_propriété" />
• Équivalent à :
◦ <%= nom_obj_bean.getNom_propriété() %>
30. Action standard : setProperty
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 127
• Modifier la valeur d’une des propriétés d’un bean utilisé dans une JSP
• Syntaxe :
◦ <jsp:setProperty name="nom_obj_bean" property="nom_propriété"
value="nouvelle_valeur" />
• Équivalent à :
◦ <%= nom_obj_bean.setNom_propriété ("nouvelle_valeur") ;%>
31. Action standard : setProperty (2)
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 128
• Cette action peut prendre comme nouvelle valeur de la propriété la
valeur d’un paramètre
• Syntaxe :
◦ <jsp:setProperty name="nom_obj_bean" property="nom_propriété"
param="nom_parametre" />
• Équivalent à :
◦ <%= nom_obj_bean.setNom_propriété
(request.getParameter("nom_parametre")); %>
32. Action standard : setProperty (3)
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 129
• Cette action peut prendre comme nouvelle valeur de la propriété la
valeur d’un paramètre qui a le même identifiant que la propriété
• Syntaxe :
◦ <jsp:setProperty name="nom_obj_bean" property="nom_propriété" />
• Équivalent à :
◦ <%= nom_obj_bean.setNom_propriété
(request.getParameter("nom_propriété")); %>
33. Action standard : setProperty (4)
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 130
• Cette action peut donner de nouvelles valeurs à plusieurs propriétés
les valeurs de paramètres qui ont les mêmes identifiants que ces
propriétés
• Syntaxe :
◦ <jsp:setProperty name="nom_obj_bean" property="*" />
• Équivalent à :
◦ <%= nom_obj_bean.setNom_propriété1
(request.getParameter1("nom_propriété1")) ;%>
◦ <%= nom_obj_bean.setNom_propriété2
(request.getParameter2("nom_propriété2")) ;%>
◦ …
34. EL: Expression Language
JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA
• Spécification de EL sous l’autorité du groupe d’expert JSR-152 pour JSP
1.3
• Le JSR-52 et JSR-152 travail ensemble sur la spécification de
l’Expression Language
• Deux version: une pour JSTL et l’autre pour JSP 1.3
• En JSTL il est utilisé uniquement dans la valeur d’un attribut:
<prefix:tag attr1="${ expr }" />
• Il est invoqué exclusivement via la syntaxe ${ expr }
2022/2023 131
35. Expression Language EL
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 132
• Principe :
◦ Effectuer des tests basiques sur des expressions
◦ Manipuler des objets sans avoir recours au code Java
• Avantage :
◦ + simple
◦ + standard
◦ + maintenable
• Syntaxe de base :
◦ $ { expression }
• Exemple :
<jsp:setProperty name="box" property="perimeter"
value="${2*box.width+2*box.height}"/>
36. EL : Opérateurs
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 133
• Opérateurs :
◦ opérateurs arithmétiques :
◦ + - * / %
◦ opérateurs logiques :
◦ && || !
◦ opérateurs relationnels :
◦ == != < > <= >=
◦ eq ne lt gt le ge
◦ L’opérateur [ ] pour accéder au objets de type Map, Array et List
◦ param["p1"] param.get("p1")
37. EL : Opérateur de test
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 134
• Conditionnel :
◦ Syntaxe :
◦ ${ condition ? 'traitement si condition vérifiée' : 'traitement sinon' }
◦ Exemple :
◦ ${ true ? 'vrai' : 'faux' }
• Opérateur « empty » :
◦ Syntaxe :
◦ ${ empty « element à tester » }
◦ Exemple :
◦ ${ empty 'test' }
38. EL : Manipulation des objets
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 135
• Instruction avec une action standard :
◦ Prénom et nom : <jsp:getProperty property="prenom"
name="attributBean"/>
• Instruction avec EL :
◦ ${attributBean.prenom}
◦ ${attributBean.getPrenom()}
39. EL : Manipulation des collections
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 136
• Possibilité de manipuler directement les collections de
java.util, telque :
◦ List, Set, Map …
• Exemple d’utilisation d’une liste :
◦ <%/* Création d'une liste d’entiers et insertion de quatre éléments */
◦ java.util.List<Integer> li = new java.util.ArrayList<Integer>();
◦ li.add( "20" );%>
◦ <!-- Les quatre syntaxes suivantes retournent le premier élément de
la liste -->
◦ ${ li.get(0) }<br />
◦ ${ li[0] }<br />
◦ ${ li['0'] }<br />
◦ ${ li["0"] }<br />
40. EL : Fonctions
• Possibilité d’utiliser des fonctions définies dans des taglib
personnalisées
◦ Syntaxe :
◦ Exemple :
• Possibilité de définir une fonction :
◦ Définition des fonctions identique à celle des tags personnalisés.
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 137
${ns:func(param1, param2, ...)}
${fn:length("Get my length")}
41. EL : Exemple de fonctions
• Définition :
public class MyFunctions {
public static String toCaps( String text ) {
return text.toUpperCase();
}
}
• Utilisation :
◦ XML:
<uri>testFunctionsURI</uri>
<function>
<name>toCaps</name>
<function-class>mypkg.MyFunctions</function-class>
<function-signature>String toCaps( java.lang.String)</function-signature>
</function>
◦ JSP:
<%@ taglib prefix="myFunctionTest" uri="testFunctionsURI"%>
${myFunctionTest.toCaps("testingCaps")}
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 138
42. EL : Objets implicites
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 139
Noms Définition Explication
pageScope Map des attributs de porté page Collection permettant d'accéder aux
différents attributs d’une porté
requestScope Map des attributs de porté requête
sessionScope Map des attributs de porté session
applicationScope Map des attributs de porté application
param Map des paramètres (String) Collection permettant d'accéder aux
paramètres de la requête HTTP
paramValues Map des paramètres (String[])
header Map des valeurs de l’entête HTTP (String) Collection permettant d'accéder à
l’entête de la requête HTTP
headerValues Map des valeurs de l’entête HTTP (String[])
initParam Map des init-params Collection permettant d'accéder aux
init-params définis dans web.xml
cookie Map des différentes cookies Collection permettant d'accéder aux
cookies
pageContext L’objet PageContext de la page courante
43. EL : Exemple d’objet implicite
• Objets implicites des EL ≠ objets implicites des actions standards sauf
« pageContext »
• « pageContext » a des propriétés pour accéder aux autres objets
implicites JSP.
• Exemple : On peut accéder à l’objet request.
${pageContext.request.queryString}
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 140
44. Désactivation de l’évaluation des EL
• Désactivation de l’évaluation des EL (syntaxe non réservée avant
JSP2) dans une JSP.
<%@ page isELIgnored ="true|false" %>
◦ Si “true” : EL ignorée
◦ Si “false” : EL interprétée
◦ La valeur par défaut dépend de la version du descripteur de déploiement
de l’application web :
◦ Servlet 2.3 et précédents : “true”
◦ Servlet 2.4 et suivants : “false”
• Désactivation depuis le web.xml (pour tout le projet):
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 141
45. Exercice
• On se fixe comme objectif d’implémenter un prototype d’un site
permettant de faire une enquête sur les disponibilités d’un groupe de
personne afin de fixer le jour d’une réunion qui convient au plus grand
nombre des perticipants. Pour des raisons de simplification, l’affichage des
disponibilités échangés se fait sous forme textuelle (sans éléments
graphiques) et l’envoie de la disponibilité d’un membre vers le serveur se
fait directement depuis les paramètres de l’URL.
• Exemples d’envois des disponibilités :
• http://setv2:8080/Doodle/Disponibilité?Membre=Bob&Disponibilite=Lund
i,Mardi
• http://setv2:8080/Doodle/Disponibilité?Membre=Tom&Disponibilite=Lund
i,Jeudi
• …
• L’affichage induit par ces envois :
• Lundi Mardi Mercredi Jeudi Vendredi Samedi
• Bob : 1 1 0 0 0 0
• Tom : 1 0 0 1 0 0
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 142
46. Suite de l’exercice
• Donner le code d’un java bean représentant la disponibilité d’un
membre en sachant qu’une disponibilité est identifiée par :
◦ une chaine de caractère qui représente le membre du groupe en question
◦ un tableau statique de 6 bouleans qui représentent les disponibilités du
membre
• Donner le code de la servlet qui récupère les informations concernant
une disponibilité, crée la disponibilité en question et l’envoie à tous les
clients.
• Donner le code de la JSP qui affiche les différentes disponibilités des
membres du groupe.
2022/2023 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 143