Les SERVLETs
Du JSP à la servlet
L’exécution d’un script JSP sur le serveur se traduit par:
Création d’un programme servlet équivalent
Compilation de ce programme
Chargement de ce programme
Exécution automatique du programme et génération d’une
réponse sous forme d’une page HTML.
07/01/2019 -A.Y- 2
Cycles de vie d’une servlet
Une servlet passe par 6 états dont l’ensemble forme un cycle de
vie:
Traduction
Compilation
Création et chargement d’un objet Servlet
Initialisation de la servlet
Appel de la méthode _jspService() et création des objets
request et response pour chaque requête émise par un client
Destruction de la servlet
07/01/2019 -A.Y- 3
Du JSP à la servlet
Traitement d’une requête par une servlet:
Serveur web
Conteneur des servlets
Requête Requête ServletRequest
Client Classe servlet
Réponse Réponse ServletResponse
07/01/2019 -A.Y- 4
Première servlet
Méthodes des requêtes HTTP: GET, POST
Méthodes de la classe HttpServlet:
− init()
− service()
− destroy()
− doPost() Conteneur de servlets
− doGet()
MaServlet
1:Requête GET 2:Service() 3:Service()
Client HttpServlet
6:Réponse HTTP 5:Réponse HTTP 4:DoGet()
07/01/2019 -A.Y- 5
Première servlet
import java.io.*;
import javax.servlet.*;
public class HelloWorld extends GenericServlet {
public void service(ServletRequest requete, ServletResponse
reponse) throws IOException, ServletException{
reponse.setContentType("text/html");
PrintWriter out = reponse.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello World</h1>");
out.println("</body>");
out.println("</html>");
out.flush();
}
}
07/01/2019 -A.Y- 6
Première servlet (méthodologie)
L'application web helloword accessible à l'url:
http://localhost:8080/helloworld//.
doit être stockée dans le répertoire /webapps/helloworld contenant:
- directement ou dans un sous dossier les fichiers html,jsp, ...
- un sous dossier WEB-INF contenant:
- le fichier de configuration web.xml.
- un sous dossier classes qui contiendra les servlets compilées.
Les étapes à suivre pour déployer la servlet HelloWorld.java sont:
- compiler la servlet.
- placer le code HelloWorld.class dans le dossier
webapps/helloworld/WEB-INF/classes.
- mettre à jour le fichier web.xml.
07/01/2019 -A.Y- 7
Première servlet (méthodologie)
WEB-INF/web.xml: Fichier de déploiement pour le paramétrage
des servlets.
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
07/01/2019 -A.Y- 8
Programmation des servlets
Il faut importer des classes spéciales pour les servlets :
import javax.servlet.*;
import javax.servlet.http.*;
Une servlet implante l'interface Servlet soit directement soit en
étendant l'une des classes: Genericservlet ou HttpServlet.
Une servlet possède les méthodes:
init(ServletConfig config) : appelée en premier au chargement de la
servlet, config est transmise par le moteur.
service(ServletRequest req, ServletResponse rep) : pour répondre
aux requêtes et générer les réponses.
destroy() : appelée lors de la destruction de la servlet.
getServletInfo() : renvoie des infos sur la servlet.
getServletConfig() : renvoie un objet de type ServletConfig.
07/01/2019 -A.Y- 9
Cycle de vie d'une servlet
Chargement du code par le conteneur et création d'une
instance de la servlet lors du premier appel à la servlet.
Exécution unique de la méthode init() de l'instance créée
Exécution de la méthode service() à chaque requête de
clients.
Attention aux accès concurrents.
Traitement de requêtes (méthode service()).
Exécution unique de la méthode destroy(), libération des
ressources créées par init() et suppression de l'instance (lors
de l'arrêt de l'application).
Cycle de vie d'une servlet
init()
Créée Initialisée
service()
destroy()
Détruite En service
init(): méthode appelée une seule fois par le serveur dans la vie d’une
servlet et juste après son initialisation.
service(ServletRequest, ServletResponse): appelée par le serveur
chaque fois que la servlet est invoquée. Chaque requête du client
déclenche une seule exécution de cette méthode.
destroy(): appelée une seule fois par le serveur dans la vie d’une
servlet, lors de sa destruction. Elle permet de libérer certaines
ressources (fichiers, bases de données,…)
07/01/2019 -A.Y- 11
Servlet générique
Une servlet qui hérite de GenericServlet est une servlet
indépendante du protocole utilisé (http, ftp, …).
public class HelloWorld extends GenericServlet{
Elle doit implémenter la méthode service qui reste le principal
point d'entrée du client vers le serveur.
public void service(ServletRequest requete, ServletResponse
reponse) throws IOException, ServletException{
Package: javax.servlet
07/01/2019 -A.Y- 12
HTTP Servlet
Une servlet qui hérite de HttpServlet est une servlet qui
répond uniquement aux requêtes utilisant protocole http.
Elle doit implémenter la méthode service qui reste le principal
point d'entrée du client vers le serveur. Cette méthode appelle
la méthode adéquate en fonction de la requête http effectuée:
doGet: pour traiter la requête GET
doPost: pour traiter la requête POST
doHead, doTrace,…
Package: javax.servlet.http
07/01/2019 -A.Y- 13
Programmation de http servlet
Une servlet dérive de la classe HttpServlet:
public class HelloWorld extends HttpServlet {
Une requête GET envoyée à la servlet est traitée par la
méthode doGet:
public void doGet(HttpServletRequest requete,
HttpServletResponse reponse) throws IOException,
ServletException{
Une requête POST est traitée par la méthode doPost:
public void doPost(HttpServletRequest requete,
HttpServletResponse reponse) throws IOException,
ServletException{
07/01/2019 -A.Y- 14
Programmation de http servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DateServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse rep) throws
ServletException, IOException {
PrintWriter out = rep.getWriter();
out.println("<html><head><title>Bonjour</title></head>");
out.println("<body><h1> Bonjour à tous </h1>");
out.println("<h2>Il est : "+new java.util.Date().toLocaleString()+"</h2>");
out.println("</body></html>");
rep.setHeader("refresh","1");
}
public void doPost(HttpServletRequest req, HttpServletResponse rep) throws
ServletException, IOException {
doGet(req, rep);
}
}
07/01/2019 -A.Y- 15
L’interface HttpServletRequest
L'objet HttpServletRequest requete est l'objet qui nous donne la
possibilité d’accéder à la requête envoyée par le client Web.
Il contient les informations sur la requête qui a sollicité la servlet
(tout ce qui provient du navigateur).
Il permet de récupérer les paramètres d’un formulaire envoyés par
POST ou GET.
getParameter(String param): retourne la chaîne de caractères égale
à la 1ère valeur (si elle existe) du paramètre param.
getParametersValue(String param): retourne le tableau de chaîne
de caractères des valeurs du paramètre param.
getParameterNames(): retourne un objet Enumeration contenant la
liste des noms des paramètres envoyés.
getRemoteHost(): retourne l‘adresse IP du client.
07/01/2019 -A.Y- 16
L’interface HttpServletRequest
Autres méthodes:
String getRemoteAddr() int getServerPort()
String getMethod() String getServerName()
String getPathInfo() String getRequestURL()
String getQueryString()
String getRequestURI()
String getServletPath()
String getContextPath()
Cookie[] getCookies()
HttpSession getSession(boolean)
boolean isRequestedSessionIdValid()
Enumeration getHeaderNames()
L’interface HttpServletResponse
La réponse de la servlet se fait via l'objet HttpServletResponse
reponse. Cet objet permet de définir tout ce que l'on va envoyer
au navigateur du client.
L'objet reponse nous permet de fixer les entêtes http qui seront
envoyés au client. Par exemple l'entête Content-type: text/html
est ici fixé par :
response.setContentType("text/html");
Pour envoyer la réponse au client, la servlet utilise un flux de
sortie que lui délivre l'objet reponse :
ServletOutputStream out= reponse. getOutputStream();
Ou bien:
PrintWriter out = response.getWriter();
07/01/2019 -A.Y- 18
L’interface HttpServletResponse
Autres méthodes:
void sendRedirect(String).
void sendError(int [ , String ])
void setStatus()
void setHeader()
void setContentLength()
String encodeURL (String)
String encodeRedirectURL (String)
void addCookie(Cookie)
07/01/2019 -A.Y- 19
La session HttpSession
L’interface HttpSession défini un objet qui représente une
session.
Quelques méthodes:
getId(): retourne l’identifiant unique de la session.
Object getAttribue(String): retourne la valeur attribuée à un
objet dont le nom est passé en argument.
setAttribute(String, Object): stocke dans la session l’objet
passé en 2ème paramètre, en lui associant un nom passé en
1er paramètre de la méthode.
long getCreationTime(): date de création. (nombre de ms
depuis 01/01/1970 00:00:00)
07/01/2019 -A.Y- 20
La session HttpSession
long getLastAccessedTime(): date du dernier accès.
void removeAttribute(String): supprime un objet de la session.
Enumeration getAttributeNames(): retourne toutes les valeurs
(objets) enregistrées dans la session.
logout(): termine la session (destruction).
invalidate(): expire la session (destruction).
isNew()…
Création d’une session:
HttpSession session = requete.getSession(true);
07/01/2019 -A.Y- 21
La session HttpSession
Exemple:
HttpSession session = req.getSession(true);
// la session est récupérée ou ouverte s’elle n’existait pas déjà.
/** Ou bien
*HttpSession session = req.getSession(true);
*la session est récupérée ou null s’elle n’existait pas déjà.
*/
if(session.getLastAccessedTime() - session.getCreationTime()
>5*60*1000 ) {
session.invalidate();
}
07/01/2019 -A.Y- 22
Récupérer les entêtes HTTP d'un client web
public class RecupererEntete extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse rep)
throws IOException, ServletException {
rep.setContentType("text/html");
PrintWriter out = rep.getWriter();
Enumeration elems = req.getHeaderNames();
while (elems.hasMoreElements()) {
String name = (String)elems.nextElement();
String value = req.getHeader(name);
out.println("<b>"+name + "</b> = " + value + "<br>");
}
}
public void doPost(HttpServletRequest req, HttpServletResponse rep)
throws IOException, ServletException
{
doGet(req,rep);
}
}
07/01/2019 -A.Y- 23
L’initialisation de la servlet
Récupération des paramètres d ’initialisation: WEB-INF/web.xml
<servlet>
<servlet-name>UneServlet</servlet-name>
<servlet-class>UneServlet</servlet-class>
<init-param>
<param-name>langue</param-name>
<param-value>Arabe</param-value>
</init-param>
<init-param>
<param-name>pays</param-name>
<param-value>Maroc</param-value>
</init-param>
</servlet>
07/01/2019 -A.Y- 24
Récupérer les paramètres d’initialisation
public class UneServlet extends GenericServlet {
Enumeration e;
public void service(ServletRequest req, ServletResponse rep) throws
IOException, ServletException{
PrintWriter out=rep.getWriter();
out.println("Servlet: paramètres d’initialisation<br>");
e = this.getInitParameterNames();
while (e.hasMoreElements()) {
String clé= (String)e.nextElement(); String value = getInitParameter(clé);
out.println(clé+ " = " + value+”<br>”);
}
}
}
07/01/2019 -A.Y- 25
Collaboration servlets/JSP
On met dans une ou plusieurs servlets, le code Java qui ne génère
pas le code HTML de la réponse.
dans des pages JSP, on met le code de génération des différents
documents HTML envoyés en réponse au client.
Quelques méthodes à utiliser:
- [ServletContext].getRequestDispatcher(String url): méthode de la
classe ServletContext qui rend un objet RequestDispatcher. Le
paramètre url est le nom de l'URL à qui on veut transmettre la
requête du client.
- [RequestDispatcher].forward(ServletRequest req, ServletResponse
rep): méthode de l'interface RequestDispatcher qui transmet à l'URL
précédente la requête req du client et l'objet rep qui doit être utilisé
pour élaborer la réponse.
07/01/2019 -A.Y- 26
Collaboration servlets/JSP
[ServletRequest].setAttribute(String nom, Object obj): lorsqu'une
servlet ou page JSP passe une requête à une autre servlet ou page
JSP, elle a en général besoin de passer à celle-ci d'autres
informations que la seule requête du client, informations issues de
son propre travail sur la requête.
[ServletRequest].getAttribute(String attribut): permet de récupérer
les valeurs des attributs d'une requête.
07/01/2019 -A.Y- 27
Communication Applet - Servlet
Exemple d’application:
Développement d’une applet pour l’authentification.
Développement d’un servlet qui communique avec l’applet et
vérifie d’authentification du client.
07/01/2019 -A.Y- 28
Communication Applet - Servlet
Cet exemple est constitué de trois éléments: une page html, une applet et
une servlet.
- La page html contient l’applet dont l’interface graphique se compose de:
- 2 zones de texte pour saisir le nom de l’utilisateur et sont mot de passe.
- 2 boutons, un pour invoquer la servlet et l’autre pour la réinitialisation des
éléments de la fenêtre.
- La servlet définie 4 méthodes:
- init qui instancie la connexion à la base de données. Ainsi la servlet utilise
une seule connexion, initialisée une seule fois pour toute au moment de
chargement de la servlet.
- doGet qui exécute la requête récupérée et qui renvoie le résultat issu de la
base de données dans un flux de sortie.
- doPost qui redirige la requête vers la méthode doGet
- destroy qui finie et libère la connexion lors du déchargement de la servlet
en mémoire.
07/01/2019 -A.Y- 29
07/01/2019 -A.Y- 30