Vous êtes sur la page 1sur 60

Java EE

Filière Informatique et Ingénierie des Données


Semestre 3

Prof. Bouchra KAROUM

Ecole Nationale des sciences Appliquées - Khouribga


Université Sultan Moulay Slimane Béni-Mellal

2023-2024
Chapitre 2 : Les servlets

2
Servlet
▷ Le servlet est un composant Java qui permet de gérer des
requêtes HTTP et fournit au client une réponse HTTP
dynamique.

▷ Les servlets permettent de :


• Créer des applications web dynamiques.
• Collecter les entrées des utilisateurs via des formulaires de
pages web
• Présenter des enregistrements à partir d’une base de
données ou autre source

3
Historique

4
Avantages des servlets
▷ Portabilité : indépendante du système exploitation et des serveurs web
▷ Efficacité : semi compilée, gestion du cache, connexions persistantes
▷ Puissance : communication bidirectionnelle avec le serveur web, partage
de données entre servlets, chaînage de servlets, servlet modifiée peut être
réactivée sans redémarrage du serveur
▷ Modularité : possibilité d’avoir plusieurs servlets, chacune pouvant
accomplir une tâche spécifique
▷ Pratique : gestion des cookies, suivi des sessions, manipulation simple du
protocole HTTP…

5
API Servlet : L’interface javax.servlet.Servlet

▷ Interface définissant le contrat que les classes doivent respecter


pour être considérées comme des servlets
▷ Définit les méthodes pour initialiser la servlet, recevoir et
répondre aux requêtes des clients et pour détruire aussi la
servlet.
▷ Méthodes :
• init()
• destroy()
• service(req: ServletRequest,rep: ServletResponse)
• getServletConfig()
• getServletInfo()
7
API Servlet : javax.servlet.GenericServlet

▷ Implémentation de l’interface Servlet définissant une servlet


indépendante de tout protocole.
▷ Classe abstraite de base pour les servlets qui peut être
utilisée pour créer des servlets non spécifiques à HTTP
▷ Méthodes :
• init()
• destroy()
• getServletConfig()
• getServletInfo()

8
API Servlet : javax.servlet.ServletRequest

▷ Fournit des méthodes permettant d'accéder aux informations de la


requête, telles que les paramètres, les en-têtes, le corps de la requête,
etc.
▷ Cette interface est implémentée par les conteneurs de servlet pour
créer des objets de requête et est généralement passée en tant que
paramètre à la méthode service() de la servlet.
▷ Méthodes :
• String getMethod() : récupère la méthode HTTP utilisée par le client
• String getHeader(String Key) :récupère la valeur de l'attribut Key de l'en-
tête
• String getRemoteHost() : récupère le nom de domaine du client
• String getRemoteAddr() : récupéré l'adresse IP du client
9
API Servlet : javax.servlet.ServletRequest

▷ Méthodes :
• String getParameter(String Key) : récupère la valeur du paramètre Key (clé)
passée dans l’URL ou dans le formulaire. Lorsque plusieurs valeurs sont
présentes, la première est retournée
• String[] getParameterValues(String Key) : récupère les valeurs
correspondantes au paramètre Key (clé) d'un formulaire; dans le cas d'une
sélection multiple (cases à cocher, listes à choix multiples) il retourne les
valeurs de toutes les entités sélectionnées
• Enumeration getParameterNames() : retourne un objet Enumération
contenant la liste des noms des paramètres passés à la requête
• String getServerName() : récupère le nom du serveur
• String getServerPort() : récupère le numéro de port du serveur

10
API Servlet : javax.servlet.ServletResponse
▷ Fournit des méthodes permettant de configurer et de générer la réponse
renvoyée par la servlet au client.
▷ Cette interface est implémentée par les conteneurs de servlet pour créer
des objets de réponse et est généralement passé en tant que paramètre
à la méthode service() de la servlet.
▷ Méthodes:
• String setStatus(int StatusCode) : définit le code de statut HTTP de la
réponse, tel que 200 pour OK, 404 pour Not Found …
• void setHeader(String Nom, String Valeur) : définit un en-tête HTTP
personnalisé dans la réponse.
• void setContentType(String type) : définit le type MIME de la réponse HTTP,
indiquant au navigateur comment interpréter le contenu de la réponse.

11
API Servlet : javax.servlet.ServletResponse
▷ Méthodes:
• void setContentLength(int len) : définit la taille de la réponse
• PrintWriter getWriter() : retourne un objet PrintWriter permettant
d'envoyer du texte au navigateur client. Il se charge de convertir au format
approprié les caractères Unicode utilisés par Java
• sendError(int sc, String msg) : envoie une réponse d'erreur HTTP avec un
code de statut spécifié et un message d'erreur optionnel.
• void sendredirect(String location) : permet de rediriger le client vers une
nouvelle URL spécifié dans location. Souvent utilisé pour faire des
redirections après un traitement
• addCookie(Cookie cookie) : utiliser pour ajouter un cookie à la réponse
HTTP. Les cookies sont des petits morceaux de données stockés sur le côté
client

12
API Servlet : javax.servlet.ServletContext

▷ Définit les méthodes qu’utilise une servlet pour communiquer


avec le conteneur de servlets. Par exemple, pour obtenir le type
MIME, pour rediriger les requêtes, pour écrire dans des fichiers
de logs.
▷ Il y a un seul contexte par web application par JVM.
▷ L’objet ServletContext est contenu dans l’objet ServletConfig. Ce
dernier est fourni à la servlet lors dans son initialisation par le
serveur web.

13
API Servlet : javax.servlet.ServletContext
▷ Méthodes:
• getInitParameter(String name) : permet de récupérer la valeur d'un
paramètre d'initialisation défini dans la section <context-param> du fichier
web.xml
• getInitParameterNames() : pour obtenir une énumération des noms de tous
les paramètres d'initialisation
• setAttribute(String name, Object value) : Pour stocker un attribut
d'application.
• getAttribute(String name) : Pour récupérer la valeur d'un attribut
d'application
• log(String message) : pour enregistrer des messages dans le journal de
l'application.
• getResource(String path) : Pour obtenir l'URL d'une ressource.

14
API Servlet : javax.servlet.ServletConfig
▷ Fournit un moyen pour les servlets d'accéder à leur configuration
spécifique, ce qui facilite la personnalisation et la configuration de
chaque servlet individuellement au sein d'une application web Java EE.
▷ Méthodes
• getServletName() : renvoie le nom de la servlet tel qu'il est configuré dans
le fichier web.xml
• getServletContext() : renvoie l'objet ServletContext associé à la servlet. Cet
objet pour accéder à des informations globales sur l'application web et
partager des données entre les servlets.
• getInitParameterNames()
• getInitParameter(String name)
▷ L'objet ServletConfig est transmis à la méthode init() de la servlet lors
de l'initialisation de celle-ci. Cela permet à la servlet d'accéder aux
paramètres d'initialisation et d'autres informations de configuration
nécessaires à son fonctionnement 15
API Servlet : javax.servlet.HttpServlet
▷ Classe abstraite hérite de javax.servlet.GenericServlet
▷ Spécialement conçue pour la gestion des requêtes HTTP dans
l'API Servlet de Java EE
▷ Fournit des méthodes spécifiques à HTTP pour gérer les
requêtes GET, POST, PUT, DELETE, etc., et générer des réponses
HTTP.
▷ Méthodes:
• doGet(req: HttpServletRequest,rep: HttpServletResponse)
• doPost(req: HttpServletRequest,rep: HttpServletResponse)
• doPut(req: HttpServletRequest,rep: HttpServletResponse)
• doDelete(req: HttpServletRequest,rep: HttpServletResponse)

16
API Servlet : javax.servlet.HttpServletRequest/Response

▷ HttpServletRequest
• Hérite de ServletRequest: définit un objet contenant une
requête selon le protocole http.
▷ HttpServletResponse
• Hérite de ServletResponse: définit un objet contenant la
réponse de la servlet selon le protocole HTTP.
• Elle dispose de méthodes permettant d’accéder aux en-tête
HTTP et aux cookies.

17
API Servlet : javax.servlet.http.HttpSession

▷ Fait partie de l'API Servlet de Java EE


▷ Utilisée pour gérer les sessions utilisateur dans une application web.
▷ Méthodes:
• getId() : Cette méthode renvoie l'identifiant de session unique associé à la
session de l'utilisateur.
• invalidate() : Cette méthode permet de détruire la session de l'utilisateur.
Toutes les données associées à la session sont effacées.
• setAttribute(String name, Object value) : Cette méthode permet de stocker
un objet dans la session de l'utilisateur. Vous pouvez utiliser cette méthode
pour stocker des données spécifiques à un utilisateur pour une utilisation
ultérieure.
• getAttribute(String name) : Cette méthode permet de récupérer un objet
précédemment stocké dans la session.
• removeAttribute(String name) : Cette méthode permet de supprimer un
attribut spécifique de la session.
18
HTTPServlet
▷ Dans la suite du cours nous allons utiliser uniquement des
Servlets qui réagissent au protocole HTTP d'où l'utilisation de la
classe HttpServlet
▷ Une Servlet est concrètement une classe Java qui hérite de la
classe HTTPServlet qui implémente l’interface Servlet
▷ Il faut redéfinir les méthodes correspondantes aux méthode HTTP
: doGet(), doPost(), doPut(), doDelete() et doHead(). Et d’autres
méthodes qui définissent son cycle de vie.

19
Conteneur de servlet
▷ Pour exécuter une application à base de servlets, il faut disposer
d’un conteneur de servlets. Son rôle est :
• La gestion des requêtes client
• La transmission des requêtes à une servlet
• L’envoi des réponses au client
▷ Les servlets sont instanciées une seule fois, ensuite le traitement
des requêtes s'effectue de manière concurrente dans des fils
d'exécution (threads) différents.
▷ Différents types de conteneur de servlets :
• Conteneurs légers : Jetty, Resin, Apache Tomcat,
• Conteneurs JEE complets : Glassfish, JBoss, WebSphere….
20
Cycle de vie d’une servlet

21
Cycle de vie d’une servlet
▪ Le cycle de vie d'une servlet est géré par le
conteneur de servlets.
▪ Le cycle de vie se résume en 5 étapes:
1. Charger la classe Servlet
2. Créer une instance de Servlet
3. Appeler la méthode init()
4. Appeler la méthode service()
5. Appeler la méthode destroy()
▪ Les étapes 1, 2 et 3 sont exécutées seulement
une seule fois, lorsque la servlet est chargée. Par
défaut, la servlet n'est pas chargée jusqu'à ce que
la première requête soit reçue.
▪ L'étape 4 est exécutée plusieurs fois à chaque
requête HTTP.
▪ L'étape 5 est exécutée quand le conteneur de
servlet détruit (décharge) la servlet.
22
Cycle de vie d’une servlet
1. Charger la classe Servlet
▪ Au démarrage de l’application (déployer l’application dans le serveur),
le serveur lit le fichier web.xml (le descripteur de déploiement de
servlet)
▪ Le serveur récupère les informations concernant la servlet et lance le
chargement
2. Créer une instance de Servlet
▪ Une fois la classe est chargée, le conteneur crée une instance de
servlet.
▪ Généralement, une seule instance est créée et les requête en
concurrence sont traitées dans la même instance de servlet. C'est
au conteneur de servlets à décider mais, en général, il n'y a qu'une
instance.
23
Cycle de vie d’une servlet
3. Appeler la méthode init()
▪ Appelée une seule fois
▪ Elle permet à la servlet de s'initialiser avant que la première
requête soit traitée
▪ Les paramètres d'initialisation de la servlet peuvent être
spécifier dans le fichier web.xml

▪ la déclaration de la méthode:

24
Cycle de vie d’une servlet
4. Appeler la méthode service()
Pour chaque requête effectuée, un lien est créé
entre le client et la servlet avec :
▷ Appel de la méthode service() qui détermine le
type de requête envoyée (GET, POST, PUT,
DELETE, etc.)
▷ 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
▷ Invocation de la méthode correspondante
doGet, doPost, doPut, doDelete, etc
25
Cycle de vie d’une servlet
4. Appeler la méthode service()
○ Tant que la servlet reste active, la méthode service() peut être
invoquer de nouveau.
○ la déclaration de la méthode:

26
Cycle de vie d’une servlet
5. Appeler la méthode destroy()
○ La méthode destroy() est appelée une seule fois à la fin de cycle
de vie d'une servlet.
○ Cette méthode donne à la servlet une chance de fermer les
connexions à la base de données, d'arrêter les threads d'arrière-
plan, d'écrire des listes de cookies et d'effectuer d'autres
activités de nettoyage.
○ Une fois la méthode destroy () est appelée, l'objet servlet est
marqué pour le garbage collection.

27
Développer une Servlet

1. Créer une classe qui hérite de


l’interface HttpServlet
2. Redéfinir une ou plusieurs méthodes
doXXX() (doPost(), doGet(), …)
3. Ajouter une description dans le
descripteur du déploiement web.xml

29
Fichier Web.xml
▷ Utilisé pour configurer divers éléments de l'application
web, tels que les servlets, les filtres, les listeners, les
paramètres d'application, les pages d'erreur, les sessions,
etc.
▷ Généralement situé dans le répertoire WEB-INF de la
structure d'un projet web.

30
Fichier Web.xml

Enregistrement de la servlet :
- Identification (nom de la servlet)
- Classe java de la servlet

Mappage de la servlet :
- Identification (nom de la servlet)
- modèle de l’URL associé à la
servlet

31
Exemple 1
▷ Donner une servlet qui affiche le nom passé comme
paramètre dans la requête HTTP (URL)

32
Exemple 1 (solution 1/3)
▷ Servlet : PremiereServlet

33
Exemple 1 (solution 2/3)
▷ Web.xml

34
Exemple 1 (solution 3/3)

35
Servlet et Formulaire
▷ Un formulaire peut envoyer des informations à une servlet:
• Mettre le nom de la servlet qui va recevoir les informations
en tant que valeur de l'attribut Action de la balise Form,
• Spécifier la méthode HTTP désirée grâce à l'attribut Method.
• Les données sont envoyées à l'aide de la méthode spécifiée
après que l'utilisateur clique sur un bouton de type Submit

36
Servlet et Formulaire
Exemple

Servlet saisieForm.java
▷ Utilisation des annotations
@webServlet
▷ Utilisation des méthodes doPost()
et doGet()

37
Servlet et Formulaire
Exemple

Fichier saisieForm.html

38
Servlet et Formulaire
Exemple

39
Cookies
▷ Appelé témoin de connexion ou témoin
▷ Informations envoyées par le serveur, stockée localement sur le poste client et
renvoyées par le client quand il revient visiter la même URL.
▷ Durée de vie réglable
▷ Permet d'avoir des données persistantes côté client
▷ Utilisation :
• Identification des utilisateurs
• Éviter la saisie d’informations à répétition (login, password, adresse,…)
• Gérer des préférences utilisateur, profils
▷ Sécurité :
• Jamais interprété ou exécuté : pas de virus
• Pas partageable : le navigateur ne distribue le cookie qu'au serveur qui l'a
émis
• Un cookie est limité à 4KB et les navigateurs se limitent à 300 cookies (20
par site) : pas de surcharge de disque
40
Cookies
▷ Un cookie comporte (entre autres) :
• un nom
• une valeur
• une date d’expiration (durée de vie)
• un “domaine” (généralement le serveur qui l’a créé)
• un “chemin” (path) indiquant pour quelle URL il est valable.
▷ Une fois le cookie créé, son nom ne peut plus être changé (pas
de méthode setName()).

41
Cookies
▷ L'en-tête HTTP réservé à l'utilisation des cookies s'appelle Set-Cookie,
il s'agit d'une simple ligne de texte de la forme:
Set-Cookie : NOM=VALEUR; domain=NOM_DE_DOMAINE;
expires=DATE

▷ Cette chaîne de caractères commence par Set-Cookie : suivie par des


paires clés-valeur sous la forme CLE=VALEUR et séparées par des
virgules.
▷ L'API servlet de Java propose une classe permettant de créer,
manipuler et gérer les cookies HTTP dans une application web :
Cookie

42
Cookies : Classe Cookie
▷ Méthodes pour configurer le cookie :
• setMaxAge(int expiry) : Définit la durée de vie du cookie en secondes. Un
cookie expirera après cette période.
• setPath(String uri) : Définit le chemin du cookie, limitant ainsi son accessibilité
aux pages du chemin spécifié.
• setDomain(String domain) : Définit le domaine du cookie, limitant son
accessibilité aux pages de ce domaine.
• setSecure(boolean secure) : Indique si le cookie doit être transmis uniquement
via une connexion sécurisée (HTTPS).
• setHttpOnly(boolean httpOnly) : Indique si le cookie doit être accessible
uniquement via HTTP et non par des scripts JavaScript
▷ Méthodes pour ajouter et supprimer des cookies dans la réponse HTTP
• response.addCookie(Cookie cookie)
• response.deleteCookie(Cookie cookie)
43
Cookies : Classe Cookie
▷ Méthodes pour obtenir des informations sur le cookie :
• getName() : Renvoie le nom du cookie.
• getValue() : Renvoie la valeur du cookie.
• getMaxAge() : Renvoie la durée de vie du cookie en secondes.
• getPath() : Renvoie le chemin du cookie.
• getDomain() : Renvoie le domaine du cookie.
• getSecure() : Renvoie true si le cookie est sécurisé (transmis via HTTPS), sinon false.
• isHttpOnly() : Renvoie true si le cookie est marqué comme "httpOnly," sinon false.
▷ Méthodes utilitaires :
• equals(Object obj) : Compare deux cookies pour savoir s'ils sont identiques.
• toString() : Renvoie une représentation sous forme de chaîne de caractères du cookie.

44
Cookies : Exemple

45
Cookies : Exemple (suite)

46
Cookies : Exemple (Résultat)

47
Sessions
▷ Le protocole HTTP est sans états (stateless protocol)
▷ Chaque requête est traitée indépendamment des autres et
qu'aucun historique des différentes requêtes n'est
conservé.
▷ Inconvénient pour certains applications web comme e-
commerce (doit sauvegarder l'état du panier du client).
➢ Solution : utilisation des sessions

48
Sessions : HttpSession
▷ Session: Période de temps correspondant à navigation continue d'un
utilisateur sur un site.

▷ Les données liées aux sessions doivent rester côté serveur


▷ Seul l'identifiant de session transmis sous forme de cookie,
▷ En Java : l’utilisation de l’interface : javax.servlet.http.HttpSession

HttpSession est un objet persistant coté serveur qui permet de


stocker les informations saisies au fur et à mesure par l'utilisateur et
de les relier à chaque requête grâce à l'identifiant passé en paramètre.
49
Sessions : HttpSession
▷ Méthodes de création et récupération de session
getSession(boolean) : une méthode de l'objet HttpServletRequest pour créer
une nouvelle session ou obtenir la session existante de l'utilisateur
• Obtenir la session, la créer si elle n’existe pas encore :
HttpSession session = request.getSession(true);

• Obtenir la session, sans la créer si elle n’existe pas :


HttpSession session = request.getSession(false);

50
Sessions : HttpSession
▷ Méthodes de gestion des attributs de session
▪ setAttribute() : stocker des données spécifiques à la session. Par
exemple, pour stocker un nom d'utilisateur après la connexion :
session.setAttribute("username", "john_doe");
▪ getAttribute() : récupérer des données stockées dans la session. Par
exemple, pour obtenir le nom d'utilisateur stocké précédemment:
String username = (String) session.getAttribute("username");
▪ removeAttribute(): supprimer des données spécifiques de la session.
Par exemple, pour supprimer le nom d'utilisateur:
session.removeAttribute("username");
▪ getAttributeNames(): récupération de tous les noms d’attributs
Enumeration e = session.getAttributeNames();

51
Sessions : HttpSession
▷ Méthodes sur les informations et cycle de vie de la session
▪ Quel est l’identifiant de la session ?
String sId= session.getId();
▪ Quand la session a-t-elle été créée ?
long t = session.getCreationTime();
▪ Dernier accès à la session
long lastAccess= session.getLastAccessedTime();
▪ Invalider la session
session.invalidate(); // Dé-référence les objets de la session
▪ Durée de conservation maximum entre 2 accès
Int max = session.getMaxInactiveInterval();
session.setMaxInactiveInterval(max) ;
▪ S’agit-il d’une nouvelle session ?
if ( session.isNew() ) { … … }
52
Sessions : La durée de vie
▷ La durée de vie (temps maximum de conservation entre 2 accès) d’une
session est limitée.
▷ Paramétrage dans le fichier « web.xml »
<session-config>
<session-timeout>40</session-timeout> //temps en minute
</session-config>
▷ La fin d’une session peut être :
• Implicite ( délai dépassé => « time out » ),
• Explicite ( sur action utilisateur => code Java ) session.invalidate();

53
Sessions : exemple

54
Sessions : exemple (suite)

55
Sessions : exemple (résultat)

56
Les filtres
▷ Les filtres permettent ainsi de traiter :
• Les requêtes qui viennent des clients avant qu’elles ne soient
traitées par les Servlets.
• Les réponses venant des Servlets avant qu’elles ne soient envoyées
aux clients.
▷ Il est possible par exemple de :
• décrypter des requêtes envoyées aux Servlets, traiter les données avec les
Servlets et crypter pour les clients ;
• gérer l’authentification des clients ;
• convertir des formats d’images, appliquer des transformations XSLT sur des
données XML...

57
Les filtres
▷ Pour utiliser un filtre, il faut :
1- modifier le descripteur de déploiement (web.xml) pour indiquer au
conteneur d’utiliser le filtre.
2- écrire une classe qui implémente l’interface javax.servlet.Filter.
▷ 1. Déclaration du Filtre en web.xml : exemple (filtrejournalisation)

58
Les filtres
2. Créer une classe qui implémente l’interface « javax.servlet.Filter».
▷ Méthodes :
• init(),
• doFilter(),
• destroy().
▷ La méthode "doFilter" est le point de passage dans le filtre. Elle dispose des
paramètres :
• ServletRequest( comme les servlets )
• ServletResponse( comme les servlets )
• FilterChain: instance de la "chaine de filtrage".

59
Les filtres
Suite de l’exemple exemple (filtrejournalisation)

60
Les filtres
Suite de l’exemple exemple (filtrejournalisation)

61
Travail à réaliser

▷ Préparation de l’environnement de travail


▷ Réalisation du TP ° 1

62

Vous aimerez peut-être aussi