Java EE
JSP – JAVA SERVER PAGES
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 97
Contenu
• Introduction
• Fonctionnement
• Syntaxe
◦ Balises simples
◦ Directives
◦ Actions standards
◦ Expression language EL
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 98
Introduction
• Éviter le code java sur les vues
• Une page JSP contient :
◦ du contenu statique
◦ du code JSP : produit dynamiquement du contenu
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 99
Principe de chargement
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 100
Fonctionnement
• 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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 101
Fonctionnement
Requête client – JSP sollicitée
Serveur
Création du code source depuis la JSP Fichier chargé?
non
oui
Compilation du code Exécution de la Servlet
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 102
Cycle de vie d’une JSP
Servlet de la JSP
jspInit()
Request
Response
jspService()
jspDestroy()
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 103
É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)
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 104
Porté des objets
• 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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 105
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 106
Exercice
• 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).
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 107
Initialisation et finalisation :
paramétrage
• 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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 108
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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 109
Autres balises simples
• 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 "); %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 110
Directives
• 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.
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 111
3 directives
• Directive page:
◦ <%@ page directive %>
• Directive include:
◦ <%@ include directive %>
• Directive taglib:
◦ <%@ taglib directive %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 112
Directive de page
• Principe :
◦ Paramétrage de l’exécution de la JSP
• Syntaxe :
◦ <%@ page directive %>
• Exemple :
◦ <%@ page isThreadSafe="false" %>
◦ <%@ page contentType="text/plain; charset=UTF-8" %>
◦ <%@ page import="java.io.*, java.util.*" %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 113
Propriétés de la directive page
<%@ page
language="..."
extends="..."
import="..."
session="true | false"
buffer="none | 8kb | sizekb"
autoFlush="true | false"
isThreadSafe="true | false"
isELIgnored ="true | false"
info="..."
errorPage="..."
contentType="..."
pageEncoding="..."
isErrorPage="true | false"
%>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 114
Exemple de directive de page
• <%@ 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.
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 115
Exercice
• 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.
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 116
Directive et action standard
d’inclusion
• 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>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 117
Exercice
• 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) ;
◦ %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 118
Action standard : forward
• 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" />
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 119
Inclusion pour la délégation
• 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>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 120
Exercice
• 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>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 121
Standard Tag Library
• 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'eectuer des requêtes SQL (travail
normalement dédié aux JavaBeans)
• Il est possible d'étendre le langage en créant d'autre balises
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 122
Directive taglib
• Principe :
◦ Inclusion d’une librairie personalisée
• Syntaxe :
◦ <%@ taglib directive %>
• Exemple :
◦ <%@ taglib uri="maTagLib.tld" prefix="tagExemple" %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 123
Action standard : useBean
• Syntaxe :
◦ <jsp:useBean id="nom_bean" class="nom_classe" scope="type_porte" />
• Équivalent à :
◦ <%
◦ nom_classe obj = (nom_classe) request.getAttribute( "nom_bean" );
◦ if ( obj== null ){
◦ obj= new nom_classe();
◦ type_porte.setAttribute( "nom_obj", obj);
◦ }
◦ %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 124
Action standard : getProperty
• 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é() %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 125
Action standard : setProperty
• 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") ;%>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 126
Action standard : setProperty (2)
• 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")); %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 127
Action standard : setProperty (3)
• 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é")); %>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 128
Action standard : setProperty (4)
• 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")) ;%>
◦ …
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 129
EL: Expression Language
• 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 }
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 130
Expression Language EL
• 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}"/>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 131
EL : Opérateurs
• 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")
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 132
EL : Opérateur de test
• 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' }
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 133
EL : Manipulation des objets
• Instruction avec une action standard :
◦ Prénom et nom : <jsp:getProperty property="prenom"
name="attributBean"/>
• Instruction avec EL :
◦ ${attributBean.prenom}
◦ ${attributBean.getPrenom()}
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 134
EL : Manipulation des collections
• 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 />
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 135
EL : Fonctions
• Possibilité d’utiliser des fonctions définies dans des taglib
personnalisées
◦ Syntaxe :
${ns:func(param1, param2, ...)}
◦ Exemple :
${fn:length("Get my length")}
• Possibilité de définir une fonction :
◦ Définition des fonctions identique à celle des tags personnalisés.
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 136
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")}
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 137
EL : Objets implicites
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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 138
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}
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 139
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>
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 140
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
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 141
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.
2020/2021 JAVA ENTREPRISE EDITION - SELMA BATTI ATTIA 142