Vous êtes sur la page 1sur 148

ROYAUME DU MAROC

Université Cadi Ayyad


Ecole Nationale des Sciences Appliqués
Département Génie Informatique, Réseaux & Télécoms
Safi
____________

JAVA EE

oujaoura@gmail.com Mustapha OUJAOURA


Chap 2 Les Servlets
Introduction
Introduction
3
¨ Composant logiciel écrit en Java s'exécutant du côté serveur Web
¤ Solution concurrente à la programmation Shell CGI.
¨ Permet de gérer des requêtes HTTP et de fournir au client une réponse HTTP via un
protocole de communication (généralement le protocole HTTP)
¨ Une Servlet s’exécute dans un moteur ou conteneur de Servlet permettant d’établir
le lien entre la Servlet et le serveur Web
¨ Une servlet est une application Java qui permet de créer dynamiquement des
données au sein d'un serveur HTTP.
¨ Une servlet s'exécute dynamiquement sur le serveur web et permet l'extension des
fonctions de ce dernier. Typiquement : accès à des bases de données, transactions
d'e-commerce, etc.
¨ Une servlet peut être chargée automatiquement lors du démarrage du serveur web
ou lors de la première requête du client. Une fois chargées, les servlets restent
actives dans l'attente d'autres requêtes du client.
¨ Ecrite en Java, une servlet en retire ses avantages : la portabilité, l'accès à toutes les
API de Java dont JDBC pour l'accès aux bases de données, ...
¨ Une servlet peut être invoquée plusieurs fois en même temps pour répondre à
plusieurs requêtes simultanées.
Fonctionnement d'une servlet
4

¨ Un serveur d'applications permet de charger et d'exécuter les servlets via un moteur


de servlets qui se charge de manager les servlets qu'il contient.
¨ Pour exécuter une servlet, il suffit de saisir une URL qui désigne la servlet dans un
navigateur.
1. Le serveur reçoit du navigateur la requête http qui a recours à une servlet
2. Si c'est la première sollicitation de la servlet, le serveur l'instancie. Les servlets sont stockées
dans un répertoire particulier du serveur. La servlet reste en mémoire jusqu'à l'arrêt du
serveur. Au fil des requêtes, la servlet peut être appelée par plusieurs threads lancés par
le serveur. Ce principe de fonctionnement évite d'instancier un objet de type servlet à
chaque requête et permet de maintenir un ensemble de ressources actives telles qu'une
connexion à une base de données.
3. Le serveur crée un objet qui représente la requête http ainsi que l'objet qui contiendra la
réponse et les envoie à la servlet
4. La servlet crée dynamiquement la réponse sous forme de page html transmise par un flux
dans l'objet contenant la réponse. La création de cette réponse utilise bien sûr la requête
du client mais aussi un ensemble de ressources incluses sur le serveur telles que des fichiers
ou des bases de données.
5. Le serveur récupère l'objet réponse et envoie la page html au client.
Cycle de vie d’une servlet
5

¨ Lorsque le conteneur reçoit une requête, il la transmet au servlet qui


correspond à l’URL pour que la requête soit traitée effectivement
suivant le cycle suivant:
1. Chargement de la classe
2. Instanciation du servlet : constructeur par défaut
3. Appel de la méthode init()
4. Appel(s) de service() : 1 thread par requête
5. Appel de la méthode destroy()
Cycle de vie d’une servlet
6

¨ Quatre étapes dans le cycle de vie d'une servlet :


¤ Chargement et instanciation (création de l'objet relatif à la classe mise en oeuvre) ;
¤ Initialisation ;
¤ Traitement des requêtes ;
¤ Fin de vie
Cycle de vie d’une servlet
7

¨ Le serveur crée un pool de threads auxquels il va pouvoir affecter chaque


requête
¨ La servlet est chargée au démarrage du serveur ou lors de la première
requête
¨ La servlet est instanciée par le serveur
¨ La méthode init() est invoquée par le conteneur
¨ Lors de la première requête, le conteneur crée les objets Request et Response
spécifiques à la requête
¨ La méthode service() est appelée à chaque requête dans un nouveau thread.
Les objets Request et Response lui sont passés en paramètre
¨ Grâce à l'objet request, la méthode service() va pouvoir analyser les
informations en provenance du client
¨ Grâce à l'objet response, la méthode service() va fournir une réponse au client
¨ La méthode destroy() est appelée lors du déchargement de la servlet, c'est-à-
dire lorsqu'elle n'est plus requise par le serveur. La servlet est alors signalée au
garbage collector.
Le Protocole HTTP
8

¨ HTTP :HyperText Tranfert Protocol


¤ protocole client-serveur inventé par Tim Berners-Lee
n avec le langage HTML et les adresses Web
¤ port 80 par défaut
¤ HTTPS – variante sécurisée (port 443)
¤ Protocole qui permet au client de récupérer des documents du serveur
¤ Ces documents peuvent être statiques (contenu qui ne change pas : HTML, PDF,
Image, etc..) ou dynamiques ( Contenu généré dynamiquement au moment de la
requête : PHP, JSP, ASP…)
¤ Ce protocole permet également de soumettre les formulaires.
¨ Fonctionnement (très simple en HTTP/1.0)
¤ Le client se connecte au serveur (Créer une socket)
¤ Le client demande au serveur un document : Requête HTTP
¤ Le serveur renvoi au client le document (status=200) ou d’une erreur (status=404
quand le document n’existe pas)
¤ Déconnexion
Le Protocole HTTP
9
¨ Une particularité du protocole HTTP est de maintenir la connexion entre le client et le
serveur uniquement durant l'échange de la requête et de la réponse.
¨ La requête est composée de trois parties :
¤ la commande :
n La première ligne de la requête contient la commande à exécuter par le serveur. La commande est
suivie éventuellement d'un argument qui précise la commande (par exemple l'url de la ressource
demandée). Enfin la ligne doit contenir la version du protocole HTTP utilisé, précédée de HTTP/.
n Exemple : GET / index.html HTTP/1.0
n Avec HTTP 1.1, les commandes suivantes sont définies : GET, POST, HEAD, OPTIONS, PUT, DELETE,
TRACE et CONNECT. Les trois premières sont les plus utilisées.
¤ la section en-tête : Cette partie en-tête est optionnelle.
n Il est possible de fournir sur les lignes suivantes de la partie en-tête des paramètres
supplémentaires. Les informations fournies peuvent permettre au serveur d'obtenir des informations
sur le client. Chaque information doit être mise sur une ligne unique. Le format est
nom_du_champ:valeur. Les champs sont prédéfinis et sont sensibles à la casse.
¤ le corps
n Une ligne vide doit précéder le corps de la requête. Le contenu du corps de la requête dépend du
type de la commande.
¨ La requête doit obligatoirement être terminée par une ligne vide.
Le Protocole HTTP
10

¨ La réponse est elle aussi composée des trois mêmes parties:


¤ une ligne de statuts
n La première ligne de l'en-tête contient un état qui est composé : de la version
du protocole HTTP utilisé, du code de statut et d'une description succincte de ce
code.
n Le code de statut est composé de trois chiffres qui donnent des informations sur
le résultat du traitement qui a généré cette réponse. Ce code peut être associé
à une catégorie en fonction de sa valeur
n Plusieurs codes sont définis par le protocole HTTP dont les plus importants sont :
n 200 : traitement correct de la requête
n 204 : traitement correct de la requête mais la réponse ne contient aucun contenu (ceci
permet au browser de laisser la page courante affichée)
n 404 : la ressource demandée n'est pas trouvée (sûrement le plus célèbre)
n 500 : erreur interne du serveur
¤ un en-tête dont le contenu est normalisé
n L'en-tête contient des informations qui précisent le contenu de la réponse.
¤ un corps dont le contenu dépend totalement de la requête
n Le corps de la réponse est précédé par une ligne vide.
Le Protocole HTTP
11

¨ Le code de statut est composé de trois chiffres qui donnent des


informations sur le résultat du traitement qui a généré cette
réponse.
¨ Ce code peut être associé à une catégorie en fonction de sa
valeur:
Plage de valeurs du code Signification
100 à 199 Information
200 à 299 Traitement avec succès
300 à 399 La requête a été redirigée
400 à 499 La requête est incomplète ou erronée
500 à 599 Une erreur est intervenue sur le serveur
Méthodes du protocole HTTP
12

¨ Une requête HTTP peut être envoyée en utilisant les


méthodes suivantes:
¤ GET : Pour récupérer le contenu d’un document
¤ POST : Pour soumissionner des formulaires (Envoyer, dans la
requête, des données saisies par l’utilisateur )
¤ PUT : Pour envoyer un fichier du client vers le serveur

¤ DELETE : Permet de demander au serveur de supprimer un


document.
¤ HEAD : Permet de récupérer les informations sur un
document (Type, Capacité, Date de dernière modification
etc…)
L’API Servlet
13
¨ L'API servlet regroupe un ensemble de classes dans deux packages :
¤ javax.servlet.http : contient les classes pour développer des servlets qui reposent sur le
protocole http utilisé par les serveurs web.
¤ javax.servlet : contient les classes pour développer des serlvets génériques indépendantes
d'un protocole
Javax.servlet.http Nom Rôle
Hérite de ServletRequest : définit un objet contenant une
HttpServletRequest
requête selon le protocole http
Les interfaces Hérite de ServletResponse : définit un objet contenant la
HttpServletResponse
réponse de la servlet selon le protocole http
HttpSession Définit un objet qui représente une session
Classe représentant un cookie (ensemble de données
Cookie
sauvegardées par le brower sur le poste client)
Hérite de GenericServlet : classe définissant une servlet
Les classes HttpServlet
utilisant le protocole http
Classe proposant des méthodes statiques utiles pour le
HttpUtils
développement de servlets http
javax.servlet Nom Rôle

L’API Servlet
RequestDispatcher
Définition d'un objet qui permet le renvoi d'une requête vers
une autre ressource du serveur (une autre servlet, une JSP ...)

14 Servlet Définition de base d'une servlet


ServletConfig Définition d'un objet pour configurer la servlet
Définition d'un objet pour obtenir des informations sur le
ServletContext
Les interfaces contexte d'exécution de la servlet
ServletRequest Définition d'un objet contenant la requête du client
Définition d'un objet qui contient la réponse renvoyée par la
ServletResponse
servlet
Permet de définir une servlet qui ne répondra qu'à une seule
SingleThreadModel
requête à la fois
Classe définissant une servlet indépendante de tout
GenericServlet
protocole
Les classes
ServletInputStream Flux permettant la lecture des données de la requête cliente
ServletOutPutStream Flux permettant l'envoi de la réponse de la servlet
Exception générale en cas de problème durant l'exécution
SevletException
Les exceptions de la servlet
UnavailableException Exception levée si la servlet n'est pas disponible
L’API Servlet
15

¨ Hiérarchie de L’API Servlet


L'interface Servlet
16

¨ Une servlet est une classe Java qui implémente l'interface


javax.servlet.Servlet.
¨ Cette interface définit 5 méthodes qui permettent au conteneur web de
dialoguer avec la servlet : elle encapsule ainsi les méthodes nécessaires à la
communication entre le conteneur et la servlet.
¨ Les méthodes init(), service() et destroy() assurent le cycle de vie de la
servlet en étant respectivement appelées lors de la création de la servlet,
lors de son appel pour le traitement d'une requête et lors de sa destruction.
¨ La méthode init() est appelée par le serveur juste après l'instanciation de la
servlet.
¨ La méthode service() ne peut pas être invoquée tant que la méthode init()
n'est pas terminée.
¨ La méthode destroy() est appelée juste avant que le serveur ne détruise la
servlet : cela permet de libérer des ressources allouées dans la méthode
init() telles qu'un fichier ou une connexion à une base de données.
L'interface Servlet
17

Méthode Rôle
Cette méthode est exécutée par le conteneur lorsque la servlet est
sollicitée : chaque requête du client déclenche une seule exécution de
void service (ServletRequest cette méthode.
req, ServletResponse res) Cette méthode pouvant être exécutée par plusieurs threads, il faut
prévoir un processus d'exclusion pour l'utilisation de certaines
ressources.
Initialisation de la servlet. Cette méthode est appelée une seule fois
après l'instanciation de la servlet.
void init(ServletConfig conf)
Aucun traitement ne peut être effectué par la servlet tant que
l'exécution de cette méthode n'est pas terminée.
ServletConfig
Renvoie l'objet ServletConfig passé à la méthode init
getServletConfig()
Cette méthode est appelée lors de la destruction de la servlet. Elle
void destroy() permet de libérer proprement certaines ressources (fichiers, bases de
données ...). C'est le serveur qui appelle cette méthode.
String getServletInfo() Renvoie des informations sur la servlet.
La requête et la réponse
18

¨ L'interface ServletRequest définit plusieurs méthodes qui permettent


d'obtenir des données sur la requête du client.
¨ L'interface ServletResponse définit plusieurs méthodes qui permettent
de fournir la réponse faite par la servlet suite à ses traitements.

Méthode Rôle
ServletInputStream getInputStream() Permet d'obtenir un flux pour les données de la requête
BufferedReader getReader() Idem
SetContentType Permet de préciser le type MIME de la réponse
ServletOutputStream
Permet d'obtenir un flux pour envoyer la réponse
getOutputStream()
PrintWriter getWriter() Permet d'obtenir un flux pour envoyer la réponse
Les servlets http
19

¨ L'usage principal des servlets est la création de pages HTML dynamiques. L'API fournit une
classe qui encapsule une servlet utilisant le protocole http. Cette classe est la classe
HttpServlet.
¨ Cette classe hérite de GenericServlet, donc elle implémente l'interface Servlet, et redéfinit
toutes les méthodes nécessaires pour fournir un niveau d'abstraction permettant de développer
facilement des servlets avec le protocole http.
¨ Ce type de servlet n'est pas utile seulement pour générer des pages HTML bien que cela soit
son principal usage, elle peut aussi réaliser un ensemble de traitements tels que mettre à jour
une base de données. En réponse, elle peut générer une page html qui indique le succès ou non
de la mise à jour. Une servlets peut aussi par exemple renvoyer une image qu'elle aura
dynamiquement générée en fonction de certains paramètres.
¨ Elle définit un ensemble de fonctionnalités très utiles : par exemple, elle contient une méthode
service() qui appelle certaines méthodes à redéfinir en fonction du type de requête http
(doGet(), doPost(), etc ...).
¨ La requête du client est encapsulée dans un objet qui implémente l'interface
HttpServletRequest : cet objet contient les données de la requête et des informations sur le
client.
Les servlets http
20

¨ Typiquement pour définir une servlet, il faut définir une classe qui hérite de la classe
HttpServlet et redéfinir la méthode doGet() et/ou doPost() selon les besoins.
¨ La méthode service() héritée de HttpServlet appelle l'une ou l'autre de ces méthodes
en fonction du type de la requête http :
¤ une requête GET : c'est une requête qui permet au client de demander une ressource
¤ une requête POST : c'est une requête qui permet au client d'envoyer des informations issues
par exemple d'un formulaire
¨ Une servlet peut traiter un ou plusieurs types de requêtes grâce à plusieurs autres
méthodes :
¤ doHead() : pour les requêtes http de type HEAD
¤ doPut() : pour les requêtes http de type PUT
¤ doDelete() : pour les requêtes http de type DELETE
¤ doOptions() : pour les requêtes http de type OPTIONS
¤ doTrace() : pour les requêtes http de type TRACE
¨ La classe HttpServlet hérite aussi de plusieurs méthodes définies dans l'interface
Servlet : init(), destroy() et getServletInfo().
Les servlets http
21

¨ HttpServlet redéfinit la méthode service(…)


¨ service(…) lit et détermine la méthode (GET, POST, …) à
partir de la requête
¨ Elle transmet la requête à la méthode appropriée de
HttpServlet destinée à traiter le type de requête (GET, POST,
…)
Les servlets http
22

¨ init() : Cette méthode définie dans la classe HttpServlet sauvegarde l'objet de type
ServletConfig.
¤ Si cette méthode doit être redéfinie, il est important d'invoquer la méthode héritée avec un
appel à super.init(config), config étant l'objet fourni en paramètre de la méthode.
¨ service() : c’est la méthode qui est appelée lors de l'invocation de la servlet.
¤ Par défaut dans la classe HttpServlet, cette méthode contient du code qui réalise une
analyse de la requête client contenue dans l'objet HttpServletRequest. Selon le type de
requête GET ou POST, elle appelle la méthode doGet() ou doPost(). C'est bien le type de
requête qui indique la méthode à utiliser dans la servlet.
¤ Ainsi, la méthode service() n'est pas à redéfinir pour ces requêtes et il suffit de redéfinir
les méthodes doGet() et/ou doPost() selon les besoins.
¨ doGet() : Une requête de type GET est utile avec des liens.
¤ Dans une servlet de type HttpServlet, une telle requête est associée à la méthode doGet().
¤ Le traitement typique de la méthode doGet() est d'analyser les paramètres de la requête,
alimenter les données de l'en-tête de la réponse et d'écrire la réponse.
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
}
Les servlets http
23

¨ doPost() : Une requête POST n'est utilisable qu'avec un formulaire HTML.


¤ Dans une servlet de type HttpServlet, une telle requête est associée à la méthode doPost().
¤ La méthode doPost() doit généralement recueillir les paramètres pour les traiter et générer
la réponse.
¤ Pour obtenir la valeur associée à chaque paramètre il faut utiliser la méthode
getParameter() de l'objet HttpServletRequest. Cette méthode attend en paramètre le nom
du paramètre dont on veut la valeur. Ce paramètre est sensible à la casse.

public void doPost(HttpServletRequest request, HttpServletResponse response) throws


IOException, ServletException {
String nom = request.getParameter("NOM");
String prenom = request.getParameter("PRENOM");
}
Fonctionnement d’une servlet
24

¨ Lorsqu'une servlet est appelée par un client, la méthode service()


est exécutée. Celle-ci est le principal point d'entrée de toute servlet
et accepte deux objets en paramètres:
¤ L'objet HttpServletRequest encapsulant la requête du client, c'est-à-dire
qu'il contient l'ensemble des paramètres passés à la servlet (informations
sur l'environnement du client, cookies du client, URL demandée, ...)
¤ L'objet HttpServletResponse permettant de renvoyer une réponse au
client (envoyer des informations au navigateur).
request Get
doGet()
response
service()
request Post
doPost()
Client response
HttpServlet
HttpServletResponse
25

¨ HttpServletResponse hérite de ServletResponse


¨ Cet objet est utilisé pour construire un message de réponse HTTP renvoyé au client,
¨ il contient les méthodes nécessaires pour définir le type de contenu, en-tête et code
de retour
¨ un flot de sortie pour envoyer des données (par exemple HTML) au client
¨ Exemples de méthodes :
¤ void setStatus(int) : définit le code de retour de la réponse
¤ void setContentType(String) : définit le type de contenu MIME
¤ 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
¤ ServletOutputStream getOutputStream() : flot pour envoyer des données binaires
au client
¤ void sendRedirect(String) : redirige le navigateur vers l'URL
HttpServletResponse
26

¨ La servlet envoie sa réponse au client en utilisant un objet de type


HttpServetResponse.
¨ HttpServletResponse est une interface : il n'est pas possible
d'instancier un tel objet mais le moteur de servlets instancie un objet
qui implémente cette interface et le passe en paramètre de la
méthode service.
¨ Avant de générer la réponse sous forme de page HTML, il faut
indiquer dans l'en-tête du message http, le type MIME du contenu du
message.
¨ Ce type sera souvent « text/html » qui correspond à une page HTML.
La méthode à utiliser est setContentType().
¨ L’interface HttpServletResponse possède plusieurs méthodes pour
mettre à jour l'en-tête http et la page HTML de retour:
HttpServletResponse
27

¨ La
Méthode Rôle
Envoie une erreur avec un code retour et un
void sendError (int)
message par défaut
void sendError (int, Envoie une erreur avec un code retour et un
String) message
void Héritée de ServletResponse, cette méthode
setContentType(String) permet de préciser le type MIME de la réponse
void Héritée de ServletResponse, cette méthode
setContentLength(int) permet de préciser la longueur de la réponse
ServletOutputStream Héritée de ServletResponse, elle retourne un
getOutputStream() flux pour l'envoi de la réponse
Héritée de ServletResponse, elle retourne un
PrintWriter getWriter()
flux pour l'envoi de la réponse
HttpServletResponse
28

¨ Il existe plusieurs façons de générer une page HTML : elles


utiliseront toutes soit la méthode getOutputStream() ou getWriter()
pour obtenir un flux dans lequel la réponse sera envoyée.
¤ Utilisation d'un StringBuffer et getOutputStream
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// creation de la reponse
StringBuffer sb = new StringBuffer();
sb.append("<HTML>\n");
sb.append("<HEAD>\n");
sb.append("<TITLE>Bonjour</TITLE>\n");
sb.append("</HEAD>\n");
sb.append("<BODY>\n");
sb.append("<H1>Bonjour</H1>\n");
sb.append("</BODY>\n");
sb.append("</HTML>");
// envoi des infos de l'en-tete
response.setContentType("text/html");
response.setContentLength(sb.length());
// envoi de la réponse
response.getOutputStream().print(sb.toString());
}
HttpServletResponse
29

¤ Utilisation directe de getOutputStream


n l'ajout des retours chariot '\n' à la fin de chaque ligne n'est pas
obligatoire mais facilite la compréhension du code HTML

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,


IOException {
response.setContentType("text/html");
ServletOutputStream out = response.getOutputStream();
out.println("<HTML>\n");
out.println("<HEAD>\n");
out.println("<TITLE>Bonjour</TITLE>\n");
out.println("</HEAD>\n");
out.println("<BODY>\n");
out.println("<H1>Bonjour</H1>\n");
out.println("</BODY>\n");
out.println("</HTML>");
}
HttpServletResponse
30

¤ Utilisation de la méthode getWriter()


n Avec cette méthode, il faut préciser le type MIME avant d'écrire la
réponse. L'emploi de la méthode println() permet d'ajouter un retour
chariot en fin de chaque ligne.
n Si un problème survient lors de la génération de la réponse, la méthode
sendError() permet de renvoyer une erreur au client : un code retour est
positionné dans l'en-tête http et le message est indiqué dans une simple
page HTML.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Bonjour</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>Bonjour</H1>");
out.println("</BODY>");
out.println("</HTML>");
}
HttpServletResponse
31

¨ La servlet envoie sa réponse au client en utilisant un objet de type


HttpServetResponse.
¨ HttpServletResponse est une interface : il n'est pas possible
d'instancier un tel objet mais le moteur de servlets instancie un objet
qui implémente cette interface et le passe en paramètre de la
méthode service.
¨ Avant de générer la réponse sous forme de page HTML, il faut
indiquer dans l'en-tête du message http, le type MIME du contenu du
message.
¨ Ce type sera souvent « text/html » qui correspond à une page HTML.
La méthode à utiliser est setContentType().
¨ L’interface HttpServletResponse possède plusieurs méthodes pour
mettre à jour l'en-tête http et la page HTML de retour:
HttpServletRequest
32

¨ HttpServletRequest hérite de ServletRequest


¨ Cet objet encapsule la requête HTTP et fournit des méthodes
pour accéder
¤ aux informations du client
¤ à l'environnement du serveur
¨ Exemples de méthodes
¤ String getMethod() : retourne le type de requête
¤ String getServerName() : retourne le nom du serveur
¤ String getParameter(String name) : retourne la valeur d'un
paramètre
¤ String[] getParameterNames() : retourne le nom des les paramètres
¤ String getRemoteHost() : retourne l'IP du client
¤ String getServerPort() : retourne le port sur lequel le serveur écoute
¤ String getQueryString() : retourne la chaîne d’interrogation
Création d’une servlet
33

¨ Une servlet est une classe qui hérite de la classe HttpServlet et qui
redéfinit les méthodes du protocole HTTP.
¨ Si la méthode utilisée est GET, il suffit de redéfinir la méthode :
¤ public void doGet(
HttpServletRequest request,
HttpServletResponse response)
¨ Si la méthode utilisée est POST, il suffit de redéfinir la méthode :
¤ public void doPost(
HttpServletRequest request,
HttpServletResponse response)
¨ Si aucun traitement particulier n'est associé à une requête de type
POST, il est pratique de demander dans la méthode doPost()
d'exécuter la méthode doGet(). Dans ce cas, la servlet est capable
de renvoyer une réponse pour les deux types de requête.
Création d’une servlet
34

¨ Pour que le serveur d’application (Tomcat, Glassfish, …) reconnaisse


une servlet, celle-ci doit être déclarée dans le fichier web.xml qui
se trouve dans le dossier WEB-INF.
¨ Le fichier web.xml s’appelle le descripteur de déploiement de
Servlet.
¨ Ce descripteur doit déclarer principalement les éléments:
¤ Définition de la servlet via la balise <servlet> qui contient (en respectant
l’ordre indiqué par les numéros):
n 2- Le nom attribué à cette servlet: <servlet-name>
n 3- La classe de la servlet : <servlet-class>
n Facultativement:
n 1- La description de la servlet : <description>
n 4- paramètre initial de la servlet : <init-param> et les tag: <param-name> <param-value>
n 5- Entier pour forcer le chargement de la servlet dès le démarrage du serveur: <load-on-startup>
¤ Le mapping de la servlet via la balise <servlet-mapping> qui contient:
n Le nom attribué à cette servlet: <servlet-name>
n Un ou plusieurs URL à utiliser pour faire appel à cette servlet: <url-pattern>
Exemple d’une servlet:
35
HelloWorld
¨ Le fichier web.xml :
<?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">
<display-name>servlet-exemples-helloServlet</display-name>
<welcome-file-list>
<welcome-file>firstServlet</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>myHelloServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myHelloServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
</web-app>
Exemple d’une servlet:
36
HelloWorld
¨ La servlet HelloServlet:
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Bonjour tout le monde</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Bonjour tout le monde</h1>");
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
Exemple d’une servlet:
37
HelloWorld
¨ La structure du projet:
Servlet 3.0
38

¨ Pour un projet web J2EE, utilisant un module web, version


3.0, le fichier web.xml n’est pas nécessaire.
¨ Dans ce cas, le déploiement d’une servlet peut se faire en
utilisant des annotations:
package web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
@WebServlet(name="cs", urlPatterns={"/fs","*.do"})
public class FirstServlet extends HttpServlet {
}
Exemple d’une servlet 3.0:
39
HelloWorld avec annotation
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.*;
@WebServlet(name ="myHelloServlet", urlPatterns = {"/firstServlet", "/fs"})
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Bonjour </title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Bonjour tout le monde</h1>");
String name = request.getParameter("name");
if(name!=null) out.println("<h2>Hello " + name + " !</h2>");
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { doGet(request, response);
}
}
Informations sur les Servlets :
40
Les paramètres d'initialisation
¨ Une servlet est exécutée dans un contexte particulier mis
en place par le moteur de servlets du serveur
d’application.
¨ La servlet peut obtenir des informations sur ce contexte.
¨ La servlet peut aussi obtenir des informations à partir de
la requête du client.
¨ Dès que de la servlet est instanciée, le moteur de servlets
appelle sa méthode init() en lui donnant en paramètre un
objet de type ServletConfig.
¨ ServletConfig est une interface qui possède deux
méthodes permettant de connaître les paramètres
d'initialisation :
Informations sur les Servlets :
41
Les paramètres d'initialisation
¨ String getInitParameter(String) : retourne la valeur du paramètre
dont le nom est fourni en paramètre.
private String ecole;
private String filiere;
public void init(ServletConfig config) {
ecole = config.getInitParameter("ecole");
filiere = config.getInitParameter("filiere");
}
¨ Enumeration getInitParameterNames() : retourne une énumération
des paramètres d'initialisation
@WebServlet(name ="myHelloServlet",
urlPatterns = {"/firstServlet", "/fs"},
initParams = {
@WebInitParam(name = "ecole", value = "ENSAS"),
@WebInitParam(name = "filiere", value = "4GINFO")})
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
System.out.println("Liste des parametres d'initialisation");
for (Enumeration<String> e=config.getInitParameterNames(); e.hasMoreElements();) {
System.out.println(e.nextElement());
}
}
Informations sur les Servlets :
42
L'objet ServletContext
¨ La servlet peut obtenir des informations à partir d'un objet ServletContext retourné
par la méthode getServletContext() d'un objet ServletConfig.
¨ Il est important de s'assurer que cet objet ServletConfig, obtenu par la méthode init()
est soit explicitement sauvegardé soit sauvegardé par l'appel à la méthode init()
héritée qui effectue la sauvegarde.
¨ L'interface ServletContext contient plusieurs méthodes :
méthode Rôle
String getMimeType(String) Retourne le type MIME du fichier en paramètre
String getServletInfo() Retourne le nom et le numéro de version du moteur de servlet
Ecrit les informations fournies en paramètre dans le fichier log
void log(Exception, String)
du serveur
void log(String) Idem
void log (String, Throwable) Idem
¨ Exemple:
public void init(ServletConfig config) {
ServletContext sc = config.getServletContext();
sc.log( "Demarrage de la Servlet HelloServlet" );
}
Informations sur les Servlets :
43
Objet ServletRequest
¨ De nombreuses informations en provenance du client peuvent être
extraites de l'objet ServletRequest passé en paramètre par le
serveur (ou de HttpServletRequest qui hérite de ServletRequest).
¨ Les informations les plus utiles sont les paramètres envoyés dans la
requête.
¨ L'interface ServletRequest dispose de nombreuses méthodes pour
obtenir ces informations :
Informations sur les Servlets :
44
Objet ServletRequest
Méthode Rôle
int getContentLength() Renvoie la taille de la requête, 0 si elle est inconnue
String getContentType() Renvoie le type MIME de la requête, null s'il est inconnu
ServletInputStream getInputStream() Renvoie un flux qui contient le corps de la requête
Renvoie une énumération contenant le nom de tous les
Enumeration getParameterNames()
paramètres
Retourne le nom du protocole utilisé par la requête et sa
String getProtocol()
version
BufferedReader getReader() Renvoie un flux qui contient le corps de la requête
String getRemoteAddr() Renvoie l'adresse IP du client
String getRemoteHost() Renvoie le nom de la machine cliente
Renvoie le protocole utilisé par la requête (exemple : http, ftp
String getScheme
...)
String getServerName() Renvoie le nom du serveur qui a reçu la requête
int getServerPort() Renvoie le port du serveur qui a reçu la requête
Informations sur les Servlets :
45
Objet ServletRequest
¨ Exemple :
package com.ensas.jee.exemples.servlets;
import java.io.*;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(
name ="myInfoServlet",
urlPatterns = {"/infoServlet", "/info"})
public class InfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out =response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Informations a disposition de la servlet</title>");
out.println("</head>");
Informations sur les Servlets :
46
Objet ServletRequest
Exemple :
¨out.println("<body>");
out.println("<p>Type mime de la requête :" +request.getContentType()+"</p>");
out.println("<p>Protocole de la requête :" +request.getProtocol()+"</p>");
out.println("<p>Adresse IP du client :" +request.getRemoteAddr()+"</p>");
out.println("<p>Nom du client : " +request.getRemoteHost()+"</p>");
out.println("<p>Nom du serveur qui a reçu la requête :" +request.getServerName()+"</p>");
out.println("<p>Port du serveur qui a reçu la requête :" +request.getServerPort()+"</p>");
out.println("<p>scheme: "+request.getScheme()+"</p>");
out.println("<p>liste des paramètres </p>");
for (Enumeration e =request.getParameterNames() ; e.hasMoreElements() ; ) {
Object p = e.nextElement();
out.println("<p>&nbsp;&nbsp;nom : "+p+" valeur :" +request.getParameter(""+p)+"</p>");
}
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
Servlet : Téléchargement d’un
47
fichier
¨ L'utilisateur peut télécharger un fichier en cliquant sur un hyperlien qui pointe vers
l'URL du servlet de téléchargement.
¨ Cela serait utile pour mettre en œuvre la fonctionnalité de téléchargement de fichiers
dans une application web en utilisant le servlet Java.
¨ Les étapes typiques sont les suivantes :
¤ Lire le fichier sur le serveur en utilisant FileInputStreamclass.
¤ Déterminer le type MIME du fichier par :
n Obtenir le ServletContext via la méthode getServletContext() du servlet.
n Appeler la méthode getMimeType(String file) sur l'objet ServletContext pour obtenir le type MIME
du fichier.
¤ Définir les informations suivantes pour l'objet HttpResponseobject :
n Définir le type de contenu sur le type MIME récupéré, en invoquant la méthode
setContentType(String). Cela indique au navigateur quel est le type de la réponse.
n Définir la longueur du contenu de la réponse en invoquant la méthode setContentLength(int).
¤ Obtenir l'objet OutputStream de la réponse.
¤ Lire des tableaux d'octets dans le FileInputStream, puis les écrire dans le OutputStream.
Répéter l'opération jusqu'à ce qu'il n'y ait plus d'octets disponibles pour la lecture (fin du
fichier).
¤ Fermer les objets FileInputStream et OutputStream.
Servlet : Téléchargement d’un
48
fichier
¨ La cartographie des types MIME est déclarée par le conteneur de
servlet.
¨ La méthode getMimeType() renvoie null s'il n'y a pas de mappage
MIME pour le fichier spécifié. Dans ce cas, il est recommandé de
forcer le type MIME à être de type binaire :
String mimeType = context.getMimeType(filePath); // gets MIME type of the file
if (mimeType == null) {
mimeType = "application/octet-stream"; // set to binary type if MIME mapping not found
}

¨ Par défaut, le navigateur traite la réponse en fonction du type de


contenu défini dans les en-têtes HTTP. Par exemple, il rendra l'image
si la réponse est un fichier image, ou ouvrira un programme de
lecture de PDF si la réponse est un document PDF, etc.
¨ Dans le cas où on veut forcer le navigateur à toujours télécharger le
fichier, on peut ajouter cet en-tête à la réponse :
response.setHeader("Content-Disposition", "attachment; filename=\"MyFile.mp4\"");
Servlet : Téléchargement d’un
49
fichier
¨ Créer un projet web pour tester le téléchargement d’un fichier:
Servlet : Téléchargement d’un
50
fichier
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//@WebServlet("/DownloadFileServlet")
public class DownloadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// if you want to use a relative path to context root:
String relativePath = getServletContext().getRealPath("");
System.out.println("relativePath = " + relativePath);
// reads input file from an absolute path
String filePath = relativePath+"/resources/downloads/logo-ensas.png";
File downloadFile = new File(filePath);
FileInputStream inStream = new FileInputStream(downloadFile);
// obtains ServletContext
ServletContext context = getServletContext();
// gets MIME type of the file
String mimeType = context.getMimeType(filePath);
Servlet : Téléchargement d’un
51
fichier
if (mimeType == null) {
mimeType = "application/octet-stream"; // set to binary type if MIME mapping not found
}
System.out.println("MIME type: " + mimeType);
// modifies response
response.setContentType(mimeType);
response.setContentLength((int) downloadFile.length());
// forces download
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
response.setHeader(headerKey, headerValue);
// obtains response's output stream
OutputStream outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
inStream.close();
outStream.close();
}
}
Servlet : Téléchargement d’un
52
fichier
<?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">
<display-name>servlet-exemples-downloadFile</display-name>
<welcome-file-list>
<welcome-file>DownloadFileServlet</welcome-file>
</welcome-file-list>
<servlet>
<description>This servlet sends file to client</description>
<display-name>DownloadFileServlet</display-name>
<servlet-name>DownloadFileServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.DownloadFileServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>DownloadFileServlet</servlet-name>
<url-pattern>/DownloadFileServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet : Chargement de fichiers
53

¨ L'API Servlet 3.0 fournit quelques nouvelles API pour travailler


avec les données téléchargées :
¤ Annotation @MultipartConfig : Une servlet peut être annotée
avec cette annotation afin de traiter les demandes de données
multipartites/formulaires qui contiennent des données de
téléchargement de fichiers. L'annotation MultipartConfig comporte
les options suivantes :
n fileSizeThreshold : les fichiers dont la taille est supérieure à ce seuil seront
directement écrits sur le disque, au lieu d'être enregistrés en mémoire.
n location : répertoire où le fichier sera stocké via la méthode Part.write().
n maxFileSize : taille maximale pour un seul fichier à télécharger.
n maxRequestSize : taille maximale pour une requête.
Toutes les tailles sont mesurées en octets.
Servlet : Chargement de fichiers
54

¤ InterfacePart : représente une partie d'une requête


multipart/format-données. Cette interface définit certaines
méthodes pour travailler avec les données téléchargées (pour n'en
citer que quelques-unes) :
n getInputStream() : renvoie un objet InputStream qui peut être utilisé pour
lire le contenu de la partie.
n getSize() : renvoie la taille des données téléchargées, en octets.
n write(String filename) : c'est la méthode pratique pour sauvegarder les
données de téléchargement dans un fichier sur le disque. Le fichier est créé
par rapport à l'emplacement spécifié dans l'annotation MultipartConfig.
¤ Nouvelles méthodes introduites dans l'interface HttpServletRequest :
n getParts() : renvoie une collection d'objets Part
n getPart(String name) : récupère un objet Part individuel avec un prénom.
Servlet : Chargement de fichiers
55

¨ Le code pour sauvegarder un fichier de téléchargement est très


simple, comme suit :
for (Part part : request.getParts()) {
String fileName = extractFileName(part);
part.write(fileName);
}
¨ Le code ci-dessus itére simplement sur toutes les parties de la
requête, et enregistre chaque partie sur le disque en utilisant la
méthode write(). Le nom du fichier est extrait par la méthode :
private String extractFileName(Part part) {
String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
for (String s : items) {
if (s.trim().startsWith("filename")) {
return s.substring(s.indexOf("=") + 2, s.length()-1);
}
}
return "";
}
Servlet : Chargement de fichiers
56

¨ Parce que le nom du fichier téléchargé est inclus dans l'en-


tête de disposition du contenu comme ceci :
¤ form-data ; name="dataFile" ; filename="PHOTO.JPG"
¤ La méthode extractFileName() permet donc d'extraire
PHOTO.JPG de la chaîne.
¨ La Syntaxe de l’Annotation @MultipartConfig :
@MultipartConfig(
fileSizeThreshold = <size in bytes>,
maxFileSize = <size in bytes>,
maxRequestSize = <size in bytes>,
location = <save location>
)
Servlet : Chargement de fichiers
57
¨ Créer un projet web pour tester le
chargement d’un fichier:

<?xml version="1.0" encoding="UTF-8" ?>


<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title>File Upload</title> </head>
<body>
<h2>File Upload</h2>
<form method="post" action="UploadServlet" enctype="multipart/form-data">
Select file to upload: <input type="file" name="file" size="60" /><br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
Servlet : Chargement de fichiers
58
<?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">
<display-name>servlet-exemples-uploadFile</display-name>
<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
<servlet>
<description>Servlet de chargement de fichiers</description>
<display-name>UploadServlet</display-name>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.UploadServlet</servlet-class>
<multipart-config>
<max-file-size>10485760</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>2097152</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet : Chargement de fichiers
59
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
//@WebServlet("/UploadServlet")
//@MultipartConfig(fileSizeThreshold=1024*1024*2, // 2MB
// maxFileSize=1024*1024*10, // 10MB
// maxRequestSize=1024*1024*50) // 50MB
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//Name of the directory where uploaded files will be saved, relative to web application directory
private static final String SAVE_DIR = "uploads";
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// gets absolute path of the web application
String appPath = request.getServletContext().getRealPath("");
// constructs path of the directory to save uploaded file
String savePath = appPath + File.separator + SAVE_DIR;
// creates the save directory if it does not exists
File fileSaveDir = new File(savePath);
if (!fileSaveDir.exists()) fileSaveDir.mkdir();
Servlet : Chargement de fichiers
60

for (Part part : request.getParts()) {


String fileName = extractFileName(part);
// refines the fileName in case it is an absolute path
fileName = new File(fileName).getName();
part.write(savePath + File.separator + fileName);
}
request.setAttribute("message", "Upload has been done successfully!");
getServletContext().getRequestDispatcher("/ResultMessage").forward(request, response);
}

private String extractFileName(Part part) {


String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
for (String s : items) {
if (s.trim().startsWith("filename")) {
return s.substring(s.indexOf("=") + 2, s.length()-1);
}
}
return "";
}
}
Servlet : Chargement de fichiers
61

package com.ensas.jee.exemples.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/ResultMessage")
public class ResultMessage extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws


ServletException, IOException {
response.getWriter().append("Message: ").append((String) request.getAttribute("message"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
Servlet : Données du formulaire
62

¨ Le navigateur utilise deux méthodes pour transmettre ces


informations au serveur web. Ces méthodes sont la méthode GET et
la méthode POST.
¨ la méthode GET
¤ La méthode GET envoie les informations de l'utilisateur à la page qui les
demande sous forme de clé-valeur séparées par le symbole &. L’url de la
page et les informations sont séparées par le symbole ? :
http://www.test.com/hello?key1 = value1&key2 = value2
¤ La méthode GET est la méthode par défaut pour transmettre des
informations du navigateur au serveur web et elle produit une longue
chaîne qui apparaît dans la case de l’URL du navigateur.
¤ Ne jamais utiliser la méthode GET si les informations à transmettre au
serveur sont sensibles.
¤ La méthode GET est limitée en taille : seuls 1024 caractères peuvent être
utilisés dans une chaîne de requête.
¤ La servlet traite ce type de requêtes en utilisant la méthode doGet().
Servlet : Données du formulaire
63

¨ la méthode POST
¤ C’est généralement la méthode la plus fiable pour transmettre
des informations à un programme back-end.
¤ Elle regroupe les informations exactement de la même manière
que la méthode GET, mais au lieu de les envoyer sous forme de
chaîne de texte après un ? (point d'interrogation) dans l'URL,
elle les envoie dans un message séparé.
¤ Ce message est transmis au programme de gestion sous la
forme d'une entrée standard qu’on peut analyser et utiliser
pour traiter ces informations.
¤ La servlet traite ce type de requêtes en utilisant la méthode
doPost().
Servlet : Données du formulaire
64

¨ Lecture des données du formulaire à l'aide de Servlet


¤ Une Servlet traite automatiquement les données des
formulaires en utilisant les méthodes suivantes selon la situation:
n getParameter() : On appel la méthode request.getParameter() pour
obtenir la valeur d'un paramètre de formulaire.
n getParameterValues() : On appel cette méthode si le paramètre
apparaît plus d'une fois et renvoie plusieurs valeurs, par exemple
une case à cocher.
n getParameterNames() : On Appel cette méthode si on veut une liste
complète de tous les paramètres de la requête en cours.
Servlet : Données du formulaire
65

¨ Pour créer un formulaire en HTML, on doit utiliser les balises


suivantes :
¤ <form> : pour créer un formulaire pour ajouter des champs dans son
corps.
¤ <input>, <select>, <textarea>... : pour créer des champs de formulaire
comme des champs de texte, une liste déroulante, une zone de texte, des
cases à cocher, des boutons radio,... et un bouton d'envoi.
¨ Pour que le formulaire fonctionne avec la servlet, on doit spécifier
les attributs suivants pour la balise <form> :
¤ method="POST" : pour envoyer les données du formulaire sous forme de
requête HTTP POST au serveur. En général, la soumission du formulaire
doit être effectuée par la méthode HTTP POST. On peut utiliser la
méthode "GET".
¤ action="URL de la servlet" : spécifie l'URL relative de la servlet qui est
responsable du traitement des données postées à partir de ce formulaire.
Servlet : Données du formulaire
66

¨ Lorsque l'utilisateur soumet un formulaire, la méthode


doPost() de la servlet sera invoquée par le conteneur de la
servlet.
¨ Typiquement, on effectue les tâches suivantes à l'intérieur
de la méthode doPost() :
¤ Lire les valeurs des champs postés depuis le formulaire via
l'objet request.
¤ Effectuer certains traitements, par exemple se connecter à la
base de données pour valider le nom d'utilisateur et le mot de
passe.
¤ Renvoyer la réponse à l'utilisateur via l'objet respone.
Servlet : Données du formulaire
67
¨ Créer un projet web pour tester la lecture des données d’un formulaire :
¤ Lire les valeurs du champ de texte et du champ de mot de passe
¤ Lire la valeur du champ de la case à cocher
¤ Lire la valeur du champ du bouton radio
¤ Lire la valeur du champ de la zone de texte
¤ Lire la valeur du champ de la liste déroulante (combobox)
Servlet : Données du formulaire
68
<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
Servlet : Données du formulaire
<title>Read Form Data</title>
</head>
<body>
69
<form action = "GetPostMethodReadFormData" method = "POST" >
Username: <input type="text" name="username"/>
<br/>Password: <input type="password" name="password"/>
<br/>Speaking language:
<input type="checkbox" name="language" value="english" />English
<input type="checkbox" name="language" value="french" />French
<br/>Gender:
<input type="radio" name="gender" value="male" />Male
<input type="radio" name="gender" value="female" />Female
<br/>Feedback:<br/>
<textarea rows="5" cols="30" name="feedback"></textarea>
<br/>Job Category:
<select name="jobCat">
<option value="techno">Technology</option>
<option value="admin">Administration</option>
<option value="biology">Biology</option>
<option value="science">Science</option>
</select>
<br/><input type = "submit" value = "Submit" />
</form>
</body>
</html>
Servlet : Données du formulaire
70

package com.ensas.jee.exemples.servlets;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/GetPostMethodReadFormData")
public class GetPostMethodReadFormData extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws


ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html> <head> <title>Read Form Data</title> </head>");
out.println("<body> <h3>Read Form Data </h3>");

String username = request.getParameter("username");


String password = request.getParameter("password");
out.println("Username: <b>" + username + "</b></br>");
out.println("Password: <b>" + password + "</b></br>");
Servlet : Données du formulaire
71

String languages[] = request.getParameterValues("language");


if (languages != null) {
out.println("Languages : <ul>");
for (String lang : languages) out.println("\t<b> <li>" + lang+"</li></b>");
out.println("</ul>");
}
String gender = request.getParameter("gender");
out.println("Gender :<b> " + gender+ "</b></br>");
String feedback = request.getParameter("feedback");
out.println("Feed back : <b>" + feedback+ "</b></br>");
String jobCategory = request.getParameter("jobCat");
out.println("Job category : <b>" + jobCategory+ "</b></br>");

out.println("</body> </html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
Servlet : Données du formulaire
72
<?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">
<display-name>servlet-exemples-ReadFormData</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!--
<servlet>
<servlet-name>GetPostMethodReadFormData</servlet-name>
<servlet-
class>com.ensas.jee.exemples.servlets.GetPostMethodReadFormData</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetPostMethodReadFormData</servlet-name>
<url-pattern>/GetPostMethodReadFormData</url-pattern>
</servlet-mapping>
-->
</web-app>
Servlet : Chaînage
73

¨ A partir d’une servlet, on peut :


¤ inclure le contenu d'une autre ressource dans la réponse (include)
¤ transmettre une requête d’une servlet à une autre ressource via la
redirection (sendRedirect) ou le transfert (forward).
¨ Pour ceci, on doit utiliser un RequestDispatcher, obtenu avec
l’objet request.
RequestDispatcher rd = request.getRequestDispatcher("/somewhereElse"); // Get the dispatcher

¤ On peut alors inclure une autre servlet :


rd.include(request, response);
out.println("This print statement will be executed");

¤ Ou transmettre la requête à une autre servlet :


rd.forward(request, response);
out.println("This print statement will not be executed");
Servlet : Chaînage (include)
74

request MyHttpServlet1
2 MyHttpServlet2
1 service(...) {
service(...) {
// do something
// do something else
rd.include(…);
}
// do something
} 3
Client response

4
Servlet : Chaînage
(forward / sendRedirect)
75

MyHttpServlet1
request
service(...) {

1 // do something 2
MyHttpServlet2
rd.forward(…);
service(...) {
}
Client //do something else

response }

3
Servlet : Chaînage
(passage d’attributs)
76

¨ On peut utiliser les attributs de requête pour transmettre


des informations entre les servlets :
¤ Dans Servlet1:
String aCar = "Renault";
request.setAttribute("car", aCar);
RequestDispatcher rd = request.getRequestDispatcher("/Servlet2");
rd.forward(request, response);

¨ Récupérer l'attribut dans une autre servlet :


¤ Dans Servlet2:
String myCar = (String) request.getAttribute("car");
out.println("My car is a " + myCar); // Outputs "Renault"
Servlet : Chaînage
(redirection - sendRedirect)
77

¨ Pour rediriger les utilisateurs vers une autre page, on peut appeler la
méthode sendRedirect sur l'objet HttpServletResponse
¤ response.sendRedirect(String location)
¨ Techniquement, le serveur envoie un status code HTTP 302 (Moved
Temporarily) au client. Ensuite, le client effectue une redirection URL vers
l'emplacement spécifié.
¨ Le paramètre location dans la méthode sendRedirect() peut être un chemin
relatif ou une URL en chemin absolu:
¤ rediriger le client vers la page login.html relative au chemin du contexte de
l'application : response.sendRedirect("login.html");
¤ rediriger le client vers une page relative à la racine du contexte du serveur :
response.sendRedirect("/login.html");
¤ rediriger le client vers un autre site web :
response.sendRedirect("https://www.yoursite.com");
¨ L'appel à sendRedirect() doit être la dernière instruction dans le workflow.
cette méthode lance une IllegalStateException si elle est invoquée après que
la réponse a déjà été engagée via l’instruction writer.close().
Servlet : Chaînage
(transfert - forward)
78

¨ Pour transmettre une requête d’une servlet à une page de destination HTML :
¤ Tout d'abord, dans la méthode doGet() / doPost() de la servlet, obtenir une
référence de RequestDispatcher à partir de la requête, en passant la page de
destination. Par exemple:
String destination = "result.html";
RequestDispatcher requestDispatcher = request.getRequestDispatcher(destination);

¤ Ensuite, appeler la méthode forward() sur l'objet RequestDispatcher(). Exemple :


requestDispatcher.forward(request, response);
¤ Noter qu'avec ce type de transfert, l'URL du navigateur reste inchangée - c'est
l'URL de la servlet - même si on spécifie la page html.
¤ Et si on valide la réponse avant d'appeler forward(), une IllegalStateException
est lancée. Comme la réponse est déjà engagée auparavant, la demande ne peut
pas être transmise.
¤ Pour envoyer des données de la servlet à une autre servlet ou une page jsp, on
définit les attributs de l'objet de la requête sous la forme nom-valeur. Par exemple
:String name = "John";
request.setAttribute("name", name);
Integer numberOfItems = 1000;
request.setAttribute("itemCount", numberOfItems);
Les Filtres
79

¨ Les filtres sont des composants essentiels des applications web


Java, car les filtres permettent aux programmeurs d'intercepter
les requêtes et de transformer les réponses à des fins diverses.
¨ Même si on ne crée pas de filtres, les conteneurs de servlets
(comme Tomcat) et les frameworks web (comme Spring) utilisent
des filtres en coulisse.
¨ En gros, il y a 3 étapes pour créer un filtre :
¤ Écrire une classe Java qui implémente l'interface Filter et redéfinir
les méthodes du cycle de vie du filtre.
¤ Spécifier les paramètres d'initialisation du filtre (facultatif).

¤ Spécifier le mappage du filtre, soit en servlets, soit en modèles


d'URL.
Les Filtres
80

¨ Composant qui intercepte dynamiquement les requêtes et


les réponses pour les utiliser ou les transformer
¨ Encapsulent les tâches récurrentes dans des unités
réutilisables
¨ Exemple de fonctions que peuvent avoir les filtres :
¤ Authentification - Blocage des requêtes sur la base de l'identité
de l'utilisateur
¤ Journalisation et audit - Suivi des utilisateurs d'une application
web.
¤ Compression des données - Réduire la taille des
téléchargements.
Les Filtres
81

Request
LoginServlet
Response

AddCarServlet
Authenticate
Audit Filter
Filter
EditCarServlet

LogoutServlet
Les Filtres
82

¨ Dans la méthode doFilter : Request Client Response


¤ Utiliser doFilter(...) de l’objet
FilterChain pour appeler
l'élément suivant dans la chaîne Filter

¤ Les instructions précédant cette


Filter
déclaration seront exécutées
avant l'élément suivant Filter
¤ Les instructions cette déclaration
seront exécutées après l'élément
Resource
suivant Servlet, JSP, HTML, …
¤ N'appeler pas la méthode
doFilter(...) de l’objet Container
FilterChain pour briser la chaîne
Les Filtres
83
Les Filtres : Création
84

¨ La classe du filtre doit implémenter l'interface Filter et redéfinir ses


trois méthodes de cycle de vie : init(), doFilter() et destroy().
¨ En général, une classe de filtre a la structure suivante :
public class HelloFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// invoqué lorsqu'une instance de ce filtre est créée par le conteneur
// utilisé pour initialiser les ressources, lire les paramètres...
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// invoqué lorsqu'une requête correspondante est envoyée au serveur
// utilisé pour intercepter la requête et traiter la réponse
chain.doFilter(request, response); // invoque le filtre suivant dans la chaîne
}
@Override
public void destroy() {
// invoqué lorsque l'instance du filtre
// est détruite par le conteneur
// utilisé pour nettoyer les ressources
}
}
Les Filtres : Création
85

¨ Depuis la version 4.0 de l'API Java Servlet, on peut ne


redéfinir que la méthode doFilter() car l'interface Filter
implémente les méthodes init() et destroy() par défaut.
Par exemple :
import java.io.IOException;
import javax.servlet.*;

public class HelloFilter2 implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain)
throws IOException, ServletException {
// invoqué lorsqu'une requête correspondante est envoyée au serveur
// utilisé pour intercepter la requête et traiter la réponse
chain.doFilter(request, response); // invoque le filtre suivant dans la chaîne
}
}
Les Filtres : paramètres
86
d'initialisation
¨ On peut spécifier les paramètres d'initialisation du filtre
dans le descripteur de déploiement (web.xml) comme ceci :
<filter>
<filter-name>Hello Filter</filter-name>
<filter-class>com.ensas.jee.exemples.servlets.HelloFilter</filter-class>

<init-param>
<param-name>message</param-name>
<param-value>A message from Hello Filter</param-value>
</init-param>

<init-param>
<param-name>threshold</param-name>
<param-value>1024</param-value>
</init-param>
</filter>
¨ On doit préciser le nom du filtre et son nom de classe
complètement qualifié.
Les Filtres : paramètres
87
d'initialisation
¨ On peut spécifier autant de paramètres qu’on le souhaite.
¨ Ensuite, dans la méthode init() du filtre, on peut lire ces
paramètres d'initialisation via l'objet FilterConfig comme ceci :

public void init(FilterConfig fConfig) throws ServletException {


String message = fConfig.getInitParameter("message");
String threshold = fConfig.getInitParameter("threshold");
// faire quelque chose avec les paramètres
}

¨ On peut utiliser des annotations pour spécifier les paramètres


d'initialisation à l'intérieur même de la classe de filtre, mais ce
n'est pas recommandé car cela nécessite de recompiler le code
lorsque on veut changer les valeurs des paramètres.
Les Filtres : Mapping du filtre
88

¨ Le but d'un filtre est d'intercepter les requêtes, on doit donc


spécifier les URL qui seront traitées par le filtre via l'étape de
mapping.
¨ On peut associer un filtre à n'importe quel modèle d'URL en utilisant
soit le fichier XML, soit des annotations.
¨ On peut spécifier le mappage d’un filtre à une servlet via XML:
<filter-mapping>
<filter-name>Hello Filter</filter-name>
<servlet-name>Hello Servlet</servlet-name>
</filter-mapping>
¨ La servlet est déclarée et mappée dans le fichier web.xml comme
suit :
<servlet>
<servlet-name>Hello Servlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello Servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Les Filtres : Mapping du filtre
89

¨ Si la classe de servlet est annotée en utilisant l'annotation


@WebServlet, on doit spécifier le nom de la servlet comme ceci :
@WebServlet(name = "Hello Servlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet { }
¨ On peut faire correspondre un filtre à un modèle d'URL :
<filter-mapping>
<filter-name>Hello Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
¨ Ici, le filtre Hello Filter est associé au modèle d'URL /*, ce qui
signifie qu'il interceptera toutes les requêtes.
¨ L'exemple suivant illustre la façon de mapper un filtre sur plusieurs
modèles d'URL :
<filter-mapping>
<filter-name>Hello Filter</filter-name>
<url-pattern>/hello</url-pattern>
<url-pattern>/bonjour</url-pattern>
<url-pattern>/hi</url-pattern>
</filter-mapping>
Les Filtres : Mapping du filtre
90

¨ Depuis l'API Servlet 3.0, on peut spécifier le mappage des filtres à


l'aide d'annotations @WebFilter pour annoter une classe de filtre.
Par exemple :
@WebFilter("/hello")
public class HelloFilter1 implements Filter {
// implementer des méthodes de cycle de vie...
}
¨ L'exemple suivant montre comment faire correspondre un filtre à
plusieurs modèles d'URL :
@WebFilter({ "/servlet1", "/servlet2", "/servlet3" })
public class FilterA implements Filter {
}

¨ Et cet exemple illustre comment mapper un filtre à une servlet en


utilisant l'annotation :
@WebFilter(servletNames = { "Hello Servlet" })
public class HelloFilter implements Filter {
}
¨ On peut associer un filtre à un ou plusieurs modèles de serlvets/URL,
et associer plusieurs filtres à un modèle de servlet/URL.
Cookies
91

¨ Les cookies sont des fichiers contenant des données au format texte.
¨ Ils sont créés à l'initiative du serveur et envoyés par le serveur sur le
poste client pour leur stockage.
¨ Les données contenues dans le cookie sont ensuite renvoyées au
serveur à chaque requête.
¨ Les cookies peuvent être utilisés explicitement ou implicitement par
exemple lors de l'utilisation d'une session.
¨ Les cookies ne sont pas dangereux car ce sont uniquement des
fichiers textes qui ne sont pas exécutés.
¨ Par contre les cookies peuvent contenir des données plus ou moins
sensibles.
¨ Il est capital de ne stocker dans les cookies que des données qui ne
sont pas facilement exploitables par une intervention humaine sur le
poste client et en tout cas de ne jamais les utiliser pour stocker des
informations sensibles telles qu'un numéro de carte bancaire.
Cookies
92

¨ Un cookie est une petite quantité de données qui est


stockée dans le navigateur web et transférée entre les
demandes et les réponses par le biais des en-têtes HTTP.
¨ Un cookie a un nom et une valeur, plus des attributs
d'option comme le commentaire, le chemin, le domaine,
l'âge maximum,...
¨ Les cookies sont généralement utilisés pour mettre en
œuvre un stockage simple et temporaire de données du
côté client, comme la gestion de la session, la mémorisation
du mot de passe, les articles du panier, etc.
Cookies
93

¨ L’API Servlet fournit la classe javax.servlet.http.Cookie pour


travailler avec les Cookies
¤ Cookie(String name, String value) : construit un cookie
¤ String getName() : retourne le nom du cookie
¤ String getValue() : retourne la valeur du cookie
¤ setValue(String new_value) : donne une nouvelle valeur au cookie
¤ setMaxAge(int expiry) : spécifie l’âge maximum du cookie

¨ Pour la création d’un nouveau cookie, il faut l’ajouter à la


réponse (HttpServletResponse)
¤ addCookie(Cookie mon_cook) : ajoute à la réponse un cookie
¨ La Servlet récupère les cookies du client en exploitant la
réponse (HttpServletRequest)
¤ Cookie[] getCookies() : récupère l’ensemble des cookies du site
Cookies
94

Attribut Rôle
Comment Commentaire associé au cookie
Nom de domaine (partiel ou complet) associé au cookie. Seuls les serveurs contenant ce
Domain
nom de domaine recevront le cookie
Durée de vie en secondes du cookie. Une fois ce délai expiré, le cookie est détruit sur le
MaxAge poste client par le navigateur. Par défaut la valeur limite la durée de vie du cookie à la
durée de vie de l'exécution du navigateur
Name Nom du cookie
Chemin du cookie. Ce chemin permet de renvoyer le cookie uniquement au serveur dont
l'url contient également le chemin. Par défaut, cet attribut contient le chemin de l'url de la
Path
servlet. Par exemple, pour que le cookie soit renvoyé à toutes les requêtes du serveur, il
suffit d'affecter la valeur "/" à cet attribut
Secure Booléen qui précise si le cookie ne doit être envoyé que par une connexion SSL
Value Valeur associée au cookie
Version Version du protocole utilisé pour gérer le cookie
Cookies
95
Cookies : création
96

¨ Pour stocker un cookie dans le navigateur web, il faut d'abord


créer un nouvel objet Cookie :
String name = "Cookie name";
String value = "Cookie value";
Cookie cookie = new Cookie(name, value);

¨ Ensuite, appeler la méthode addCookie() de l'objet


HttpServletResponseObject dans une classe Servlet :
response.addCookie(cookie);

¨ Cela enverra les en-têtes HTTP appropriés au client, et le


navigateur enregistre le cookie sur l'ordinateur de l'utilisateur.
¨ Exemple de Code pour créer un cookie et l’ajouter au client
Cookie cookie = new Cookie("nom", "valeur");
cookie. setMaxAge(2*24*60*60); // Durée de vie=2 Jours
response.addCookie(cookie);
Cookies : création
97

¨ Outre le nom et la valeur des attributs obligatoires, on peut


également spécifier des informations supplémentaires pour un
cookie en utilisant les méthodes suivantes :
¤ setComment(String) : spécifie un commentaire qui décrit l'objectif du
cookie.
cookie.setComment("This cookie stores username of the customer");
¤ setDomain(String) : spécifie le nom de domaine dans lequel ce
cookie est visible. Par défaut, les cookies ne sont renvoyés qu'au
serveur qui les a envoyés. Ainsi, le réglage du nom de domaine rend
les cookies disponibles pour différents serveurs sous le même nom de
domaine.
cookie.setDomain(".ensas.uca.ma");
¤ setHttpOnly(boolean) : s'il est défini à true, Javascript ne peut pas
lire ce cookie du côté client, ce qui peut empêcher certains types
d'attaques par script intersites.
cookie.setHttpOnly(true);
Cookies : création
98

¤ setMaxAge(int) : spécifie la durée de stockage du cookie dans


l'ordinateur de l'utilisateur, en secondes. S'il n'est pas défini, le
cookie est supprimé lorsque le navigateur web se ferme.
cookie.setMaxAge(7 * 24 * 60 * 60);

¤ La durée de vie du cookie est ainsi fixée à 7 jours (= 24 heures x


60 minutes x 60 secondes) et il est toujours stocké sur l'ordinateur de
l'utilisateur lorsque le navigateur existe.
¤ setPath(String) : utilisez cette méthode si vous souhaitez restreindre
la disponibilité du cookie pour un certain chemin (et ses sous-
chemins) sur le serveur.
cookie.setPath("/product");

¤ setSecure(boolean) : si ce paramètre est défini sur true, le cookie est


envoyé du navigateur au serveur uniquement lorsque le protocole
sécurisé (HTTPS ou SSL) est utilisé. La valeur par défaut est false.
Cookies : lecture
99

¨ Pour lire les cookies envoyés par le navigateur au serveur, appeler la


méthode getCookies() sur un objet HttpServletRequest.
¨ Cette méthode renvoie un tableau d'objets Cookie qui sont visibles pour la
requête en cours.
¨ Exemple de Code pour récupérer les cookies
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
}
¨ Lee code suivant lit tous les cookies et affiche leurs noms et valeurs :
Cookie[] cookies = request.getCookies();
PrintWriter writer = response.getWriter();
for (Cookie aCookie : cookies) {
String name = aCookie.getName();
String value = aCookie.getValue();
writer.println(name + " = " + value);
}
Cookies : lecture
100

¨ Si on veut lire un cookie spécifique, on doit vérifier le nom


du cookie dans la boucle. Par exemple, ce code lit la
valeur du cookie ayant le nom "username":

String username = null;


for (Cookie aCookie : cookies) {
String name = aCookie.getName();
if (name.equals("username")) {
username = aCookie.getValue();
break;
}
}
Cookies : mise à jour
101

¨ Pour mettre à jour un cookie existant, on doit créer un


nouveau cookie portant le même nom et l'ajouter à la
réponse.
¨ Cela écrasera (mettra à jour) le cookie du même nom. Par
exemple :

String name = "Cookie name";


String value = "New value";
Cookie cookie = new Cookie(name, value);
response.addCookie(cookie);
Cookies : suppression
102

¨ Pour supprimer un cookie du cache du navigateur, on doit


créer un nouveau cookie du même nom, définir son âge
maximum à zéro et l'ajouter à la réponse.
¨ Par exemple, ce code permet de supprimer le cookie avec
le nom "username" du navigateur :

Cookie cookie = new Cookie("username", "");


cookie.setMaxAge(0);
response.addCookie(cookie);
Cookies : exemple
103

¨ Créer un projet web Java simple. Coder la page d'accueil


(index.html) comme suit :
<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Exemple sur les Cookies </title>
</head>
<body>
<div align="left">
<h1>Exemple sur les Cookies</h1>
<h2><a href="add_cookies">Ajouter les Cookies</a></h2>
<h2><a href="read_cookies">Lire les Cookies</a></h2>
<h2><a href="delete_cookies">Supprimer les Cookies</a></h2>
</div>
</body>
</html>
Cookies : exemple
104
Cookies : exemple
105

package com.ensas.jee.exemples.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//@WebServlet("/add_cookies")
public class AddCookiesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int cookieCount;

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
String name = "Cookie" + (++cookieCount);
String value = String.valueOf(System.currentTimeMillis());
Cookie cookie = new Cookie(name, value);
response.addCookie(cookie);
response.getWriter().println("Le cookie est creé avec succès!");
}
}
Cookies : exemple
106
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//@WebServlet("/read_cookies")
public class ReadCookiesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter writer = response.getWriter();
Cookie[] cookies = request.getCookies();
if (cookies == null) { writer.println("Pas de cookies");
} else {
writer.println("Nombre de cookies: " + cookies.length);
for (Cookie aCookie : cookies) {
String name = aCookie.getName();
String value = aCookie.getValue();
writer.println(name + " = " + value);
}
}
}
}
Cookies : exemple
107
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//@WebServlet("/delete_cookies")
public class DeleteCookiesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter writer = response.getWriter();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie aCookie : cookies) {
aCookie.setMaxAge(0);
response.addCookie(aCookie);
}
writer.println("Les cookies sont tous supprimés!");
} else {
writer.println("Pas de cookies");
}
}
}
Cookies : exemple
108
<?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">
<display-name>servlet-exemples-cookies</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>addCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.AddCookiesServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>readCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.ReadCookiesServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>deleteCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.DeleteCookiesServlet</servlet-class>
</servlet>
Cookies : exemple
109
<servlet-mapping>
<servlet-name>addCookiesServlet</servlet-name>
<url-pattern>/add_cookies</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>readCookiesServlet</servlet-name>
<url-pattern>/read_cookies</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>deleteCookiesServlet</servlet-name>
<url-pattern>/delete_cookies</url-pattern>
</servlet-mapping>
</web-app>
Les sessions
110
¨ une session indique une période de temps pendant laquelle un utilisateur unique visite
un site web.
¨ Une session commence lorsque l'utilisateur demande la première page. Et pendant
une session, l'utilisateur peut consulter autant de pages qu'il le souhaite.
¨ La session se termine si l'utilisateur n'a pas demandé de pages pendant un certain
temps (timeout).
¨ Le délai d'expiration de la session varie en fonction de la configuration du serveur -
généralement entre 15 et 30 minutes.
¨ Le protocole HTTP étant sans état, le serveur peut suivre la session grâce à des
cookies, à la réécriture d'URL ou à des champs de formulaire cachés - pour identifier
un utilisateur unique à travers différentes requêtes.
¨ Le suivi des sessions à l'aide de cookies est le principal mécanisme.
¨ Si le navigateur web de l'utilisateur ne prend pas en charge les cookies, il est
possible d'utiliser la réécriture d'URL ou des champs de formulaire cachés.
¨ Dans le développement web, les programmeurs utilisent le mécanisme de session pour
gérer les informations de l'utilisateur qui ne persistent que dans une session
particulière, telles que l'état d'authentification, le nom d'utilisateur ou toute donnée
devant être partagée entre plusieurs requêtes.
Les sessions
111

¨ Un objet HttpSession représente la session d'un utilisateur


particulier.
¨ Noter que HttpSession est une interface définie dans le paquet
javax.servlet, alors que l'implémentation réelle est injectée
dans le HttpServletRequest par le conteneur de servlets.
¨ On peut stocker des informations relatives à l'utilisateur dans
une session sous forme de paires clés - valeurs.
¨ L'interface HttpSession définit la méthode setAttribute(key,
value) pour stocker une entrée clé-valeur et la méthode
getAttribute(key) pour obtenir la valeur d'une clé spécifiée.
¨ Par défaut, Java utilise des cookies pour le suivi des sessions.
Un cookie portant le nom de JSESSIONID est stocké
temporairement dans le navigateur web. Il est utilisé pour
identifier le même utilisateur à travers différentes requêtes.
Les sessions : Obtention ou
création
112
¨ Par défaut, une session est automatiquement créée lorsque l'utilisateur visite le site
web.
¨ Pour obtenir l'objet HttpSession représentant la session de l'utilisateur, invoquer la
méthode getSession() de l'interface HttpServletRequest dans la méthode doGet() ou
doPost() d’une Servlet. Par exemple :
HttpSession session = request.getSession();
¨ La méthode HttpServletRequest .getSession() renvoie la session actuelle associée à
la requête, ou en crée une nouvelle si la demande n'a pas de session. Cela signifie
que l'objet HttpSession renvoyé n'est pas toujours nul.
¨ Pour obtenir une session sans en créer une nouvelle si elle n'existe pas, on peut invoker
getSession(false) sur le HttpServletRequest :
HttpSession session = request.getSession(false);
if (session != null) {
// la session existe
} else {
// pas de session
}
¨ Dans ce cas, la valeur retournée peut être nulle si aucune session n'existe pas. Cela
signifie également que getSession() est équivalent à getSession(true).
Les sessions : Stocker les
données
113

¨ Pour stocker une valeur dans une session, on utilise la méthode


setAttribute(key, value) de l'objet HttpSession :
session.setAttribute("username", "ENSAS");
List<Student> students = studentDao.getStudents();
session.setAttribute("listStudent", students);
¨ Les données stockées dans une session sont gérées par le serveur et
seront supprimées à la fin de la session.
¨ On peut stocker n'importe quel type d'objet dans la session.
¨ Chaque utilisateur est associé à un objet HttpSession différent, de
sorte que les valeurs stockées pour l'utilisateur n°1 sont différentes
de celles stockées pour l'utilisateur n°2 - bien que la clé soit la
même.
¨ Si la clé est déjà associée à une valeur, alors l'ancienne valeur est
remplacée par la nouvelle. On peut donc utiliser la méthode
setAttribute() pour mettre à jour la valeur dans la session.
Les sessions : Lire / supprimer
les données
114

¨ Pour obtenir la valeur d'une session, on utilise la méthode


getAttribute(key) de l'objet HttpSession :
String username = (String) session.getAttribute("username");
List<Student> listStudents = (List<Student>) session.getAttribute("listStudent");
¤ On a besoin d'un cast pour le type String car la méthode
getAttribute() renvoie toujours une valeur de type Object.
¤ La méthode getAttribute(key) retournera une valeur nulle si la
clé donnée n'est pas trouvée dans la session.
¨ Pour supprimer de la session une valeur associée à une clé,
on utilise la méthode removeAttribute(key):
session.removeAttribute("username");
Les sessions : délai d'expiration
115

¨ Si un utilisateur reste inactif pendant un certain temps, sa session


expire - ce qui signifie que toutes les données liées à sa session sont
supprimées du serveur - la session est détruite.
¨ Chaque serveur a une valeur par défaut différente pour le délai
d'expiration global de la session, par exemple 30 minutes dans
Apache Tomcat.
¨ On peut définir le délai de session pour une application web
individuelle en modifiant son fichier (web.xml) :
<session-config>
<session-timeout>15</session-timeout>
</session-config>
¨ Cela permet d'outrepasser le délai global de session défini par le
serveur et de fixer le délai de session à 15 minutes.
¨ On peut définir la valeur du délai d'attente pour une session
individuelle de la manière suivante :
session.setMaxInactiveInterval(300);
Les sessions : Invalidation
116

¨ Par défaut, une session n'est détruite qu'après que


l'utilisateur ait été inactif pendant une période de
temporisation.
¨ Si on veut détruire une session individuelle immédiatement,
on appel la méthode invalidate() comme ceci :
session.invalidate();

¨ Ceci supprime tous les objets liés à la session et la détruit.


Les sessions : Obtention ou
création
117

<?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">
<display-name>servlet-exemples-testSession</display-name>
<welcome-file-list>
<welcome-file>test_session</welcome-file>
</welcome-file-list>
<web-app>
Les sessions : Obtention ou
création
118

package com.ensas.jee.exemples.servlets;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/test_session")
public class TestSessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestSessionServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
PrintWriter writer = response.getWriter();
writer.println("Session ID: " + session.getId());
writer.println("Creation Time: " + new Date(session.getCreationTime()));
writer. println("Last Accessed Time: " + new Date(session.getLastAccessedTime()));
}
}
Les servlets : gestion d'erreurs
119

¨ Dans le développement d'applications web en Java, le traitement des erreurs


est nécessaire pour construire des sites web sécurisés.
¨ En cas d'erreur, l'utilisateur ne doit pas voir les détails techniques de l'erreur
qu'il ne peut pas comprendre.
¨ Il doit plutôt voir une page conviviale qui lui indique ce qui s'est passé.
¨ Il est également recommandé de traiter les erreurs correctement afin de
cacher les informations techniques sensibles qui peuvent être exploitées par
les pirates informatiques.
¨ Java EE permet de gérer les erreurs (par les codes d'erreur HTTP et les types
d'exception Java) facilement en mettant quelques éléments de configuration
dans le descripteur de déploiement (le fichier web.xml).
¨ Au lieu d'afficher les pages d'erreur par défaut fournies par le serveur, le
développeur peut afficher ses propres pages d'erreur. Exemple, l'erreur HTTP
404 :
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errors/Error404.html</location>
</error-page>
Les servlets : gestion d'erreurs
120

¨ Si on demande un URL non existant, l'erreur HTTP 404 sera générée:


<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title> Error 404 - Page Non Trouvée</title> </head>
<body>
<h2>Sorry, la page demandée n'est pas disponible.</h2>
</body>
</html>
Les servlets : gestion d'erreurs
121
¨ On peut ajouter d'autres éléments <page d'erreur> pour traiter d'autres codes
d'erreur.
¨ On peut aussi déclarer des pages pour gérer les exceptions lancées par l'application:
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/WEB-INF/errors/IOException.html</location>
</error-page>
¨ On peut également déclarer une page d'exception générique pour prendre en
compte tous les types d'exception :
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/errors/Exception.html</location>
</error-page>
¨ Ici, si une exception s'est produite et qu'elle n'est pas déclarée comme étant traitée
spécifiquement dans le web.xml, alors le serveur affichera la page Exception.html,
car toutes les exceptions sont des sous-types du type Throwable.
¨ Le type d'exception le plus spécifique est choisi s'il y a plusieurs correspondances.
Les servlets : gestion d'erreurs
122

¨ Créer une application web pour tester la gestion d'erreurs.


<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title> Exception Handling</title> </head>
<body>
<h2>Gestion d'erreurs</h2>
<h3><a href="test404">Test 404 Error</a></h3>
<h3><a href="Servlet500Error">Test 500 Error</a></h3>
<h 3><a href="ServletIOException">Test IOException</a></h3>
<h3>
<a href="ServletThrowableException">Test ServletException</a>
</h3>
</body>
</html>
Les servlets : gestion d'erreurs
123
<?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">
<display-name>servlet-exemple-gestionErreurs</display-name>
<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errors/Error404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/errors/Error500.html</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/WEB-INF/errors/IOException.html</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/errors/Throwable.html</location>
</error-page>
</web-app>
Les servlets : gestion d'erreurs
124
package com.ensas.jee.exemples.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/Servlet500Error")
public class Servlet500Error extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.sendError(500);
}
}
package com.ensas.jee.exemples.servlets;
@WebServlet("/ServletIOException")
public class ServletIOException extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
throw new IOException();
}
}
Les servlets : gestion d'erreurs
125

package com.ensas.jee.exemples.servlets;
@WebServlet("/ServletThrowableException")
public class ServletIOException extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
throw new ServletException();
}
}
Les servlets : Exercice(JDBC)
126
¨ Créer une application web pour tester les opérations CRUD sur une base de donnée (JDBC).
Les servlets : Exercice(JDBC)
127
Les servlets : Exercice(JDBC)
128
Les servlets : Exercice(JDBC)
129
<?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">
<display-name>servlet-exemple-JDBC-CRUD</display-name>
<welcome-file-list> <welcome-file>ControllerServlet</welcome-file> </welcome-file-list>
<context-param>
<param-name>jdbcURL</param-name>
<param-value>jdbc:mysql://localhost:3306/BookStore</param-value>
</context-param>
<context-param>
<param-name>jdbcUsername</param-name>
<param-value>username</param-value>
</context-param>
<context-param>
<param-name>jdbcPassword</param-name>
<param-value>password</param-value>
</context-param>
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.controller.ControllerServlet</servlet-class>
</servlet>
Les servlets : Exercice(JDBC)
130
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/Error</location>
</error-page>
</web-app>
package com.ensas.jee.exemples.servlets.model;
public class Book {
protected int id;
protected String title;
protected String author;
protected float price;
public Book() {}
public Book(int id, String title, String author, float price) {
this(title, author, price); this.id = id;
}
public Book(String title, String author, float price) {
this.title = title; this.author = author; this.price = price;
}
Les servlets : Exercice(JDBC)
131
public int getId() { return id;
}
public void setId(int id) { this.id = id;
}
public String getTitle() { return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
Les servlets : Exercice(JDBC)
132
package com.ensas.jee.exemples.servlets.dao;
import java.sql.*;
import java.util.*;
import com.ensas.jee.exemples.servlets.model.Book;
public class BookDAO {
private String jdbcURL;
private String jdbcUsername;
private String jdbcPassword;
private Connection jdbcConnection;
public BookDAO(String jdbcURL, String jdbcUsername, String jdbcPassword) {
this.jdbcURL = jdbcURL;
this.jdbcUsername = jdbcUsername;
this.jdbcPassword = jdbcPassword;
}
protected void connect() throws SQLException {
if (jdbcConnection == null || jdbcConnection.isClosed()) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new SQLException(e);
}
jdbcConnection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
}
}
Les servlets : Exercice(JDBC)
133
protected void disconnect() throws SQLException {
if (jdbcConnection != null && !jdbcConnection.isClosed()) jdbcConnection.close();
}
public List<Book> listAllBooks() throws SQLException {
List<Book> listBook = new ArrayList<>();
String sql = "SELECT * FROM book";
connect();
Statement statement = jdbcConnection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("book_id");
String title = resultSet.getString("title");
String author = resultSet.getString("author");
float price = resultSet.getFloat("price");
Book book = new Book(id, title, author, price);
listBook.add(book);
}
resultSet.close();
statement.close();
disconnect();
return listBook;
}
Les servlets : Exercice(JDBC)
134
public boolean insertBook(Book book) throws SQLException {
String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setString(1, book.getTitle());
statement.setString(2, book.getAuthor());
statement.setFloat(3, book.getPrice());
boolean rowInserted = statement.executeUpdate() > 0;
statement.close();
disconnect();
return rowInserted;
}
public boolean deleteBook(Book book) throws SQLException {
String sql = "DELETE FROM book where book_id = ?";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setInt(1, book.getId());
boolean rowDeleted = statement.executeUpdate() > 0;
statement.close();
disconnect();
return rowDeleted;
}
Les servlets : Exercice(JDBC)
135

public boolean updateBook(Book book) throws SQLException {


String sql = "UPDATE book SET title = ?, author = ?, price = ? WHERE book_id = ?";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setString(1, book.getTitle());
statement.setString(2, book.getAuthor());
statement.setFloat(3, book.getPrice());
statement.setInt(4, book.getId());
boolean rowUpdated = statement.executeUpdate() > 0;
statement.close();
disconnect();
return rowUpdated;
}
public Book getBook(int id) throws SQLException {
Book book = null;
String sql = "SELECT * FROM book WHERE book_id = ?";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
Les servlets : Exercice(JDBC)
136
if (resultSet.next()) {
String title = resultSet.getString("title");
String author = resultSet.getString("author");
float price = resultSet.getFloat("price");
book = new Book(id, title, author, price);
}
resultSet.close();
statement.close();
return book;
}
}
package com.ensas.jee.exemples.servlets.controller;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import com.ensas.jee.exemples.servlets.dao.BookDAO;
import com.ensas.jee.exemples.servlets.model.Book;
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private BookDAO bookDAO;
Les servlets : Exercice(JDBC)
137
public void init() {
String jdbcURL = getServletContext().getInitParameter("jdbcURL");
String jdbcUsername = getServletContext().getInitParameter("jdbcUsername");
String jdbcPassword = getServletContext().getInitParameter("jdbcPassword");
bookDAO = new BookDAO(jdbcURL, jdbcUsername, jdbcPassword);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getServletPath();
try {
switch (action) {
case "/new":showNewForm(request, response);break;
case "/insert":insertBook(request, response);break;
case "/delete":deleteBook(request, response);break;
case "/edit":showEditForm(request, response); break;
case "/update":updateBook(request, response); break;
default:listBook(request, response); break;
}
} catch (SQLException ex) {
throw new ServletException(ex);
}
}
Les servlets : Exercice(JDBC)
138
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
private void listBook(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException, ServletException {
List<Book> listBook = bookDAO.listAllBooks();
request.setAttribute("listBook", listBook);
RequestDispatcher dispatcher = request.getRequestDispatcher("BookList");
dispatcher.forward(request, response);
}
private void showNewForm(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("BookForm").forward(request, response);
}
private void showEditForm(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
Book existingBook = bookDAO.getBook(id);
RequestDispatcher dispatcher = request.getRequestDispatcher("BookForm");
request.setAttribute("book", existingBook);
dispatcher.forward(request, response);
}
Les servlets : Exercice(JDBC)
139

private void insertBook(HttpServletRequest request, HttpServletResponse response)


throws SQLException, IOException {
String title = request.getParameter("title");
String author = request.getParameter("author");
float price = Float.parseFloat(request.getParameter("price"));
Book newBook = new Book(title, author, price);
bookDAO.insertBook(newBook);
response.sendRedirect("list");
}
private void updateBook(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
String title = request.getParameter("title");
String author = request.getParameter("author");
float price = Float.parseFloat(request.getParameter("price"));
Book book = new Book(id, title, author, price);
bookDAO.updateBook(book);
response.sendRedirect("list");
}
Les servlets : Exercice(JDBC)
140

private void insertBook(HttpServletRequest request, HttpServletResponse response)


throws SQLException, IOException {
String title = request.getParameter("title");
String author = request.getParameter("author");
float price = Float.parseFloat(request.getParameter("price"));
Book newBook = new Book(title, author, price);
bookDAO.insertBook(newBook);
response.sendRedirect("list");
}
private void updateBook(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
String title = request.getParameter("title");
String author = request.getParameter("author");
float price = Float.parseFloat(request.getParameter("price"));
Book book = new Book(id, title, author, price);
bookDAO.updateBook(book);
response.sendRedirect("list");
}
Les servlets : Exercice(JDBC)
141
private void deleteBook(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
Book book = new Book(id);
bookDAO.deleteBook(book);
response.sendRedirect("list");
}
}
package com.ensas.jee.exemples.servlets.view;
import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import com.ensas.jee.exemples.servlets.model.Book;
@WebServlet("/BookList")
public class BookListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
Les servlets : Exercice(JDBC)
142
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Books Store Application</title></head>");
out.println("<body>");
out.println("<h1>Books Management</h1>");
out.println("<h2>");
out.println("<a href=\"new\">Add New Book</a>");
out.println("&nbsp;&nbsp;&nbsp;"); //espace horizontal
out.println("<a href=\"list\">List All Books</a>");
out.println("</h2>");
out.println("<div> <table border=\"1\" cellpadding=\"5\">");
out.println("<caption><h2>List of Books</h2></caption>");
out.println("<tr>");
out.println("<th> ID </th>");
out.println("<th> Title </th>");
out.println("<th> Author </th>");
out.println("<th> Price </th>");
out.println("<th> Actions </th>");
out.println("</tr>");
Les servlets : Exercice(JDBC)
143

List<Book> listBook = (List<Book>) request.getAttribute("listBook");


for (Book book : listBook) {
out.println("<tr>");
out.println("<td>"+book.getId()+"</td>");
out.println("<td>"+book.getTitle()+"</td>");
out.println("<td>"+book.getAuthor()+"</td>");
out.println("<td>"+book.getPrice()+"</td>");
out.println("<td>");
out.println("<a href=\"edit?id="+book.getId()+"\">Edit</a>");
out.println("&nbsp;&nbsp;&nbsp;&nbsp;"); //espace horizontal
out.println("<a href=\"delete?id="+book.getId()+"\">Delete</a>");
out.println("</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("</div>");
out.println("</body>");
out.println("</html>");
}
}
Les servlets : Exercice(JDBC)
144
package com.ensas.jee.exemples.servlets.view;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import com.ensas.jee.exemples.servlets.model.Book;
@WebServlet("/BookForm")
public class BookFormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Books Store Application</title>");
out.println("</head>");
out.println("<body>");
Les servlets : Exercice(JDBC)
145

out.println("<h1>Books Management</h1>");
out.println("<h2>");
out.println("<a href=\"new\">Add New Book</a>");
out.println("&nbsp;&nbsp;&nbsp;"); //espace horizontal
out.println("<a href=\"list\">List All Books</a>");
out.println("</h2>");
out.println("<div >");
Book book=(Book) request.getAttribute("book");
if (book != null) out.println("<form action=\"update\" method=\"post\">");
if (book == null) out.println("<form action=\"insert\" method=\"post\">");
out.println("<table border=\"1\" cellpadding=\"5\">");
out.println("<caption><h2>");
if (book != null) out.println("Edit Book");
if (book == null) out.println("Add New Book");
out.println("</h2></caption>");
if (book != null) {
out.println("<input type=\"hidden\" name=\"id\" value=\""+book.getId()+"\"/>");
out.println("<tr><th>Title:</th> ");
out.println("<td><input type=\"text\" name=\"title\" size=\"45\" value=\""+book.getTitle()+"\"/>");
out.println("</td></tr>");
out.println("<tr><th>Author:</th></tr>");
Les servlets : Exercice(JDBC)
146
out.println("<tr><th>Author:</th><td>");
out.println("<input type=\"text\" name=\"author\" size=\"45\" value=\""+book.getAuthor()+"\"/>");
out.println("</td></tr>");
out.println("<tr><th>Price:</th>");
out.println("<td><input type=\"text\" name=\"price\" size=\"5\" value=\""+book.getPrice()+"\"/>");
out.println("</td></tr>");
} else {
out.println("<input type=\"hidden\" name=\"id\" value=\"\"/>");
out.println("<tr><th>Title:</th>");
out.println("<td><input type=\"text\" name=\"title\" size=\"45\" value=\"\" /></td></tr>");
out.println("<tr><th>Author:</th>");
out.println("<td><input type=\"text\" name=\"author\" size=\"45\" value=\"\" /></td></tr>");
out.println("<tr><th>Price:</th>");
out.println("<td><input type=\"text\" name=\"price\" size=\"5\" value=\"\" /></td></tr>");
}
out.println("<tr> <td colspan=\"2\" align=\"center\"><input type=\"submit\" value=\"Save\"/> ");
out.println("</td></tr></table>");
out.println("</form></div>");
out.println("</body>");
out.println("</html>");
}
}
Les servlets : Exercice(JDBC)
147
package com.ensas.jee.exemples.servlets.view;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/Error")
public class ErrorServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Error</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Error</h1>");
Les servlets : Exercice(JDBC)
148
out.println("<h2>");
//Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
//String servletName = (String)request.getAttribute("javax.servlet.error.servlet_name");
//String requestUri = (String)request.getAttribute("javax.servlet.error.request_uri");
// Analyze the servlet exception
Throwable exception = (Throwable)request.getAttribute("javax.servlet.error.exception");
out.println(exception.getMessage());
out.println("</h2>");
out.println("</body>");
out.println("</html>");
}
}

Vous aimerez peut-être aussi