SlideShare une entreprise Scribd logo
1  sur  138
Télécharger pour lire hors ligne
P R O F Y . B O U K O U C H I
4 E A N N É E G É N I E I N F O R M A T I Q U E
E N S A D ’ A G A D I R
Développement des applications JEE web backend
JEE
• JEE (Java Platform, Enterprise Edition), anciennement J2EE ( Java 2 Platform
Entreprise Edition ) est la version entreprise de la plate-forme "Java" qui se
compose de l'environnement "JSE" ainsi que de nombreuses API et composants
destinés à une utilisation "côté serveur" au sein du système d'information de
l'entreprise.
• L'objectif majeur de Java EE est de faciliter le développement d'applications web
robustes et distribuées, déployées et exécutées sur un serveur d'applications
C’EST QUOI JEE?
LES SPÉCIFICATIONS JEE
• JEE propose des spécifications (Java Specification Requests -JSR-)pour une
infrastructure dans laquelle s'exécutent les composants. Elle décrivent les rôles de
chaque élément et précisent un ensemble d'interfaces pour permettre à chacun de
ces éléments de communiquer.
• Les spécifications précisent à l'aide des API un certain nombre de fonctionnalités
que doit implémenter l'environnement d'exécution:
• JSR 221: JDBCTM 4.0 API Specification
• JSR 52: A Standard Tag Library for JavaServer Pages
• JSR 369: JavaTM Servlet 4.0 Specification
• JSR 370: JavaTM API for RESTful Web Services (JAX-RS 2.1) Specification
• JSR 371: Model-View-Controller (MVC 1.0) Specification
• Etc.
• Ces fonctionnalités permettent de séparer les applications et l'environnement dans
lequel elles s'exécutent et permettent aux développeurs de se concentrer sur la
logique métier.
LES SPÉCIFICATIONS JEE
API JEE version de l'API dans J2EE/Java EE
1.2 1.3 1.4 5 6 7
1 Entreprise Java Bean (EJB) 1.1 2.0 2.1 3.0 3.1 3.2
2 Remote Method Invocation (RMI) et RMI-IIOP 1.0
3 Java Naming and Directory Interface (JNDI) 1.2 1.2 1.2.1
4 Java Database Connectivity (JDBC) 2.0 2.0 3.0
5
Java Transaction API (JTA)
Java Transaction Service (JTS)
1.0 1.0 1.0 1.1 1.1 1.2
6 Java Messaging service (JMS) 1.0 1.0 1.1 1.1 1.1 2.0
7 Servlets 2.2 2.3 2.4 2.5 3.0 3.1
8 Java Server Pages (JSP) 1.1 1.2 2.0 2.1 2.2 2.2
9 Java Server Faces (JSF) 1.2 2.0 2.2
10 Expression Language (EL) 2.2 3.0
11 Java Server Pages Standard Tag Libray (JSTL) 1.2 1.2 1.2
12 JavaMail 1.1 1.2 1.3 1.4 1.4 1.4
13 J2EE Connector Architecture (JCA) 1.0 1.5 1.5 1.6 1.6
14 Java API for XML Parsing (JAXP) 1.1 1.2
15 Java Authentication and Authorization Service (JAAS) 1.0
16 JavaBeans Activation Framework 1.0.2 1.0.2
17 Java API for XML-based RPC (JAXP-RPC) 1.1 1.1 1.1 1.1
18 SOAP with Attachments API for Java (SAAJ) 1.2 1.3
19 Java API for XML Registries (JAXR) 1.0 1.0 1.0 1.0
API JEE version de l'API dans J2EE/Java EE
1.2 1.3 1.4 5 6 7
20 Java Management Extensions (JMX) 1.2
21 Java Authorization Service Provider Contract for Containers (JACC) 1.0 1.1 1.4 1.4
22 Java API for XML-Based Web Services (JAX-WS) 2.0 2.2 2.2
23 Java Architecture for XML Binding (JAXB) 2.0 2.2
24 Streaming API for XML (StAX) 1.0
25 Java Persistence API (JPA) 1.0 2.0 2.1
26 Java API for RESTful Web Services (JAX-RS) 1.1 2.0
27 Web Services 1.2 1.3 1.3
28 Web Services Metadata for the Java Platform 2.1 2.1
29 Java APIs for XML Messaging (JAXM) 1.3
30 Context and Dependency Injection (CDI) 1.0 1.1
31 Dependancy Injection (DI) 1.0
32 Bean Validation 1.0 1.1
33 Managed beans 1.0 1.0
34 Interceptors 1.1 1.1
35 Common Annotations 1.1 1.1
36 Java API for WebSocket 1.0
37 Java API for JSON 1.0
38 Concurrency Utilities for Java EE 1.0
39 Batch Applications for the Java Platform 1.0
• Pour exécuter ces composants de natures
différentes, JEE définit des conteneurs
pour chacun d'eux.
• Les conteneurs permettent aux
applications d'accéder aux ressources et
aux services en utilisant les API.
• Les appels aux composants se font par
des clients en passant par les conteneurs.
• Les clients n'accèdent pas directement
aux composants mais sollicitent le
conteneur pour les utiliser.
L'ENVIRONNEMENT D'EXÉCUTION DES APPLICATIONS J2EE
Les conteneurs assurent la gestion du cycle
de vie des composants qui s'exécutent en
eux.
Il existe plusieurs conteneurs définis par JEE:
• conteneur web : pour exécuter les
servlets et les JSP
• conteneur d'EJB : pour exécuter les
EJB
• conteneur client : pour exécuter
des applications standalone sur les
postes qui utilisent des composants
JEE
Les serveurs d'applications peuvent fournir:
• un conteneur web uniquement
• ou un conteneur d'EJB uniquement
• ou les deux
LES CONTENEURS
Pour déployer une application dans un
conteneur, il faut lui fournir deux éléments:
• l'application avec tous les composants
(classes compilées, ressources ...) regroupés
dans une archive ou module. Chaque
conteneur possède son propre format
d'archive.
• un fichier descripteur de déploiement
contenu dans le module qui précise au
conteneur des options pour exécuter
l'application
DÉPLOIEMENT D’UNE APPLICATION
Il existe trois types d'archives (JAR, WAR ou EAR) :
1. Bibliothèque => JAR: Regroupe des classes
2. Application client => JAR: Regroupe les ressources
nécessaires à leur exécution (classes, bibliothèques, images,
...)
3. EJB => JAR: Regroupe les EJB et leurs composants (classes)
4. Web => WAR: Regroupe les servlets et les JSP ainsi que les
ressources nécessaires à leur exécution (classes,
bibliothèques de balises, images, ...)
5. Application => EAR : Une application est un regroupement
d'un ou plusieurs modules dans un fichier EAR (Entreprise
ARchive). L'application est décrite dans un fichier
application.xml lui-même contenu dans le fichier EAR
6. JCA =>RAR : JEE Connector Architecture (JCA) est la solution
de JEE pour résoudre le problème d’intégration entre le
monde JEE et le système d’information d’entreprise (EIS)
comme les ERP, mainframes, SGBD, applications anciennes
écrites en C, C++, COBOL…
DÉPLOIEMENT D’UNE APPLICATION
SERVEUR JEE
Un site web est un ensemble constitué de pages web (elles-mêmes faites
de fichiers HTML, CSS, Javascript, etc.).
On distingue deux types de sites
• les sites internet statiques : ce sont des sites dont le contenu est
«fixe», il n'est modifiable que par le propriétaire du site. Ils sont
réalisés à l'aide des technologies HTML, CSS et Javascript uniquement.
• les sites internet dynamiques : ce sont des sites dont le contenu est
«dynamique», en plus des langages précédemment cités, ils font
intervenir d'autres technologies (Java EE, PHP, dotnet, etc. )
SERVEUR JEE
La communication client/serveur qui s'effectue entre le client et le serveur est régie par des
règles de protocole HTTP:
1. l'utilisateur saisit une URL dans la barre d'adresses de son navigateur ;
2. le navigateur envoie alors une requête HTTP au serveur pour lui demander la page
correspondante ;
3. le serveur reçoit cette requête, l'interprète et génère alors une page web qu'il va
renvoyer au client par le biais d'une réponse HTTP ;
4. le navigateur reçoit, via cette réponse, la page web finale, qu'il affiche alors à
l'utilisateur.
SERVEUR JEE
• le client ne comprend que les langages de présentation comme : HTML, CSS et
Javascript (ils sont tous interprétés par le navigateur directement sur la machine
client).
• le serveur génère des pages à envoyer au client de manière dynamique, il dispose de
technologies (JEE, PHP, .NET, Django et Ruby on Rails, etc.) capable de :
• analyse des données reçues via HTTP.
• transformation des données.
• enregistrement des données dans une BD.
• intégration des données dans le design.
• Etc.
SERVEUR JEE
• Serveur http : c’est un serveur qui gère exclusivement des requêtes HTTP.
• Un serveur web JEE est constitué d'un serveur HTTP (Web) et d'un conteneur web
• Un serveur d'applications JEE est constitué d'un serveur HTTP, d'un conteneur web et d’un
conteneur EJB
SERVEUR JEE
• les solutions propriétaires et payantes : WebLogic (Oracle) et WebSphere (IBM),
sont les références dans le domaine, utilisées dans les banques et la finance, elles
sont à la fois robustes, finement paramétrables et très coûteuses.
• les solutions libres et gratuites : Apache Tomcat, JBoss, GlassFish et JOnAS sont les
principaux représentants.
SERVEUR JEE
FRAMEWORK
Il est parfois lourd d’utiliser un composant
standard de J2EE : trop ouvert, trop complexe,
design patterns à connaître et à implémenter.
Solution : les frameworks
• couches d'abstraction s'appuyant sur
d'autres briques plus génériques visant à
simplifier l’utilisation de certaines
technologies
• briques spécialisées intégrant un ensemble
de bonnes pratiques et un cadre de codage
Rank Framework Popularity
1 Spring mvc 28.82
2 JSF 15.2
3 Spring Boot 13.35
4 GWT 7.74
5 Grails 6.35
6 Struts 5.4
7 Dropwizard 4.9
8 Play framework 3.26
9 JHipster 2.49
10 jax-rs 2.44
11 Vaadin 2.15
12 Seam 1.94
13 Wicket 1.91
14 Tapestry 1.9
15 Sparkjava 0.77
16 Vert.x 0.76
17 Rapidoid 0.25
18 Lagom 0.24
19 Ratpack 0.13Web Frameworks Index at a Glance 2017/11/15 
Frameworks : Hibernate
• Permet l'accès à une SGBD
• Mapping objet/relationnel (ORM)
Frameworks : Struts
• Ne nécessite qu'un simple moteur de servlet
contrairement aux EJB
• Implémentation du modèle MVC2
• Basé sur les technologies Servlet/JSP
Frameworks : Spring
• Ne nécessite qu'un simple moteur de servlet
contrairement aux EJB
• Conteneur léger
• POA : programmation orienté aspect
FRAMEWORK
Les technologies des applications Web Java, coté serveur
DÉVELOPPEMENT APPLICATION WEB JEE
Environnement de Developpement Intégré (IDE)
• Eclipse IDE for Java EE Developers
• autres : Netbeans, Jdeveloper, etc.
Serveur Web
• Apache Tomcat
• Autres :Wildfly, GlassFish, etc.
Serveur BD
• Serveur MySql avec Workbench
• Autres: Postgres, SQLServer, Oracle, etc.
DÉVELOPPEMENT APPLICATION WEB JEE
APPLICATION WEB
• Les Servlets et les JSPs sont la base de JEE
• Les frameworks MVC les plus populaires aujourd’hui sont à la
base des Servlets et JSPs:
• Spring
• JSF
• Struts
 Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 23
• Une application web est composée de servlets,
JSP, html, et d'autres ressources
• La portabilité de telles applications impose :
– une structure commune
– une description standard de leur déploiement
• Toutes les ressources d'une application web sont
réunies dans un même répertoire dont la
structure est strictement définie.
• La description du déploiement est contenue dans
un fichier XML de nom web.xml
Application
WebContent
.html, .css,
.jsp, .jpg, …
WEB-INF
web.xml
html,
jsp,…
Lib
• jar
Classes
• *.class
 Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 24
• L'ensemble des fichiers peut être réuni dans un fichier
d'archive (.war ) sous forme compressée
• L'ensemble de ces informations est indépendante du
serveur et simplifie le portage et le déploiement d'une
application web
• Structure générale de déploiement d'une application
web:
• Ressources public : html, css, jsp, image, etc.
• Ressources privées: WEB-INF
• Classes: fichiers compilés (servlets, …)
• web.xml (fichier de déploiement ).
• html, jsp, etc.
• lib : jar
 Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 25
Application
WebContent
.html, .css,
.jsp, .jpg, …
WEB-INF
web.xml
html,
jsp,…
Lib
• jar
Classes
• *.class
• Le fichier web.xml est nommé
un fichier de déploiement ».
• Il contient en particulier des
informations établissant une
ou plusieurs correspondance
entre un répertoire cité par le
client et le véritable répertoire
concerné sur le serveur.
<?xml version= 1.0 encoding= UTF-8 ?>
<web-app version= 3.0 xmlns=
http://java.sun.com/xml/ns/javaee
xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation= http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd >
<servlet>
<servlet-name>nomServlet</servlet-name>
<servlet-class>cheminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>nomServlet</servlet-name>
<url-pattern>/urlServlet</url-pattern>
</servlet-mapping>
</web-app>
web.xml
 Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 26
SERVLET
CONCEPTS DE BASE
• Un ou une servlet est une classe Java qui permet de créer dynamiquement des données
au sein d'un serveur Web.
• Ces données sont le plus généralement présentées au format HTML, mais elles peuvent
également l'être au format XML ou tout autre format destiné aux navigateurs web.
UNE SERVLET
Version Date de sortie Plateforme
Servlet 4.0 Septembre 2017 JavaEE 8
Servlet 3.1 Mai 2013 JavaEE 7
Servlet 3.0 Décembre 2009 JavaEE 6, JavaSE 6
Servlet 2.5 Septembre 2005 JavaEE 5, JavaSE 5
Servlet 2.4 Novembre 2003 J2EE 1.4, J2SE 1.3
Servlet 2.3 Aout 2001 J2EE 1.3, J2SE 1.2
Servlet 2.2 Aout 1999 J2EE 1.2, J2SE 1.2
Servlet 2.1 Novembre 1998 --
Servlet 2.0 -- --
Servlet 1.0 Juin 1997 --
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 29
Les servlets utilisent l'API Java Servlet (package
javax.servlet).
À l'aide de Servlets, vous pouvez :
1. collecter les entrées des utilisateurs via des
formulaires de pages Web,
2. présenter des enregistrements à partir d'une base de
données ou une autre source,
3. et créer dynamiquement des pages Web.
• Pour exécuter une application à base de servlets, il faut disposer
d’un conteneur de servlets. Son rôle est la :
1. gestion des requêtes client
2. transmission des requêtes à une servlet
3. envoi des réponses au client
CONTENEURDE SERVLETS
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 30
Etape 1 : Créer la servlet
• Le paramètre req de type
HttpServletRequest donne accès aux
paramètres de la requête, à l'en-tête HTTP,
aux informations du client.
• Le paramètre res de type
HttpServletResponse contient les données
de la réponse aux client. Elles peuvent être
de n'importe quel type.
• Le type de réponses est précisé par la
méthode setContentType()
• La méthode getWriter retourne un objet
de type PrintWriter, flux de sortie pour le
texte HTML de la réponse
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet {
protected void doGet(
HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
PrintWriter page = res.getWriter();
page.println("<HTML>");
page.println("<HEAD><TITLE>Hello
World</TITLE></HEAD>");
page.println("<BODY>");
page.println("<H1>Hello World</H1> );
page.println("<H2>Bienvenue au cours de
Servlet</H2>");
page.println("</BODY></HTML>");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException
{ doGet(request, response); }
}
1ÈRE SERVLET
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 31
• Etape 2 : Déclarer la servlet dans le web.xml
• Le fichier web.xml est un fichier au format XML permet de décrire le déploiement de l’application au
serveur.
• Il permet de configurer : l'application, les servlets, les sessions, les bibliothèques de tags personnalisés, les
paramètres de contexte, les types Mimes, les pages par défaut, les ressources externes, la sécurité de
l'application et des ressources JEE.
<?xml version= 1.0 encoding= UTF-8 ?>
<web-app xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance
xmlns= http://xmlns.jcp.org/xml/ns/javaee xsi:schemaLocation=
http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-
app_3_1.xsd id= WebApp_ID version= 3.1 >
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>chemin.servlets.Hello </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 32
1ÈRE SERVLET
La déclaration de notre Servlet Hello
Le mapping de notre servlet sur
l'URL relative /hello
• Etape 3 : Appel de la servlet
L'exécution de cette servlet répond à une requête HTTP. Par exemple:
http://localhost:8080/CoursServlet/hello
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 33
1ÈRE SERVLET
Context-path url-patternserveur
CYCLE DE VIE
 Cycle de vie d’une servlet
• Il y a 5 étapes dans le cycle de vie d'une Servlet :
1. Charger la classe Servlet dans la mémoire.
2. Créer l'instance de la Servlet.
3. Appeler la méthode init() de Servlet.
4. Appeler la méthode service() de Servlet.
5. Appeler la méthode destroy() de Servlet.
• Les étapes 1, 2 et 3 sont exécutées une seule fois, lorsque
la Servlet est initialement chargée. Par défaut, la Servlet
n'est pas chargée jusqu'à ce que la première requête soit
reçue par l'utilisateur.
• L'étape 4 est exécutée plusieurs fois - une fois pour chaque
requête HTTP vers la Servlet.
• L'étape 5 est exécutée lorsque le conteneur de servlet
(Servlet Container) décharge (unloaded) la Servlet.
Prof Y.BOUKOUCHI - ENSA d'Agadir 35
Pour chaque requête effectuée, un lien est
créé entre le client et la servlet avec :
A. appel de la méthode service(…), qui
détermine le type de requête envoyée
(POST ou GET),
B. création de deux objets :
• HttpServletRequest: sert à extraire les
paramètres envoyés avec la requête.
• HttpServletResponse: sert à construire
la réponse pour le client.
C. Invocation de la méthode correspondante
doGet(…) ou doPost(…)
 Cycle de vie d’une servlet Prof Y.BOUKOUCHI - ENSA d'Agadir 36
LA CLASSE HTTPSERVLET
• public abstract class HttpServlet extends GenericServlet {
HttpServlet ()
// methodes repondant aux différents types de requêtes
protected void doDelete ( HttpServletRequest req , HttpServletResponse resp )
protected void doGet ( HttpServletRequest req , HttpServletResponse resp )
protected void doHead ( HttpServletRequest req , HttpServletResponse resp )
protected void doOptions ( HttpServletRequest req , HttpServletResponse resp )
protected void doPost ( HttpServletRequest req , HttpServletResponse resp )
protected void doPut ( HttpServletRequest req , HttpServletResponse resp )
protected void doTrace ( HttpServletRequest req , HttpServletResponse resp )
protected void service ( HttpServletRequest req , HttpServetResponse resp )
void service ( ServletRequest req , ServletResponse res )
Etc.
}
 Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 37
FORMULAIRES
MéthodesGetetPost
Pour transmettre des paramètres du client au serveur, il faut choisir entre deux
démarches :
1. Transmission des paramètres via un formulaire html et dans ce cas, il faut choisir
entre deux méthodes de transmission:
• la méthode GET : envoie les paramètres via l’URL, ils sont visibles dans le navigateur;
• la méthode POST : envoie les paramètres via l’en-tête http, ils sont masqués.
• Les paramètres de formulaires sont récupérables via HttpServletRequest, La
récupération se fait par les méthodes suivantes :
• Enumeration getParameterNames()
• String getParameterValues(String name)
• String getParameter(String name)
2. Transmission des paramètres via un URL et dans ce cas, leurs valeurs seront
récupérées par la méthode doGet.
http://localhost:8080/context-path/nomServlet?par1=val1&par2=val2
 Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 39
Les composants du formulaire :
<form method="post" id="form" action="FormStudent">
<fieldset>
<legend> Formulaire d'inscription</legend>
<label for="nom">Nom</label>
<input id="nom" name="nom" type="text" placeholder="Votre nom">
<textarea id="adresse" name="adresse" placeholder="Votre adresse" ></textarea>
<select id="pays" name="pays" >
<option value="Maroc">Maroc</option>
<option value="France">France</option>
</select>
<input type="radio" name="sexe" value="H" checked="checked"> Homme
<input type="checkbox" name="comptences" id="comptences-0"
value="JEE">Développement JEE
<input type="submit" name="S'enregistrer" value= " Valider" />
 Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 40
public class FormStudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
res.setContentType("text/html");
PrintWriter out= res.getWriter();
String nom=req.getParameter("nom");
…
String comptences[]=req.getParameterValues("comptences");
out.println("<HTML><HEAD><TITLE>Fiche Inscription</TITLE></HEAD>");
out.println("<BODY>");
out.println("<b>Nom : </b><b>"+nom+" "+prenom+ "("+sexe+")</b>");
out.println("<p>Email et mot de passe : "+email+" "+motpass+"</p>");
out.println("<p>Adresse et pays : "+adresse+" ("+pays+")</p>");
out.println("<p>Compténces:");
for(String s:comptences){
out.println(s+" ");
}
out.println("</p>");
out.println("</BODY></HTML>");
}
}
 Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 41
Attention: Si aucun paramètre
nommé n’a été fourni lors de
l’appel, on obtiendra en retour
de l’appel de getParameter la
valeur null.
LES OBJETS D’INFORMATIONS
Informationsàpartirl’objetdeServletRequest
• Informations à propos du client:
• getRemoteAddr(): récupère l'adresse IP de l'hôte qui a initié la requête.
• getRemoteHost(): renvoie le nom de la machine hôte qui a initié la requête.
• Informations à propos du serveur:
• getServerName(): permet d'obtenir le nom du serveur
• getServerPort(): permet d'obtenir le numéro du port
• Informations à propos de l’URL:
• getRequestURI(): permet d'obtenir l'URL sur lequel porte la requête.
• Autres informations de l’en-tête:
• getHeaderNames() : de récupérer une liste des noms des entêtes passés par le client lors de la requête.
Cette méthode renvoie un objet de type Enumeration.
 Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 43
De nombreuses informations en provenance du client peuvent être extraites de l'objet
ServletRequest passé en paramètre par le serveur.
• Exemple ‣ http://localhost/exemples/servlets/TraceServlet/tutu?toto=titi
• getMethod() → GET
• getPathInfo() → /tutu
• getQueryString() → toto=titi
• getRequestURI() → /exemples/servlets/TraceServlet/tutu
• getServletPath() → /servlets/TraceServlet
• getContextPath() → /exemples
 Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 44
Informationsàpartirl’objetdeServletRequest
out.println("<b>Quelques informations fournies par l'objet requête</b><br>");
out.print("Adresse IP de l'hote :"+req.getRemoteAddr()+"<br>");
out.print("Nom de la machine hote :"+req.getRemoteHost()+"<br>");
out.print("Nom du serveur:"+req.getServerName()+"<br>");
out.print("Port du serveur:"+req.getServerPort()+"<br>");
out.print("URL de la requête:"+req.getRequestURI()+"<br>");
out.println("---------- Les en-têtes de la requete -----<br>");
String entete;
while(headers.hasMoreElements()){
entete=headers.nextElement();
out.println("En-tête : "+entete +", sa valeur : "+req.getHeader(entete)+"<br>");}
La servlet peut obtenir des informations à partir d'un objet ServletContext retourné par la
méthode getServletContext() d'un objet ServletConfig.
• getServerInfo(): Retourne le nom et le numéro de version du moteur de servlet
• getContextPath() : Retourne le contexte de l’application
• getSessionTimeout(): Retourne la durée de vie des sessions
• getRealPath("nomFichier"): Retourne le chemin d’un fichier dans le serveur.
• getInitParameter(String name):Retourne la valeur d’un paramètre d’initialisation.
• getInitParameterNames(): Retourne la liste des paramètres d’initialisation.
• setAttribute(String name,Object object): Définie un objet comme attribue de l’application.
• Etc.
Informationsàpartirl’objetdeServletContext
 Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 45
ServletContext context=getServletContext();
out.println("<b>Quelques informations fournies par l'objet requête</b><br>");
out.print("Serveur utilisé :"+context.getServerInfo()+"<br>");
out.print("Contexte path :"+context.getContextPath()+"<br>");
out.print("Session Timeout :"+context.getSessionTimeout()+"<br>");
out.print("Chemin réel du fichier
:"+context.getRealPath("HeaderInfosServlet")+"<br>");
TRANSMISSION DU CONTRÔLE
• La transmission du contrôle permet :
• une servlet de traiter en partie une requête et transmettre le contrôle à une autre
servlet pour la suite du traitement.
• une servlet de transmettre le contrôle à une page JSP pour générer la réponse.
• Pour transmettre le contrôle on utilise l’objet de type RequestDispatcher, obtenu en
invoquant la méthode getRequestDispatcher("Chemin") de la requête.
• RequestDispatcher dispatcher = req. getRequestDispatcher("/Welcome");
• Le chemin doit correspondre à une ressource se trouvant dans la même application web,
il ne peut pas référencer de ressource externe. La ressource désignée par ce chemin peut
être statique (une image, ou un fichier), ou dynamique (une servlet).
 Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 47
• L’objet RequestDispatcher expose deux méthodes:
• forward() redirige la requête vers la ressource désignée.
• include() inclut cette ressource dans la réponse courante.
• Ces deux méthodes prennent en paramètre la requête et la réponse courantes.
 Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 48
 Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 49
String login=req.getParameter("login");
String motpass=req.getParameter("motpass");
if(login.equals("boukouchi")&&motpass.equals("admin")){
RequestDispatcher dispatcher = req. getRequestDispatcher("/Welcome");
dispatcher. forward(req, res);
} else{
res.setContentType("text/html");
PrintWriter out= res.getWriter();
out.println("<b>Email ou mot de pass est invalide</b>");
RequestDispatcher dispatcher = req. getRequestDispatcher("/index.html");
dispatcher. include(req, res);
}
• La 3e méthode de transmission du contrôle est la méthode sendRedirect appelée par l’objet
HttpServletResponse.
• Le serveur envoie une réponse 302 au navigateur qui initie une nouvelle requête sur le même
serveur ou sur un autre serveur vers l’URL transmis dans la réponse (URL relative ou absolue).
• Lorsqu’il s’agit de continuer sur le même serveur forward est préférable, car plus rapide.
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// construction redirection par le client
response .sendRedirect("http://www.ensa-agadir.ac.ma");
//Ou interne : response .sendRedirect("WelcomeStudent");
// le traitement de la requête courante continue
}
 Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 50
LaméthodesendRedirect
LES PARAMÈTRES & LES ATTRIBUTS
Paramètresd'initialisationdelaservlet
 Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 52
• Les paramètres d'initialisation d’une servlet sont
déclarés dans l'élément servlet du
fichier web.xml, et sont lus dans la
méthodes init(), via l'objet ServletConfig.
• Les valeurs de ces paramètres peuvent être
retrouvées dans le code de la servlet grâce à la
méthode getInitParameter() de l'objet
ServletConfig.
• On peut également accéder à la liste de tous les
paramètres d'initialisation par appel à la méthode
getInitParameterNames(), qui retourne
un Enumeration.
private String databaseUser;
private String databasePW;
public void init( ServletConfig config) throws ServletException {
databasePW= config .getInitParameter ("dbUserPw");
databaseUser = config .getInitParameter ("dbUser");
}
<servlet>
<servlet-name>ParametersServlet</servlet-name>
<servlet-class>...ParametersServlet</servlet-class>
<init-param>
<param-name>dbUser</param-name>
<param-value>infoDB</param-value>
</init-param>
<init-param>
<param-name>dbUserPw</param-name>
<param-value>admin</param-value>
</init-param>
</servlet>
• Ces paramètres peuvent être association à un
ensemble de Servlets:
• contrairement aux paramètres d'initialisation de
Servlet précédents,
• ceux-ci sont commun à toutes les Servlets de
l'application web.
Paramètresd'initialisationducontexte
 Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 53
String databaseName ;
String databaseDriver ;
public void init(ServletConfig config) throws ServletException {
ServletContext context =config . getServletContext();
databaseName = context . getInitParameter ("databaseName");
databaseDriver = context . getInitParameter ("databaseDriver");
}
<context-param>
<param-name>databaseName</param-name>
<param-value>GestionDB</param-value>
</context-param>
<context-param>
<param-name>databaseDriver</param-name>
<param-value>MySQL</param-value>
</context-param>
PortéedesObjets
• la portée des objets souvent appelée visibilité, ou
scope en anglais, elle définit tout simplement leur
durée de vie.
• Il existe au total quatre portées différentes dans
une application :
1. page (JSP seulement) : les objets dans cette portée
sont uniquement accessibles dans la page JSP en
question ;
2. requête (HttpServletRequest): les objets dans
cette portée sont uniquement accessibles durant
l'existence de la requête en cours ;
3. Session (HttpSession) : les objets dans cette
portée sont accessibles durant l'existence de la
session en cours ;
4. Application (ServletContext): les objets dans cette
portée sont accessibles durant toute l'existence de
l'application.
 Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 54
• Il est possible d’ajouter des attributs personnels soit au
niveau de la requête , la session ou bien le contexte
(l’application).
• Ces attributs sont des paires clé/valeur, la clé étant une
chaîne de caractères et la valeur étant un objet de
n’importe quel type.
• Il y a des méthodes qui permet de stocker, récupérer et
détruire ces attributs:
• La méthode setAttribute(nom, objet). Si le nom de
l’attribut existe déjà, la valeur existante est remplacée par
la nouvelle.
• La méthode getAttribute(nom) est utilisée pour récupérer
la valeur d’un attribut de type quelconque dans
l’application ou la valeur null si l’attribut n’existe pas.
• La méthode getAttributesNames() permet de récupérer
le nom de tous les attributs.
• la méthode removeAttribute(nom) permet la suppression
de l’attribut indiqué.
Lesattributs
 Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 55
request.setAttribute("att_req", "valeur");
String att = (String)request.getAttribute("att_req");
request.removeAttribute("att_req");
ServletContext context=getServletContext();
context.setAttribute("att_app", "valeur");
String att = (String)context.getAttribute("att_app");
context.removeAttribute("att_app");
HttpSession session=request.getSession();
session.setAttribute("att_sess", "valeur");
String att = (String)session.getAttribute("att_sess");
session.removeAttribute("att_sess");
 Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir<web-app …>
<context-param>
<param-name>societe</param-name>
<param-value>ENSA d'Agadir</param-value>
</context-param>
<servlet>
<servlet-name>compteur</servlet-name>
<servlet-class>...CompteurServlet</servlet-class>
<init-param>
<param-name>role</param-name>
<param-value>administrateur</param-value>
</init-param>
</servlet>
...
</web-app>
56
public class CompteurServlet extends HttpServlet {
private ServletConfig config;
private ServletContext context;
private int compteurServlet = 0;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.context = config.getServletContext();}
protected void doGet(HttpServletRequest req, HttpServletResponse res) …{
HttpSession session = req.getSession(true);
Integer compteurSession = (Integer) session.getAttribute("compteur");
if (compteurSession == null) {compteurSession = 1;
session.setAttribute("compteur", compteurSession);
} else {compteurSession++;
session.setAttribute("compteur", compteurSession); }
String role = config.getInitParameter("role");
String societe = context.getInitParameter("societe");
compteurServlet++;
res.setContentType("text/html");
PrintWriter page = res.getWriter();
page.println("<HTML><HEAD><TITLE>Compteur</TITLE></HEAD><BODY>");
page.println("<h2>Paramètres et Attributs</h2>");
page.println("<h3>Etablissement :" + societe + "</h3>");
page.println("<h3>Role :" + role + "</h3>");
page.println("<b>Nombre totale des requetes/servlet: </b><b>" + compteurServlet + "</b></br>");
page.println("<b>Nombre totale des requetes/servlet/Session: </b><b>" + compteurSession + "</b>");
page.println("</BODY></HTML>");
SESSION TRACKING
• Le protocole HTTP est un protocole non connecté ( protocole sans états, en anglais
stateless protocol), cela signifie que chaque requête est traitée indépendamment
des autres et qu'aucun historique des différentes requêtes n'est conservé.
• →le serveur web ne peut pas se "souvenir" de la requête précédente: panier,
login, préférences, etc.
• Alors, le suivi de session (session tracking) ou bien la gestion de la session (session
management) est un mécanisme de gestion des états, permet de maintenir la
cohésion entre l'utilisateur et la requête, c'est-à-dire :
• reconnaître les requêtes provenant du même utilisateur
• associer un profil à l'utilisateur
• connaître les paramètre de l'application (nombre de produits vendus, panier, ...)
• Il y a quatre techniques pour assurer le Session Tracking:
1. en utilisant les cookies
2. en passant en paramètre un champ de formulaire caché
3. en ajoutant à l'URL des variables d'identification
4. en utilisant le HttpSession
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 58
Techniquesde SessionTracking
• Les cookies sont des petits fichiers textes stockés sur le
disque du client, permettant de stocker des paires
clés/valeur.
• Les cookies concernant le domaine du site sur lequel un
utilisateur surfe sont automatiquement envoyés dans les
en-têtes HTTP lors de chaque requête du client.
• Lorsque le serveur désire créer un cookie sur le
navigateur du client, il lui suffit d'envoyer des
instructions dans les en-têtes de la réponse HTTP.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 59
Lescookies
• un cookie a obligatoirement un nom et une valeur associée.
• Propriétés optionnelles importantes
• Max Age : durée de rétention de l’information (date
d'expiration)
• Domain : domaine auquel l’information peut –être associée
• Path: chemin où le client doit renvoyer l’information
• Avantage des cookies
• Technique la plus simple de maintien de l'état.
• Les cookies sont conservés côté client.
• Inconvénient des cookies
• Cela ne fonctionnera pas si le cookie est désactivé à partir du
navigateur.
• Seules les informations textuelles peuvent être définies dans
l'objet Cookie.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 60
Lescookies
La classe javax.servlet.http.Cookie fournit un ensemble de fonction pour la gestion d’un
cookie:
• Cookie() : constructeur.
• Cookie(String name, String value) : Constructeur créant un objet Cookie de nom Name et de
valeur Value).
• public String getName() : Retourne le nom du cookie
• public String getValue() : Retourne la valeur du cookie.
• public void setName(String name) : Redéfinit le nom du cookie.
• public void setValue(String value) : Redéfinit la valeur du cookie.
• public void setMaxAge(int expiry): Définit la durée de validité du cookie (en secondes).
• int getMaxAge() : Retourne la durée de validité du cookie (en secondes)
• String getDomain() : Retourne le domaine pour lequel le cookie est valide
• void setDomain(String Domain) : Définit le domaine pour lequel le cookie est valide
• String getPath() : Retourne le chemin pour lequel le cookie est valide
• void setPath(String Chemin) : Définit le chemin pour lequel le cookie est valide
• int getVersion() : Retourne la version du cookie
• void setVersion(int Version) : Définit la valeur du cookie
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 61
Lescookies
Pour ajouter un cookie ou obtenir sa valeur, nous avons besoin de méthodes fournies par d'autres
interfaces. Elles sont:
• public void addCookie(Cookie ck) : la méthode de HttpServletResponse utilisée pour ajouter le cookie
à la réponse.
• public Cookie[] getCookies() : la méthode de HttpServletRequest utilisée pour récupérer tous les
cookies à partir de navigateur
• Créer un Cookie:
Cookie ck=new Cookie("user","boukouchi"); //créer un objet cookie
ck.setMaxAge(30*60) //Max Age : durée de rétention de l’information
response.addCookie(ck); //ajouter une cookie à la réponse
• Supprimer un Cookie (Il est principalement utilisé pour déconnecter l'utilisateur.)
Cookie ck=new Cookie("user",""); //supprimer la valeur du cookie
ck.setMaxAge(0); //changer l'âge max à 0
response.addCookie(ck); //ajouter un cookie à la réponse
• Récupérer des Cookies:
Cookie ck[]=request.getCookies();
for(int i=0;i<ck.length;i++){ out.print("<br>"+ck[i].getName()+" "+ck[i].getValue()); //afficher le nom et la valeur }
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 62
Lescookies
Servlet1 Servlet2
Cookie invalide après 60 secondes
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 63
<form action="servlet1" method="get">
<label for="email">Adresse Email</label>
<input type="email" name="email" >
<button type="submit">Envoyer</button>
</form>
String email = request.getParameter("email");
Cookie ck = new Cookie("email", email);
ck.setMaxAge(1 * 60);
response.addCookie(ck);
response.setContentType("text/html");
page.println("<HTML><HEAD><TITLE>Session
Tracking</TITLE></HEAD><BODY>");
…
Cookie cks[] = request.getCookies();
int indice = -1;
for (int i = 0; i < cks.length; i++) {
if (cks[i].getName().equals("email"))
indice = i;
}
if (indice != -1 && cks[indice].getValue() != null) {
response.setContentType("text/html");
...
page.println("<h3>Bienvenue : " +
cks[indice].getValue() + "</h3>");
...
} else {
response.sendRedirect("login.html");
}
Dans cet exemple, nous stockons l’adresse email de
l'utilisateur dans l'objet cookie et nous y accédons dans
une autre servlet.
• Dans le cas d'un champ de formulaire masqué (Hidden Form Field), un champ de texte
masqué (invisible) est utilisé pour conserver l'état d'un utilisateur.
• Dans ce cas, nous stockons les informations dans le champ caché et les récupérons à
partir d'un autre servlet.
• Cette approche est préférable si nous devons soumettre le formulaire dans toutes les
pages et que nous ne voulons pas dépendre du navigateur.
• <input type="hidden" name=“name" value=“Boukouchi">
• Avantage du champ de formulaire caché
• fonctionne toujours.
• Inconvénient du champ de formulaire masqué:
• Il est maintenu côté serveur.
• Un formulaire supplémentaire est requis sur chaque page.
• Seules les informations textuelles peuvent être utilisées.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 64
Champdeformulairecaché
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 65
Champdeformulairecaché
<form action="servlet1" method="get">
<label for="email">Adresse Email</label>
<input type="email" name="email" >
<button type="submit">Envoyer</button>
</form>
String email = request.getParameter("email");
…
page.println("<form action="servlet2"
method="get">");
page.println("<input type="hidden"
name="email" value="" + email + "">");
page.println("<button
type="submit">Envoyer</button></form>");
page.println("</BODY></HTML>");
String email = request.getParameter("email");
if (email != null) {
response.setContentType("text/html");
…
page.println("<h3>Bienvenue : " + email +"</h3>");
page.println("<p>Session Tracking par Hidden
Form Field</p>");
…
} else {
response.sendRedirect("login.html");
}
Dans cet exemple, nous stockons l’adresse email de
l'utilisateur dans un champ caché et nous y accédons dans
une autre servlet.
Servlet1 Servlet2
Champ invalide (null)
• Dans la réécriture d'URL(URL rewriting), nous ajoutons les données à l'URL du prochain
servlet ou de la prochaine ressource.
• Nous pouvons envoyer des paires nom / valeur de paramètre en utilisant le format
suivant: url? name1 = valeur1 & name2 = valeur2
• Lorsque l'utilisateur clique sur le lien hypertexte, les paires nom / valeur de paramètre
sont transmises au serveur. À partir d'un servlet, nous pouvons utiliser la méthode
getParameter () pour obtenir une valeur de paramètre.
• Avantage de la réécriture d'URL
• fonctionne toujours.
• Pas de formulaire supplémentaire.
• Inconvénient de la réécriture d'URL
• Cela fonctionnera uniquement avec des liens.
• Il peut envoyer uniquement des informations textuelles.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 66
laréécritured'URL
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 67
laréécritured'URL
<form action="servlet1" method="get">
<label for="email">Adresse Email</label>
<input type="email" name="email" >
<button type="submit">Envoyer</button>
</form>
String email = request.getParameter("email");
…
page.println("<h3>Bienvenue : " + email +
"</h3>");
page.println("<hr>");
page.println("<a href='servlet2?email=" + email +
"'>suivant</a>");
page.println("</BODY></HTML>");
String email = request.getParameter("email");
if (email != null) {
response.setContentType("text/html");
…
page.println("<h3>Bienvenue : " + email +"</h3>");
page.println("<p>Session Tracking par Réécriture
d'URL</p>");
…
} else {
response.sendRedirect("login.html");
}
Dans cet exemple, nous stockons l’adresse email de
l'utilisateur dans un lient et nous y accédons dans une
autre servlet.
Servlet1 Servlet2
Paramètre invalide (null)
• la session représente un espace mémoire alloué pour chaque utilisateur, permettant de
sauvegarder des informations tout le long de leur visite ;
• le contenu d'une session est conservé jusqu'à ce que l'utilisateur ferme son navigateur,
reste inactif trop longtemps, ou encore lorsqu'il se déconnecte du site ;
• L’objet HTTPSession permet :
• Gestion des objets dans la session : ajout, modification, retrait, recherche, etc.
• Gestion des méta-information à propos de la session elle-même : date de création, id
de la session, etc.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 68
HttpSession
Nom :JSESSIONID, Valeur :295C0FB721251D83BACD24AD7E34EF36
• L'objet HttpSession s'obtient grâce à la méthode getSession() de l'objet HttpServletRequest,
chaque utilisateur se voit attribuer un Session ID
• Utiliser cette méthode : HttpServletRequest.getSession() // par défaut true
HttpSession session = request.getSession(true);
• Retourne la session en cours, ou crée une (true) si il n’en existe pas.
HttpSession session = request.getSession(false);
• Retourne la session en cours, ou null si il n’en existe pas.
• Méthodes pour le cycle de vie d’une session:
• Récupérer le session ID -> public String getId();
• Voir si la session vient juste d’être créée -> public boolean isNew();
• Récupérer la date de création -> public long getCreationTime();
• Dernière fois que la session a été activée-> public long getLastAccessedTime();
• Terminer (invalider) une session -> public void invalidate(); Les sessions peuvent se terminer
automatiquement lors de périodes d’inactivité
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 69
HttpSession
• Récupérer des données de la session :
Integer accessCount = (Integer) session.getAttribute(" nom");
• Récupérer toutes les « clés » de tous les objets dans la session :
Enumeration attributes = request.getAttributeNames();
• Mettre des données dans la session:
HttpSession session = request.getSession();
session.setAttribute("nom", "Boukouchi");
• Et on peut les supprimer :
session.removeAttribute("name");
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 70
HttpSession
• Retourne l'intervalle de temps maximum (timeout)entre deux requête avant que la
session n'expire (en seconde)
public int getMaxInactiveInterval();
• Si on spécifie cet intervalle, la session sera fermée (invalidée) automatiquement
lorsqu’un utilisateur ne fait rien pendant un temps plus long
public void setMaxInactiveInterval( int secondes )
• Si la valeur est négative : jamais d’interruption
• Le timeout par défaut peut-être codé dans le descripteur de déploiement
(fichierweb.xml) en ajoutant les balises :
• <session-config>
<session-timeout>
120 <!-- en minutes -- >
</session-timeout>
</session-config>
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 71
HttpSession
• Le Session ID est communiqué au client:
• Option 1: si le navigateur supporte les cookies,
la Servlet créée un cookie avec le session ID,
dans Tomcat, ce cookie est appelé JSESSIONID
• Cookie : contient les cookies HTTP stockés
précédemment envoyés par le serveur à
l'aide de l'en-tête Set-Cookie.
• Set-Cookie : envoie des cookies du serveur
à l'agent utilisateur.
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 72
HttpSession
• Option 2: si le navigateur ne supporte pas les cookies, la servlet va essayer de récupérer le
session ID depuis l’URL (la servlet doit réécrire URL locale avant de l’envoyer au client en
utilisant les fonctions suivantes encodeURL() ou encodeRedirectURL () de
HttpServletResponse.
• La servlet peut déterminer si l’identifiant de session est valide par la fonction suivante:
• public boolean HttpServletRequest.isRequestedSessionIdValid()
• La servlet peut détecter si l’identifiant de la session vient d’un cookie ou d’une URL codée
en utilisant :
• public boolean HttpServletRequest.isRequestedSessionIdFromURL()
• public boolean HttpServletRequest.isRequestedSessionIdFromCookie()
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 73
HttpSession
page.println("<h3>Session ID : " + session.getId() + "</h3>");
page.println("<hr>");
page.println("<a href='" + response.encodeUrl("servlet8?email=" + email) + "'>suivant</a>");
 Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 74
HttpSession
<form action="servlet1" method="get">
<label for="email">Adresse Email</label>
<input type="email" name="email" >
<button type="submit">Envoyer</button>
</form>
HttpSession session = request.getSession();
Date dateCreationS = new
Date(session.getCreationTime());
Date dateInactiviteS = new
Date(session.getLastAccessedTime());
String email = request.getParameter("email");
session.setAttribute("email", email);
…
page.println("<h4>Session ID : " + session.getId() +
"</h4>");
…
HttpSession session = request.getSession();
Date dateCreationS = new
Date(session.getCreationTime());
Date dateInactiviteS = new
Date(session.getLastAccessedTime());
String email = (String)
session.getAttribute("email");
if (email != null) {
…
} else {
response.sendRedirect("login.html");
}
Dans cet exemple, nous stockons l’adresse email de l'utilisateur
dans une session et nous y accédons dans une autre servlet.
Servlet1 Servlet2
Attribut Session invalide (null)
LES LISTENERS
• Un objet listener (écouteur, observateur) est un objet qui écoute certains événements
dans une application.
• Pour le conteneur Web Java EE, un listener designe une classe qui implémente une des
interfaces définies dans l’API servlet.
• Lorsque l'événement qu'il écoute se déclenche, alors ce listener s'active : une de ses
méthodes particulière (callback) est invoquée, avec en paramètre un objet portant les
informations sur cet événement (ServletContextEvent, HttpSessionEvent , etc.).
• Ces objets doivent implémenter des interfaces standard, fournies par l'API Servlet
(ServletContextListener, HttpSessionListener, etc.), et être déclarés dans le descripteur
d'une application web :
• le fichier web.xml
<listener>
<listener-class>
package.maClasseListener
</listener-class>
</listener>
• ou bien annotée avec @WebListener
 Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 76
@WebListener
public class MaClasseListener implements APIServletListener {
public MaClasseListener() { }
public void methodeCallback 1 (APIServletEvent event) {
// traitement
}
}
Voici quelques événements définis par l'API Servlet:
• Ajout ou le retrait d'un attribut (Changes to attributes) sur
un contexte, une session ou une requête :
• Événements : ServletContextEvent, HttpSessionEvent et
ServletRequestEvent.
• Listeners: ServletContextAttributeListener,
ServletRequestAttributeListener et
HttpSessionAttributeListener.
• la création ou à la destruction (LifeCycle) du contexte,
d’une session, ou d'une requête:
• Événements : ServletContextEvent, HttpSessionEvent
et ServletRequestEvent.
• Listener : HttpContextListener, HttpRequestListener,
HttpSessionListener et HttpSessionActivationListener.
• Etc.
 Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 77
• L’exemple ci-dessous présente ContextListener qui implémente ServletContextListener dont
le rôle est de réaliser un log applicatif signalant respectivement le lancement et l’arrêt de
l’application Web.
 Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 78
@WebListener
public class ContextListener implements ServletContextListener {
public ContextListener() {
}
public void contextDestroyed(ServletContextEvent sce) {
sce.getServletContext().log("## Arrêt de l'application ##");
}
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().log("## Lancement de l'application ##");
}
}
 Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 79
• L’exemple ci-dessous présente SessionListener qui implémente HttpSessionListener dont le
rôle est de compter le nombre de visiteur connectés à l’application web.
@WebListener
public class SessionListener implements HttpSessionListener {
private int compteurVisiteur = 0;
public SessionListener() {}
public void sessionCreated(HttpSessionEvent se) {
synchronized (this) {
compteurVisiteur++;
System.out.println("Nombre de Visiteur : " + compteurVisiteur);
}
}
public synchronized void sessionDestroyed(HttpSessionEvent se) {
compteurVisiteur--;
System.out.println("Nombre de Visiteur : " + compteurVisiteur);
}
}
LES FILTRES
• Les filtres sont des codes exécutés entre les requêtes et les servlets ou pages JSP, pour
faire un pré- ou post-traitement sur les requêtes ou les réponses.
• Il est déclaré dans le descripteur de l'application web.xml, et posé sur une ou plusieurs
servlets.
• Lorsqu'une requête doit être traitée par une servlet sur laquelle un filtre est déclaré, alors
le serveur, plutôt que d'invoquer directement la méthode doGet() ou doPost() de la
servlet, va invoquer la méthode doFilter() de ce filtre.
• Un filtre peut agir sur tous les aspects du cycle requête / réponse, en modifiant l'un ou
l'autre
• Nombreuses utilisations des filtres :
• Authentification,
• redirection,
• modification des entêtes,
• cryptage des données,
• contrôle des accès effectués par les clients,
• journalisation des accès
• …
 Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 81
• un filtre est une classe qui doit implémenter
l'interface Filter.
• Cette interface définit trois méthodes :
• init(FilterConfig) : méthode callback, appelée
lors de la construction de cet objet par le
serveur d'applications.
• destroy() : méthode callback, appelée lors de la
destruction de cet objet par le serveur
d'applications.
• doFilter(ServletRequest, ServletResponse,
FilterChain) : cette méthode est appelée sur
requête HTTP, au lieu de l'appel d'une servlet
sur lequel ce filtre est déclaré.
• La propagation de la requête au filtre suivant, ou
à la servlet est faite en invoquant
filterChain.doFilter(request, response).
public class TransparentFilter implements Filter {
public void init(FilterConfig filterConfig) {
// l'objet filterConfig encapsule les paramètres
// d'initialisation de ce filtre
}
public void destroy() {
// callback de destruction de ce filtre
}
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain filterChain)
throws IOException, ServletException {
// propagation de la requête le long de la chaîne
filterChain.doFilter(request, response) ;
}
}
 Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 82
Cycledevied'unFiltre
• Un filtre doit être déclaré dans le fichier web.xml
de l'application.
• De même qu'une servlet, un filtre est déclaré en
deux temps :
• d'une part par sa classe d'implémentation,
• d'autre part par l'URL qu'il filtre.
<web-app>
<!-- déclaration de la classe d'implémentation du filtre -->
<filter>
<filter-name>nomFilter</filter-name>
<filter-class>chemin.classFilter</filter-class>
</filter>
<!-- déclaration des URL interceptées par ce filtre -->
<filter-mapping>
<filter-name>nomFilter</filter-name>
<url-pattern>/urlServlet</url-pattern>
</filter-mapping>
<!-- suivent les déclarations des servlets -->
<servlet>
<servlet-name>nomServlet</servlet-name>
<servlet-class>chemin.classServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>nomServlet</servlet-name>
<url-pattern>/urlServlet</url-pattern>
</servlet-mapping>
</web-app>
 Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 83
Déclarationd'unFiltre
• Filtrage d'une requête pour
la journalisation
• il s'agit juste d'enregistrer
les informations du client
qui a soumis la requête.
@WebFilter("/*")
public class LoggerFilter implements Filter {
private Logger log = Logger.getLogger("LoggerFilter");
public LoggerFilter() {
log.log(Level.INFO, "Création de filtre");
}
public void init(FilterConfig fConfig) throws ServletException {
log.log(Level.INFO, "Initialisation de filtre");
}
public void destroy() {
log.log(Level.INFO, "Destruction de filtre");
}
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
String host = httpRequest.getRemoteHost();
String url = httpRequest.getRequestURL().toString();
log.log(Level.INFO,"L'hôte["+host+"] fait une requête sur ["+url+
"]");
chain.doFilter(request, response);
}
}
<filter>
<filter-name>Logger</filter-name>
<filter-class>
ma.boukouchi.filter.LoggerFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Logger</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
 Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 84
OU
LES @NNOTATIONS & WEB.XML
• Les annotations sont une nouveauté apportée par la version 5 de Java pour ajouter
des métadonnées à un code source.
• Elle peut s'appliquer à un package, une classe, une interface, un constructeur, une
méthode, un champ, un argument de méthode, une variable locale ou encore à une autre
annotation.
• Lors de la compilation des codes sources, le compilateur Java stocke les métadonnées
d'annotation dans les fichiers classes. Plus tard, la JVM ou d'autres programmes peuvent
accéder à ces métadonnées pour déterminer comment interagir avec les composants du
programme ou changer leur comportement.
• La syntaxe d'une annotation est la suivante :
@annotation-type[ (name=value) * ]
• Exemple:
• @Deprecated : Cette annotation marque une entité obsolète.
• @Override : Cette annotation marque une méthode redéfinie.
• @SuppressWarnings : Cette annotation signale au compilateur de supprimer certains avertissements à la
compilation de l'entité.
 web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 86
Principeetfonctionnement
• Le fichier web.xml contient un
nombre important d’informations
concernant l’application web Java.
• Servlet 3.0 a apporté de
nombreuses annotations qui
évitent de remplir le fichier
web.xml.
• Pour des applications simples, le
fichier web.xml est facultatif mais
pour d’autre il est nécessaire
encore pour certaines tâches.
Les Annotations introduites par Servlet 3.0
1 @WebServlet
2 @WebInitParam
3 @WebFilter
4 @WebListener
5 @HandlesTypes
6 @HttpConstraint
7 @HttpMethodConstraint
8 @MultipartConfig
9 @ServletSecurity
 web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 87
Principeetfonctionnement
• Elle permet de déclarer une
servlet.
• Attributs:
• name
• value
• urlPatterns: obligatoire !
• loadOnStartup
• initParams
• asyncSupported
• smallIcon, largeIcon
• description
• displayName
 web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 88
Annotation@WebServlet <servlet>
<servlet-name> Inscription</servlet-name>
<servlet-class>chemin.Inscription</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Inscription</servlet-name>
<url-pattern>/inscription</url-pattern>
</servlet-mapping>
@WebServlet( "/inscription" )
public class Inscription extends HttpServlet {
...
@WebServlet( name="Inscription", urlPatterns = "/inscription" )
public class Inscription extends HttpServlet {
...
@WebServlet(urlPatterns = {"/inscription", "/registration "})
public class Inscription extends HttpServlet {
...
• Elle permet de définir les
paramètres d’initialisation d’une
servlet ou d’un filtre.
• Elle est dans l’annotation
@WebFilter ou @WebServlet.
• Attributs:
• name
• value
• description
 web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 89
Annotation@WebInitParam <servlet>
<servlet-name>Download</servlet-name>
<servlet-class>packages.Download</servlet-class>
<init-param>
<param-name>chemin</param-name>
<param-value>/fichiers/</param-value>
</init-param>
</servlet>
...
@WebServlet( urlPatterns = "/fichiers/*", initParams =
@WebInitParam( name = "chemin", value = "/fichiers/" ) )
public class Download extends HttpServlet {
...
• @WebFilter permet de définir un
filtre.
• Attributs:
• urlPatterns
• initParams
• filterName
• servletNames
• urlPatterns
• dispatcherTypes
• @WebListener permet de définir un
observateur.
 web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 90
Annotation@WebFilteret@WebListener <filter>
<filter-name>RestrictionFilter</filter-name>
<filter-class>...RestrictionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RestrictionFilter</filter-name>
<url-pattern>/restreint/*</url-pattern>
</filter-mapping>
...
@WebFilter( urlPatterns = "/restreint/*" )
public class RestrictionFilter implements Filter {
...
<listener>
<listener-class>...InitialisationDaoFactory</listener-class>
</listener>
...
@WebListener
public class InitialisationDaoFactory implements
ServletContextListener {
...
JSP
JAVA SERVER PAGES
• La JavaServer Pages ou JSP est une technique basée sur Java qui permet de créer
dynamiquement des pages web.
• un JSP est une page HTML dans laquelle sont introduits des morceaux de code
Java nommés script .
• il existe plusieurs sortes de script: scriptlet, déclarations, commentaires,
Expressions, etc.
• Il faut minimiser le code java dans une page JSP (refactoriser le code, modèle
MVC, etc.)
• il existe d’autres balises spécifiques aux JSP qui permettent l’emploi de
JavaBeans , bibliothèque personnalisé (JSTL), etc.
• Les JSP sont enregistrés avec l’extension .jsp.
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 93
ConceptsJSP
<%@page import="java.time.LocalDate"%>
<%@ page language="java" contentType="text/html;
charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Hello</title>
</head>
<body>
<% LocalDate date= LocalDate.now();%>
<h2>Hello ENSA</h2>
Aujourd'hui, c'est le : <%=date.toString()%>
</body>
</html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 94
ConceptsJSP
• Quelques objets sont prédéfinies dans une page JSP, ils peuvent être utilisées sans déclaration.
• request : contient une référence sur l’objet de type HttpServletRequest qui contient la requête
à cette page.
• response : référence sur le flux sortant de la servlet (HttpServletResponse).
• config : il s’agit de la variable de type ServletConfig utilisée pour initialiser la page.
• pageContext : objet de type PageContext, elle contient des méthodes qui permettent d’accéder
à toutes les variables déclarées par défaut.
• session : variable de type HttpSession, cette variable représente la session dans laquelle se
trouve la requête.
• application : variable de type ServletContext, cette variable modélise l'application web dans
laquelle on se trouve.
• out : cette variable est de type Writer. C’est celle qui sert à envoyer les données vers le client.
C’est une instance de la classe JspWriter.
• page : variable qui modélise la page dans laquelle on se trouve.
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 95
ObjetsprédéfiniesdansunepageJSP
• Pour exécuter notre JSP nous pouvons
indifféremment:
• saisir l’adresse du JSP dans le navigateur,
en l’accompagnant de la valeur du
paramètre
• utiliser un formulaire HTML
• Transmission de paramètres à une JSP via
l’objet request
• Dans la JSP, la distinction entre Get et Post
n’existe plus. La servlet générée par une JSP
est formée essentiellement d’une méthode
(nommée souvent _jspService).
<html>
<head>
<title> JSP Bonjour </title>
</head>
<body>
<%
String nom = request.getParameter ("prenom");
if (nom == null) {out.println ("BONJOUR");}
else{out.println ("BONJOUR"+ nom);}
%>
</body>
</html>
<html>
<head>
<title> Appel de JSP bonjourVous </title>
</head>
<body>
<form action ="bonjourVous.jsp" method="GET">
Vous vous appelez <input type="text" size="24"
name="prenom">
<input type="submit" value="OK">
</form>
</body></html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 96
JSPetFormulaire
• Pour pouvoir exécuter un JSP, le serveur reçoit une
requête de la forme :
http://.../nomJSP.jsp?Paramètres
• Lorsqu’il reçoit cette requête pour la première fois, le
moteur de JSP compile le fichier JSP correspondant
en une servlet et en lance l’exécution.
• Si, par la suite le moteur de JSP reçoit une nouvelle
requête concernant la même JSP, la servlet en
question est directement exécutée, sans qu’aucune
nouvelle compilation ne soit nécessaire.
• C’est l’ensemble du JSP qui est compilé en servlet, il
est traduit en instructions Java sous la forme :
out.println ( texte_ou_balise_HTML )
• tous les codes Java sont incorporés à une unique
méthode _jspService
public void _jspService (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType( text/html );
HttpSession session = request.getSession();
JspWriter out = response.getWriter();
out.println( ... );
}
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 97
Cycledevied’uneJSP
• Le cycle de vie d'une Java Server Page est
identique à une Servlet:
• La méthode jspInit() est appelée après le
chargement de la page
• La méthode _jspService() est appelée à chaque
requête
• La méthode jspDestroy() est appelé lors du
déchargement
• Possibilité de redéfinir dans le code JSP les
méthodes jspInit() et jspDestroy() en utilisant
un élément de scripts déclaration <%!...%>.
<%@ page language="java" contentType="text/html; charset=UTF-
8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!public void jspInit() {
/* Redéfinition de la méthode jspInit()*/
ecole = "ENSA d'Agadir";
}%>
<%!String ecole;%>
Bienvenue à <%=ecole%>
</body>
</html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 98
Cycledevied’uneJSP
• Il existe au total quatre portées différentes
dans une application :
1. page (JSP seulement) : les objets dans cette
portée sont uniquement accessibles dans la
page JSP en question ;
2. requête : les objets dans cette portée sont
uniquement accessibles durant l'existence de la
requête en cours ;
3. session : les objets dans cette portée sont
accessibles durant l'existence de la session en
cours ;
4. application : les objets dans cette portée sont
accessibles durant toute l'existence de
l'application.
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 99
PortéedesObjets
scriptlet
• Un scriptlet est un morceau de code Java
figurant entre les balises spéciales <% et %>.
Commentaire
• des commentaires : <%-- ... --%>
<%@page import="java.time.LocalDate"%>
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
<%-- ceci un commentaire --%>
<%
out.println("BONJOUR");
%>
</body>
</html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 100
LesscriptsJavad’uneJSP
Directives
des directives au moteur JSP :
<%@ directive attribut= valeur %>
où directive vaut page, include ou taglib.
<%@page contentType= text/html pageEncoding= UTF-8 import= java.util.List %>
<%@include file= copyright.html %>
• Elle permet d’introduire la valeur d’une expression Java
dans le flux HTML sous la forme suivante :
<%= expression %>
• Dans l’élément de script <%= expression %>, on peut
placer n’importe quelle expression valide en Java, et qui
puisse être convertie en chaîne.
• Exemple :
• BONJOUR<%=request.getParameter("prenom")%>
• <%= session.getId()%>
BONJOUR
<% out.println (nom) ;
%>
BONJOUR <%= nom %>
<html>
<head>
<title>JSP Bonjour</title>
</head>
<body>
<%
String nom =
request.getParameter("prenom");
if (nom == null) {
%>
BONJOUR
<%
} else {
%>
BONJOUR<%=nom%>
<%
}
%>
</body>
</html>
Les expressions
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 101
LesscriptsJavad’uneJSP
• <%! Déclarations_Variables_Methodes %>
• Ce script permet d’introduire des
déclarations de variables ou de méthodes.
• Une variable déclarée dans un scriptlet est
une variable locale (dont le scriptlet est
incorporé généralement dans la méthode
_jspService)
• les déclarations fournies dans la balise <%! ...
%> vont figurer en dehors de cette méthode,
dans la classe elle-même.
• Elles correspondent donc à des champs
(variables d’instance) ou à des méthodes de
la classe.
Les balises de déclaration
…
<html>
<head>
<title> Compteur d'appels </title>
</head>
<body>
<%! int compte=0; %>
<h2>Compteur d'appels</h2>
<%
compte++ ;
out.println ("numéro d'appel : "+compte);
%>
</body>
</html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 102
LesscriptsJavad’uneJSP
• L’emplacement de la balise <%! ... %> dans
la JSP n’est pas important.
• La déclaration de méthode dans un scriptlet
(les méthodes locales à une méthode
n’existent pas en Java) conduirait à une
erreur au moment de la compilation de la
JSP.
• À la création de la classe servlet générée
par la JSP, les méthodes déclarées seront
des méthodes d’instance utilisables par
n’importe quelle autre méthode de la
classe.
Les balises de déclaration
...
<!DOCTYPE html>
<html>
<%-- méthode de calcul de factorielle --%>
<%!int fact(int n) {
int fac = 1;
for (int i = 1; i <= n; i++) fac *= i;
return fac;
}%>
<%--code de détermination de la valeur de nombre--%>
<%
String sNbr = request.getParameter("nombre");
int nbr;
if (sNbr == null || sNbr=="") nbr = 1;
Else nbr = Integer.parseInt(sNbr);
%>
<html> <head> <title>Calcul de factorielles</title>
</head>
<body>
<h3>Calcul de factorielles</h3>
<form action="test.jsp" method="get">
<label for="nombre">Nombre 1</label>
<input type="number" name="nombre" value="<%=nbr%>">
<button type="submit">Calculer</button>
</form>
<h4> Factorielles de<%=nbr%> ! =<%=fact(nbr)%> </h4>
</body></html>
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 103
LesscriptsJavad’uneJSP
• Lors de l'exécution d'une page JSP, des erreurs peuvent survenir. Chaque erreur se traduit
par la levée d'une exception.
• Si cette exception est capturée dans un bloc try/catch de la JSP, celle-ci est traitée.
• Si l'exception n'est pas capturée dans la page, il y a deux possibilités selon qu'une page
d'erreur est associée à la page JSP ou non :
• sans page d'erreur associée, la pile d'exécution de l'exception est affichée
• avec une page d'erreur associée, une redirection est effectuée vers cette JSP
Techniquedegestiondeserreurs
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 104
• La définition d'une page d'erreur permet de
la préciser dans l'attribut errorPage de la
directive page des autres JSP de
l'application.
• Si une exception est levée dans les
traitements d'une de ces pages, la JSP va
automatiquement rediriger l'utilisateur vers
la page d'erreur précisée.
• La valeur de l'attribut errorPage de la
directive page doit contenir l'URL de la page
d'erreur.
<%@ page errorPage="error.jsp" %>
Techniquedegestiondeserreurs
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 105
<%@ page language="java"
errorPage="error.jsp"
contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<html>
<head>
<title>Calcul</title>
</head>
<body>
<h3>Calcul</h3>
<%
int a = 1, b = 0, c;
if (b != 0) {
c = a / b;
out.println(a + " / " + b + " = " + c);
} else
throw new Exception("Division par Zéro !");
%>
</body>
</html>
• Une page d'erreur est une JSP dont l'attribut
isErrorPage est égal à true dans la directive page.
• Une telle page dispose d'un accès à la variable
implicite nommée exception de type Throwable qui
encapsule l'exception qui a été levée.
• Il est possible dans une telle page d'afficher un
message d'erreur personnalisé mais aussi d'inclure
des traitements liés à la gestion de l'exception :
• ajouter l'exception dans un journal,
• envoyer un mail pour son traitement, ...
• Elle n'est pas conçue pour être accessible
directement aux utilisateurs du site et se trouve donc
dans la zone privée <WEB-INF>
<%@ page language="java"
contentType="text/html"%>
<%@ page isErrorPage="true"%>
<html>
<body>
<h1>Une erreur est survenue lors
des traitements</h1>
<p><%=exception.getMessage()%></p>
</body>
</html>
Techniquedegestiondeserreurs
 Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 106
TRANSFER DE CONTRÔLE
<body>
<%
String login = "youness";
String codeAcces;
%>
<%-- traitement normal --%>
<%
if (login.equals("youness")) {
codeAcces = "ABC45";
%>
<%-- renvoi paramètre code --%>
<jsp:forward page="WEB-INF/PageAcces.jsp">
<jsp:param name="code" value="<%=codeAcces%>" />
</jsp:forward>
<%
}
else{
%>
<%-- renvoi un message d’erreur --%>
<jsp:forward page="WEB-INF/login.jsp">
<jsp:param name="message" value="Login invalide" />
</jsp:forward>
<%
}
%>
</body>
 Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 108
Inclusion dynamique
• Une page JSP peut donner le contrôle à une
autre page JSP en utilisant deux méthodes :
• En utilisant la directive <jsp:forward.../> de la
première page vers la seconde.
• En utilisant le bouton d’un formulaire avec les
données associées, ou un lien avec paramètres
• la balise jsp:forward offre des possibilités plus
riches de chaînage qui peut être conditionnel
ou itératif
• la balise jsp:forward assortit de paramètres
(par name et value) qui sont transmis d’un JSP
à l’autre.
<jsp:forward page="page.jsp">
<jsp:param name="nom" value="valeur" />
</jsp:forward>
Inclusion dynamique
• On peut utiliser le code Java d’une JSP dans un
autre (après compilation) à l’aide de la balise
jsp:include.
• Elle dispose du même mécanisme de paramètres
que la balise jsp:forward.
• Cette fois, le mécanisme s’apparente à un appel
de fonction (il y a bien retour dans le JSP
appelant) avec éventuel transfert d’arguments.
• L’inclusion est sans impact sur la page principale,
qui n’est donc pas modifiable.
• Il permet donc véritablement un développement
modulaire.
 Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 109
<body>
<h2>Ceci est un appel et inclusion de la JSP
factorielle</h2>
<div style="background-color:silver; border-
style: double;">
<jsp:include page="factorielle.jsp">
<jsp:param name="nombre" value="5" />
</jsp:include>
</div>
</body>
</html>
Inclusion statique
• La balise : <%@ include file ="RéférencePageJSP"/> recopie le texte de la page
JSP mentionnée à l’emplacement où elle figure.
• Il s’agit d’une simple recopie de texte, avant compilation des JSP concernés. Une
seule servlet est généré.
• Cela permet de réutiliser des contenus et de rendre modulaires les pages.
• Cette technique est utile pour inclure du contenu comme des en-têtes, pieds de
page ou menus dans toutes les pages.
 Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 110
JSTL & EL
La Java Standard Tag Library & Expression Language
• La JavaServer Pages Standard Tag Library (JSTL) est un composant de la plate-
forme JEE de développement.
• Elle étend la spécification JSP en ajoutant une bibliothèque de balises pour les
tâches courantes, comme :
• le travail sur des fichiers XML,
• l'exécution conditionnelle,
• les boucles
• l'internationalisation.
• …
• La JSTL, en tant que bibliothèque de balises JSP, propose de développer une page
JSP sans y utiliser de code Java directement ce qui permet aux web designers de
concevoir des pages dynamiques complexes sans connaissances préalable du
langage Java.
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 112
JSTL
• JSTL propose un langage nommé EL (Expression Langage) qui permet de faire
facilement référence à des objets Java accessibles dans les différents contextes
de la JSP (page, requête, session ou application).
• Il permet de placer à n'importe quel endroit d'une page JSP des expressions qui
sont évaluées et remplacées par le résultat de leur évaluation.(à la place d'une
expression <%=expressionJava%>)
• La syntaxe est la suivante : ${ expression }
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 113
ExpressionLanguage
<%= session.getAttribute("personne").getNom()%>
${sessionScope.personne.nom}
• EL possède par défaut les variables suivantes :
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 114
ExpressionLanguage
Variable Rôle
PageScope variable contenue dans la portée de la page (PageContext)
RequestScope variable contenue dans la portée de la requête (HttpServletRequest)
SessionScope variable contenue dans la portée de la session (HttpSession)
ApplicationScope variable contenue dans la portée de l'application (ServletContext)
Param paramètre de la requête http
ParamValues paramètres de la requête sous la forme d'une collection
Header en-tête de la requête
HeaderValues en-têtes de la requête sous la forme d'une collection
InitParam paramètre d'initialisation
Cookie cookie
PageContext objet PageContext de la page
• EL ne permet pas l'accès aux variables locales.
• Pour pouvoir accéder à de telles variables, il faut obligatoirement en créer
une copie dans une des portées particulières : page, request, session ou
application
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 115
ExpressionLanguage
<% String nom="boukouchi"; %>
Bonjour : ${nom}
<% String nom="boukouchi";
pageContext.setAttribute("nom", nom);
%>
Bonjour : ${nom}
• L'EL fournit les opérateurs de comparaison
suivants:
Concept Condition EL Résultat
Numérique inférieur à ${1 < 2} vrai
Numérique inférieur à (Less than) ${1 lt 2} vrai
Numérique supérieur à (Greater than) ${1 gt 2} faux
Numérique supérieur ou égal à ${1 >= 1} vrai
Numérique inférieur ou égal à (Less equals) ${1 le 1} vrai
Numérique égal à ${1 == 1} vrai
Numérique égal à (equal) ${1 eq 1} vrai
Numérique non égal à ${1 != 2} vrai
Numérique non égal à (not equal) ${1 ne 2} vrai
Alphabétique supérieur que ${'abe' > 'ade'} faux
Alphabétique égal à (Equals) ${'abe' eq 'abe'} vrai
Alphabétique non égal à (Not equals) ${'abe' ne 'ade'} vrai
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 116
ExpressionLanguage
• L'EL fournit les opérateurs de comparaison suivants:
égaux à (equals) == eq
Pas égaux (Not equals) != ne
Moins que (Less than) < lt
Plus grand que(Greater than) > gt
Moins que ou égaux à
(Less than or equals)
<= le
Plus grand ou égaux à
(Greater than or equals)
>= ge
Opérateur Description
&& Et
|| Ou
${(guess >= 10) && (guess <= 20)}
${ guess >= 10 || guess <= 20 }
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 117
ExpressionLanguage
Operateur Rôle Exemple
. Obtenir une propriété d'un objet ${param.nom}
[] Obtenir une propriété par son nom ou son indice
${param[" nom "]}
${row[1]}
Empty
Teste si un objet est null ou vide si c'est une chaîne de
caractère. Renvoie un booléen
${empty param.nom}
• La JSTL étend la spécification JSP en ajoutant de nombreuses balises pour des tâches
courantes.
• Elle est composée de plusieurs bibliothèques :
• Core Tags (préfixe c) exposent tous les tags de base de la JSTL pour l’affichage, la gestion des
variables, les boucles, les conditionnelles, etc.,
• <%@ taglib prefix="c " uri= "http://java.sun.com/jsp/jstl/core"%>
• Formatting Tags (préfixe fmt) exposent toutes les fonctionnalités d'affichage de données non
triviales : les dates formatées, les nombres formatés, les messages internationalisés, etc.
• <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix= "fmt"%>
• XML tags (préfixe x) pour l’analyse et la transformation (XSLT) des pages XML. Cette librairie
permet par exemple de lire des flux XML via HTTP, de les analyser, de les transformer par XSLT,
puis de les afficher sous différentes formes.
• <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x "%>
• SQL tags (préfixe sql) pour la connexion aux bases de données, les requêtes, les transactions, etc.,
• <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
• Functions Tags (préfixe fn) présentent des fonctions standards dont la majorité sont pour la
manipulation des chaine de caractères
• <%@ tagl uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 118
JSTL
• Télécharger les bibliothèques :
• taglibs-standard-impl-1.2.5.jar
• taglibs-standard-spec-1.2.5.jar
• (http://tomcat.apache.org/download-taglibs.cgi)
<%@ page language="java" contentType="text/html;
charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Exemples de JSTL</title>
</head>
<body>
<c:out value="Bonjour" /><br/>
</body>
</html>
Hello JSTL
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 119
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 120
JSTLCoreTags
1. Le tag set permet de stocker une variable dans une portée particulière (page, request,
session ou application).
2. Le tag out permet d’afficher la valeur d’une variable, ce tag est équivalent à <%= ...%>.
3. Le tag remove permet de supprimer une variable.
4. Le tag catch permet de gérer les exceptions.
5. Le tag if est utilisé pour réaliser une condition.
6. Le tag choose est utilisé pour des cas mutuellement exclusifs (équivalent du switch).
7. Le tag foreach est utilisé pour réaliser des itérations.
8. Le tag forTokens est utilisé pour découper une chaîne selon un ou plusieurs séparateurs.
9. Le tag import permet d’accéder à une ressource via son URL pour l’inclure ou l’utiliser
dans la page JSP.
10. Le tag redirect permet de réaliser une redirection vers une nouvelle URL
<c:out> : permet d’afficher la valeur d’une variable, ce tag est équivalent à <%= ...%>
<c:out value= ${'Bonjour ENSA'} /><br/>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 121
JSTLCoreTags
<c:set>: permet de stocker une variable dans une portée particulière (page, request, session ou
application)
<c:set var= "montantHT" scope="session" value='${6600}' />
<c:set var="TVA" scope="session" value='${0.20}' />
<p>Montant HT: <c:out value='${montantHT}' /><p>
<p>Montant TTC: <c:out value= '${montantHT*(1+TVA)}' /><p>
• <c:choose>:Traitement conditionnel exclusif
<c:set var="note" scope="session" value="${16.75}" />
<p> Votre note est :<c:out value="${note}" /></p>
<c:choose>
<c:when test="${note>= 0 && note < 10}">Ajourné.</c:when>
<c:when test="${note>= 10 && note <12}">Mention Passable.</c:when>
<c:when test="${note>= 12 && note <14}">Mention Assez-Bien.</c:when>
<c:when test="${note>= 14 && note <16}">Mention Bien.</c:when>
<c:when test="${note>= 16 && note <=20}">Mention Très Bien.</c:when>
<c:otherwise>Note invalide ...</c:otherwise>
</c:choose>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 122
JSTLCoreTags • <c:if>:Traitement conditionnel
<c:set var="montantHT" scope="session" value="${1000}" />
<p>Montant HT:<c:out value="${montantHT}" /><p>
<c:if test="${montantHT >= 6000}">
<p>Montant TTC:<c:out value="${montantHT*1.2}" /><p>
</c:if>
<c:if test="${montantHT < 6000}">
<p>Montant TTC:<c:out value="${montantHT*1.1}" /><p>
</c:if>
<c:forEach>: Itérer sur une collection
<%@page import="org.exemples.beans.UserBeans"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8"><title>Exemples de JSTL</title></head>
<body>
<%!List<UserBeans> users = new
ArrayList<UserBeans>();%>
<%
users.add(new UserBeans("youness", "BOUKOUCHI", "PA"));
users.add(new UserBeans("mohammed", "ELYAKOUBI", "PA"));
users.add(new UserBeans("mohammed", "NOUHI", "PA"));
request.setAttribute("users", users);
%>
<table style="border: 1px"solid; >
<tr bgcolor=#ccffcc>
<td size=12>nom</td><td>prenom</td><td>role</td>
</tr>
<c:forEach var="user" items="${users}" >
<tr bgcolor=#e6ffff>
<td>${user.nom}</td>
<td>${user.prenom}</td>
<td>${user.role}</td>
</tr>
</c:forEach>
</table></body></html>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 123
JSTLCoreTags
<c:forEach var="i" begin="1" end ="5" >
Item <c:out value ="${i}" /><p>
</c:forEach>
<c:forTokens>:Itérer sur des éléments d'une
String
<c:forTokens items="GInf-GInd-GElec"
delims="-" var="opt">
<c:out value="${opt}"/><p>
</c:forTokens>
<c:redirect>: permet de réaliser une redirection vers une nouvelle URL
<c:redirect url="hello.jsp"/>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 124
JSTLCoreTags
<c:import>: permet d’accéder à une ressource via son URL pour l’inclure ou
l’utiliser dans la page JSP
<c:import var="data" url= "hello.jsp" />
<c:out value="${data}"/>
<fmt:formatDate>
<%@page import= java.util.Date %>
<%@ taglib prefix="c" uri= http://java.sun.com/jsp/jstl/core %>
<%@ taglib prefix="fmt" uri= http://java.sun.com/jsp/jstl/fmt %>
<html> <head> <title>Hello JSTL</title></head>
<body>
<c:set var="date" value= <%=new Date()%> />
<p> Objet Date :
<c:out value= ${date} ></c:out>
<p> Format Date :
<fmt:formatDate type="date" value="${date} "/>
<p> Format Date :
<fmt:formatDate type="time" value="${date} "/>
<p> Format Date et Temps style(short) :
<fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${date} "/>
<p> Format Date et Temps style(medium) :
<fmt:formatDate type="both" dateStyle="medium" timeStyle="medium" value="${date} " />
<p> Format Date et Temps style(long) :
<fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${date} " />
</body></html>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 125
JSTLFormattingTags
<fmt:formatNumber>
<%@ taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %>
<%@ taglib prefix= fmt uri= http://java.sun.com/jsp/jstl/fmt %>
<html> <head> <title>Hello JSTL</title></head>
<body>
<c:set var= "montant " value= "39800.34567 " />
<p>Montant :<c:out value= "${montant} " ></c:out>
<p> Monétaire:
<fmt:formatNumber type= "number" pattern= "###.## DH " value= "${montant} " />
<p>Porcentage %:
<fmt:formatNumber type= "percent" maxIntegerDigits= "5" maxFractionDigits= "2" value= "${montant} " />
</body></html>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 126
JSTLFormattingTags
• <fn:>
<%@ taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %>
<%@ taglib prefix= fn uri= http://java.sun.com/jsp/jstl/functions%>
<html> <head> <title>Hello JSTL</title></head>
<body>
<c:set var="ensa" value="Ecole Nationale des Sciences Appliquées" />
Longuer ENSA: ${fn:length(ensa)}<br>
ENSA en miniscule : ${fn:toLowerCase(ensa)}<br>
ENSA en majuscule : ${fn:toUpperCase(ensa)}<br>
</body>
</html>
 JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 127
JSTLFunctionTags
LE MODÈLE MVC
• Un design pattern ou un modèle de conception est en quelque sorte une ligne de
conduite qui permet de décrire les grandes lignes d’une solution (bonnes pratiques de
développement ).
• Le modèle MVC proposée par Sun est la solution de développement Web côté serveur
qui permet de séparer la partie logique/métier de la partie présentation dans une
application Web.
• L’objectif principal est de diviser l’application en trois parties:
• Le modèle qui est représenté par les EJB, JavaBeans, systèmes de persistances.
• La vue qui est représentée par les JSP, Html, CSS, etc.
• Le contrôleur qui est représenté par les Servlets et les filtres.
 Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 129
LeModèle MVC(ModelViewController)
• La couche Contrôleur : chargée de router les informations, elle va décider qui va
récupérer l’information et la traiter. Elle gère les requêtes des utilisateurs et retourne
une réponse avec l’aide de la couche Modèle et Vue.
• La couche Vue : s’occupe de la présentation des données à l’utilisateur, c’est elle qui est
responsable de produire les interfaces de présentation de votre application à partir des
informations qu’elle dispose (page HTML par exemple).
• La couche Modèle : exécute la logique métier de l’application, elle est responsable de
la manipulation des données(le traitement, la validation, l’association, etc.). Elle est
également responsable de l’interaction avec la base de données (se connecter et
d’exécuter les requêtes CRUD sur une base de données).
 Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 130
ArchitectureMVC(ModelViewController)
1. Le client envoie une requête HTTP au serveur. C’est en général une Servlet qui traite la demande.
2. La Servlet récupère les informations transmises par le client et délègue le traitement à
un composant métier adapté.
3. Les composants du modèle manipulent ou non des données du système d’information (lecture,
écriture, mise à jour, suppression).
4. Une fois les traitements terminés, les composants rendent la main à la Servlet en lui
retournant un résultat. La Servlet stocke alors le résultat dans un contexte adapté (session,
requête, réponse...).
5. La Servlet appelle la JSP adéquate qui peut accéder au résultat.
6. La JSP s’exécute, utilise les données transmises par la Servlet et génère la réponse au client.
 Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 131
ArchitectureMVC(ModelViewController)
 Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 132
ArchitectureMVC(ModelViewController)
DÉPLOIEMENT AU SERVEUR
• Pour déployer une application dans un conteneur, il faut lui fournir dans une
archive deux éléments :
• les fichiers de l’application : Servlets, JSPs, classes compilées (.class), ressources statiques
(pages HTML statiques, images, CSS, pdf, txt, . . . ), . . .
• un fichier XML descripteur de déploiement : précise au conteneur la configuration pour
exécuter l’application
• Chaque conteneur possède son propre format d’archive :
 Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 134
FichierWAR
• Pour créer le fichier WAR, dans eclipse on clique File/Export
 Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 135
FichierWAR
Pour exporter les fichiers
sources .java
• Pour déployer une application web
JEE, on utilise l’outil manager de
Tomcat qui permet de déployer une
application avec une interface Web.
• Le lien Tomcat Manager ouvre une
fenêtre d’authentification Les
informations de connexion
correspondent aux données insérées
lors de l’installation du serveur.
• Nous obtenons une page qui liste
toutes les applications actuellement
déployées sur le serveur.
 Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 136
DéploiementauserveurTomcat
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP

Contenu connexe

Tendances

Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSyrine Ben aziza
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Heithem Abbes
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemeStéphane Traumat
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystémeAlgeria JUG
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 

Tendances (20)

Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Gestion comptes bancaires Spring boot
Gestion comptes bancaires Spring bootGestion comptes bancaires Spring boot
Gestion comptes bancaires Spring boot
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Java RMI
Java RMIJava RMI
Java RMI
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 

Similaire à Appalications JEE avec Servlet/JSP

cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfRachida19
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Eric Bourdet
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Eric Bourdet
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EESabri Bouchlema
 
Programmation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfProgrammation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfngombeemmanuel
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partageraliagadir
 
introductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfintroductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfHamdaneAbdelAzizHagg
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1ATHMAN HAJ-HAMOU
 

Similaire à Appalications JEE avec Servlet/JSP (20)

Java Entreprise Edition
Java Entreprise EditionJava Entreprise Edition
Java Entreprise Edition
 
J2 ee
J2 eeJ2 ee
J2 ee
 
La plateforme JEE
La plateforme JEELa plateforme JEE
La plateforme JEE
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdf
 
Java j2ee
Java j2eeJava j2ee
Java j2ee
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
 
Java Server Faces 2
Java Server Faces 2Java Server Faces 2
Java Server Faces 2
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
 
Programmation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfProgrammation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdf
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partager
 
introductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfintroductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdf
 
1 Introduction
1 Introduction1 Introduction
1 Introduction
 
Mysql
MysqlMysql
Mysql
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Java EE 6 Solutions Linux 2010
Java EE 6 Solutions Linux 2010Java EE 6 Solutions Linux 2010
Java EE 6 Solutions Linux 2010
 
Support cours j2_ee
Support cours j2_eeSupport cours j2_ee
Support cours j2_ee
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1
 
Architecture .net
Architecture  .netArchitecture  .net
Architecture .net
 

Plus de Youness Boukouchi

Les fondamentaux de langage C#
Les fondamentaux de langage C#Les fondamentaux de langage C#
Les fondamentaux de langage C#Youness Boukouchi
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateYouness Boukouchi
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java Youness Boukouchi
 
Métriques de qualité logicielle
Métriques de qualité logicielleMétriques de qualité logicielle
Métriques de qualité logicielleYouness Boukouchi
 
Modélisation des processus métiers BPMN
Modélisation des processus métiers BPMNModélisation des processus métiers BPMN
Modélisation des processus métiers BPMNYouness Boukouchi
 
Méthodes agiles: Scrum et XP
Méthodes agiles: Scrum et XPMéthodes agiles: Scrum et XP
Méthodes agiles: Scrum et XPYouness Boukouchi
 
Mindmaps الخريطة الذهنية
Mindmaps الخريطة الذهنيةMindmaps الخريطة الذهنية
Mindmaps الخريطة الذهنيةYouness Boukouchi
 
التفكير الإيجابي 2015
التفكير الإيجابي 2015التفكير الإيجابي 2015
التفكير الإيجابي 2015Youness Boukouchi
 
فن التواصل مع الاخرين 2015
فن التواصل مع الاخرين 2015فن التواصل مع الاخرين 2015
فن التواصل مع الاخرين 2015Youness Boukouchi
 

Plus de Youness Boukouchi (11)

Les fondamentaux de langage C#
Les fondamentaux de langage C#Les fondamentaux de langage C#
Les fondamentaux de langage C#
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernate
 
Programmation en C
Programmation en CProgrammation en C
Programmation en C
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Test logiciel
Test logicielTest logiciel
Test logiciel
 
Métriques de qualité logicielle
Métriques de qualité logicielleMétriques de qualité logicielle
Métriques de qualité logicielle
 
Modélisation des processus métiers BPMN
Modélisation des processus métiers BPMNModélisation des processus métiers BPMN
Modélisation des processus métiers BPMN
 
Méthodes agiles: Scrum et XP
Méthodes agiles: Scrum et XPMéthodes agiles: Scrum et XP
Méthodes agiles: Scrum et XP
 
Mindmaps الخريطة الذهنية
Mindmaps الخريطة الذهنيةMindmaps الخريطة الذهنية
Mindmaps الخريطة الذهنية
 
التفكير الإيجابي 2015
التفكير الإيجابي 2015التفكير الإيجابي 2015
التفكير الإيجابي 2015
 
فن التواصل مع الاخرين 2015
فن التواصل مع الاخرين 2015فن التواصل مع الاخرين 2015
فن التواصل مع الاخرين 2015
 

Appalications JEE avec Servlet/JSP

  • 1. P R O F Y . B O U K O U C H I 4 E A N N É E G É N I E I N F O R M A T I Q U E E N S A D ’ A G A D I R Développement des applications JEE web backend
  • 2. JEE
  • 3. • JEE (Java Platform, Enterprise Edition), anciennement J2EE ( Java 2 Platform Entreprise Edition ) est la version entreprise de la plate-forme "Java" qui se compose de l'environnement "JSE" ainsi que de nombreuses API et composants destinés à une utilisation "côté serveur" au sein du système d'information de l'entreprise. • L'objectif majeur de Java EE est de faciliter le développement d'applications web robustes et distribuées, déployées et exécutées sur un serveur d'applications C’EST QUOI JEE?
  • 4. LES SPÉCIFICATIONS JEE • JEE propose des spécifications (Java Specification Requests -JSR-)pour une infrastructure dans laquelle s'exécutent les composants. Elle décrivent les rôles de chaque élément et précisent un ensemble d'interfaces pour permettre à chacun de ces éléments de communiquer. • Les spécifications précisent à l'aide des API un certain nombre de fonctionnalités que doit implémenter l'environnement d'exécution: • JSR 221: JDBCTM 4.0 API Specification • JSR 52: A Standard Tag Library for JavaServer Pages • JSR 369: JavaTM Servlet 4.0 Specification • JSR 370: JavaTM API for RESTful Web Services (JAX-RS 2.1) Specification • JSR 371: Model-View-Controller (MVC 1.0) Specification • Etc. • Ces fonctionnalités permettent de séparer les applications et l'environnement dans lequel elles s'exécutent et permettent aux développeurs de se concentrer sur la logique métier.
  • 6. API JEE version de l'API dans J2EE/Java EE 1.2 1.3 1.4 5 6 7 1 Entreprise Java Bean (EJB) 1.1 2.0 2.1 3.0 3.1 3.2 2 Remote Method Invocation (RMI) et RMI-IIOP 1.0 3 Java Naming and Directory Interface (JNDI) 1.2 1.2 1.2.1 4 Java Database Connectivity (JDBC) 2.0 2.0 3.0 5 Java Transaction API (JTA) Java Transaction Service (JTS) 1.0 1.0 1.0 1.1 1.1 1.2 6 Java Messaging service (JMS) 1.0 1.0 1.1 1.1 1.1 2.0 7 Servlets 2.2 2.3 2.4 2.5 3.0 3.1 8 Java Server Pages (JSP) 1.1 1.2 2.0 2.1 2.2 2.2 9 Java Server Faces (JSF) 1.2 2.0 2.2 10 Expression Language (EL) 2.2 3.0 11 Java Server Pages Standard Tag Libray (JSTL) 1.2 1.2 1.2 12 JavaMail 1.1 1.2 1.3 1.4 1.4 1.4 13 J2EE Connector Architecture (JCA) 1.0 1.5 1.5 1.6 1.6 14 Java API for XML Parsing (JAXP) 1.1 1.2 15 Java Authentication and Authorization Service (JAAS) 1.0 16 JavaBeans Activation Framework 1.0.2 1.0.2 17 Java API for XML-based RPC (JAXP-RPC) 1.1 1.1 1.1 1.1 18 SOAP with Attachments API for Java (SAAJ) 1.2 1.3 19 Java API for XML Registries (JAXR) 1.0 1.0 1.0 1.0
  • 7. API JEE version de l'API dans J2EE/Java EE 1.2 1.3 1.4 5 6 7 20 Java Management Extensions (JMX) 1.2 21 Java Authorization Service Provider Contract for Containers (JACC) 1.0 1.1 1.4 1.4 22 Java API for XML-Based Web Services (JAX-WS) 2.0 2.2 2.2 23 Java Architecture for XML Binding (JAXB) 2.0 2.2 24 Streaming API for XML (StAX) 1.0 25 Java Persistence API (JPA) 1.0 2.0 2.1 26 Java API for RESTful Web Services (JAX-RS) 1.1 2.0 27 Web Services 1.2 1.3 1.3 28 Web Services Metadata for the Java Platform 2.1 2.1 29 Java APIs for XML Messaging (JAXM) 1.3 30 Context and Dependency Injection (CDI) 1.0 1.1 31 Dependancy Injection (DI) 1.0 32 Bean Validation 1.0 1.1 33 Managed beans 1.0 1.0 34 Interceptors 1.1 1.1 35 Common Annotations 1.1 1.1 36 Java API for WebSocket 1.0 37 Java API for JSON 1.0 38 Concurrency Utilities for Java EE 1.0 39 Batch Applications for the Java Platform 1.0
  • 8. • Pour exécuter ces composants de natures différentes, JEE définit des conteneurs pour chacun d'eux. • Les conteneurs permettent aux applications d'accéder aux ressources et aux services en utilisant les API. • Les appels aux composants se font par des clients en passant par les conteneurs. • Les clients n'accèdent pas directement aux composants mais sollicitent le conteneur pour les utiliser. L'ENVIRONNEMENT D'EXÉCUTION DES APPLICATIONS J2EE
  • 9. Les conteneurs assurent la gestion du cycle de vie des composants qui s'exécutent en eux. Il existe plusieurs conteneurs définis par JEE: • conteneur web : pour exécuter les servlets et les JSP • conteneur d'EJB : pour exécuter les EJB • conteneur client : pour exécuter des applications standalone sur les postes qui utilisent des composants JEE Les serveurs d'applications peuvent fournir: • un conteneur web uniquement • ou un conteneur d'EJB uniquement • ou les deux LES CONTENEURS
  • 10. Pour déployer une application dans un conteneur, il faut lui fournir deux éléments: • l'application avec tous les composants (classes compilées, ressources ...) regroupés dans une archive ou module. Chaque conteneur possède son propre format d'archive. • un fichier descripteur de déploiement contenu dans le module qui précise au conteneur des options pour exécuter l'application DÉPLOIEMENT D’UNE APPLICATION
  • 11. Il existe trois types d'archives (JAR, WAR ou EAR) : 1. Bibliothèque => JAR: Regroupe des classes 2. Application client => JAR: Regroupe les ressources nécessaires à leur exécution (classes, bibliothèques, images, ...) 3. EJB => JAR: Regroupe les EJB et leurs composants (classes) 4. Web => WAR: Regroupe les servlets et les JSP ainsi que les ressources nécessaires à leur exécution (classes, bibliothèques de balises, images, ...) 5. Application => EAR : Une application est un regroupement d'un ou plusieurs modules dans un fichier EAR (Entreprise ARchive). L'application est décrite dans un fichier application.xml lui-même contenu dans le fichier EAR 6. JCA =>RAR : JEE Connector Architecture (JCA) est la solution de JEE pour résoudre le problème d’intégration entre le monde JEE et le système d’information d’entreprise (EIS) comme les ERP, mainframes, SGBD, applications anciennes écrites en C, C++, COBOL… DÉPLOIEMENT D’UNE APPLICATION
  • 13. Un site web est un ensemble constitué de pages web (elles-mêmes faites de fichiers HTML, CSS, Javascript, etc.). On distingue deux types de sites • les sites internet statiques : ce sont des sites dont le contenu est «fixe», il n'est modifiable que par le propriétaire du site. Ils sont réalisés à l'aide des technologies HTML, CSS et Javascript uniquement. • les sites internet dynamiques : ce sont des sites dont le contenu est «dynamique», en plus des langages précédemment cités, ils font intervenir d'autres technologies (Java EE, PHP, dotnet, etc. ) SERVEUR JEE
  • 14. La communication client/serveur qui s'effectue entre le client et le serveur est régie par des règles de protocole HTTP: 1. l'utilisateur saisit une URL dans la barre d'adresses de son navigateur ; 2. le navigateur envoie alors une requête HTTP au serveur pour lui demander la page correspondante ; 3. le serveur reçoit cette requête, l'interprète et génère alors une page web qu'il va renvoyer au client par le biais d'une réponse HTTP ; 4. le navigateur reçoit, via cette réponse, la page web finale, qu'il affiche alors à l'utilisateur. SERVEUR JEE
  • 15. • le client ne comprend que les langages de présentation comme : HTML, CSS et Javascript (ils sont tous interprétés par le navigateur directement sur la machine client). • le serveur génère des pages à envoyer au client de manière dynamique, il dispose de technologies (JEE, PHP, .NET, Django et Ruby on Rails, etc.) capable de : • analyse des données reçues via HTTP. • transformation des données. • enregistrement des données dans une BD. • intégration des données dans le design. • Etc. SERVEUR JEE
  • 16. • Serveur http : c’est un serveur qui gère exclusivement des requêtes HTTP. • Un serveur web JEE est constitué d'un serveur HTTP (Web) et d'un conteneur web • Un serveur d'applications JEE est constitué d'un serveur HTTP, d'un conteneur web et d’un conteneur EJB SERVEUR JEE
  • 17. • les solutions propriétaires et payantes : WebLogic (Oracle) et WebSphere (IBM), sont les références dans le domaine, utilisées dans les banques et la finance, elles sont à la fois robustes, finement paramétrables et très coûteuses. • les solutions libres et gratuites : Apache Tomcat, JBoss, GlassFish et JOnAS sont les principaux représentants. SERVEUR JEE
  • 18. FRAMEWORK Il est parfois lourd d’utiliser un composant standard de J2EE : trop ouvert, trop complexe, design patterns à connaître et à implémenter. Solution : les frameworks • couches d'abstraction s'appuyant sur d'autres briques plus génériques visant à simplifier l’utilisation de certaines technologies • briques spécialisées intégrant un ensemble de bonnes pratiques et un cadre de codage Rank Framework Popularity 1 Spring mvc 28.82 2 JSF 15.2 3 Spring Boot 13.35 4 GWT 7.74 5 Grails 6.35 6 Struts 5.4 7 Dropwizard 4.9 8 Play framework 3.26 9 JHipster 2.49 10 jax-rs 2.44 11 Vaadin 2.15 12 Seam 1.94 13 Wicket 1.91 14 Tapestry 1.9 15 Sparkjava 0.77 16 Vert.x 0.76 17 Rapidoid 0.25 18 Lagom 0.24 19 Ratpack 0.13Web Frameworks Index at a Glance 2017/11/15 
  • 19. Frameworks : Hibernate • Permet l'accès à une SGBD • Mapping objet/relationnel (ORM) Frameworks : Struts • Ne nécessite qu'un simple moteur de servlet contrairement aux EJB • Implémentation du modèle MVC2 • Basé sur les technologies Servlet/JSP Frameworks : Spring • Ne nécessite qu'un simple moteur de servlet contrairement aux EJB • Conteneur léger • POA : programmation orienté aspect FRAMEWORK
  • 20. Les technologies des applications Web Java, coté serveur DÉVELOPPEMENT APPLICATION WEB JEE
  • 21. Environnement de Developpement Intégré (IDE) • Eclipse IDE for Java EE Developers • autres : Netbeans, Jdeveloper, etc. Serveur Web • Apache Tomcat • Autres :Wildfly, GlassFish, etc. Serveur BD • Serveur MySql avec Workbench • Autres: Postgres, SQLServer, Oracle, etc. DÉVELOPPEMENT APPLICATION WEB JEE
  • 23. • Les Servlets et les JSPs sont la base de JEE • Les frameworks MVC les plus populaires aujourd’hui sont à la base des Servlets et JSPs: • Spring • JSF • Struts  Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 23
  • 24. • Une application web est composée de servlets, JSP, html, et d'autres ressources • La portabilité de telles applications impose : – une structure commune – une description standard de leur déploiement • Toutes les ressources d'une application web sont réunies dans un même répertoire dont la structure est strictement définie. • La description du déploiement est contenue dans un fichier XML de nom web.xml Application WebContent .html, .css, .jsp, .jpg, … WEB-INF web.xml html, jsp,… Lib • jar Classes • *.class  Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 24
  • 25. • L'ensemble des fichiers peut être réuni dans un fichier d'archive (.war ) sous forme compressée • L'ensemble de ces informations est indépendante du serveur et simplifie le portage et le déploiement d'une application web • Structure générale de déploiement d'une application web: • Ressources public : html, css, jsp, image, etc. • Ressources privées: WEB-INF • Classes: fichiers compilés (servlets, …) • web.xml (fichier de déploiement ). • html, jsp, etc. • lib : jar  Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 25 Application WebContent .html, .css, .jsp, .jpg, … WEB-INF web.xml html, jsp,… Lib • jar Classes • *.class
  • 26. • Le fichier web.xml est nommé un fichier de déploiement ». • Il contient en particulier des informations établissant une ou plusieurs correspondance entre un répertoire cité par le client et le véritable répertoire concerné sur le serveur. <?xml version= 1.0 encoding= UTF-8 ?> <web-app version= 3.0 xmlns= http://java.sun.com/xml/ns/javaee xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd > <servlet> <servlet-name>nomServlet</servlet-name> <servlet-class>cheminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>nomServlet</servlet-name> <url-pattern>/urlServlet</url-pattern> </servlet-mapping> </web-app> web.xml  Application Web JEE Prof Y.BOUKOUCHI - ENSA d'Agadir 26
  • 29. • Un ou une servlet est une classe Java qui permet de créer dynamiquement des données au sein d'un serveur Web. • Ces données sont le plus généralement présentées au format HTML, mais elles peuvent également l'être au format XML ou tout autre format destiné aux navigateurs web. UNE SERVLET Version Date de sortie Plateforme Servlet 4.0 Septembre 2017 JavaEE 8 Servlet 3.1 Mai 2013 JavaEE 7 Servlet 3.0 Décembre 2009 JavaEE 6, JavaSE 6 Servlet 2.5 Septembre 2005 JavaEE 5, JavaSE 5 Servlet 2.4 Novembre 2003 J2EE 1.4, J2SE 1.3 Servlet 2.3 Aout 2001 J2EE 1.3, J2SE 1.2 Servlet 2.2 Aout 1999 J2EE 1.2, J2SE 1.2 Servlet 2.1 Novembre 1998 -- Servlet 2.0 -- -- Servlet 1.0 Juin 1997 --  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 29 Les servlets utilisent l'API Java Servlet (package javax.servlet). À l'aide de Servlets, vous pouvez : 1. collecter les entrées des utilisateurs via des formulaires de pages Web, 2. présenter des enregistrements à partir d'une base de données ou une autre source, 3. et créer dynamiquement des pages Web.
  • 30. • Pour exécuter une application à base de servlets, il faut disposer d’un conteneur de servlets. Son rôle est la : 1. gestion des requêtes client 2. transmission des requêtes à une servlet 3. envoi des réponses au client CONTENEURDE SERVLETS  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 30
  • 31. Etape 1 : Créer la servlet • Le paramètre req de type HttpServletRequest donne accès aux paramètres de la requête, à l'en-tête HTTP, aux informations du client. • Le paramètre res de type HttpServletResponse contient les données de la réponse aux client. Elles peuvent être de n'importe quel type. • Le type de réponses est précisé par la méthode setContentType() • La méthode getWriter retourne un objet de type PrintWriter, flux de sortie pour le texte HTML de la réponse import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { protected void doGet( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter page = res.getWriter(); page.println("<HTML>"); page.println("<HEAD><TITLE>Hello World</TITLE></HEAD>"); page.println("<BODY>"); page.println("<H1>Hello World</H1> ); page.println("<H2>Bienvenue au cours de Servlet</H2>"); page.println("</BODY></HTML>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 1ÈRE SERVLET  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 31
  • 32. • Etape 2 : Déclarer la servlet dans le web.xml • Le fichier web.xml est un fichier au format XML permet de décrire le déploiement de l’application au serveur. • Il permet de configurer : l'application, les servlets, les sessions, les bibliothèques de tags personnalisés, les paramètres de contexte, les types Mimes, les pages par défaut, les ressources externes, la sécurité de l'application et des ressources JEE. <?xml version= 1.0 encoding= UTF-8 ?> <web-app xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xmlns= http://xmlns.jcp.org/xml/ns/javaee xsi:schemaLocation= http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web- app_3_1.xsd id= WebApp_ID version= 3.1 > <servlet> <servlet-name>hello</servlet-name> <servlet-class>chemin.servlets.Hello </servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 32 1ÈRE SERVLET La déclaration de notre Servlet Hello Le mapping de notre servlet sur l'URL relative /hello
  • 33. • Etape 3 : Appel de la servlet L'exécution de cette servlet répond à une requête HTTP. Par exemple: http://localhost:8080/CoursServlet/hello  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 33 1ÈRE SERVLET Context-path url-patternserveur
  • 35.  Cycle de vie d’une servlet • Il y a 5 étapes dans le cycle de vie d'une Servlet : 1. Charger la classe Servlet dans la mémoire. 2. Créer l'instance de la Servlet. 3. Appeler la méthode init() de Servlet. 4. Appeler la méthode service() de Servlet. 5. Appeler la méthode destroy() de Servlet. • Les étapes 1, 2 et 3 sont exécutées une seule fois, lorsque la Servlet est initialement chargée. Par défaut, la Servlet n'est pas chargée jusqu'à ce que la première requête soit reçue par l'utilisateur. • L'étape 4 est exécutée plusieurs fois - une fois pour chaque requête HTTP vers la Servlet. • L'étape 5 est exécutée lorsque le conteneur de servlet (Servlet Container) décharge (unloaded) la Servlet. Prof Y.BOUKOUCHI - ENSA d'Agadir 35
  • 36. Pour chaque requête effectuée, un lien est créé entre le client et la servlet avec : A. appel de la méthode service(…), qui détermine le type de requête envoyée (POST ou GET), B. création de deux objets : • HttpServletRequest: sert à extraire les paramètres envoyés avec la requête. • HttpServletResponse: sert à construire la réponse pour le client. C. Invocation de la méthode correspondante doGet(…) ou doPost(…)  Cycle de vie d’une servlet Prof Y.BOUKOUCHI - ENSA d'Agadir 36
  • 37. LA CLASSE HTTPSERVLET • public abstract class HttpServlet extends GenericServlet { HttpServlet () // methodes repondant aux différents types de requêtes protected void doDelete ( HttpServletRequest req , HttpServletResponse resp ) protected void doGet ( HttpServletRequest req , HttpServletResponse resp ) protected void doHead ( HttpServletRequest req , HttpServletResponse resp ) protected void doOptions ( HttpServletRequest req , HttpServletResponse resp ) protected void doPost ( HttpServletRequest req , HttpServletResponse resp ) protected void doPut ( HttpServletRequest req , HttpServletResponse resp ) protected void doTrace ( HttpServletRequest req , HttpServletResponse resp ) protected void service ( HttpServletRequest req , HttpServetResponse resp ) void service ( ServletRequest req , ServletResponse res ) Etc. }  Les concepts de base Prof Y.BOUKOUCHI - ENSA d'Agadir 37
  • 39. MéthodesGetetPost Pour transmettre des paramètres du client au serveur, il faut choisir entre deux démarches : 1. Transmission des paramètres via un formulaire html et dans ce cas, il faut choisir entre deux méthodes de transmission: • la méthode GET : envoie les paramètres via l’URL, ils sont visibles dans le navigateur; • la méthode POST : envoie les paramètres via l’en-tête http, ils sont masqués. • Les paramètres de formulaires sont récupérables via HttpServletRequest, La récupération se fait par les méthodes suivantes : • Enumeration getParameterNames() • String getParameterValues(String name) • String getParameter(String name) 2. Transmission des paramètres via un URL et dans ce cas, leurs valeurs seront récupérées par la méthode doGet. http://localhost:8080/context-path/nomServlet?par1=val1&par2=val2  Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 39
  • 40. Les composants du formulaire : <form method="post" id="form" action="FormStudent"> <fieldset> <legend> Formulaire d'inscription</legend> <label for="nom">Nom</label> <input id="nom" name="nom" type="text" placeholder="Votre nom"> <textarea id="adresse" name="adresse" placeholder="Votre adresse" ></textarea> <select id="pays" name="pays" > <option value="Maroc">Maroc</option> <option value="France">France</option> </select> <input type="radio" name="sexe" value="H" checked="checked"> Homme <input type="checkbox" name="comptences" id="comptences-0" value="JEE">Développement JEE <input type="submit" name="S'enregistrer" value= " Valider" />  Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 40
  • 41. public class FormStudentServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out= res.getWriter(); String nom=req.getParameter("nom"); … String comptences[]=req.getParameterValues("comptences"); out.println("<HTML><HEAD><TITLE>Fiche Inscription</TITLE></HEAD>"); out.println("<BODY>"); out.println("<b>Nom : </b><b>"+nom+" "+prenom+ "("+sexe+")</b>"); out.println("<p>Email et mot de passe : "+email+" "+motpass+"</p>"); out.println("<p>Adresse et pays : "+adresse+" ("+pays+")</p>"); out.println("<p>Compténces:"); for(String s:comptences){ out.println(s+" "); } out.println("</p>"); out.println("</BODY></HTML>"); } }  Les formulaires Prof Y.BOUKOUCHI - ENSA d'Agadir 41 Attention: Si aucun paramètre nommé n’a été fourni lors de l’appel, on obtiendra en retour de l’appel de getParameter la valeur null.
  • 43. Informationsàpartirl’objetdeServletRequest • Informations à propos du client: • getRemoteAddr(): récupère l'adresse IP de l'hôte qui a initié la requête. • getRemoteHost(): renvoie le nom de la machine hôte qui a initié la requête. • Informations à propos du serveur: • getServerName(): permet d'obtenir le nom du serveur • getServerPort(): permet d'obtenir le numéro du port • Informations à propos de l’URL: • getRequestURI(): permet d'obtenir l'URL sur lequel porte la requête. • Autres informations de l’en-tête: • getHeaderNames() : de récupérer une liste des noms des entêtes passés par le client lors de la requête. Cette méthode renvoie un objet de type Enumeration.  Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 43 De nombreuses informations en provenance du client peuvent être extraites de l'objet ServletRequest passé en paramètre par le serveur.
  • 44. • Exemple ‣ http://localhost/exemples/servlets/TraceServlet/tutu?toto=titi • getMethod() → GET • getPathInfo() → /tutu • getQueryString() → toto=titi • getRequestURI() → /exemples/servlets/TraceServlet/tutu • getServletPath() → /servlets/TraceServlet • getContextPath() → /exemples  Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 44 Informationsàpartirl’objetdeServletRequest out.println("<b>Quelques informations fournies par l'objet requête</b><br>"); out.print("Adresse IP de l'hote :"+req.getRemoteAddr()+"<br>"); out.print("Nom de la machine hote :"+req.getRemoteHost()+"<br>"); out.print("Nom du serveur:"+req.getServerName()+"<br>"); out.print("Port du serveur:"+req.getServerPort()+"<br>"); out.print("URL de la requête:"+req.getRequestURI()+"<br>"); out.println("---------- Les en-têtes de la requete -----<br>"); String entete; while(headers.hasMoreElements()){ entete=headers.nextElement(); out.println("En-tête : "+entete +", sa valeur : "+req.getHeader(entete)+"<br>");}
  • 45. La servlet peut obtenir des informations à partir d'un objet ServletContext retourné par la méthode getServletContext() d'un objet ServletConfig. • getServerInfo(): Retourne le nom et le numéro de version du moteur de servlet • getContextPath() : Retourne le contexte de l’application • getSessionTimeout(): Retourne la durée de vie des sessions • getRealPath("nomFichier"): Retourne le chemin d’un fichier dans le serveur. • getInitParameter(String name):Retourne la valeur d’un paramètre d’initialisation. • getInitParameterNames(): Retourne la liste des paramètres d’initialisation. • setAttribute(String name,Object object): Définie un objet comme attribue de l’application. • Etc. Informationsàpartirl’objetdeServletContext  Les objets informations Prof Y.BOUKOUCHI - ENSA d'Agadir 45 ServletContext context=getServletContext(); out.println("<b>Quelques informations fournies par l'objet requête</b><br>"); out.print("Serveur utilisé :"+context.getServerInfo()+"<br>"); out.print("Contexte path :"+context.getContextPath()+"<br>"); out.print("Session Timeout :"+context.getSessionTimeout()+"<br>"); out.print("Chemin réel du fichier :"+context.getRealPath("HeaderInfosServlet")+"<br>");
  • 47. • La transmission du contrôle permet : • une servlet de traiter en partie une requête et transmettre le contrôle à une autre servlet pour la suite du traitement. • une servlet de transmettre le contrôle à une page JSP pour générer la réponse. • Pour transmettre le contrôle on utilise l’objet de type RequestDispatcher, obtenu en invoquant la méthode getRequestDispatcher("Chemin") de la requête. • RequestDispatcher dispatcher = req. getRequestDispatcher("/Welcome"); • Le chemin doit correspondre à une ressource se trouvant dans la même application web, il ne peut pas référencer de ressource externe. La ressource désignée par ce chemin peut être statique (une image, ou un fichier), ou dynamique (une servlet).  Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 47
  • 48. • L’objet RequestDispatcher expose deux méthodes: • forward() redirige la requête vers la ressource désignée. • include() inclut cette ressource dans la réponse courante. • Ces deux méthodes prennent en paramètre la requête et la réponse courantes.  Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 48
  • 49.  Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 49 String login=req.getParameter("login"); String motpass=req.getParameter("motpass"); if(login.equals("boukouchi")&&motpass.equals("admin")){ RequestDispatcher dispatcher = req. getRequestDispatcher("/Welcome"); dispatcher. forward(req, res); } else{ res.setContentType("text/html"); PrintWriter out= res.getWriter(); out.println("<b>Email ou mot de pass est invalide</b>"); RequestDispatcher dispatcher = req. getRequestDispatcher("/index.html"); dispatcher. include(req, res); }
  • 50. • La 3e méthode de transmission du contrôle est la méthode sendRedirect appelée par l’objet HttpServletResponse. • Le serveur envoie une réponse 302 au navigateur qui initie une nouvelle requête sur le même serveur ou sur un autre serveur vers l’URL transmis dans la réponse (URL relative ou absolue). • Lorsqu’il s’agit de continuer sur le même serveur forward est préférable, car plus rapide. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // construction redirection par le client response .sendRedirect("http://www.ensa-agadir.ac.ma"); //Ou interne : response .sendRedirect("WelcomeStudent"); // le traitement de la requête courante continue }  Transmission du contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 50 LaméthodesendRedirect
  • 51. LES PARAMÈTRES & LES ATTRIBUTS
  • 52. Paramètresd'initialisationdelaservlet  Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 52 • Les paramètres d'initialisation d’une servlet sont déclarés dans l'élément servlet du fichier web.xml, et sont lus dans la méthodes init(), via l'objet ServletConfig. • Les valeurs de ces paramètres peuvent être retrouvées dans le code de la servlet grâce à la méthode getInitParameter() de l'objet ServletConfig. • On peut également accéder à la liste de tous les paramètres d'initialisation par appel à la méthode getInitParameterNames(), qui retourne un Enumeration. private String databaseUser; private String databasePW; public void init( ServletConfig config) throws ServletException { databasePW= config .getInitParameter ("dbUserPw"); databaseUser = config .getInitParameter ("dbUser"); } <servlet> <servlet-name>ParametersServlet</servlet-name> <servlet-class>...ParametersServlet</servlet-class> <init-param> <param-name>dbUser</param-name> <param-value>infoDB</param-value> </init-param> <init-param> <param-name>dbUserPw</param-name> <param-value>admin</param-value> </init-param> </servlet>
  • 53. • Ces paramètres peuvent être association à un ensemble de Servlets: • contrairement aux paramètres d'initialisation de Servlet précédents, • ceux-ci sont commun à toutes les Servlets de l'application web. Paramètresd'initialisationducontexte  Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 53 String databaseName ; String databaseDriver ; public void init(ServletConfig config) throws ServletException { ServletContext context =config . getServletContext(); databaseName = context . getInitParameter ("databaseName"); databaseDriver = context . getInitParameter ("databaseDriver"); } <context-param> <param-name>databaseName</param-name> <param-value>GestionDB</param-value> </context-param> <context-param> <param-name>databaseDriver</param-name> <param-value>MySQL</param-value> </context-param>
  • 54. PortéedesObjets • la portée des objets souvent appelée visibilité, ou scope en anglais, elle définit tout simplement leur durée de vie. • Il existe au total quatre portées différentes dans une application : 1. page (JSP seulement) : les objets dans cette portée sont uniquement accessibles dans la page JSP en question ; 2. requête (HttpServletRequest): les objets dans cette portée sont uniquement accessibles durant l'existence de la requête en cours ; 3. Session (HttpSession) : les objets dans cette portée sont accessibles durant l'existence de la session en cours ; 4. Application (ServletContext): les objets dans cette portée sont accessibles durant toute l'existence de l'application.  Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 54
  • 55. • Il est possible d’ajouter des attributs personnels soit au niveau de la requête , la session ou bien le contexte (l’application). • Ces attributs sont des paires clé/valeur, la clé étant une chaîne de caractères et la valeur étant un objet de n’importe quel type. • Il y a des méthodes qui permet de stocker, récupérer et détruire ces attributs: • La méthode setAttribute(nom, objet). Si le nom de l’attribut existe déjà, la valeur existante est remplacée par la nouvelle. • La méthode getAttribute(nom) est utilisée pour récupérer la valeur d’un attribut de type quelconque dans l’application ou la valeur null si l’attribut n’existe pas. • La méthode getAttributesNames() permet de récupérer le nom de tous les attributs. • la méthode removeAttribute(nom) permet la suppression de l’attribut indiqué. Lesattributs  Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir 55 request.setAttribute("att_req", "valeur"); String att = (String)request.getAttribute("att_req"); request.removeAttribute("att_req"); ServletContext context=getServletContext(); context.setAttribute("att_app", "valeur"); String att = (String)context.getAttribute("att_app"); context.removeAttribute("att_app"); HttpSession session=request.getSession(); session.setAttribute("att_sess", "valeur"); String att = (String)session.getAttribute("att_sess"); session.removeAttribute("att_sess");
  • 56.  Les paramètres et les attributs Prof Y.BOUKOUCHI - ENSA d'Agadir<web-app …> <context-param> <param-name>societe</param-name> <param-value>ENSA d'Agadir</param-value> </context-param> <servlet> <servlet-name>compteur</servlet-name> <servlet-class>...CompteurServlet</servlet-class> <init-param> <param-name>role</param-name> <param-value>administrateur</param-value> </init-param> </servlet> ... </web-app> 56 public class CompteurServlet extends HttpServlet { private ServletConfig config; private ServletContext context; private int compteurServlet = 0; public void init(ServletConfig config) throws ServletException { this.config = config; this.context = config.getServletContext();} protected void doGet(HttpServletRequest req, HttpServletResponse res) …{ HttpSession session = req.getSession(true); Integer compteurSession = (Integer) session.getAttribute("compteur"); if (compteurSession == null) {compteurSession = 1; session.setAttribute("compteur", compteurSession); } else {compteurSession++; session.setAttribute("compteur", compteurSession); } String role = config.getInitParameter("role"); String societe = context.getInitParameter("societe"); compteurServlet++; res.setContentType("text/html"); PrintWriter page = res.getWriter(); page.println("<HTML><HEAD><TITLE>Compteur</TITLE></HEAD><BODY>"); page.println("<h2>Paramètres et Attributs</h2>"); page.println("<h3>Etablissement :" + societe + "</h3>"); page.println("<h3>Role :" + role + "</h3>"); page.println("<b>Nombre totale des requetes/servlet: </b><b>" + compteurServlet + "</b></br>"); page.println("<b>Nombre totale des requetes/servlet/Session: </b><b>" + compteurSession + "</b>"); page.println("</BODY></HTML>");
  • 58. • Le protocole HTTP est un protocole non connecté ( protocole sans états, en anglais stateless protocol), cela signifie que chaque requête est traitée indépendamment des autres et qu'aucun historique des différentes requêtes n'est conservé. • →le serveur web ne peut pas se "souvenir" de la requête précédente: panier, login, préférences, etc. • Alors, le suivi de session (session tracking) ou bien la gestion de la session (session management) est un mécanisme de gestion des états, permet de maintenir la cohésion entre l'utilisateur et la requête, c'est-à-dire : • reconnaître les requêtes provenant du même utilisateur • associer un profil à l'utilisateur • connaître les paramètre de l'application (nombre de produits vendus, panier, ...) • Il y a quatre techniques pour assurer le Session Tracking: 1. en utilisant les cookies 2. en passant en paramètre un champ de formulaire caché 3. en ajoutant à l'URL des variables d'identification 4. en utilisant le HttpSession  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 58 Techniquesde SessionTracking
  • 59. • Les cookies sont des petits fichiers textes stockés sur le disque du client, permettant de stocker des paires clés/valeur. • Les cookies concernant le domaine du site sur lequel un utilisateur surfe sont automatiquement envoyés dans les en-têtes HTTP lors de chaque requête du client. • Lorsque le serveur désire créer un cookie sur le navigateur du client, il lui suffit d'envoyer des instructions dans les en-têtes de la réponse HTTP.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 59 Lescookies
  • 60. • un cookie a obligatoirement un nom et une valeur associée. • Propriétés optionnelles importantes • Max Age : durée de rétention de l’information (date d'expiration) • Domain : domaine auquel l’information peut –être associée • Path: chemin où le client doit renvoyer l’information • Avantage des cookies • Technique la plus simple de maintien de l'état. • Les cookies sont conservés côté client. • Inconvénient des cookies • Cela ne fonctionnera pas si le cookie est désactivé à partir du navigateur. • Seules les informations textuelles peuvent être définies dans l'objet Cookie.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 60 Lescookies
  • 61. La classe javax.servlet.http.Cookie fournit un ensemble de fonction pour la gestion d’un cookie: • Cookie() : constructeur. • Cookie(String name, String value) : Constructeur créant un objet Cookie de nom Name et de valeur Value). • public String getName() : Retourne le nom du cookie • public String getValue() : Retourne la valeur du cookie. • public void setName(String name) : Redéfinit le nom du cookie. • public void setValue(String value) : Redéfinit la valeur du cookie. • public void setMaxAge(int expiry): Définit la durée de validité du cookie (en secondes). • int getMaxAge() : Retourne la durée de validité du cookie (en secondes) • String getDomain() : Retourne le domaine pour lequel le cookie est valide • void setDomain(String Domain) : Définit le domaine pour lequel le cookie est valide • String getPath() : Retourne le chemin pour lequel le cookie est valide • void setPath(String Chemin) : Définit le chemin pour lequel le cookie est valide • int getVersion() : Retourne la version du cookie • void setVersion(int Version) : Définit la valeur du cookie  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 61 Lescookies
  • 62. Pour ajouter un cookie ou obtenir sa valeur, nous avons besoin de méthodes fournies par d'autres interfaces. Elles sont: • public void addCookie(Cookie ck) : la méthode de HttpServletResponse utilisée pour ajouter le cookie à la réponse. • public Cookie[] getCookies() : la méthode de HttpServletRequest utilisée pour récupérer tous les cookies à partir de navigateur • Créer un Cookie: Cookie ck=new Cookie("user","boukouchi"); //créer un objet cookie ck.setMaxAge(30*60) //Max Age : durée de rétention de l’information response.addCookie(ck); //ajouter une cookie à la réponse • Supprimer un Cookie (Il est principalement utilisé pour déconnecter l'utilisateur.) Cookie ck=new Cookie("user",""); //supprimer la valeur du cookie ck.setMaxAge(0); //changer l'âge max à 0 response.addCookie(ck); //ajouter un cookie à la réponse • Récupérer des Cookies: Cookie ck[]=request.getCookies(); for(int i=0;i<ck.length;i++){ out.print("<br>"+ck[i].getName()+" "+ck[i].getValue()); //afficher le nom et la valeur }  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 62 Lescookies
  • 63. Servlet1 Servlet2 Cookie invalide après 60 secondes  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 63 <form action="servlet1" method="get"> <label for="email">Adresse Email</label> <input type="email" name="email" > <button type="submit">Envoyer</button> </form> String email = request.getParameter("email"); Cookie ck = new Cookie("email", email); ck.setMaxAge(1 * 60); response.addCookie(ck); response.setContentType("text/html"); page.println("<HTML><HEAD><TITLE>Session Tracking</TITLE></HEAD><BODY>"); … Cookie cks[] = request.getCookies(); int indice = -1; for (int i = 0; i < cks.length; i++) { if (cks[i].getName().equals("email")) indice = i; } if (indice != -1 && cks[indice].getValue() != null) { response.setContentType("text/html"); ... page.println("<h3>Bienvenue : " + cks[indice].getValue() + "</h3>"); ... } else { response.sendRedirect("login.html"); } Dans cet exemple, nous stockons l’adresse email de l'utilisateur dans l'objet cookie et nous y accédons dans une autre servlet.
  • 64. • Dans le cas d'un champ de formulaire masqué (Hidden Form Field), un champ de texte masqué (invisible) est utilisé pour conserver l'état d'un utilisateur. • Dans ce cas, nous stockons les informations dans le champ caché et les récupérons à partir d'un autre servlet. • Cette approche est préférable si nous devons soumettre le formulaire dans toutes les pages et que nous ne voulons pas dépendre du navigateur. • <input type="hidden" name=“name" value=“Boukouchi"> • Avantage du champ de formulaire caché • fonctionne toujours. • Inconvénient du champ de formulaire masqué: • Il est maintenu côté serveur. • Un formulaire supplémentaire est requis sur chaque page. • Seules les informations textuelles peuvent être utilisées.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 64 Champdeformulairecaché
  • 65.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 65 Champdeformulairecaché <form action="servlet1" method="get"> <label for="email">Adresse Email</label> <input type="email" name="email" > <button type="submit">Envoyer</button> </form> String email = request.getParameter("email"); … page.println("<form action="servlet2" method="get">"); page.println("<input type="hidden" name="email" value="" + email + "">"); page.println("<button type="submit">Envoyer</button></form>"); page.println("</BODY></HTML>"); String email = request.getParameter("email"); if (email != null) { response.setContentType("text/html"); … page.println("<h3>Bienvenue : " + email +"</h3>"); page.println("<p>Session Tracking par Hidden Form Field</p>"); … } else { response.sendRedirect("login.html"); } Dans cet exemple, nous stockons l’adresse email de l'utilisateur dans un champ caché et nous y accédons dans une autre servlet. Servlet1 Servlet2 Champ invalide (null)
  • 66. • Dans la réécriture d'URL(URL rewriting), nous ajoutons les données à l'URL du prochain servlet ou de la prochaine ressource. • Nous pouvons envoyer des paires nom / valeur de paramètre en utilisant le format suivant: url? name1 = valeur1 & name2 = valeur2 • Lorsque l'utilisateur clique sur le lien hypertexte, les paires nom / valeur de paramètre sont transmises au serveur. À partir d'un servlet, nous pouvons utiliser la méthode getParameter () pour obtenir une valeur de paramètre. • Avantage de la réécriture d'URL • fonctionne toujours. • Pas de formulaire supplémentaire. • Inconvénient de la réécriture d'URL • Cela fonctionnera uniquement avec des liens. • Il peut envoyer uniquement des informations textuelles.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 66 laréécritured'URL
  • 67.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 67 laréécritured'URL <form action="servlet1" method="get"> <label for="email">Adresse Email</label> <input type="email" name="email" > <button type="submit">Envoyer</button> </form> String email = request.getParameter("email"); … page.println("<h3>Bienvenue : " + email + "</h3>"); page.println("<hr>"); page.println("<a href='servlet2?email=" + email + "'>suivant</a>"); page.println("</BODY></HTML>"); String email = request.getParameter("email"); if (email != null) { response.setContentType("text/html"); … page.println("<h3>Bienvenue : " + email +"</h3>"); page.println("<p>Session Tracking par Réécriture d'URL</p>"); … } else { response.sendRedirect("login.html"); } Dans cet exemple, nous stockons l’adresse email de l'utilisateur dans un lient et nous y accédons dans une autre servlet. Servlet1 Servlet2 Paramètre invalide (null)
  • 68. • la session représente un espace mémoire alloué pour chaque utilisateur, permettant de sauvegarder des informations tout le long de leur visite ; • le contenu d'une session est conservé jusqu'à ce que l'utilisateur ferme son navigateur, reste inactif trop longtemps, ou encore lorsqu'il se déconnecte du site ; • L’objet HTTPSession permet : • Gestion des objets dans la session : ajout, modification, retrait, recherche, etc. • Gestion des méta-information à propos de la session elle-même : date de création, id de la session, etc.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 68 HttpSession Nom :JSESSIONID, Valeur :295C0FB721251D83BACD24AD7E34EF36
  • 69. • L'objet HttpSession s'obtient grâce à la méthode getSession() de l'objet HttpServletRequest, chaque utilisateur se voit attribuer un Session ID • Utiliser cette méthode : HttpServletRequest.getSession() // par défaut true HttpSession session = request.getSession(true); • Retourne la session en cours, ou crée une (true) si il n’en existe pas. HttpSession session = request.getSession(false); • Retourne la session en cours, ou null si il n’en existe pas. • Méthodes pour le cycle de vie d’une session: • Récupérer le session ID -> public String getId(); • Voir si la session vient juste d’être créée -> public boolean isNew(); • Récupérer la date de création -> public long getCreationTime(); • Dernière fois que la session a été activée-> public long getLastAccessedTime(); • Terminer (invalider) une session -> public void invalidate(); Les sessions peuvent se terminer automatiquement lors de périodes d’inactivité  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 69 HttpSession
  • 70. • Récupérer des données de la session : Integer accessCount = (Integer) session.getAttribute(" nom"); • Récupérer toutes les « clés » de tous les objets dans la session : Enumeration attributes = request.getAttributeNames(); • Mettre des données dans la session: HttpSession session = request.getSession(); session.setAttribute("nom", "Boukouchi"); • Et on peut les supprimer : session.removeAttribute("name");  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 70 HttpSession
  • 71. • Retourne l'intervalle de temps maximum (timeout)entre deux requête avant que la session n'expire (en seconde) public int getMaxInactiveInterval(); • Si on spécifie cet intervalle, la session sera fermée (invalidée) automatiquement lorsqu’un utilisateur ne fait rien pendant un temps plus long public void setMaxInactiveInterval( int secondes ) • Si la valeur est négative : jamais d’interruption • Le timeout par défaut peut-être codé dans le descripteur de déploiement (fichierweb.xml) en ajoutant les balises : • <session-config> <session-timeout> 120 <!-- en minutes -- > </session-timeout> </session-config>  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 71 HttpSession
  • 72. • Le Session ID est communiqué au client: • Option 1: si le navigateur supporte les cookies, la Servlet créée un cookie avec le session ID, dans Tomcat, ce cookie est appelé JSESSIONID • Cookie : contient les cookies HTTP stockés précédemment envoyés par le serveur à l'aide de l'en-tête Set-Cookie. • Set-Cookie : envoie des cookies du serveur à l'agent utilisateur.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 72 HttpSession
  • 73. • Option 2: si le navigateur ne supporte pas les cookies, la servlet va essayer de récupérer le session ID depuis l’URL (la servlet doit réécrire URL locale avant de l’envoyer au client en utilisant les fonctions suivantes encodeURL() ou encodeRedirectURL () de HttpServletResponse. • La servlet peut déterminer si l’identifiant de session est valide par la fonction suivante: • public boolean HttpServletRequest.isRequestedSessionIdValid() • La servlet peut détecter si l’identifiant de la session vient d’un cookie ou d’une URL codée en utilisant : • public boolean HttpServletRequest.isRequestedSessionIdFromURL() • public boolean HttpServletRequest.isRequestedSessionIdFromCookie()  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 73 HttpSession page.println("<h3>Session ID : " + session.getId() + "</h3>"); page.println("<hr>"); page.println("<a href='" + response.encodeUrl("servlet8?email=" + email) + "'>suivant</a>");
  • 74.  Session Tracking Prof Y.BOUKOUCHI - ENSA d'Agadir 74 HttpSession <form action="servlet1" method="get"> <label for="email">Adresse Email</label> <input type="email" name="email" > <button type="submit">Envoyer</button> </form> HttpSession session = request.getSession(); Date dateCreationS = new Date(session.getCreationTime()); Date dateInactiviteS = new Date(session.getLastAccessedTime()); String email = request.getParameter("email"); session.setAttribute("email", email); … page.println("<h4>Session ID : " + session.getId() + "</h4>"); … HttpSession session = request.getSession(); Date dateCreationS = new Date(session.getCreationTime()); Date dateInactiviteS = new Date(session.getLastAccessedTime()); String email = (String) session.getAttribute("email"); if (email != null) { … } else { response.sendRedirect("login.html"); } Dans cet exemple, nous stockons l’adresse email de l'utilisateur dans une session et nous y accédons dans une autre servlet. Servlet1 Servlet2 Attribut Session invalide (null)
  • 76. • Un objet listener (écouteur, observateur) est un objet qui écoute certains événements dans une application. • Pour le conteneur Web Java EE, un listener designe une classe qui implémente une des interfaces définies dans l’API servlet. • Lorsque l'événement qu'il écoute se déclenche, alors ce listener s'active : une de ses méthodes particulière (callback) est invoquée, avec en paramètre un objet portant les informations sur cet événement (ServletContextEvent, HttpSessionEvent , etc.). • Ces objets doivent implémenter des interfaces standard, fournies par l'API Servlet (ServletContextListener, HttpSessionListener, etc.), et être déclarés dans le descripteur d'une application web : • le fichier web.xml <listener> <listener-class> package.maClasseListener </listener-class> </listener> • ou bien annotée avec @WebListener  Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 76 @WebListener public class MaClasseListener implements APIServletListener { public MaClasseListener() { } public void methodeCallback 1 (APIServletEvent event) { // traitement } }
  • 77. Voici quelques événements définis par l'API Servlet: • Ajout ou le retrait d'un attribut (Changes to attributes) sur un contexte, une session ou une requête : • Événements : ServletContextEvent, HttpSessionEvent et ServletRequestEvent. • Listeners: ServletContextAttributeListener, ServletRequestAttributeListener et HttpSessionAttributeListener. • la création ou à la destruction (LifeCycle) du contexte, d’une session, ou d'une requête: • Événements : ServletContextEvent, HttpSessionEvent et ServletRequestEvent. • Listener : HttpContextListener, HttpRequestListener, HttpSessionListener et HttpSessionActivationListener. • Etc.  Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 77
  • 78. • L’exemple ci-dessous présente ContextListener qui implémente ServletContextListener dont le rôle est de réaliser un log applicatif signalant respectivement le lancement et l’arrêt de l’application Web.  Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 78 @WebListener public class ContextListener implements ServletContextListener { public ContextListener() { } public void contextDestroyed(ServletContextEvent sce) { sce.getServletContext().log("## Arrêt de l'application ##"); } public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().log("## Lancement de l'application ##"); } }
  • 79.  Les listeners Prof Y.BOUKOUCHI - ENSA d'Agadir 79 • L’exemple ci-dessous présente SessionListener qui implémente HttpSessionListener dont le rôle est de compter le nombre de visiteur connectés à l’application web. @WebListener public class SessionListener implements HttpSessionListener { private int compteurVisiteur = 0; public SessionListener() {} public void sessionCreated(HttpSessionEvent se) { synchronized (this) { compteurVisiteur++; System.out.println("Nombre de Visiteur : " + compteurVisiteur); } } public synchronized void sessionDestroyed(HttpSessionEvent se) { compteurVisiteur--; System.out.println("Nombre de Visiteur : " + compteurVisiteur); } }
  • 81. • Les filtres sont des codes exécutés entre les requêtes et les servlets ou pages JSP, pour faire un pré- ou post-traitement sur les requêtes ou les réponses. • Il est déclaré dans le descripteur de l'application web.xml, et posé sur une ou plusieurs servlets. • Lorsqu'une requête doit être traitée par une servlet sur laquelle un filtre est déclaré, alors le serveur, plutôt que d'invoquer directement la méthode doGet() ou doPost() de la servlet, va invoquer la méthode doFilter() de ce filtre. • Un filtre peut agir sur tous les aspects du cycle requête / réponse, en modifiant l'un ou l'autre • Nombreuses utilisations des filtres : • Authentification, • redirection, • modification des entêtes, • cryptage des données, • contrôle des accès effectués par les clients, • journalisation des accès • …  Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 81
  • 82. • un filtre est une classe qui doit implémenter l'interface Filter. • Cette interface définit trois méthodes : • init(FilterConfig) : méthode callback, appelée lors de la construction de cet objet par le serveur d'applications. • destroy() : méthode callback, appelée lors de la destruction de cet objet par le serveur d'applications. • doFilter(ServletRequest, ServletResponse, FilterChain) : cette méthode est appelée sur requête HTTP, au lieu de l'appel d'une servlet sur lequel ce filtre est déclaré. • La propagation de la requête au filtre suivant, ou à la servlet est faite en invoquant filterChain.doFilter(request, response). public class TransparentFilter implements Filter { public void init(FilterConfig filterConfig) { // l'objet filterConfig encapsule les paramètres // d'initialisation de ce filtre } public void destroy() { // callback de destruction de ce filtre } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // propagation de la requête le long de la chaîne filterChain.doFilter(request, response) ; } }  Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 82 Cycledevied'unFiltre
  • 83. • Un filtre doit être déclaré dans le fichier web.xml de l'application. • De même qu'une servlet, un filtre est déclaré en deux temps : • d'une part par sa classe d'implémentation, • d'autre part par l'URL qu'il filtre. <web-app> <!-- déclaration de la classe d'implémentation du filtre --> <filter> <filter-name>nomFilter</filter-name> <filter-class>chemin.classFilter</filter-class> </filter> <!-- déclaration des URL interceptées par ce filtre --> <filter-mapping> <filter-name>nomFilter</filter-name> <url-pattern>/urlServlet</url-pattern> </filter-mapping> <!-- suivent les déclarations des servlets --> <servlet> <servlet-name>nomServlet</servlet-name> <servlet-class>chemin.classServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>nomServlet</servlet-name> <url-pattern>/urlServlet</url-pattern> </servlet-mapping> </web-app>  Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 83 Déclarationd'unFiltre
  • 84. • Filtrage d'une requête pour la journalisation • il s'agit juste d'enregistrer les informations du client qui a soumis la requête. @WebFilter("/*") public class LoggerFilter implements Filter { private Logger log = Logger.getLogger("LoggerFilter"); public LoggerFilter() { log.log(Level.INFO, "Création de filtre"); } public void init(FilterConfig fConfig) throws ServletException { log.log(Level.INFO, "Initialisation de filtre"); } public void destroy() { log.log(Level.INFO, "Destruction de filtre"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String host = httpRequest.getRemoteHost(); String url = httpRequest.getRequestURL().toString(); log.log(Level.INFO,"L'hôte["+host+"] fait une requête sur ["+url+ "]"); chain.doFilter(request, response); } } <filter> <filter-name>Logger</filter-name> <filter-class> ma.boukouchi.filter.LoggerFilter </filter-class> </filter> <filter-mapping> <filter-name>Logger</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>  Les Filtres Prof Y.BOUKOUCHI - ENSA d'Agadir 84 OU
  • 85. LES @NNOTATIONS & WEB.XML
  • 86. • Les annotations sont une nouveauté apportée par la version 5 de Java pour ajouter des métadonnées à un code source. • Elle peut s'appliquer à un package, une classe, une interface, un constructeur, une méthode, un champ, un argument de méthode, une variable locale ou encore à une autre annotation. • Lors de la compilation des codes sources, le compilateur Java stocke les métadonnées d'annotation dans les fichiers classes. Plus tard, la JVM ou d'autres programmes peuvent accéder à ces métadonnées pour déterminer comment interagir avec les composants du programme ou changer leur comportement. • La syntaxe d'une annotation est la suivante : @annotation-type[ (name=value) * ] • Exemple: • @Deprecated : Cette annotation marque une entité obsolète. • @Override : Cette annotation marque une méthode redéfinie. • @SuppressWarnings : Cette annotation signale au compilateur de supprimer certains avertissements à la compilation de l'entité.  web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 86 Principeetfonctionnement
  • 87. • Le fichier web.xml contient un nombre important d’informations concernant l’application web Java. • Servlet 3.0 a apporté de nombreuses annotations qui évitent de remplir le fichier web.xml. • Pour des applications simples, le fichier web.xml est facultatif mais pour d’autre il est nécessaire encore pour certaines tâches. Les Annotations introduites par Servlet 3.0 1 @WebServlet 2 @WebInitParam 3 @WebFilter 4 @WebListener 5 @HandlesTypes 6 @HttpConstraint 7 @HttpMethodConstraint 8 @MultipartConfig 9 @ServletSecurity  web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 87 Principeetfonctionnement
  • 88. • Elle permet de déclarer une servlet. • Attributs: • name • value • urlPatterns: obligatoire ! • loadOnStartup • initParams • asyncSupported • smallIcon, largeIcon • description • displayName  web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 88 Annotation@WebServlet <servlet> <servlet-name> Inscription</servlet-name> <servlet-class>chemin.Inscription</servlet-class> </servlet> <servlet-mapping> <servlet-name>Inscription</servlet-name> <url-pattern>/inscription</url-pattern> </servlet-mapping> @WebServlet( "/inscription" ) public class Inscription extends HttpServlet { ... @WebServlet( name="Inscription", urlPatterns = "/inscription" ) public class Inscription extends HttpServlet { ... @WebServlet(urlPatterns = {"/inscription", "/registration "}) public class Inscription extends HttpServlet { ...
  • 89. • Elle permet de définir les paramètres d’initialisation d’une servlet ou d’un filtre. • Elle est dans l’annotation @WebFilter ou @WebServlet. • Attributs: • name • value • description  web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 89 Annotation@WebInitParam <servlet> <servlet-name>Download</servlet-name> <servlet-class>packages.Download</servlet-class> <init-param> <param-name>chemin</param-name> <param-value>/fichiers/</param-value> </init-param> </servlet> ... @WebServlet( urlPatterns = "/fichiers/*", initParams = @WebInitParam( name = "chemin", value = "/fichiers/" ) ) public class Download extends HttpServlet { ...
  • 90. • @WebFilter permet de définir un filtre. • Attributs: • urlPatterns • initParams • filterName • servletNames • urlPatterns • dispatcherTypes • @WebListener permet de définir un observateur.  web.xml et les annotations Prof Y.BOUKOUCHI - ENSA d'Agadir 90 Annotation@WebFilteret@WebListener <filter> <filter-name>RestrictionFilter</filter-name> <filter-class>...RestrictionFilter</filter-class> </filter> <filter-mapping> <filter-name>RestrictionFilter</filter-name> <url-pattern>/restreint/*</url-pattern> </filter-mapping> ... @WebFilter( urlPatterns = "/restreint/*" ) public class RestrictionFilter implements Filter { ... <listener> <listener-class>...InitialisationDaoFactory</listener-class> </listener> ... @WebListener public class InitialisationDaoFactory implements ServletContextListener { ...
  • 92. • La JavaServer Pages ou JSP est une technique basée sur Java qui permet de créer dynamiquement des pages web. • un JSP est une page HTML dans laquelle sont introduits des morceaux de code Java nommés script . • il existe plusieurs sortes de script: scriptlet, déclarations, commentaires, Expressions, etc. • Il faut minimiser le code java dans une page JSP (refactoriser le code, modèle MVC, etc.) • il existe d’autres balises spécifiques aux JSP qui permettent l’emploi de JavaBeans , bibliothèque personnalisé (JSTL), etc. • Les JSP sont enregistrés avec l’extension .jsp.  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 93 ConceptsJSP
  • 93. <%@page import="java.time.LocalDate"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Hello</title> </head> <body> <% LocalDate date= LocalDate.now();%> <h2>Hello ENSA</h2> Aujourd'hui, c'est le : <%=date.toString()%> </body> </html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 94 ConceptsJSP
  • 94. • Quelques objets sont prédéfinies dans une page JSP, ils peuvent être utilisées sans déclaration. • request : contient une référence sur l’objet de type HttpServletRequest qui contient la requête à cette page. • response : référence sur le flux sortant de la servlet (HttpServletResponse). • config : il s’agit de la variable de type ServletConfig utilisée pour initialiser la page. • pageContext : objet de type PageContext, elle contient des méthodes qui permettent d’accéder à toutes les variables déclarées par défaut. • session : variable de type HttpSession, cette variable représente la session dans laquelle se trouve la requête. • application : variable de type ServletContext, cette variable modélise l'application web dans laquelle on se trouve. • out : cette variable est de type Writer. C’est celle qui sert à envoyer les données vers le client. C’est une instance de la classe JspWriter. • page : variable qui modélise la page dans laquelle on se trouve.  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 95 ObjetsprédéfiniesdansunepageJSP
  • 95. • Pour exécuter notre JSP nous pouvons indifféremment: • saisir l’adresse du JSP dans le navigateur, en l’accompagnant de la valeur du paramètre • utiliser un formulaire HTML • Transmission de paramètres à une JSP via l’objet request • Dans la JSP, la distinction entre Get et Post n’existe plus. La servlet générée par une JSP est formée essentiellement d’une méthode (nommée souvent _jspService). <html> <head> <title> JSP Bonjour </title> </head> <body> <% String nom = request.getParameter ("prenom"); if (nom == null) {out.println ("BONJOUR");} else{out.println ("BONJOUR"+ nom);} %> </body> </html> <html> <head> <title> Appel de JSP bonjourVous </title> </head> <body> <form action ="bonjourVous.jsp" method="GET"> Vous vous appelez <input type="text" size="24" name="prenom"> <input type="submit" value="OK"> </form> </body></html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 96 JSPetFormulaire
  • 96. • Pour pouvoir exécuter un JSP, le serveur reçoit une requête de la forme : http://.../nomJSP.jsp?Paramètres • Lorsqu’il reçoit cette requête pour la première fois, le moteur de JSP compile le fichier JSP correspondant en une servlet et en lance l’exécution. • Si, par la suite le moteur de JSP reçoit une nouvelle requête concernant la même JSP, la servlet en question est directement exécutée, sans qu’aucune nouvelle compilation ne soit nécessaire. • C’est l’ensemble du JSP qui est compilé en servlet, il est traduit en instructions Java sous la forme : out.println ( texte_ou_balise_HTML ) • tous les codes Java sont incorporés à une unique méthode _jspService public void _jspService (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( text/html ); HttpSession session = request.getSession(); JspWriter out = response.getWriter(); out.println( ... ); }  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 97 Cycledevied’uneJSP
  • 97. • Le cycle de vie d'une Java Server Page est identique à une Servlet: • La méthode jspInit() est appelée après le chargement de la page • La méthode _jspService() est appelée à chaque requête • La méthode jspDestroy() est appelé lors du déchargement • Possibilité de redéfinir dans le code JSP les méthodes jspInit() et jspDestroy() en utilisant un élément de scripts déclaration <%!...%>. <%@ page language="java" contentType="text/html; charset=UTF- 8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%!public void jspInit() { /* Redéfinition de la méthode jspInit()*/ ecole = "ENSA d'Agadir"; }%> <%!String ecole;%> Bienvenue à <%=ecole%> </body> </html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 98 Cycledevied’uneJSP
  • 98. • Il existe au total quatre portées différentes dans une application : 1. page (JSP seulement) : les objets dans cette portée sont uniquement accessibles dans la page JSP en question ; 2. requête : les objets dans cette portée sont uniquement accessibles durant l'existence de la requête en cours ; 3. session : les objets dans cette portée sont accessibles durant l'existence de la session en cours ; 4. application : les objets dans cette portée sont accessibles durant toute l'existence de l'application.  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 99 PortéedesObjets
  • 99. scriptlet • Un scriptlet est un morceau de code Java figurant entre les balises spéciales <% et %>. Commentaire • des commentaires : <%-- ... --%> <%@page import="java.time.LocalDate"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello</title> </head> <body> <%-- ceci un commentaire --%> <% out.println("BONJOUR"); %> </body> </html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 100 LesscriptsJavad’uneJSP Directives des directives au moteur JSP : <%@ directive attribut= valeur %> où directive vaut page, include ou taglib. <%@page contentType= text/html pageEncoding= UTF-8 import= java.util.List %> <%@include file= copyright.html %>
  • 100. • Elle permet d’introduire la valeur d’une expression Java dans le flux HTML sous la forme suivante : <%= expression %> • Dans l’élément de script <%= expression %>, on peut placer n’importe quelle expression valide en Java, et qui puisse être convertie en chaîne. • Exemple : • BONJOUR<%=request.getParameter("prenom")%> • <%= session.getId()%> BONJOUR <% out.println (nom) ; %> BONJOUR <%= nom %> <html> <head> <title>JSP Bonjour</title> </head> <body> <% String nom = request.getParameter("prenom"); if (nom == null) { %> BONJOUR <% } else { %> BONJOUR<%=nom%> <% } %> </body> </html> Les expressions  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 101 LesscriptsJavad’uneJSP
  • 101. • <%! Déclarations_Variables_Methodes %> • Ce script permet d’introduire des déclarations de variables ou de méthodes. • Une variable déclarée dans un scriptlet est une variable locale (dont le scriptlet est incorporé généralement dans la méthode _jspService) • les déclarations fournies dans la balise <%! ... %> vont figurer en dehors de cette méthode, dans la classe elle-même. • Elles correspondent donc à des champs (variables d’instance) ou à des méthodes de la classe. Les balises de déclaration … <html> <head> <title> Compteur d'appels </title> </head> <body> <%! int compte=0; %> <h2>Compteur d'appels</h2> <% compte++ ; out.println ("numéro d'appel : "+compte); %> </body> </html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 102 LesscriptsJavad’uneJSP
  • 102. • L’emplacement de la balise <%! ... %> dans la JSP n’est pas important. • La déclaration de méthode dans un scriptlet (les méthodes locales à une méthode n’existent pas en Java) conduirait à une erreur au moment de la compilation de la JSP. • À la création de la classe servlet générée par la JSP, les méthodes déclarées seront des méthodes d’instance utilisables par n’importe quelle autre méthode de la classe. Les balises de déclaration ... <!DOCTYPE html> <html> <%-- méthode de calcul de factorielle --%> <%!int fact(int n) { int fac = 1; for (int i = 1; i <= n; i++) fac *= i; return fac; }%> <%--code de détermination de la valeur de nombre--%> <% String sNbr = request.getParameter("nombre"); int nbr; if (sNbr == null || sNbr=="") nbr = 1; Else nbr = Integer.parseInt(sNbr); %> <html> <head> <title>Calcul de factorielles</title> </head> <body> <h3>Calcul de factorielles</h3> <form action="test.jsp" method="get"> <label for="nombre">Nombre 1</label> <input type="number" name="nombre" value="<%=nbr%>"> <button type="submit">Calculer</button> </form> <h4> Factorielles de<%=nbr%> ! =<%=fact(nbr)%> </h4> </body></html>  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 103 LesscriptsJavad’uneJSP
  • 103. • Lors de l'exécution d'une page JSP, des erreurs peuvent survenir. Chaque erreur se traduit par la levée d'une exception. • Si cette exception est capturée dans un bloc try/catch de la JSP, celle-ci est traitée. • Si l'exception n'est pas capturée dans la page, il y a deux possibilités selon qu'une page d'erreur est associée à la page JSP ou non : • sans page d'erreur associée, la pile d'exécution de l'exception est affichée • avec une page d'erreur associée, une redirection est effectuée vers cette JSP Techniquedegestiondeserreurs  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 104
  • 104. • La définition d'une page d'erreur permet de la préciser dans l'attribut errorPage de la directive page des autres JSP de l'application. • Si une exception est levée dans les traitements d'une de ces pages, la JSP va automatiquement rediriger l'utilisateur vers la page d'erreur précisée. • La valeur de l'attribut errorPage de la directive page doit contenir l'URL de la page d'erreur. <%@ page errorPage="error.jsp" %> Techniquedegestiondeserreurs  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 105 <%@ page language="java" errorPage="error.jsp" contentType="text/html; charset=UTF-8"%> <!DOCTYPE html> <html> <html> <head> <title>Calcul</title> </head> <body> <h3>Calcul</h3> <% int a = 1, b = 0, c; if (b != 0) { c = a / b; out.println(a + " / " + b + " = " + c); } else throw new Exception("Division par Zéro !"); %> </body> </html>
  • 105. • Une page d'erreur est une JSP dont l'attribut isErrorPage est égal à true dans la directive page. • Une telle page dispose d'un accès à la variable implicite nommée exception de type Throwable qui encapsule l'exception qui a été levée. • Il est possible dans une telle page d'afficher un message d'erreur personnalisé mais aussi d'inclure des traitements liés à la gestion de l'exception : • ajouter l'exception dans un journal, • envoyer un mail pour son traitement, ... • Elle n'est pas conçue pour être accessible directement aux utilisateurs du site et se trouve donc dans la zone privée <WEB-INF> <%@ page language="java" contentType="text/html"%> <%@ page isErrorPage="true"%> <html> <body> <h1>Une erreur est survenue lors des traitements</h1> <p><%=exception.getMessage()%></p> </body> </html> Techniquedegestiondeserreurs  Le JavaServer Pages Prof Y.BOUKOUCHI - ENSA d'Agadir 106
  • 107. <body> <% String login = "youness"; String codeAcces; %> <%-- traitement normal --%> <% if (login.equals("youness")) { codeAcces = "ABC45"; %> <%-- renvoi paramètre code --%> <jsp:forward page="WEB-INF/PageAcces.jsp"> <jsp:param name="code" value="<%=codeAcces%>" /> </jsp:forward> <% } else{ %> <%-- renvoi un message d’erreur --%> <jsp:forward page="WEB-INF/login.jsp"> <jsp:param name="message" value="Login invalide" /> </jsp:forward> <% } %> </body>  Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 108 Inclusion dynamique • Une page JSP peut donner le contrôle à une autre page JSP en utilisant deux méthodes : • En utilisant la directive <jsp:forward.../> de la première page vers la seconde. • En utilisant le bouton d’un formulaire avec les données associées, ou un lien avec paramètres • la balise jsp:forward offre des possibilités plus riches de chaînage qui peut être conditionnel ou itératif • la balise jsp:forward assortit de paramètres (par name et value) qui sont transmis d’un JSP à l’autre. <jsp:forward page="page.jsp"> <jsp:param name="nom" value="valeur" /> </jsp:forward>
  • 108. Inclusion dynamique • On peut utiliser le code Java d’une JSP dans un autre (après compilation) à l’aide de la balise jsp:include. • Elle dispose du même mécanisme de paramètres que la balise jsp:forward. • Cette fois, le mécanisme s’apparente à un appel de fonction (il y a bien retour dans le JSP appelant) avec éventuel transfert d’arguments. • L’inclusion est sans impact sur la page principale, qui n’est donc pas modifiable. • Il permet donc véritablement un développement modulaire.  Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 109 <body> <h2>Ceci est un appel et inclusion de la JSP factorielle</h2> <div style="background-color:silver; border- style: double;"> <jsp:include page="factorielle.jsp"> <jsp:param name="nombre" value="5" /> </jsp:include> </div> </body> </html>
  • 109. Inclusion statique • La balise : <%@ include file ="RéférencePageJSP"/> recopie le texte de la page JSP mentionnée à l’emplacement où elle figure. • Il s’agit d’une simple recopie de texte, avant compilation des JSP concernés. Une seule servlet est généré. • Cela permet de réutiliser des contenus et de rendre modulaires les pages. • Cette technique est utile pour inclure du contenu comme des en-têtes, pieds de page ou menus dans toutes les pages.  Transfer de contrôle Prof Y.BOUKOUCHI - ENSA d'Agadir 110
  • 110. JSTL & EL La Java Standard Tag Library & Expression Language
  • 111. • La JavaServer Pages Standard Tag Library (JSTL) est un composant de la plate- forme JEE de développement. • Elle étend la spécification JSP en ajoutant une bibliothèque de balises pour les tâches courantes, comme : • le travail sur des fichiers XML, • l'exécution conditionnelle, • les boucles • l'internationalisation. • … • La JSTL, en tant que bibliothèque de balises JSP, propose de développer une page JSP sans y utiliser de code Java directement ce qui permet aux web designers de concevoir des pages dynamiques complexes sans connaissances préalable du langage Java.  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 112 JSTL
  • 112. • JSTL propose un langage nommé EL (Expression Langage) qui permet de faire facilement référence à des objets Java accessibles dans les différents contextes de la JSP (page, requête, session ou application). • Il permet de placer à n'importe quel endroit d'une page JSP des expressions qui sont évaluées et remplacées par le résultat de leur évaluation.(à la place d'une expression <%=expressionJava%>) • La syntaxe est la suivante : ${ expression }  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 113 ExpressionLanguage <%= session.getAttribute("personne").getNom()%> ${sessionScope.personne.nom}
  • 113. • EL possède par défaut les variables suivantes :  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 114 ExpressionLanguage Variable Rôle PageScope variable contenue dans la portée de la page (PageContext) RequestScope variable contenue dans la portée de la requête (HttpServletRequest) SessionScope variable contenue dans la portée de la session (HttpSession) ApplicationScope variable contenue dans la portée de l'application (ServletContext) Param paramètre de la requête http ParamValues paramètres de la requête sous la forme d'une collection Header en-tête de la requête HeaderValues en-têtes de la requête sous la forme d'une collection InitParam paramètre d'initialisation Cookie cookie PageContext objet PageContext de la page
  • 114. • EL ne permet pas l'accès aux variables locales. • Pour pouvoir accéder à de telles variables, il faut obligatoirement en créer une copie dans une des portées particulières : page, request, session ou application  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 115 ExpressionLanguage <% String nom="boukouchi"; %> Bonjour : ${nom} <% String nom="boukouchi"; pageContext.setAttribute("nom", nom); %> Bonjour : ${nom}
  • 115. • L'EL fournit les opérateurs de comparaison suivants: Concept Condition EL Résultat Numérique inférieur à ${1 < 2} vrai Numérique inférieur à (Less than) ${1 lt 2} vrai Numérique supérieur à (Greater than) ${1 gt 2} faux Numérique supérieur ou égal à ${1 >= 1} vrai Numérique inférieur ou égal à (Less equals) ${1 le 1} vrai Numérique égal à ${1 == 1} vrai Numérique égal à (equal) ${1 eq 1} vrai Numérique non égal à ${1 != 2} vrai Numérique non égal à (not equal) ${1 ne 2} vrai Alphabétique supérieur que ${'abe' > 'ade'} faux Alphabétique égal à (Equals) ${'abe' eq 'abe'} vrai Alphabétique non égal à (Not equals) ${'abe' ne 'ade'} vrai  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 116 ExpressionLanguage
  • 116. • L'EL fournit les opérateurs de comparaison suivants: égaux à (equals) == eq Pas égaux (Not equals) != ne Moins que (Less than) < lt Plus grand que(Greater than) > gt Moins que ou égaux à (Less than or equals) <= le Plus grand ou égaux à (Greater than or equals) >= ge Opérateur Description && Et || Ou ${(guess >= 10) && (guess <= 20)} ${ guess >= 10 || guess <= 20 }  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 117 ExpressionLanguage Operateur Rôle Exemple . Obtenir une propriété d'un objet ${param.nom} [] Obtenir une propriété par son nom ou son indice ${param[" nom "]} ${row[1]} Empty Teste si un objet est null ou vide si c'est une chaîne de caractère. Renvoie un booléen ${empty param.nom}
  • 117. • La JSTL étend la spécification JSP en ajoutant de nombreuses balises pour des tâches courantes. • Elle est composée de plusieurs bibliothèques : • Core Tags (préfixe c) exposent tous les tags de base de la JSTL pour l’affichage, la gestion des variables, les boucles, les conditionnelles, etc., • <%@ taglib prefix="c " uri= "http://java.sun.com/jsp/jstl/core"%> • Formatting Tags (préfixe fmt) exposent toutes les fonctionnalités d'affichage de données non triviales : les dates formatées, les nombres formatés, les messages internationalisés, etc. • <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix= "fmt"%> • XML tags (préfixe x) pour l’analyse et la transformation (XSLT) des pages XML. Cette librairie permet par exemple de lire des flux XML via HTTP, de les analyser, de les transformer par XSLT, puis de les afficher sous différentes formes. • <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x "%> • SQL tags (préfixe sql) pour la connexion aux bases de données, les requêtes, les transactions, etc., • <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> • Functions Tags (préfixe fn) présentent des fonctions standards dont la majorité sont pour la manipulation des chaine de caractères • <%@ tagl uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 118 JSTL
  • 118. • Télécharger les bibliothèques : • taglibs-standard-impl-1.2.5.jar • taglibs-standard-spec-1.2.5.jar • (http://tomcat.apache.org/download-taglibs.cgi) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Exemples de JSTL</title> </head> <body> <c:out value="Bonjour" /><br/> </body> </html> Hello JSTL  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 119
  • 119.  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 120 JSTLCoreTags 1. Le tag set permet de stocker une variable dans une portée particulière (page, request, session ou application). 2. Le tag out permet d’afficher la valeur d’une variable, ce tag est équivalent à <%= ...%>. 3. Le tag remove permet de supprimer une variable. 4. Le tag catch permet de gérer les exceptions. 5. Le tag if est utilisé pour réaliser une condition. 6. Le tag choose est utilisé pour des cas mutuellement exclusifs (équivalent du switch). 7. Le tag foreach est utilisé pour réaliser des itérations. 8. Le tag forTokens est utilisé pour découper une chaîne selon un ou plusieurs séparateurs. 9. Le tag import permet d’accéder à une ressource via son URL pour l’inclure ou l’utiliser dans la page JSP. 10. Le tag redirect permet de réaliser une redirection vers une nouvelle URL
  • 120. <c:out> : permet d’afficher la valeur d’une variable, ce tag est équivalent à <%= ...%> <c:out value= ${'Bonjour ENSA'} /><br/>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 121 JSTLCoreTags <c:set>: permet de stocker une variable dans une portée particulière (page, request, session ou application) <c:set var= "montantHT" scope="session" value='${6600}' /> <c:set var="TVA" scope="session" value='${0.20}' /> <p>Montant HT: <c:out value='${montantHT}' /><p> <p>Montant TTC: <c:out value= '${montantHT*(1+TVA)}' /><p>
  • 121. • <c:choose>:Traitement conditionnel exclusif <c:set var="note" scope="session" value="${16.75}" /> <p> Votre note est :<c:out value="${note}" /></p> <c:choose> <c:when test="${note>= 0 && note < 10}">Ajourné.</c:when> <c:when test="${note>= 10 && note <12}">Mention Passable.</c:when> <c:when test="${note>= 12 && note <14}">Mention Assez-Bien.</c:when> <c:when test="${note>= 14 && note <16}">Mention Bien.</c:when> <c:when test="${note>= 16 && note <=20}">Mention Très Bien.</c:when> <c:otherwise>Note invalide ...</c:otherwise> </c:choose>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 122 JSTLCoreTags • <c:if>:Traitement conditionnel <c:set var="montantHT" scope="session" value="${1000}" /> <p>Montant HT:<c:out value="${montantHT}" /><p> <c:if test="${montantHT >= 6000}"> <p>Montant TTC:<c:out value="${montantHT*1.2}" /><p> </c:if> <c:if test="${montantHT < 6000}"> <p>Montant TTC:<c:out value="${montantHT*1.1}" /><p> </c:if>
  • 122. <c:forEach>: Itérer sur une collection <%@page import="org.exemples.beans.UserBeans"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Exemples de JSTL</title></head> <body> <%!List<UserBeans> users = new ArrayList<UserBeans>();%> <% users.add(new UserBeans("youness", "BOUKOUCHI", "PA")); users.add(new UserBeans("mohammed", "ELYAKOUBI", "PA")); users.add(new UserBeans("mohammed", "NOUHI", "PA")); request.setAttribute("users", users); %> <table style="border: 1px"solid; > <tr bgcolor=#ccffcc> <td size=12>nom</td><td>prenom</td><td>role</td> </tr> <c:forEach var="user" items="${users}" > <tr bgcolor=#e6ffff> <td>${user.nom}</td> <td>${user.prenom}</td> <td>${user.role}</td> </tr> </c:forEach> </table></body></html>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 123 JSTLCoreTags <c:forEach var="i" begin="1" end ="5" > Item <c:out value ="${i}" /><p> </c:forEach> <c:forTokens>:Itérer sur des éléments d'une String <c:forTokens items="GInf-GInd-GElec" delims="-" var="opt"> <c:out value="${opt}"/><p> </c:forTokens>
  • 123. <c:redirect>: permet de réaliser une redirection vers une nouvelle URL <c:redirect url="hello.jsp"/>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 124 JSTLCoreTags <c:import>: permet d’accéder à une ressource via son URL pour l’inclure ou l’utiliser dans la page JSP <c:import var="data" url= "hello.jsp" /> <c:out value="${data}"/>
  • 124. <fmt:formatDate> <%@page import= java.util.Date %> <%@ taglib prefix="c" uri= http://java.sun.com/jsp/jstl/core %> <%@ taglib prefix="fmt" uri= http://java.sun.com/jsp/jstl/fmt %> <html> <head> <title>Hello JSTL</title></head> <body> <c:set var="date" value= <%=new Date()%> /> <p> Objet Date : <c:out value= ${date} ></c:out> <p> Format Date : <fmt:formatDate type="date" value="${date} "/> <p> Format Date : <fmt:formatDate type="time" value="${date} "/> <p> Format Date et Temps style(short) : <fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${date} "/> <p> Format Date et Temps style(medium) : <fmt:formatDate type="both" dateStyle="medium" timeStyle="medium" value="${date} " /> <p> Format Date et Temps style(long) : <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${date} " /> </body></html>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 125 JSTLFormattingTags
  • 125. <fmt:formatNumber> <%@ taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %> <%@ taglib prefix= fmt uri= http://java.sun.com/jsp/jstl/fmt %> <html> <head> <title>Hello JSTL</title></head> <body> <c:set var= "montant " value= "39800.34567 " /> <p>Montant :<c:out value= "${montant} " ></c:out> <p> Monétaire: <fmt:formatNumber type= "number" pattern= "###.## DH " value= "${montant} " /> <p>Porcentage %: <fmt:formatNumber type= "percent" maxIntegerDigits= "5" maxFractionDigits= "2" value= "${montant} " /> </body></html>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 126 JSTLFormattingTags
  • 126. • <fn:> <%@ taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %> <%@ taglib prefix= fn uri= http://java.sun.com/jsp/jstl/functions%> <html> <head> <title>Hello JSTL</title></head> <body> <c:set var="ensa" value="Ecole Nationale des Sciences Appliquées" /> Longuer ENSA: ${fn:length(ensa)}<br> ENSA en miniscule : ${fn:toLowerCase(ensa)}<br> ENSA en majuscule : ${fn:toUpperCase(ensa)}<br> </body> </html>  JSTL & EL Prof Y.BOUKOUCHI - ENSA d'Agadir 127 JSTLFunctionTags
  • 128. • Un design pattern ou un modèle de conception est en quelque sorte une ligne de conduite qui permet de décrire les grandes lignes d’une solution (bonnes pratiques de développement ). • Le modèle MVC proposée par Sun est la solution de développement Web côté serveur qui permet de séparer la partie logique/métier de la partie présentation dans une application Web. • L’objectif principal est de diviser l’application en trois parties: • Le modèle qui est représenté par les EJB, JavaBeans, systèmes de persistances. • La vue qui est représentée par les JSP, Html, CSS, etc. • Le contrôleur qui est représenté par les Servlets et les filtres.  Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 129 LeModèle MVC(ModelViewController)
  • 129. • La couche Contrôleur : chargée de router les informations, elle va décider qui va récupérer l’information et la traiter. Elle gère les requêtes des utilisateurs et retourne une réponse avec l’aide de la couche Modèle et Vue. • La couche Vue : s’occupe de la présentation des données à l’utilisateur, c’est elle qui est responsable de produire les interfaces de présentation de votre application à partir des informations qu’elle dispose (page HTML par exemple). • La couche Modèle : exécute la logique métier de l’application, elle est responsable de la manipulation des données(le traitement, la validation, l’association, etc.). Elle est également responsable de l’interaction avec la base de données (se connecter et d’exécuter les requêtes CRUD sur une base de données).  Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 130 ArchitectureMVC(ModelViewController)
  • 130. 1. Le client envoie une requête HTTP au serveur. C’est en général une Servlet qui traite la demande. 2. La Servlet récupère les informations transmises par le client et délègue le traitement à un composant métier adapté. 3. Les composants du modèle manipulent ou non des données du système d’information (lecture, écriture, mise à jour, suppression). 4. Une fois les traitements terminés, les composants rendent la main à la Servlet en lui retournant un résultat. La Servlet stocke alors le résultat dans un contexte adapté (session, requête, réponse...). 5. La Servlet appelle la JSP adéquate qui peut accéder au résultat. 6. La JSP s’exécute, utilise les données transmises par la Servlet et génère la réponse au client.  Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 131 ArchitectureMVC(ModelViewController)
  • 131.  Le modèle MVC Prof Y.BOUKOUCHI - ENSA d'Agadir 132 ArchitectureMVC(ModelViewController)
  • 133. • Pour déployer une application dans un conteneur, il faut lui fournir dans une archive deux éléments : • les fichiers de l’application : Servlets, JSPs, classes compilées (.class), ressources statiques (pages HTML statiques, images, CSS, pdf, txt, . . . ), . . . • un fichier XML descripteur de déploiement : précise au conteneur la configuration pour exécuter l’application • Chaque conteneur possède son propre format d’archive :  Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 134 FichierWAR
  • 134. • Pour créer le fichier WAR, dans eclipse on clique File/Export  Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 135 FichierWAR Pour exporter les fichiers sources .java
  • 135. • Pour déployer une application web JEE, on utilise l’outil manager de Tomcat qui permet de déployer une application avec une interface Web. • Le lien Tomcat Manager ouvre une fenêtre d’authentification Les informations de connexion correspondent aux données insérées lors de l’installation du serveur. • Nous obtenons une page qui liste toutes les applications actuellement déployées sur le serveur.  Déploiement au serveur Prof Y.BOUKOUCHI - ENSA d'Agadir 136 DéploiementauserveurTomcat