Académique Documents
Professionnel Documents
Culture Documents
Inconvnient Servlet :
interface graphique utilisateur limite HTML.
3
LAPI Servlet (1/2)
Une servlet doit implmenter linterface
javax.servlet.Servlet
1. soit directement,
2. soit en drivant dune classe implmentant cette interface
comme :
javax.servlet.GenericServlet
(particulirement dsigne pour des
javax.servlet.http.HttpServlet
requtes et rponses HTTP)
Cette interface possde les mthodes pour :
initialiser la servlet : init()
recevoir et rpondre aux requtes des clients : service()
dtruire la servlet et ses ressources : destroy()
4
LAPI Servlet (2/2)
javax.servlet.Servlet
Servlet interface
Gnralisation
javax.servlet.GenericServlet
Spcification
javax.servlet.HttpServlet
5
Modle de programmation
Les servlets suivent un modle de
programmation requte-service-rponse :
Requte : objet javax.servlet.ServletRequest
contient les informations ncessaires pour une
communication du client vers le serveur
Service : mthode service() invoque
Rponse : objet javax.servlet.ServletResponse
contient les informations ncessaires pour une
communication du serveur vers le client
6
Structure de base dune servlet
import javax.servlet.*;
public class First implements Servlet {
public void init(ServletConf config)
throws ServletException {}
8
Le cycle de vie dune servlet
Une servlet possde le cycle de vie suivant :
1. la servlet est cre puis initialise (init())
cette mthode nest appele par le serveur quune seule fois lors
du chargement
2. traitements des requtes (service())
cette mthode est appele automatiquement par le serveur
chaque requte de client
3. la servlet est dtruite (destroy())
cette mthode nest appele par le serveur quune seule fois la
fin, elle permet de librer des ressources
9
Les servlets de type : HttpServlet
Pour faciliter le traitement particulier des
serveurs Web, la classe Servlet est raffine en
javax.servlet.http.HttpServlet
2 mthodes remplacent avantageusement la mthode
service() de la classe mre :
doGet() : pour traiter des requtes Http de type GET
doPost() : pour traiter des requtes Http de type POST
la servlet doit obligatoirement contenir lune ou lautre
de ces 2 mthodes
service() de HttpServlet appelle automatiquement la
bonne mthode en fonction du type de requtes
10
Cycle de vie dune Servlet HTTP
Instanciation et chargement
Initialisation
invocation de
Le conteneur
Linstance Web
de la Servlet la mthode
excute
reste
La en
Le classe linstance
mmoire
conteneurJava Web
de de
jusqu
la init()
la Servlet
larrt
initialise
cre
Servlet du
uneest
la dans
serveur.
instance
Servletun
dployeLa
de
en
Classe de Servlet lamthode
contexte
au classe destory()
seinutilisant
de
de Servletest
multitche.
conteneur et Requtes clients
ainsiChaque
invoque indiquant
charge Weben thread
la ventuellement mmoire.
le
que la
invoque Servlet nest
la mthode plus En service
fichier web.xml.
en service et linstance
service() qui soccupe invocation de
Linitialisation se
de la Servlet est fait la mthode
Destruction dexcuter la mthode
une seul fois.
supprime par le service()
invocation de doGet() oucollector
doPost().
la mthode garbage .
destory()
Arrt du serveur
puis finalize()
11
Ecrire une servlet Http (1/2)
La servlet doit driver de la classe
javax.servlet.http.HttpServlet
Les mthodes suivantes sont dfinies:
init(), destroy() et getServletInfo()
12
Ecrire une servlet Http (2/2)
Utiliser les objets HttpServletRequest et
HttpServletResponse passs en
paramtres des mthodes doGet() ou
doPost() pour implmenter le service
HttpServletRequest contient les renseignements sur le
formulaire HTML initial (utile pour doPost())
HttpServletResponse contient le flux de sortie
pour la gnration de la page HTML rsultat
ce flux de sortie est obtenu par les mthodes :
getWriter() : recommand pour retourner du texte
getOutputStream() : recommand pour des donnes
binaires
13
Squelette dune servlet Http (GET)
import javax.servlet.*;
import javax.servlet.http.*;
public class SimpleServlet extends HttpServlet
{
public void init (HttpServletConfig c)
throws ServletException {}
public void doGet (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {}
public void destroy() {}
public String getServletInfo() {}
}
14
Exemple simple (GET)
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
// 1. spcifier le contenu de la rponse
res.setContentType("text/html");
// 2. rcuprer le conteneur de la rponse
PrintWriter out = res.getWriter();
// 3. remplir le conteneur par la rponse
out.println("<HEAD><TITLE>SimpleServlet");
out.println("</TITLE></HEAD><BODY>");
out.println("<h1>Une servlet simple</h1>");
out.println("<P>Cest la sortie de la
servlet</P>");
out.println("</BODY>");
out.close();
// 4. finalement, envoyer le contenu au client
15
Collecte des donnes utilisateurs
Une Requte contient :
l 'URL de la ressource accder (page,script,prog)
les donnes de formatage (le cas chant)
des infos d'entte complmentaires
Requte GET :
pour extraire des informations sur le serveur
intgre les paramtres l 'URL
http://host/servlet/hello?key1= value1&...
Requte POST :
pour modifier les donnes sur le serveur
donnes de la page assembles/envoyes vers le serveur
16
Les donnes des formulaires
Rcupres par la mthode getParameter()de la
classe HttpServletRequest
Le nom du paramtre est pass comme argument
Les donnes envoyes par la mthode GET sont traites
de la mme manire que celles envoyes par POST
La valeur retourne est de type String, elle correspond
la premire occurrence du paramtre (un paramtre
peut avoir plusieurs valeurs)
Si le paramtre na pas une valeur la chane vide est
retourne
Si le champ ne fait pas partie du formulaire, alors null est
retourn par cette mthode.
17
Exemple : lire trois paramtres
Voir les fichiers suivants :
1. LectureParam1.html
2. LectureParam2.html
3. LectureParam2p.html
4. LectureParam1.java
5. LectureParam2.java
18
Les donnes des formulaires
Si le paramtre a plusieurs valeurs il faut utiliser la
mthode getParameterValues() au lieu de
getParameter()
Cette mthode retourne un tableau de type
String
19
Les donnes des formulaires
Pour la vrification du code, il est utile de rcuprer
la liste des noms des paramtres avec la mthode
getParameterNames() qui retourne une valeur de
type Enumeration (hasMoreElements(), nextElement())
20
Traitement des enttes de requtes
Exemple dune requte HTTP 1.1
21
Lecture des enttes de requtes
Paramtres dentte
String getHeader(String)
getHeader("Accept-Encoding") | getHeader("Referer")
Enumeration getHeaders(String)
Enumeration getHeaderNames()
Cookie[] getCookies()
String getRemoteAddr()
String getRemoteHost()
int getContentLength()
String getContentType()
Information lie ( la requte)
getMethod(), getRequestURI(), getProtocol()
22
Interfaces ServletRequest et
HttpServletRequest (1/5)
Mthodes de Rcupration dinformations sur lURL de la
requte
public String getScheme( ) :
Retourne le nom du protocole utilis par le client pour mettre sa
requte. Par exemple : http, https, ftp, etc.
23
Interfaces ServletRequest et
HttpServletRequest (2/5)
Mthodes de rcupration dinformations sur lURL de la
requte (suite)
24
Interfaces ServletRequest et
HttpServletRequest (3/5)
Mthodes de rcupration dinformations sur le client
25
Interfaces ServletRequest et
HttpServletRequest (4/5)
Mthodes de rcupration dinformations sur le serveur
26
Interfaces ServletRequest et
HttpServletRequest (5/5)
Mthodes de rcupration dinformations dans len-tte
HTTP
public String getHeader(String nom ) :
Retourne la valeur de lentte nomm, pass en paramtre ou la
valeur null si lentte nexiste pas. Le nom de lentte est sensible
la casse. Par exemple : getHeader("Accept-Language") retourne
fr.
public java.util.Enumeration getHeaders(String nom ) :
Retourne sous la forme dun objet de type java.util.Enumeration
lensemble des valeurs de len-tte de la requte spcifi en
paramtre.
public java.util.Enumeration getHeaderNames() :
Retourne sous la forme dun objet de type java.util.Enumeration
lensemble des noms des en-ttes contenus dans la requte.
27
Afficher toutes les enttes (1/2)
out.println("<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n"
+
"<B>Request Method: </B>" +
request.getMethod() + "<BR>\n" +
"<B>Request URI: </B>" +
request.getRequestURI() + "<BR>\n" +
"<B>Request Protocol: </B>" +
request.getProtocol() + "<BR><BR>\n" +
"<B>Adresse IP Client: </B>" +
request.getRemoteAddr()
+ "<BR>\n" +
"<B>Nom Client: </B>" +
request.getRemoteHost()
+ "<BR>\n" +
28
Afficher toutes les enttes (2/2)
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TH>Header Name<TH>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName =
(String)headerNames.nextElement();
out.println("<TR><TD>" + headerName);
out.println(" <TD>" + request.getHeader(headerName));
}
out.println("</TABLE>\n</BODY></HTML>");
}
}
29
Rsultat affiche par Internet Explorer
30
Interfaces ServletResponse et
HttpServletResponse (1/7)
Mthodes de dclaration du type du contenu et de la taille de
la rponse
31
Interfaces ServletResponse et
HttpServletResponse (2/7)
Mthodes de renseignement des informations dans len-tte
HTTP
32
Interfaces ServletResponse et
HttpServletResponse (3/7)
Mthodes denvoi derreurs et dtats HTTP
33
Interfaces ServletResponse et
HttpServletResponse (4/7)
Mthodes de redirection dURL
public void sendRedirect(String url) throws
java.io.IOException
Envoyer au navigateur du client un ordre de redirection
sur une autre ressources Web, qui peut tre de la
mme application Web ou nom.
LURL de la ressources Web passe en paramtre peut
tre relative ou absolue.
Exemple dURL relative :
res.sendRedirect("/MaWebApp/indentification.html"
)
Exemple dURL absolue :
res.sendRedirect("http://www.tunisie.com" );
34
Interfaces ServletResponse et
HttpServletResponse (5/7)
Mthodes pull client
Le pull client est similaire la redirection, avec une
diffrence principale : le navigateur affiche le contenu de la
premire page et attends un certain temps avant de
retrouver et afficher le contenu de la page suivante.
Utilits :
Le contenu de la premire page peut expliquer au
client que la page demande a t dplace avant que
la page suivante ne soit automatiquement charge.
Les pages peuvent tre retrouves en squence,
rendant ainsi possible une animation de mouvements
de ges lent.
35
Interfaces ServletResponse et
HttpServletResponse (6/7)
Mthodes pull client (suite)
Linformation de pull client est envoye au client via len-
tte HTTP Refresh.
La valeur de cet en-tte indique le nombre de secondes
pendant lesquelles la page doit tre affiche avant daller
chercher la prochaine et elle peut aussi inclure lURL
indiquant o aller la chercher.
res.setHeader("Refresh", "3" );
Indique au client de recharger la mme Servlet aprs avoir affich
son contenu courant pendant trois secondes
res.setHeader("Refresh", "3;URL=http://www.tunsie.com");
Indique au client dafficher la page daccueil Tunisie aprs trois
secondes.
36
Interfaces ServletResponse et
HttpServletResponse (7/7)
Exemple de manipulation : Mise jour de lheure courante
ClientPull.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
out.println(new Date().toString());
}
}
37
Collaboration entre Servlets : LInterface
RequestDispatcher (1/2)
Agrgation de rsultats fournis par des Servlets :
meilleure modularit,
meilleure rutilisation.
servlet4
servlet1
servlet5
Servlet servlet2
servlet3
38
Collaboration entre Servlets : LInterface
RequestDispatcher (1/2)
Obtention dun RequestDispatcher :
dans la mthode de traitement de requte de Servlet
..
RequestDispatcher rd;
rd =
getServeletContext().getRequestDispatcher("/servlet/MaServlet");
if(rd==null) res.sendError(404);
.
rd.forward(req, res);
39
40
Synchronisation des traitements :
LInterface SingleThreadModel (1/5)
Par dfaut une Servlet fonctionne dans un environnement
multitche.
Cest--dire qu chaque requte reue pour une Servlet,
le conteneur Web cre un thread qui va excuter la
mthode de service dune instance de la Servlet.
41
Synchronisation des traitements :
LInterface SingleThreadModel (2/5)
Exemple dapplication posant un problme :
Deux client dsirent senregistrer sur votre site par lintermdiaire dun
formulaire HTML. Ils envoient leurs donnes en mme temps
destination dune Servlet dont le rle est de crer un enregistrement
dans la table clients dune base de donnes.
La Servlet doit donc procder en deux tapes :
Rcuprer la plus grande valeur de cl primaire actuellement
prsente dans la Table.
Crer un nouvel enregistrement dans la table avec les donnes du
client, en donnant la cl primaire la valeur maximale rcupre
prcdemment, plus un.
42
Synchronisation des traitements :
LInterface SingleThreadModel (3/5)
43
Synchronisation des traitements :
LInterface SingleThreadModel (4/5)
Solution du problme :
Avec limplmentation de linterface
javax.servlet.SingleThreadModel, un conteneur Web prend en
charge le fait quune instance de Servlet ne peut tre excute par
un seul thread la fois.
import javax.servlet.*;
.
public class MaServlet extends HttpServlet implements SingleThreadModel
{}
Lutilisation de linterface javax.servlet.SingleThreadModel implique
que le conteneur Web invoque la mthode de service dans un bloc
synchronis.
Bien souvent, seules quelques instructions sont rellement
critiques.
Au lieu de synchroniser toute la mthode service, il est possible
damliorer les performances en synchronisant uniquement les
quelques instructions sensibles en utilisant tout simplement un
ou plusieurs blocs synchroniss.
44
Synchronisation des traitements :
LInterface SingleThreadModel (5/5)
Exemple de syntaxe dun bloc synchronis dans une Servlet
Object obj = new Object();
Synchronized(obj) {
.
}
}
}
45
Initialisation de servlet
@WebServlet(
urlPatterns = "/imageUpload",
initParams =
{
@WebInitParam(name = "saveDir", value = "D:/FileUpload"),
@WebInitParam(name = "allowedTypes", value = "jpg,jpeg,gif,png")
}
)
46