Vous êtes sur la page 1sur 46

Java EE

JSP – JAVA SERVER PAGES

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 98


Contenu
• Introduction
• Fonctionnement
• Syntaxe
◦ Balises simples
◦ Directives
◦ Actions standards
◦ Expression language EL

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 99


Introduction
• Éviter le code java sur les vues

• Une page JSP contient :


◦ du contenu statique
◦ du code JSP : produit dynamiquement du contenu

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 100


Principe de chargement

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 101


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 102


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 103


Cycle de vie d’une JSP
Servlet de la JSP

jspInit()

Request
Response
jspService()

jspDestroy()

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 104


É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)

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 105


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 106


2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 107
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).

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 108


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 109


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 110


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 "); %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 111


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.

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 112


3 directives
• Directive page:
◦ <%@ page directive %>

• Directive include:
◦ <%@ include directive %>

• Directive taglib:
◦ <%@ taglib directive %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 113


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.*" %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 114


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"
%>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 115


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.

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 116


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.

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 117


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>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 118


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) ;
◦ %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 119


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" />

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 120


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>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 121


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>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 122


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 123


Directive taglib
• Principe :
◦ Inclusion d’une librairie personalisée

• Syntaxe :
◦ <%@ taglib directive %>

• Exemple :
◦ <%@ taglib uri="maTagLib.tld" prefix="tagExemple" %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 124


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);
◦ }
◦ %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 125


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é() %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 126


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") ;%>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 127


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")); %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 128


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é")); %>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 129


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")) ;%>
◦ …

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 130


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 }

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 131


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}"/>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 132


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")

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 133


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' }

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 134


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()}

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 135


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 />

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 136


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.

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 137


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")}

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 138


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 139


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}

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 140


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>

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 141


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

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 142


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.

2021/2022 JAKARTA ENTREPRISE EDITION - SELMA BATTI ATTIA 143

Vous aimerez peut-être aussi