1 / 112

S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Sadok.benyahia@fst.rnu.tn

Connexion Web et Bases de Données : Les SERVLETS. S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Sadok.benyahia@fst.rnu.tn. Présentation. Servlet : Serv er- side app let Une servlet est un composant qui étend les fonctionnalités d'un serveur web de manière portable et efficace.

preston
Télécharger la présentation

S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Sadok.benyahia@fst.rnu.tn

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Connexion Web et Bases de Données :Les SERVLETS S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Sadok.benyahia@fst.rnu.tn

  2. Présentation 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 une ou plusieurs URLs à chaque servlet. • 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.

  3. Servlet : Avantages coté serveur • Fournissent un moyen d'améliorer les serveurs web sur n'importe quelle plateforme, d'autant plus que les servlets sont indépendantes du serveur web • S'exécutent dans un moteur de servlet (ou conteneur de servlet) utilisé pour établir le lien entre la servlet et le serveur web.  On ne se soucie pas de détails techniques tels que la connexion au réseau, la mise en forme de la réponse à la norme HTTP, ...,

  4. Servlet : Avantages coté serveur • Beaucoup plus performantes que les scripts, car il s'agit de pseudo-code, chargé automatiquement lors du démarrage du serveur ou bien lors de la connexion du premier client. • Elles sont donc actives (résidentes en mémoire) et prêtes à traiter les demandes des clients grâce à des threads, tandis qu'avec les langages de script traditionnels un nouveau processus est créé pour chaque requête HTTP.  Une charge moins importante au niveau du processeur du serveur (d'autant plus qu'un système de cache peut permettre de stocker les calculs déjà accomplis), ainsi que de prendre une place moins importante en mémoire.

  5. Servlet : Avantages coté serveur • La réutilisabilité des servlets: permettre de créer des composants encapsulant des services similaires, afin de pouvoir les réutiliser dans des applications futures. • Une servlet, peut utiliser toutes les API Java afin de communiquer avec des applications extérieures, se connecter à des bases de données, accéder aux entrée-sorties (fichiers par exemple), ...

  6. Présentation • Avantage Servlet: • inhérents à Java : • JSDK ou JDK1.2 gratuit et portable • par rapport aux Applets : • plus facile à développer, • meilleures performances, • client  léger , • Inconvénient Servlet : • interface graphique utilisateur limitée à HTML.

  7. L’API Servlet (1/2) • Une servlet doit implémenter l’interface javax.servlet.Servlet • soit directement, • soit en dérivant d’une classe implémentant cette interface comme : • javax.servlet.GenericServlet • javax.servlet.http.HttpServlet (particulièrement désignée pour des requêtes et réponses HTTP) • cette interface possède les méthodes pour : • initialiser la servlet : init() • recevoir et répondre aux requêtes des clients : service() • détruire la servlet et ses ressources : destroy()

  8. Généralisation Spécification L’API Servlet (2/2) javax.servlet.Servlet Servlet interface javax.servlet.GenericServlet GenericServlet classe abstraite javax.servlet.HttpServlet HttpServlet classe abstraite classe définie par l ’utilisateur MapremiereServlet

  9. Modèle de programmation • Les servlets suivent un modèle de programmation requête-service-réponse : • Requête : objet javax.servlet.ServletRequest • contient les informations nécessaires pour une communication du client vers le serveur • Service : méthode service() invoquée • Réponse : objet javax.servlet.ServletResponse • contient les informations nécessaires pour une communication du serveur vers le client

  10. Servlet : Mise en oeuvre Lorsqu'une servlet est appelée par un client, la méthode service() est exécutée. Celle-ci est le principal point d'entrée de toute servlet et accepte deux objets en paramètres: void service ( ServletRequest req , ServletResponse res ); l'objet ServletRequest encapsulant la requête du client, (contient l'ensemble des paramètres passés à la servlet (informations sur l'environnement du client, cookies du client, URL demandée, ...) l'objet ServletResponse permettant de renvoyer une réponse au client (envoyer des informations au navigateur). Il est ainsi possible de créer des en-têtes HTTP (headers), d'envoyer des cookies au navigateur du client, ...

  11. Servlet : Développement • Afin de développer un servlet fonctionnant avec le protocole HTTP, il suffit de créer une classe étendant HttpServlet (qui implémente elle-même l'interface Servlet). • La classe HttpServlet (dérivant de GenericServlet) permet de fournir une implémentation de l'interface Servlet spécifique à HTTP. La classe HttpServlet surcharge la méthode service en lisant la méthode HTTP utilisée par le client, puis en redirigeant la requête vers une méthode appropriée. • Si la méthode utilisée est GET, il suffit de redéfinir la méthodepublic voiddoGet( HttpServletRequestreq, HttpServletResponseres); • Si la méthode utilisée est POST, il suffit de redéfinir la méthodepublic voiddoPost ( HttpServletRequestreq, HttpServletResponseres);

  12. Servlet : exemple import javax.servlet.*; import javax.servlet.http.*;  public class ServletDeBase extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException { // lecture de la requête // traitements // envoi de la réponse }  }

  13. Méthode Description String getMethod() Récupèrela méthode HTTP utilisée par le client String getHeader(String Key) Récupère la valeur de l'attribut Key de l'en-tête StringgetRemoteHost() Récupère le nom de domaine du client String getRemoteAddr() Récupère l‘adresse IP du client String getParameter(String Key) Récupère la valeur du paramètre Key (clé) d'un formulaire. Lorsque plusieurs valeurs sont présentes, la première est retournée String getParameterValues(String Key) Récupère les valeurs correspondant au paramètre Key (clé) d'un formulaire, c'est-à-dire dans le cas d'une sélection multiple (cases à cocher, listes à choix multiples) les valeurs de toutes les entités sélectionnées Enumeration getParameterNames() Retourne un objet Enumeration contenant la liste des noms des paramètres passés à la requête String getServerName() Récupère le nom du serveur String getServerPort() Récupère le numéro de port du serveur Servlet : L’objet HttpServletRequest : la méthode DoXXX

  14. Méthode Description String setStatus (intStatusCode) Définit le code de retour de la réponse void setHeader(StringNom, String Valeur) Définitunepaireclé/valeurdans les entêtes void setContentType(String type) Définit le type MIME de la réponse HTTP, c'est-à-dire le type de donnéesenvoyées au navigateur void setContentLength (int len) Définit la taille de la réponse PrintWriter getWriter() Retourne un objet PrintWriterpermettantd'envoyer du texte au navigateur client. Il se charge de convertir au format approprié les caractères Unicode utilisés par Java ServletOutputStream getOutputStream() Définit un flot de données à envoyer au client, par l'intermédiaire d'un objet ServletOutputStream, dérivé de la classe java.io.OutpuStream void sendredirect(String location) Permet de rediriger le client vers l'URL location Servlet : L’objet HttpServletResponse • la réponse à fournir à l'utilisateur est représentée sous forme d'objet HttpServletResponse.

  15. Exemple de servlet import javax. servlet.*; import javax. servlet. http.*; import java. io.*; public class HelloServlet extends HttpServlet { public void service( ServletRequest request, ServletResponse response ) throws ServletException, IOException { response. setContentType( "text/ html" ); PrintWriter out = response. getWriter(); imposé • L’interface d’un objet ASP imposé par l'API servlet ce qui suit est en HTML récupère un flux pour générer le résultat out. println( "< html>< body>" ); out. println( "< h1> Hello depuis une servlet</ h1>" ); out. println( "</ body></ html>" ); } } génération du code HTML  Compilation : HelloServlet. class installé dans l'arborescence de Tomcat  Chargement via une URL de type http://.../ servlet/ HelloServlet

  16. Exemple de servlet (code complet) import javax.servlet.*; import javax.servlet.http.*; import java.io.* public class PremiereServlet extends HttpServlet { public void init() { }  public void doGet (HttpServletRequestreq, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter();  out.println("<HTML>"); out.println("<HEAD><TITLE> Titre </TITLE></HEAD>"); out.println("<BODY>"); out.println("Ma première servlet"); out.println("</BODY>"); out.println("</HTML>"); out.close(); } } • L’interface d’un objet ASP

  17. Exemple de servlet (code complet): Explication du code La classe HttpServlet a été étendue : public class PremiereServlet extends HttpServlet {} Lorsque la servlet est instanciée, il peut être intéressant d'effectuer des opérations qui seront utiles tout au long du cycle de vie de la servlet (se connecter à une base de données, ouvrir un fichier, ...). Pour ce faire, il s'agit de surcharger la méthode init() de la servlet. public void init() {} • L’interface d’un objet ASP

  18. Exemple de servlet (code complet): Explication du code A chaque requête, la méthode service() est invoquée. Celle-ci détermine le type de requête dont il s'agit, puis transmet la requête et la réponse à la méthode adéquate (doGet() ou doPost()), on ne s'intéresse qu'à la méthode GET  la méthode doGet() a été surchargée : public void doGet(HttpServletRequestreq, HttpServletResponse res) throws ServletException, IOException {} • L’interface d’un objet ASP

  19. Exemple de servlet (code complet): Explication du code Par contre l'objet HttpServletResponse permet de renvoyer une page à l'utilisateur: 1-définir le type de données qui vont être envoyées au client : la méthode setContentType() de l'objet HttpServletResponse 2- créer un objet PrintWriter grâce à la méthode getWriter() :  envoyer du texte formatté au navigateur PrintWriter out = res.getWriter(); 3- utiliser la méthode println() de l'objet PrintWriter afin d'envoyer les données textuelles au navigateur, 4- fermer l'objet PrintWriter lorsqu'il n'est plus utile avec sa méthode close() • L’interface d’un objet ASP

  20. Déploiement de servlets

  21. Web.xml <web-app> <servlet> <servlet-name>……..</servlet-name> <servlet-class>……..</servlet-class> <init-param> < param-name> …….. </param-name> < param-value> …….. </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>…….</servlet-name> <url-pattern>…..…..</url-pattern> </servlet-mapping> </web-app> Déclaration d’une Servlet au sein d’une application Web (1/5) La déclaration d’une Servlet dans une application Web se fait dans le descripteur de déploiement «web.xml».

  22. Déclaration d’une Servlet au sein d’une application Web (2/5) • <web-app> ……. </web-app>: • encapsule l’ensemble des éléments servant à la configuration de l’application Web. • <servlet> ……… </servlet>: • encapsule l’ensemble des éléments servant à la configuration de chaque Servlet. • <servlet-name> ………… </servlet-name>: • contient une chaîne de caractère identifiant la Servlet au sein de l’application web.

  23. Déclaration d’une Servlet au sein d’une application Web (3/5) • <servlet-class> ………… </servlet-class>: • contient le nom complet de la classe de Servlet (package compris). • <init-param> …. </init-param> : • Encapsule les paramètres d’initialisation de la Servlet. • Chaque élément <init-param> ….. </init-param> correspond à un paramètre représenté par une paire nom/valeur avec les éléments : • <param-name> ….. </param-name>, • <param-value> ….. </param-value>.

  24. Déclaration d’une Servlet au sein d’une application Web (4/5) • <servlet-mapping> ………… </servlet-mapping>: • contient des informations permettant de définir la relation entre les URL et les servlets. • <url-pattern>…….</url-pattern> • définit comment une Servlet est invoquée.

  25. web.xml <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/servlet/Hello</url-pattern> </servlet-mapping> </web-app> Déclaration d’une Servlet au sein d’une application Web (5/5) Déclaration de la Servlet « Hello » dans le descripteur de déploiement «web.xml»

  26. Invocation d’une Servlet à partir d’un navigateur Web (1/7) • Invoquer une Servlet c’est utiliser tout d’abord un conteneur Web (e.g., : Apache TOMCAT 5.0) pour sa mise en œuvre. • Déployer la Servlet au sein d’une application Web. • Crée un nouveau dossier nommée MaWebApp dans le dossier webapps de TOMCAT. • Le dossier MaWebAppdoit contenir un sous dossier nommé Web-INF, qui lui-même contient le descripteur de déploiement web.xml un sous-dossier nommé classes, qui contient le fichier compilé Hello.class de la Servlet. • Deux possibilités d’invocation d’une Servlet : • invocation de la méthode doGet(…), • invocation de la méthode doPost(..).

  27. Hello http://localhost:8080/MaWebApp/servlet/Hello Hello Invocation d’une Servlet à partir d’un navigateur Web (2/7) • 1ère Invocation de la méthode doGet(…) : • Saisie de l’URL de la Servlet dans la barre d’adresse du navigateur. • http://<hôte>:<port>/<webApp>/servlet/<servlet> • http://localhost:8080/MaWebApp/servlet/Hello

  28. Index.html <HTML> <HEAD> <TITLE> Test de la servlet Heloo par clic sur lien </TITLE> </HEAD> <BODY> <P> <A href="/MaWebApp/servlet/Hello"> Cliquer pour tester la Servlet Hello </A> </P> </BODY> </HTML> Cliquer pour tester la Servlet Hello Hello Invocation d’une Servlet à partir d’un navigateur Web (3/7) • 2ième Invocation de la méthode doGet(…): • Clique sur un lien hypertexte qui pointe sur l’URL de la Servlet.

  29. Invocation d’une Servlet à partir d’un navigateur Web (4/7) • Invocation de la méthode doPost(…) : • La méthode doPost() d’une Servlet est invoquée principalement lors de l’envoi des données saisies dans un formulaire HTML (par un clic sur un bouton de type submit). • Exemple de méthode doPost() qui retourne une chaîne de caractères concaténée avec les valeurs des paramètres transmis par le client.

  30. Index.html <HTML> <HEAD> <TITLE> Test de la servlet Hello </TITLE> </HEAD> <BODY> <FORM action = "/test/servlet/Hello" method ="post"> <P> Prenom : <INPUT type ="text" name="prenom"> <BR> Nom : <INPUT type ="text" name="nom"> <BR> <INPUT type ="submit" value="Valider"> </P> </FORM> </BODY> </HTML> Invocation d’une Servlet à partir d’un navigateur Web (5/7) • Invocation de la méthode doPost(…) :

  31. Invocation d’une Servlet à partir d’un navigateur Web (6/7) • Invocation de la méthode doPost(…) : Hello.java • import java.io.*; • import javax.servlet.*; • import javax.servlet.http.*; • public class Hello extendsHttpServlet{ • public voiddoPost(HttpServletRequestreq, HttpServletResponseres) • throwsServletException, IOException { • String prenom = req.getParameter("prenom"); • String nom = req.getParameter("nom"); • res.setContentType("text/html"); • PrintWriterout = res.getWriter(); • out.println("<HTML><BODY>"); • out.println("<H1>Bonjour" +prenom+""+ nom+"."+ "</H1>" ); • out.println("</HTML><BODY> "); • } • }

  32. Cycle de vie d’une servlet

  33. Structure de base d’une 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() {…} }

  34. Le cycle de vie d’une servlet

  35. Le cycle de vie d’une servlet • Une servlet a le cycle de vie suivant : • 1. la servlet est créée puis initialisée (init()) • cette méthode n’est appelée par le serveur qu’une seule foislors du chargement • 2. traitements des requêtes (service()) • cette méthode est appelée automatiquement par le serveur à chaque requête du client • 3. la servlet est détruite (destroy()) • cette méthode n’est appelée par le serveur qu’une seule fois à la fin, elle permet de libérer des ressources

  36. Les servlets de type : HttpServlet • Pour faciliter le traitement particulier des serveurs Web, la classe Servlet est affinée en javax.servlet.http.HttpServlet • 2 méthodes remplacent avantageusement la méthodeservice()de la classe mère : • doGet() : pour traiter des requêtes Http de type GET • doPost() : pour traiter des requêtes Http de type POST • 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 de la requête

  37. Cycle de vie d’une Servlet HTTP Instanciation et chargement Instanciation et chargement Initialisation invocation de la méthodeinit() Initialisation invocation de la méthode init() Le conteneur Web exécute l’instance de la Servlet dans un contexte multitâche. Chaque thread invoque la méthode service() qui s’occupe d’exécuter la méthode doGet() ou doPost(). L’instance de la Servlet reste en mémoire jusqu’à l’arrêt du serveur. La méthode destory() est ainsi invoquée indiquant que la Servlet n’est plus en service et l’instance de la Servlet est supprimée par le garbage collector. Le conteneur Web initialise la Servlet en utilisant éventuellement le fichier web.xml. L’initialisation se fait une seul fois. Le conteneur Web crée une instance de la classe de Servlet et la charge en mémoire. La classe Java de la Servlet est déployée au sein de conteneur Web Requêtes clients Classe de Servlet Classe de Servlet En service invocation de la méthode service() En serviceinvocation de la méthodeservice() Destruction invocation de la méthodedestory() puis finalize() Destruction invocation de la méthode destory() puis finalize() Arrêt du serveur

  38. Ecrire une servlet Http (1) • La servlet doit dériver de la classe javax.servlet.http.HttpServlet • Il faut redéfinir les méthodes : • init(), destroy() et getServletInfo() • doPost()oudoGet() (oudoPut()oudoDelete() doHead()oudoOptions()oudoTrace() ) • suivant le type de requêtes Http du client que la servlet doit traiter : POST, GET, PUT ou DELETE

  39. Ecrire une servlet Http (2) • Utiliser les objets HttpServletRequest et HttpServletResponse passés en paramètres des méthodes doGet() ou doPost() pour implémenter le service • HttpServletRequestcontient les renseignements sur le formulaire HTML initial (utile pour doPost()) • HttpServletResponse contient le flux de sortie pour la génération de la page 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

  40. Squelette d’une 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() {…} }

  41. Exemple simple (GET) public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // 1. spécifier le contenu de la réponse res.setContentType("text/html"); // 2. récupérer le conteneur de la réponse PrintWriter out = res.getWriter(); // 3. remplir le conteneur par la réponse out.println("<HEAD><TITLE>SimpleServlet"); out.println("</TITLE></HEAD><BODY>"); out.println("<h1>Une servlet simple</h1>"); out.println("<P>C’est la sortie de la servlet</P>"); out.println("</BODY>"); // finalement, envoyer le contenu au client out.close();

  42. Quelques trucs: mettre les servlets en paquet • Pour éviter les conflits de noms placer les fichiers .class dans un répertoire (exemple MesServlets) qui a le même nom que celui du package. • Insérer l’instruction d’appartenance au paquet au début du fichier .java de la servlet • package MesServlets; • Inclure le nom du paquet dans l ’URL • http://localhost/servlet/MesServlets.HelloWWW2

  43. Quelques trucs • Néanmoins : <DOCTYPE...> et <HEAD...> toujours pareils • Faire une classe utilitaire ! public class ServletUtilities { public static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">"; public static String headWithTitle(String title) { return(DOCTYPE + "\n" + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n"); } ... }

  44. HelloWWW avecServletUtilities import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(ServletUtilities.headWithTitle("Hello")+ "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>"); } }

  45. Les données des formulaires • Récupérées par la méthode getParameter()de la classe HttpServletRequest • Le nom du paramètre est passé comme argument • Les données envoyées pas la méthode GET sont traitées de la même manière que celles envoyées par POST • La valeur retournée est de type String, il correspond à la première occurrence du paramètre (un paramètre peut avoir plusieurs valeurs) • Si le paramètre n ’a pas une valeur la chaîne vide est retournée • Si le champ ne fait pas partie du formulaire, alors null est retourné par cette méthode.

  46. Les données des formulaires • Si le paramètre a plusieurs valeurs il faut utiliser la méthodegetParameterValues()au lieu degetParameter() • Cette méthode retourne un tableau de type String

  47. Les données des formulaires • Pour la vérification du code, il est utile de récupérer la liste des noms des paramètres avec la méthode getParameterNames() qui retourne une valeur de type Enumeration • Chaque nom peut être transformé en String et utilisé par la suite dans getParameter().

  48. Récupération des données d'un formulaire (Recap…) • public String getParameter(String Key) : permet de retourner le valeur d'un champ dont on a passé le nom (sensibles à la casse) en argument ( Si le champ n'existe pas, la valeur null est retournée). • public String[] getParameterValues(String Key) : à utiliser Lorsqu'un champ d'un formulaire peut avoir plusieurs valeurs (liste à choix multiples, cases à cocher,.. Retourne un tableau contenant l'ensemble des valeurs affectées à la clé spécifiée en paramètre. • EnumerationgetParameterNames() :Pour connaître l'ensemble des noms des champs du formulaire passé à la servlet. Retourne un objet Enumeration, contenant la liste des champs du formulaire. Il est possible de transformer chaque entrée en chaîne, puis de la traiter avec la méthode getParameter() afin de récupérer sa valeur.

  49. Récupération des données d'un formulaire : Exemple • L’interface d’un objet ASP Le Formulaire <FORM Method="POST" Action="http://serveur/servlet/UserInfo"> Nom : <INPUT type=text size=20 name=Nom><BR> Prénom : <INPUT type=text size=20 name=Prenom> <BR>Age : <INPUT type=text size=2 name=Age><BR> <INPUT type=submit value=Envoyer> </FORM>

  50. Récupération des données d'un formulaire : Exemple La Servelet de Traitement import java.io.*;import javax.servlet.*;import javax.servlet.http.*; public class UserInfo extends HttpServlet {  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>\n<BODY>\n" + "<H1>Recapitulatif des informations</H1>\n" + "<UL>\n" + " <LI>Nom: " + request.getParameter("Nom") + "\n" + " <LI>Prenom: " + request.getParameter("Prenom") + "\n" + " <LI>Age: " + request.getParameter("Age") + "\n" + "</UL>\n" + "</BODY></HTML>"); }} • L’interface d’un objet ASP

More Related