chap2

Page 1

Pé Présentation i (1/2)

Chapitre 2 : Modèle de Programmation des Servlets

Servlet : Server-side applet Une servlet est un composant qui étend les fonctionnalités d'un serveur web de manière portable et efficace. Un serveur web héberge des classes Java servlets qui sont exécutées à l'intérieur du container web. Le serveur web associe i une ou plusieurs l i URL URLs à chaque h servlet. l t La servlet est invoquée lorsque des requêtes HTTP utilisateur sont soumises au serveur. Quand la servlet reçoit une requête du client, elle génère une réponse, éventuellement en utilisant la logique métier contenue dans des EJBs ou en interrogeant directement une base de données. Elle retourne alors une réponse HTML ou XML au demandeur.

Soumaya y Marzouk & Riadh Ben Halima École Nationale d’Ingénieurs d Ingénieurs de Sfax

2

Pé Présentation i (2/2)

L’API S Servlet l (1/2)

A Avantages t S l t Servlet:

javax.servlet.Servlet 1 soit 1. it di directement, t t 2. soit en dérivant d’une classe implémentant cette interface comme :

– inhérent à Java : • JSDK ou JDK1 JDK1.2 2 gratuit t it ett portable t bl

– par rapport aux Applets : • plus facile à développer développer, • meilleures performances, • client léger g ,

Une servlet doit implémenter l’interface

javax.servlet.GenericServlet

javax.servlet.http.HttpServlet (particulièrement

désignée pour

d requêtes des êt ett réponses é HTTP)

Inconvénient Servlet :

Cette interface possède les méthodes pour :

– interface graphique utilisateur limitée à HTML.

3

initialiser la servlet : init() recevoir et répondre aux requêtes des clients : service() détruire la servlet et ses ressources : destroy() 4


Modèle de programmation

L’API S Servlet l t (2/2)

L Les servlets l t suivent i t un modèle dèl d de programmation requête-service-réponse :

javax.servlet.Servlet

Servlet

GenericServlet javax.servlet.HttpServlet

Htt S HttpServlet l t

– Requête : objet javax.servlet.ServletRequest

Gén néralisattion

Spéc cificatio on

javax.servlet.GenericServlet

interface

MapremiereServlet

• contient les informations nécessaires ppour une communication du client vers le serveur

classe abstraite

– Service : méthode service() invoquée

classe l abstraite b i

– Réponse : objet javax.servlet.ServletResponse classe définie par l ’utilisateur

• contient i les l informations i f i nécessaires é i pour une communication du serveur vers le client

5

6

Le cycle de vie dd’une une servlet

Structure de base d’une servlet i import t j javax.servlet.*; l t * 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

8


L servlets Les l de d type : HttpServlet

Le cycle l de d vie i d’une d’ servlet l Une servlet possède è le cycle de vie suivant :

1. la servlet est crée puis initialisée (init())

Pour faciliter le traitement particulier des serveurs Web, la classe Servlet est raffinée en javax servlet http HttpServlet javax.servlet.http.HttpServlet

• cette méthode n’est appelée par le serveur qu’une seule fois lors du chargement

– 2 méthodes remplacent avantageusement la méthode service() de la classe mère :

2. traitements des requêtes (service())

• doGet() : pour traiter des requêtes Http de type GET • doPost() () : ppour traiter des requêtes q Httpp de type yp POST

• cette méthode est appelée pp automatiquement q ppar le serveur à chaque requête de client

– la servlet doit obligatoirement contenir l’une ou l’autre de ces 2 méthodes – service() de HttpServlet appelle automatiquement la bonne méthode en fonction du type yp de requêtes q

3. la servlet est détruite (destroy y()) • cette méthode n’est appelée par le serveur qu’une seule fois à la fin,, elle permet p de libérer des ressources 9

Cycle de vie dd’une une Servlet HTTP

10

Ecrire une servlet Http (1/2)

Instanciation et chargement

La servlet doit dériver de la classe javax.servlet.http.HttpServlet

Initialisation l invocation de la méthode init()

Classe de Servlet

Destruction invocation de la méthode destory() puis finalize()

Le conteneur Web L’instance de la Servlet exécute l’instance de reste en mémoire jjusqu’à qla La Le classe conteneur Java Web de l’arrêt du serveur. La la Servlet dans un initialise crée Servlet une est la instance Servlet déployée de en méthode destory() contexte multitâche. la au classe seinutilisant de de conteneur Servletest et Requêtes clients ainsiChaque invoquée indiquant thread la éventuellement charge Web en mémoire mémoire. le que la Servlet n’est plus En service invoque la méthode fichier web.xml. en service et l’instance invocation de service() qui s’occupe L’initialisation de la Servlet se estfait la méthode d’exécuter d exécuter méthode une seul fois. service() () supprimée éla fois par lle doGet() oucollector doPost(). garbage . A ê d Arrêt du serveur 11

L méthodes Les é h d suivantes i sont définies: défi i – init(), destroy()

et getServletInfo() Il faut redéfinir une de ces méthodes : – doPost() ou doGet() (ou doPut() ou doDelete() doHead() () ou doOptions() p () ou doTrace() () ) • suivant le type de requêtes Http du client que la servlet doit traiter : POST, POST GET, GET PUT ou DELETE

12


E i une servlet Ecrire l Http H (2/2)

Squelette d’une servlet Http (GET)

Utili Utiliser lles objets bj t HttpServletRequest ett HttpServletResponse passés en paramètres des méthodes doGet() ou doPost() () p pour implémenter p le service – HttpServletRequest contient les renseignements sur le formulaire HTML initial (utile pour doPost()) – HttpServletResponse contient le flux de sortie

pour la g p génération de la p page g HTML résultat • ce flux de sortie est obtenu par les méthodes : – getWriter() : recommandé pour retourner du texte – getOutputStream() : recommandé pour des données binaires

13

Exemple simple (GET)

import javax.servlet.*; javax servlet *; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init ( p (HttpServletConfig p g c) ) throws ServletException {…} public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void destroy() {…} public bli St String i getServletInfo() tS l tI f () { {…} } 14 }

C ll t des Collecte d données d é utilisateurs tili t

public bli void id doGet(HttpServletRequest d G t(Htt S l tR t req, HttpServletResponse res) throws ServletException, IOException { // 1. spécifier le contenu de la réponse res.setContentType("text/html"); p le conteneur de la réponse p // 2. récupérer PrintWriter out = res.getWriter(); // 3. remplir le conteneur par la réponse out println("<HEAD><TITLE>SimpleServlet"); out.println( <HEAD><TITLE>SimpleServlet ); out.println("</TITLE></HEAD><BODY>"); out.println("<h1>Une servlet simple</h1>"); out.println("<P>C’est t i tl (" P C’ t l la sortie ti de d la l servlet</P>"); l t /P ") out.println("</BODY>"); out.close(); // 4. finalement, envoyer le contenu au client

Une Requête contient : ) l 'URL de la ressource à accéder (page,script,prog) ) les données de formatage (le cas échéant) ) des infos d'en-tête complémentaires

Requête GET : ) pour extraire des informations sur le serveur ) intègre les paramètres à l 'URL URL http://host/servlet/hello?key1= value1&...

Requête POST : ) pour modifier les données sur le serveur ) données de la page assemblées/envoyées vers le serveur

15

16


L données Les d é des d fformulaires l i

Exemple : lire trois paramètres

Récupérées par la méthode getParameter()de la classe HttpServletRequest

Le nom du p paramètre est p passé comme argument g

Les données envoyées par la méthode GET sont traitées de la même manière q que celles envoyées y p par POST

Voir les fichiers suivants : 1. LectureParam1.html 2 LectureParam2.html 2. LectureParam2 html

La valeur retournée est de type String, elle correspond à la première occurrence du paramètre (un paramètre peut avoir plusieurs valeurs)

3. LectureParam2p.html

Si le paramètre n’a pas une valeur la chaîne vide est retournée

5 LectureParam2.java 5. LectureParam2 java

Si le champ ne fait pas partie du formulaire, alors null est retourné t é par cette tt méthode. éth d

4. LectureParam1.java

17

L données Les d é des d fformulaires l i

Les données d des d formulaires f l i

Si le paramètre a plusieurs valeurs il faut utiliser la méthode getParameterValues() au lieu de getParameter() Cette méthode retourne un tableau de type String

18

Pour la vérification du code, il est utile de récupérer la liste s e des noms o s des pa paramètres a è es a avec ec la a méthode é ode getParameterNames() qui retourne une valeur de type Enumeration Chaque nom peut être transformé en String et utilisé par la suite dans getParameterValues(). getParameterValues() Voir les fichiers : 1.LectureParam4.html 2.LectureParam4.java LectureParam4 java

Voir les fichiers : 1. LectureParam3.html 2 LectureParam3p.html 2. LectureParam3p html 3. LectureParam3.java 19

20


Traitement des entêtes de requêtes

Lecture des entêtes de requêtes

Exemple d’une requête HTTP 1.1 GET

/search?keywords=servlets+jsp

Général – getHeader()

(getHeaders() (version 2.2))

– getHeader( getHeader("Accept Accept-Encoding Encoding" ) – getHeaderNames()

HTTP/1.1

Accept: image/gif, image/jpg, */*

Accept-Encoding: gzip

Spécialisé – – – –

Connection: Keep-Alive Cookie: userID=id456578 Host: www.somebookstore.com Referer: http://www.somebookstore.com/findbooks.html

getHeader( getHeader("Referer" Referer )

getCookies() getRemoteAddr() et getRemoteHost() getContentLength() getContentType()

Information liée – getMethod(), getRequestURI(), getProtocol()

User-Agent: Mozilla/3.5 [en] (WinXP; U) 21

Interfaces ServletRequest q et HttpServletRequest (1/5)

22

Interfaces ServletRequest et HttpServletRequest (2/5)

Méthodes de Récupération d’informations sur l’URL de la requête – public bli String St i getScheme( tS h ():

• Retourne le nom du protocole utilisé par le client pour émettre sa requête. Par exemple : http, https, ftp, etc.

– public String getContextPath( ) : • Retourne sous la forme d’une chaîne de caractères commençant ç par un /, la portion de l’URL de la requête correspondant au nom du contexte de l’application Web. Par exemple : /MonAppWeb

Méthodes de récupération d’informations sur l’URL de la requête (suite) – public String getRequestURL( ) : • Retourne l’URL que le client a utilisée pour émettre sa requête. L’URL retournée contient le nom du protocole, le nom du serveur, le numéro de port et le chemin d’invocation de la ressource web, mais pas les paramètres de la chaîne de requête. Par exemple : http://localhost:8080/MonAppWeb/servlet/Hello

– public bli String St i getServletPath( tS l tP th( ) :

– public String getMethod(): • Retourne le nom de la méthode HTTP(GET, POST, etc) utilisée par l client le li t pour é émettre tt sa requête. êt 23

• Retourne la partie de l’URL qui invoque la Servlet/JSP, composée du chemin et du nom ou de l’alias de la Servlet/JSP. Par exemple: /servlet/Hello 24


Interfaces ServletRequest et HttpServletRequest (3/5)

Interfaces ServletRequest et HttpServletRequest (4/5)

Méthodes de récupération d’informations sur le client

– public String getRemoteAddr( ) :

Méthodes de récupération d’informations sur le serveur – public String getServerName( ) : qui a reçu ç la • Retourne le nom d’hôte du serveur q requête. Par exemple : localhost

• Retourne l’adresse IP du client qui a émis la requête. Par exemple : 127.0.0.1

– public String getRemoteHost( ) : • R Retourne t le l nom complet l t du d client li t quii a é émis i lla requête. êt Par P exemple : 127.0.0.1

– public String getServerPort( ) : d’écoute écoute du serveur qui • Retourne le numéro de port d a reçu la requête. Par exemple : 8080

– public String getRemoteUser( ) : • Retourne le nom de l’utilisateur qui a envoyé la requête si celui s’est s est authentifié au préalable, préalable sinon retourne la valeur null. null 25

Interfaces ServletRequest et HttpServletRequest (5/5)

Affi h ttoutes Afficher t lles entêtes têt

Méthodes de récupération d’informations dans l’en-tête HTTP – public String getHeader(String nom ) : • Retourne la valeur de l’entête nommé, passé en paramètre ou la pas. Le nom de l’entête est sensible à valeur null si l’entête n’existe p la casse. Par exemple : getHeader("Accept-Language") retourne fr.

– public bli java.util.Enumeration j til E ti getHeaders(String tH d (St i nom ) : • Retourne sous la forme d’un objet de type java.util.Enumeration l’ensemble des valeurs de l’en-tête de la requête spécifié en paramètre.

– public java.util.Enumeration getHeaderNames() : • Retourne sous la forme d’un objet de type java.util.Enumeration l’ensemble des noms des en-têtes contenus dans la requête.

26

27

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" <BR><BR>\n + "<B>Adresse IP Client: </B>" + request.getRemoteAddr() + "<BR>\n" + "<B>Nom Client: </B>" + request.getRemoteHost() + "<BR>\n" + 28


Résultat affiche ppar Internet Explorer p

Affi h ttoutes Afficher t les l entêtes têt (suite) ( it ) "<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>"); t i tl ("</TABLE>\ </BODY></HTML>") } } 29

Interfaces ServletResponse et HttpServletResponse (2/7)

Interfaces ServletResponse et HttpServletResponse (1/7)

30

Méthodes de déclaration du type du contenu et de la taille de la réponse

Méthodes de renseignement des informations dans l’en-tête HTTP – public void setHeader(String nom, String Valeur) :

– public void setContentType(String type ) : • Spécifier le type MIME de contenu du corps de la réponse HTTP. Par exemple text/html pour du HTML, text/plain pour du d ttexte t brut, b t application/pdf li ti / df pour un document d t Adobe pdf …

• Initialiser un en en-tête tête dans la réponse HTTP HTTP, avec le nom et la valeur spécifiés en paramètres. Si l’en-tête existe déjà, la nouvelle valeur remplace l’ancienne

– public void addHeader(String nom, String Valeur) : • Ajouter un en-tête dans la réponse HTTP, avec le nom et la valeur l spécifiés é ifié en paramètres. èt Cette C tt méthode éth d permett à un en-tête d’avoir plusieurs valeurs.

– public void setContentLength(int taille) : • Spécifier la taille du contenu de la réponse HTTP. Autrement dit définir l’en-tête HTTP Content-Length.

– public boolean containsHeader(String nom) : 31

• Retourne un booléen indiquant si un entête existe ou non.32


Interfaces ServletResponse p et HttpServletResponse (3/7)

Interfaces ServletResponse et HttpServletResponse (4/7)

Méthodes d’envoi d’erreurs et d’états HTTP Méthodes de redirection d’URL – 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 même application Web ou nom. • L’URL de la ressources Web passée en paramètre peut être relative ou absolue. • Exemple d’URL d URL relative : – res.sendRedirect("/MaWebApp/indentification.html" ) d URL absolue : • Exemple d’URL – res.sendRedirect("http://www.tunisie.com" ); 34

– public bli void id sendError(int dE (i t sc)) th throws jjava.io.IOException i IOE ti – public void sendError(int sc,String message) throws java io IOException java.io.IOException • Envoyer un code d’erreur HTTP au client. Par exemple SC-NOT-FOUND(404) ou SC-SERVICEUNAVAILABLE(503). – public void sendStatus(int sc) : • Appliquer un code d’état à la réponse HTTP quand il n’y a pas d’erreur, comme par exemple SC-OK(200) 33 ou SC-CONTINUE(100).

Interfaces ServletResponse et HttpServletResponse (5/7)

Méthodes pull client – Le pull client est similaire à la redirection, avec une diffé différence principale i i l : lle navigateur i t affiche ffi h lle contenu t d de la première page et attends un certain temps avant de retrouver e ou e e et a afficher c e le e co contenu e u de la a page su suivante. a e – Utilités : • Le contenu conten de la première page pe peutt e expliquer pliq er a au client que la page demandée a été déplacée avant que la p q page g suivante ne soit automatiquement q chargée. • Les pages peuvent être retrouvées en séquence, rendant ainsi possible une animation de mouvements 35 de âges lent.

Interfaces ServletResponse p et HttpServletResponse (6/7)

Méthodes pull client (suite) – L’information de pull client est envoyée au client via l’entête HTTP Refresh. – La valeur de cet en-tête indique le nombre de secondes pendant lesquelles la page doit être affichée avant d’aller d aller chercher la prochaine et elle peut aussi inclure l’URL indiquant q où aller la chercher. – res.SetHeader("Refresh", "3" ); • Indique au client de recharger la même Servlet après avoir affiché son contenu courant pendant trois secondes

– res.SetHeader("Refresh", "3;URL=http://www.tunsie.com"); ; p ); • Indique au client d’afficher la page d’accueil Tunisie après trois 36 secondes.


Collaboration entre Servlets : L’Interface RequestDispatcher (1/2)

Interfaces ServletResponse et HttpServletResponse (7/7) Exemple de manipulation : Mise à jour de l’heure courante

ClientPull.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*;

Agrégation de résultats fournis par des Servlets : – meilleure modularité modularité, – meilleure réutilisation. servlet4 l t4 servlet1

public class ClientPull extends HttpServlet{

servlet5

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("Text/plain"); PrintWriter out = res.getWriter();

Servlet

servlet2

res.setHeader ("Refresh", "60"); out.println(new Date().toString());

servlet3

} }

37

Collaboration entre Servlets : L’Interface RequestDispatcher (2/2)

38

Synchronisation des traitements : L’Interface SingleThreadModel (1/5)

Obtention d’un RequestDispatcher : – dans la méthode de traitement de requête q de Servlet

……………..

RequestDispatcher rd; rd =

Par défaut une Servlet fonctionne dans un environnement multitâche. – C’est-à-dire qu’à chaque requête reçue pour une Servlet, le conteneur Web crée un thread qui va exécuter la méthode de service d’une instance de la Servlet Servlet.

getServeletContext().getRequestDispatcher("/servlet/MaServlet"); if(rd==null) res.sendError(404);

– Si la méthode de service travaille avec des variables d’instance de la Servlet; chaque thread peut modifier la valeur de ces variables indépendamment de la logique de traitement des autres threads.

………….

– Redirection d’une requête • Dans la méthode de traitement de requête, demande à une autre Servlet de répondre au client rd.forward(req, res);

39

Obligation Obli ti de d garantir ti dans d un certain t i cas un fonctionnement f ti t 40 isolé de chaque thread.


Synchronisation des traitements : L’Interface SingleThreadModel (2/5)

Synchronisation des traitements : L’Interface SingleThreadModel (3/5)

Exemple d’application posant un problème :

– Que se passe-t-il si deux instances de la Servlet effectuent ff la première étape du traitement en même temps ?

– Deux client désirent s’enregistrer sur votre site par l’intermédiaire d’un formulaire HTML. Ils envoient leurs données en même temps à g destination d’une Servlet dont le rôle est de créer un enregistrement dans la table clients d’une base de données. – La Servlet doit donc procéder en deux étapes : • Récupérer la plus grande valeur de clé primaire actuellement présente dans la Table. • Créer un nouvel enregistrement dans la table avec les données du client en donnant à la clé primaire la valeur maximale récupérée client, précédemment, plus un.

• Une seule des deux instances pourra exécuter la deuxième étape. L’autre instance obtient une erreur de la base de données, car elle tente de créer un doublon de clé primaire. Un g sur votre site. seul des deux clients est donc enregistré

41

42

Synchronisation des traitements : L’Interface SingleThreadModel (4/5)

Synchronisation des traitements : L’Interface SingleThreadModel (5/5)

Solution du problème : – Avec l’implémentation de l’interface javax.servlet.SingleThreadModel, un conteneur Web prend en charge h lle ffait it qu’une ’ iinstance t d de S Servlet l t ne peutt êt être exécutée é té par un seul thread à la fois. import javax.servlet.*; …………….

public class MaServlet extends HttpServlet implements SingleThreadModel

{…………}

– L’utilisation de l’interface javax.servlet.SingleThreadModel implique que le conteneur Web invoque la méthode de service dans un bloc synchronisé. – Bien souvent, seules quelques instructions sont réellement critiques. • Au lieu de synchroniser toute la méthode service, il est possible d’améliorer d améliorer les performances en synchronisant uniquement les quelques instructions sensibles en utilisant tout simplement un43ou plusieurs blocs synchronisés.

Exemple de syntaxe d’un bloc synchronisé dans une Servlet ………

Object obj = new Object(); public void doXXXX(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ……… Synchronized(obj) { …………. } } } 44


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.