Cours Java Servlet
Cours Java Servlet
Achref El Mouelhi
Jakarta EE
r e
chèle MVC dans une application JEE
© A
Contrôleur du mod
Jakarta EE
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
Jakarta EE
Jakarta EE
Explication
H I ©
doGet() : s’exécute quand l’utilisateur demande une page (via la
EL
barre d’adresse, un lien hypertexte...)
O U
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
Jakarta EE
package org.eclipse.controller;
import javax.servlet.http.HttpServlet;
H I ©
EL
import javax.servlet.http.HttpServletRequest;
U
import javax.servlet.http.HttpServletResponse;
O
LM
public class TestServlet extends HttpServlet {
}
r e f E
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
ch
©A
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
}
}
Jakarta EE
Jakarta EE
Jakarta EE
Jakarta EE
Jakarta EE
Faire un clic droit sur src situé dans Java Resources de notre
projet
H I ©
Aller dans New et choisir Servlet
U EL
M O
E L par
Remplir le champ Java package:
f
re
org.eclipse.controller
c h (par example)
Remplir© A Class name: par un nom suffixé par le mot
le champ
Servlet : TestServlet (par example)
Cliquer sur Next
Jakarta EE
Jakarta EE
package org.eclipse.controller;
// les imports
@WebServlet("/mapage")
H I ©
public class TestServlet extends HttpServlet {
U EL
private static final long serialVersionUID = 1L;
O
E LM
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
f
} r e
response.getWriter().append("Served at: ").append(request.getContextPath());
ch
©A
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Jakarta EE
Jakarta EE
chr e
A
Choisir XML File
©
Cliquer sur Next et choisir le nom web.xml
Jakarta EE
Contenu de web.xml
©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>
Jakarta EE
<welcome-file-list>
Contient les différent formats fichiers qui peuvent être utilisés
H I ©
comme page d’accueil de l’application
U EL
M O
f E L dans webapp
Ces fichiers seront directement
Pas besoin d’uneh
c re pour les afficher
Servlet
© Avia la route / ou directement via leur nom
Accessibles
Jakarta EE
...
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.eclipse.controller.TestServlet</servlet-class>
H I ©
EL
</servlet>
O U
f E LM
ch r e
©A
Jakarta EE
...
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.eclipse.controller.TestServlet</servlet-class>
H I ©
EL
</servlet>
O U
Explication
f E LM
ch r e
©A
<servlet> et </servlet> : déclaration de la Servlet
Jakarta EE
H I ©
EL
<description> et </description> : ajouter une description
OU
sur le fonctionnement de la Servlet (comme un commentaire)
M
E L
<load-on-startup> et </load-on-startup>
f : permet de
c hr
forcer le chargementede la Servlet lors de démarrage
... © A
Jakarta EE
Jakarta EE
...
<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
Jakarta EE
...
<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
Jakarta EE
Contenu de web.xml
r e E
<servlet-name>TestServlet</servlet-name>
f
<servlet-class>org.eclipse.controller.TestServlet</servlet-class>
</servlet>
ch
<servlet-mapping>
©A
<servlet-name>TestServlet</servlet-name>
<url-pattern>/mapage</url-pattern>
</servlet-mapping>
</web-app>
Jakarta EE
H I ©
Remarque
U EL
O
f E LM
Dans la suite de ce cours, on n’utilisera que le routage par annotation.
ch r e
©A
Jakarta EE
r e
adresse : http://localhost:8080/cours-jee/mapage
ch at: /cours-jee
contenuA
: Served
©
Jakarta EE
©A
Jakarta EE
H I ©
EL
Comment afficher le Hello World
O U
Il faut modifier la Servlet (l’objet HttpServletResponse qui est
responsable de la réponse)
f E LM
ch r e
©A
Jakarta EE
Nouveau contenu de la Servlet
Jakarta EE
©A
Jakarta EE
On peut indiquer l’encodage et le type du contenu de la réponse
H I ©
accents
U EL
// indiquer l'encodage UTF-8 pour éviter les problèmes avec les
O
LM
response.setCharacterEncoding("UTF-8");
r e f E
PrintWriter out = response.getWriter();
ch
out.println("Hello World");
©A
}
L’objet PrintWriter
Jakarta EE
Pour retourner une page HTML complète
©A
out.println("<title>Projet JEE</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello World");
out.println("</body>");
out.println("</html>");
}
Jakarta EE
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
Jakarta EE
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).
Jakarta EE
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
Protocole route
Scheme ServerPort ServletPath
ServerName ContextPath
H I ©
Parameter
UEL
O
f E LM
ch r e
http://localhost:8080/nom-projet/route-servlet?param1=value1¶m2=value2
©A RequestURI
RequestURL
Jakarta EE
H I ©
UEL
O
f E LM
ch r e
©A
Jakarta EE
H I ©
UEL
Exemples O
f E LM
Il suffit de préfixer le nom des propriétés précédentes par get
ch r e
A
request.getContextPath()
©
request.getServletPath()
request.getServerPort()
...
Jakarta EE
Exercice 1
Créez une Servlet CalculServlet accessible via une des quatre routes suivantes
/calcul/plus
/calcul/moins
H I ©
/calcul/fois
U EL
O
/calcul/div
f E LM
ch r e
La Servlet doit afficher chaque fois la deuxième partie de la route demandé
plus ©A
moins
fois
div
Jakarta EE
f E LM
ch r e
©A
Jakarta EE
f E LM
ch r e
Solution ©A
request.getParameter("nomParameter");
Jakarta EE
Exemple de récupération et d’affichage de paramètres de la requête
H I ©
EL
String nom = request.getParameter("nom");
String prenom = request.getParameter("prenom");
O U
LM
PrintWriter out = response.getWriter();
}
r e E
out.print("Hello " + nom + " " + prenom);
f
ch
©A
Jakarta EE
Exemple de récupération et d’affichage de paramètres de la requête
H I ©
EL
String nom = request.getParameter("nom");
String prenom = request.getParameter("prenom");
O U
LM
PrintWriter out = response.getWriter();
}
r e E
out.print("Hello " + nom + " " + prenom);
f
ch
©A
Remarque
Jakarta EE
©A
out.print("Hello " + nom + " " + prenom);
} else {
out.print("Hello world");
}
}
À 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
Jakarta EE
Exercice 2
H I ©
accepte deux paramètres a et b
U EL
O
LM
Si la route demandée est
e f E
/calcul/plus?a=2&b=5, alors la Servlet affiche le résultat de l’addition.
r
ch
/calcul/moins?a=2&b=5, alors la Servlet affiche le résultat de la soustraction.
©A
/calcul/fois?a=2&b=5, alors la Servlet affiche le résultat de la multiplication.
/calcul/div?a=2&b=5, alors la Servlet affiche le résultat de la division.
Jakarta EE
Si le paramètre est présent plusieurs fois dans l’URL avec le même nom, alors on peut
utiliser getParameterValues()
f E LM
}
}
ch r e
©A
Jakarta EE
Si le paramètre est présent plusieurs fois dans l’URL avec le même nom, alors on peut
utiliser getParameterValues()
f E LM
}
}
ch r e
©A
Exemple d’URL pour tester
http://localhost:8080/test-jee/home?nom=wick&nom=dalton
Jakarta EE
Exercice 3
Jakarta EE
Pour récupérer tous les paramètres dans un Map, on peut utiliser getParameterMap()
}
}
r e f E
}
ch
©A
Jakarta EE
Pour récupérer tous les paramètres dans un Map, on peut utiliser getParameterMap()
}
}
r e f E
}
ch
©A
Exemple d’URL pour tester
http://localhost:
8080/test-jee/home?nom=wick&nom=dalton&genre=homme&age=45
Jakarta EE
response.sendRedirect("MaServlet");
H I ©
UEL
O
f E LM
ch r e
©A
Jakarta EE
response.sendRedirect("MaServlet");
H I ©
UEL
O
Ne pas mettre "/" avant MaServlet.
f E LM
ch r e
©A
Jakarta EE
response.sendRedirect("MaServlet");
H I ©
UEL
O
Ne pas mettre "/" avant MaServlet.
f E LM
r e
ch l’URL depuis le contextPath
A
On peut aussi reconstruire
©
response.sendRedirect(request.getContextPath() + "/MaServlet");