Vous êtes sur la page 1sur 46

Partie 2 : Modle de

Programmation des Servlets


Ahmed JEMAL
Email :
jmlhmd@gmail.com
Prsentation (1/2)
Servlet : Server-side applet
Une servlet est un composant qui tend les
fonctionnalits d'un serveur web de manire portable et
efficace.
Un serveur web hberge des classes Java servlets qui sont
excutes l'intrieur du container web. Le serveur
web associe une ou plusieurs URLs chaque servlet.
La servlet est invoque lorsque des requtes HTTP
utilisateur sont soumises au serveur.
Quand la servlet reoit une requte du client, elle gnre
une rponse, ventuellement en utilisant la logique mtier
contenue dans des EJBs ou en interrogeant directement
une base de donnes. Elle retourne alors une rponse
HTML ou XML au demandeur.
2
Prsentation (2/2)
Avantages Servlet:
inhrent Java :
JSDK ou JDK1.2 gratuit et portable
par rapport aux Applets :
plus facile dvelopper,
meilleures performances,
client lger ,

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

GenericServlet classe abstraite

javax.servlet.HttpServlet

HttpServlet classe abstraite

MapremiereServlet classe dfinie par l utilisateur

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 {}

public void service(ServletRequest


req,
ServletResponse rep)
throws ServletException,
IOException {}

public void destroy() {}


}
7
Le cycle de vie dune servlet

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()

Il faut redfinir une de ces mthodes :


doPost() ou doGet() (ou doPut() ou doDelete()
doHead() ou doOptions() ou doTrace() )
suivant le type de requtes Http du client
que la servlet doit traiter : POST, GET, PUT
ou DELETE

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())

Chaque nom peut tre transform en String et


utilis par la suite dans getParameterValues().

20
Traitement des enttes de requtes
Exemple dune requte HTTP 1.1

GET /search?keywords=servlets+jsp HTTP/1.1


Accept: image/gif, image/jpg, */*
Accept-Encoding: gzip
Connection: Keep-Alive
Cookie: userID=id456578
Host: www.somebookstore.com
Referer: http://www.somebookstore.com/findbooks.html
User-Agent: Mozilla/3.5 [fr] (WinXP; U)

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.

public String getContextPath( ) :


Retourne sous la forme dune chane de caractres commenant
par un /, la portion de lURL de la requte correspondant au nom du
contexte de lapplication Web. Par exemple : /MonAppWeb

public String getMethod():


Retourne le nom de la mthode HTTP(GET, POST, etc) utilise par
le client pour mettre sa requte.

23
Interfaces ServletRequest et
HttpServletRequest (2/5)
Mthodes de rcupration dinformations sur lURL de la
requte (suite)

public String getRequestURL( ) :


Retourne lURL que le client a utilise pour mettre sa requte.
LURL retourne contient le nom du protocole, le nom du serveur, le
numro de port et le chemin dinvocation de la ressource web, mais
pas les paramtres de la chane de requte. Par exemple :
http://localhost:8080/MonAppWeb/servlet/Hello

public String getServletPath( ) :


Retourne la partie de lURL qui invoque la Servlet/JSP, compose
du chemin et du nom ou de lalias de la Servlet/JSP. Par exemple:
/servlet/Hello

24
Interfaces ServletRequest et
HttpServletRequest (3/5)
Mthodes de rcupration dinformations sur le client

public String getRemoteAddr( ) :


Retourne ladresse IP du client qui a mis la requte. Par exemple
: 127.0.0.1

public String getRemoteHost( ) :


Retourne le nom complet du client qui a mis la requte. Par
exemple : 127.0.0.1

public String getRemoteUser( ) :


Retourne le nom de lutilisateur qui a envoy la requte si celui
sest authentifi au pralable, sinon retourne la valeur null.

25
Interfaces ServletRequest et
HttpServletRequest (4/5)
Mthodes de rcupration dinformations sur le serveur

public String getServerName( ) :


Retourne le nom dhte du serveur qui a reu la
requte. Par exemple : localhost

public String getServerPort( ) :


Retourne le numro de port dcoute du serveur qui a
reu la requte. Par exemple : 8080

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

public void setContentType(String type ) :


Spcifier le type MIME de contenu du corps de la rponse
HTTP. Par exemple text/html pour du HTML, text/plain pour
du texte brut, application/pdf pour un document Adobe pdf

public void setContentLength(int taille) :


Spcifier la taille du contenu de la rponse HTTP. Autrement
dit dfinir len-tte HTTP Content-Length.

31
Interfaces ServletResponse et
HttpServletResponse (2/7)
Mthodes de renseignement des informations dans len-tte
HTTP

public void setHeader(String nom, String Valeur) :


Initialiser un en-tte dans la rponse HTTP, avec le nom et la
valeur spcifis en paramtres. Si len-tte existe dj, la
nouvelle valeur remplace lancienne

public void addHeader(String nom, String Valeur) :


Ajouter un en-tte dans la rponse HTTP, avec le nom et la
valeur spcifis en paramtres. Cette mthode permet un
en-tte davoir plusieurs valeurs.

public boolean containsHeader(String nom) :


Retourne un boolen indiquant si un entte existe ou non.

32
Interfaces ServletResponse et
HttpServletResponse (3/7)
Mthodes denvoi derreurs et dtats HTTP

public void sendError(int sc) throws java.io.IOException


public void sendError(int sc,String message) throws
java.io.IOException
Envoyer un code derreur HTTP au client. Par exemple
SC-NOT-FOUND(404) ou SC-SERVICE-
UNAVAILABLE(503).

public void sendStatus(int sc) :


Appliquer un code dtat la rponse HTTP quand il
ny a pas derreur, comme par exemple SC-OK(200) ou
SC-CONTINUE(100).

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.*;

public class ClientPull extends HttpServlet{

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,


IOException {
res.setContentType("Text/plain");
PrintWriter out = res.getWriter();

res.setHeader ("Refresh", "60");

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);
.

Redirection dune requte


Dans la mthode de traitement de requte, demande
une autre Servlet de rpondre au client

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.

Si la mthode de service travaille avec des variables


dinstance de la Servlet; chaque thread peut modifier la
valeur de ces variables indpendamment de la logique de
traitement des autres threads.

Obligation de garantir dans un certain cas un fonctionnement


isol de chaque thread.

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)

Que se passe-t-il si deux instances de la Servlet effectuent la


premire tape du traitement en mme temps ?
Une seule des deux instances pourra excuter la deuxime tape. Lautre
instance obtient une erreur de la base de donnes, car elle tente de crer un
doublon de cl primaire. Un seul des deux clients est donc enregistr sur
votre site.

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();

public void doXXXX(HttpServletRequest req, HttpServletResponse


res) throws ServletException, IOException {

Synchronized(obj) {
.
}

}
}

45
Initialisation de servlet
@WebServlet(
urlPatterns = "/imageUpload",
initParams =
{
@WebInitParam(name = "saveDir", value = "D:/FileUpload"),
@WebInitParam(name = "allowedTypes", value = "jpg,jpeg,gif,png")
}
)

public class ImageUploadServlet extends HttpServlet {


private String saveDir, fileTypes ;
public void init ServletConfig paramServletConfig) throws ServletException{
saveDir = getInitParameter("saveDir");
fileTypes = getInitParameter("allowedTypes");
}
.
}

46