Académique Documents
Professionnel Documents
Culture Documents
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.
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
8
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
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
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
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
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.
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
62