JEE : Servlets
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
elmouelhi.achref@gmail.com
H & H: Research and Training 1 / 35
Plan
1 Introduction
2 Structure d’une Servlet
3 Première Servlet avec Eclipse
Routage par annotation
Routage dans web.xml
4 Objet HttpServletRequest
5 Tester la Servlet
6 Paramètres de requête
7 Rediriger vers une autre Servlet
8 Servlet multi-routes
H & H: Research and Training 2 / 35
Introduction
JEE
Servlet : le cœur d’une application JEE
H I ©
EL
Classe Java héritant de la classe HttpServlet
U
Recevant une requête HTTP (deM OGET, POST...) et retournant
f E L type
une réponse HTTP
r e
chèle MVC dans une application JEE
© A
Contrôleur du mod
H & H: Research and Training 3 / 35
Introduction
JEE
Vue Modèle
(page JSP) (Java Bean)
H I ©
U EL
O
f E LM
ch r e
Requête
©A
HTTP
Contrôleur
(Servlet)
Réponse
HTTP
Client Serveur
H & H: Research and Training 4 / 35
Structure d’une Servlet
JEE
Une Servlet : classe Java héritant de HttpServlet
package org.eclipse.config;
H I ©
UEL
import javax.servlet.http.HttpServlet; O
f E LM
ch r e
public class TestServlet extends HttpServlet {
} ©A
H & H: Research and Training 5 / 35
Structure d’une Servlet
JEE
Explication
HttpServlet contient des méthodes abstraites, préfixées par
do(), associées aux différentes méthodes (verbes) HTTP.
I ©
doGet() : s’exécute quand l’utilisateur demande une page (via la
H
barre d’adresse, un lien hypertexte...)
UEL
O
doPost() : s’exécute quand l’utilisateur envoie des données via
un formulaire par exemple
f E LM
...
ch r e
©A
Chaque méthode prend en paramètre :
HttpServletRequest : contenant des informations sur la
requête utilisateur
HttpServletResponse : permettant de personnaliser la réponse
à retourner à l’utilisateur
H & H: Research and Training 6 / 35
Structure d’une Servlet
JEE
Ajoutons les méthodes doGet() et doPost() à TestServlet
package org.eclipse.config;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
H I ©
EL
OU
public class TestServlet extends HttpServlet {
M
f E L
protected void doGet(HttpServletRequest request,
ch r
HttpServletResponseeresponse) {
}
© A
protected void doPost(HttpServletRequest request,
HttpServletResponse response) {
}
}
H & H: Research and Training 7 / 35
Structure d’une Servlet
JEE
Mais quand cette Servlet sera exécutée ?
Quand l’utilisateur saisit une URL dans le navigateur, il envoie une
requête HTTP à notre contrôleur (qui est en vrai une Servlet)
Mais quelle Servlet ? je peux en avoir plusieurs
H I ©
U
Le serveur va chercher quelle Servlet est E L
associée à cette route
L MO
r e f E
A ch
©
H & H: Research and Training 8 / 35
Structure d’une Servlet
JEE
Mais quand cette Servlet sera exécutée ?
Quand l’utilisateur saisit une URL dans le navigateur, il envoie une
requête HTTP à notre contrôleur (qui est en vrai une Servlet)
I
Mais quelle Servlet ? je peux en avoir plusieurs
H ©
U
Le serveur va chercher quelle Servlet est E L
associée à cette route
L MO
r e f E
A cuneh route à une Servlet ?
©
Comment associer
soit avec l’annotation @WebServlet
soit dans le fichier web.xml
H & H: Research and Training 8 / 35
Structure d’une Servlet
JEE
Mais quand cette Servlet sera exécutée ?
Quand l’utilisateur saisit une URL dans le navigateur, il envoie une
requête HTTP à notre contrôleur (qui est en vrai une Servlet)
I
Mais quelle Servlet ? je peux en avoir plusieurs
H ©
U
Le serveur va chercher quelle Servlet est E L
associée à cette route
L MO
r e f E
A cuneh route à une Servlet ?
©
Comment associer
soit avec l’annotation @WebServlet
soit dans le fichier web.xml
Commençons par créer une Servlet avec Eclipse
H & H: Research and Training 8 / 35
Première Servlet avec Eclipse
JEE
Pour créer une Servlet sous Eclipse
Faire un clic droit sur src situé dans Java Resources de notre
projet
H I ©
EL
OU
Aller dans New et choisir Servlet
M
E L par
Remplir le champ Java package:
f
h r e
org.eclipse.controller
c (par example)
Remplir©
A
le champ Class name: par un nom suffixé par le mot
Servlet : TestServlet (par example)
Cliquer sur Next
H & H: Research and Training 9 / 35
Première Servlet avec Eclipse Routage par annotation
JEE
Routage par annotation (par défaut)
On peut modifier ou supprimer l’URL Mappings. Remplaçons la
chaı̂ne existante (/TestServlet) par /mapage H I ©
U EL
Cliquer sur Next O
f E
Décocher la case Constructors from superclass LM
h r e
lesccases correspondantes aux deux méthodes
Vérifier que A
©
doGet() et doPost sont cochées
Valider en cliquant sur Finish
H & H: Research and Training 10 / 35
Première Servlet avec Eclipse Routage par annotation
JEE
Le contenu généré par Eclipse
package org.eclipse.controller;
// les imports
@WebServlet("/mapage")
H I ©
EL
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
O U
f E LM
protected void doGet(HttpServletRequest request, HttpServletResponse
r e
response) throws ServletException, IOException {
ch
©A
response.getWriter().append("Served at: ").append(request.
getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
}
H & H: Research and Training 11 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Routage dans web.xml
H I ©
U EL
Le fichier web.xml situé dans WEB-INF de WebContent permet de :
déclarer la Servlet L MO
r e f E
associer une URL
A ch à une Servlet (Mapping URL/Servlet)
©
H & H: Research and Training 12 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Si le fichier n’existe pas
Faire un clic droit sur WEB-INF de WebContent de notre projet
H I ©
EL
Aller dans New et choisir Other
M OU
f E
Saisir xml dans la zone de L
recherche
Choisir XMLA chr
File
e
©
Cliquer sur Next et choisir le nom web.xml
H & H: Research and Training 13 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Contenu de 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://
H I ©
xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID"
U EL
version="3.1">
O
<display-name>cours-jee</display-name>
f E LM
<welcome-file-list>
ch r e
<welcome-file>index.html</welcome-file>
©A
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
H & H: Research and Training 14 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
<welcome-file-list>
Contient les différent formats fichiers qui peuvent être utilisés H I ©
comme page d’accueil de l’applicationU EL
M O
f E L dans WebContent
Ces fichiers seront directement
Pas besoin d’uneh
c re pour les afficher
Servlet
© Avia la route / ou directement via leur nom
Accessibles
H & H: Research and Training 15 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Dans web.xml, on déclare la Servlet avant </web-app>
...
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.eclipse.controller.TestServlet</servlet-
class>
H I ©
</servlet>
U EL
O
f E LM
ch r e
©A
H & H: Research and Training 16 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Dans web.xml, on déclare la Servlet avant </web-app>
...
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.eclipse.controller.TestServlet</servlet-
class>
H I ©
</servlet>
U EL
O
f E LM
Explication
ch r e
©A
<servlet> et </servlet> : déclaration de la Servlet
<servlet-name> et </servlet-name> : permet d’attribuer un nom à la
Servlet qu’on utilisera plus tard
<servlet-class> et </servlet-class> : indique le chemin de la classe
de la Servlet
H & H: Research and Training 16 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Autres sous balises disponibles pour Servlet
H I ©
<description> et </description> : ajouter une description
EL
OU
sur le fonctionnement de la Servlet (comme un commentaire)
M
<load-on-startup> et
f E L
</load-on-startup> : permet de
e
chr de la Servlet lors de démarrage
forcer le chargement
... © A
H & H: Research and Training 17 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
N’oublions pas, le rôle du web.xml :
H I ©
EL
déclarer la Servlet (c’est fait)
M OU
faire le mapping (assurer E
f L si cela n’a pas été fait avec
le routage
les annotations) hr
c e
©A
H & H: Research and Training 18 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
...
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/mapage</url-pattern>
</servlet-mapping>
</web-app>
H I ©
U EL
O
f E LM
ch r e
©A
H & H: Research and Training 19 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
...
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/mapage</url-pattern>
</servlet-mapping>
</web-app>
H I ©
U EL
O
Explication
f E LM
ch r e
<servlet-mapping> et </servlet-mapping> : pour faire le mapping
© A
Servlet/url
<servlet-name> et </servlet-name> : permet d’indiquer le nom de la
Servlet à appeler
<url-pattern> et </url-pattern> : indique l’URL qui provoquera l’appel
de la Servlet indiquée dans la la sous-balise précédente
H & H: Research and Training 19 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
Le contenu de 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://
H I ©
xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID"
U EL
version="3.1">
O
<servlet>
f E LM
ch r e
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.eclipse.controller.TestServlet</servlet-
class>
</servlet> ©A
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/mapage</url-pattern>
</servlet-mapping>
</web-app>
H & H: Research and Training 20 / 35
Première Servlet avec Eclipse Routage dans web.xml
JEE
H I ©
Remarque
U EL
O
f E LM
Dans la suite de ce cours, on utilise que le routage par annotation.
ch r e
©A
H & H: Research and Training 21 / 35
Objet HttpServletRequest
JEE
Format d’une requête utilisateur
http://localhost:8080/nomProjetJEE/URLServlet
H I ©
UEL
O
f E LM
ch r e
©A
H & H: Research and Training 22 / 35
Objet HttpServletRequest
JEE
Format d’une requête utilisateur
http://localhost:8080/nomProjetJEE/URLServlet
H I ©
Comment récupérer ces informations
UEL
O
f E LM
request.getContextPath() : nom du projet défini par le
ch r e
serveur Apache Tomcat dans la requête
©A
request.getServletPath() : adresse de la Servlet
demandée par l’utilisateur (définie soit dans web.xml ou dans
l’annotation @WebServlet)
request.getServerPort() : numéro de port utilisé par le
serveur
H & H: Research and Training 22 / 35
Tester la Servlet
JEE
Une seule étape à faire
H I ©
Cliquer sur Run
UEL
O
Une page blanche affichée ayant comme
f E LM
r e
adresse : http://localhost:8080/cours-jee/mapage
ch
©A
contenu : Served at: /cours-jee
H & H: Research and Training 23 / 35
Tester la Servlet
JEE
Si on teste une autre URL inexistante
H I ©
UEL
Écrire dans la zone d’adresse
O
http://localhost:8080/nomProjetJEE/tapage
f E LM
ch r e
Une page HTTP 404 sera affichée
©A
H & H: Research and Training 24 / 35
Tester la Servlet
JEE
H I ©
Comment afficher le Hello World
UEL
O
LM
Il faut modifier la Servlet (l’objet HttpServletResponse qui
est responsable de la réponse)
r e f E
ch
©A
H & H: Research and Training 25 / 35
Tester la Servlet
JEE
Nouveau contenu de la Servlet
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
H I ©
EL
HttpServletResponse response) throws ServletException,
IOException {
M OU
f E L
response.getWriter().print("Hello World");
}
ch r e
protected©
A
void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
doGet(request, response);
}
}
H & H: Research and Training 26 / 35
Tester la Servlet
JEE
Pour exécuter une deuxième fois
H I ©
EL
Cliquer sur Run
M OU
Choisir Continue without
f E L restarting (pas besoin de
chr e
redémarrer le serveur)
© A
H & H: Research and Training 27 / 35
Tester la Servlet
JEE
On peut indiquer l’encodage et le type du contenu de la réponse
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
// pour indiquer le type de réponse
response.setContentType("text/html");
H I ©
EL
// indiquer l’encodage UTF-8 pour éviter les problèmes avec les
U
accents
O
LM
response.setCharacterEncoding("UTF-8");
r e f E
PrintWriter out = response.getWriter();
ch
out.println("Hello World");
}
©A
L’objet PrintWriter
s’obtient de l’objet response
permet d’envoyer un (ou des) message(s) à l’utilisateur
H & H: Research and Training 28 / 35
Tester la Servlet
JEE
Pour retourner une page HTML complète
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException{
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
H I ©
PrintWriter out = response.getWriter();
UEL
out.println("<!DOCTYPE html>");
O
out.println("<html>");
out.println("<head>");
f E LM
ch r e
out.println("<meta charset=\"utf-8\" />");
©A
out.println("<title>Projet JEE</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello World");
out.println("</body>");
out.println("</html>");
}
H & H: Research and Training 29 / 35
Tester la Servlet
JEE
Constats
Beaucoup de code dans la Servlet (trop long) pour un affichage.
simple
H I ©
UEL
O
Violation du modèle MVC : le contrôleur n’affiche pas de résultat.
f E LM
ch r e
©A
H & H: Research and Training 30 / 35
Tester la Servlet
JEE
Constats
Beaucoup de code dans la Servlet (trop long) pour un affichage.
simple
H I ©
UEL
O
Violation du modèle MVC : le contrôleur n’affiche pas de résultat.
f E LM
ch r e
Solution ©A
Utiliser des vues pour l’affichage (chapitre suivant).
H & H: Research and Training 30 / 35
Paramètres de requête
JEE
Récupérer les paramètres d’une requête
Mais, une requête peut avoir de paramètres (par example
H I ©
/mapage?nom=Wick&prenom=John)
UEL
O
f E LM
Comment, dans ce cas, récupérer les paramètres ?
ch r e
©A
H & H: Research and Training 31 / 35
Paramètres de requête
JEE
Récupérer les paramètres d’une requête
Mais, une requête peut avoir de paramètres (par example
H I ©
/mapage?nom=Wick&prenom=John)
UEL
O
f E LM
Comment, dans ce cas, récupérer les paramètres ?
ch r e
Solution
©A
request.getParameter("nomParameter");
H & H: Research and Training 31 / 35
Paramètres de requête
JEE
Exemple de récupération et d’affichage de paramètres de la
requête
protected void doGet(HttpServletRequest request,
H I ©
HttpServletResponse response) throws
UEL
ServletException, IOException {
O
f E LM
r e
String nom = request.getParameter("nom");
ch
©A
String prenom = request.getParameter("prenom");
PrintWriter out = response.getWriter();
out.print("Hello " + nom + " " + prenom);
}
H & H: Research and Training 32 / 35
Paramètres de requête
Récupérer les paramètres d’une requête
À ne pas confondre
H I ©
EL
OU
Les paramètres de requête : concept relatif aux requêtes HTTP
M
Les attributs de requête : E
f L introduit dans JEE (à voir dans
concept
chr
le prochain chapitre) e
© A
H & H: Research and Training 33 / 35
Rediriger vers une autre Servlet
JEE
Rediriger vers une autre Servlet annotée par
H I ©
EL
@WebServlet("/MaServlet")
response.sendRedirect("MaServlet"); O U
f E LM
ch r e
©A
Ne pas mettre "/" avant MaServlet.
H & H: Research and Training 34 / 35
Servlet multi-routes
JEE
Pour avoir plusieurs routes qui permettent d’exécuter une Servlet
@WebServlet({"/route1", "/route2",... /routeN})
H I ©
EL
M OU
f
Dans la Servlet, pour récup E Lla route qui a conduit à
érer
chr e
l’exécution de la Servlet
© A
request.getServletPath()
H & H: Research and Training 35 / 35