Introduction aux servlets et JSP
Transcription
Introduction aux servlets et JSP
Introduction aux servlets et JSP M. Belguidoum Université Mentouri de Constantine Département Informatique M. Belguidoum (UMC) Servlets et JSP 1 / 78 Plan 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 2 / 78 Introduction 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 3 / 78 Introduction Application web Une application web est une extension dynamique d'un serveur web ou applicatif. Il y a deux types d'applications web : les applications web orientées présentation qui génèrent des pages web (HTML, XML) dynamiquement les applications web orientées service : ce sont les web services http: //java.sun.com/javaee/5/docs/tutorial/doc/bnadr.html Les servlets sont une des techniques utilisées pour construire des applications web. M. Belguidoum (UMC) Servlets et JSP 4 / 78 Introduction Motivation et historique Nécessité d'avoir des pages HTML dynamiques i.e. pages créées lors de la requête (météo, cours de la bourse, vente aux enchères, etc.) Technologie des scripts CGI (Common Gateway Interface) : le serveur Web demande à lancer un programme par le protocole CGI principe : au lieu d'envoyer le contenu d'un chier (page HTML, image...), un serveur HTTP utilisant une interface CGI exécute un programme puis retourne le contenu généré, comme s'il s'agissait d'un contenu de chier. CGI est le standard industriel qui indique comment transmettre la requête du serveur HTTP au programme et comment récupérer la réponse générée. CGI permet de passer des paramètres au programme, de telle manière qu'il puisse en tenir compte pour générer les données. Exemple : une chaîne de caractères recherché auprès d'un moteur de recherche. Inconvénient : une nouvelle copie du programme doit être lancée à chaque requête, surcharge rapideles serveurs M. Belguidoum (UMC) Servlets et JSP 5 / 78 Introduction Servlet et JSP Les servlets constituent la réponse Java aux programmes CGI. Exécutées sur un serveur d'applications elles interceptent les requêtes des navigateurs web et génèrent des réponses (souvent en DHTML) construites dynamiquement à l'aide du langage Java. Les JSP sont l'extension des servlets et se rapprochent du modèle J2EE qui sépare : Les contenus statiques et dynamiques La présentation et la logique métier, notamment grâce aux JavaBeans. M. Belguidoum (UMC) Servlets et JSP 6 / 78 Servlet et JSP 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 7 / 78 Servlet et JSP JSP et Servlet servlet : du code Java produisant une page HTML programme autonome stocké dans un chier .class sur le serveur exemple : out.println("<H1>titre niveau 1</H1>"); JSP : page HTML contenant du code Java qui sera exécuté pour produire la page programme source Java embarqué dans une page .html .class autonome embarqué dans .html M. Belguidoum (UMC) côté client applet JavaScript Servlets et JSP côté serveur servlet JSP 8 / 78 Servlet et JSP Conteneur Un conteneur est un composant logiciel système qui contrôle d'autres composants, dits métier Tomcat est un exemple de conteneur Les servlets n'ont pas de méthode main(), ils sont contrôlés par le conteneur Tomcat Les requêtes ne sont pas adressées aux servlets mais au conteneur dans lequel ils sont déployés Tous les conteneurs de servlets doivent supporter le protocole HTTP et peuvent aussi supporter le protocole HTTPS. Un conteneur de JSP (JSP container) fournit les mêmes services qu'un conteneur de servlets. M. Belguidoum (UMC) Servlets et JSP 9 / 78 Servlet et JSP Pourquoi un conteneur ? Un conteneur fournit pour les Servlets Un support pour la communication : pas besoin de ServerSocket, Socket, Stream, ... La gestion du cycle de vie Un support pour le Multithreading : création automatique des Threads Un support pour la sécurité Un support pour les JSP M. Belguidoum (UMC) Servlets et JSP 10 / 78 Servlet et JSP Apache Tomcat Tomcat est un conteneur libre de servlets Java 2 Enterprise Edition, issu du projet Jakarta. Implémente les spécications des servlets et des JSP du Java Community Process. Il est paramétrable par des chiers XML et de propriétés, et inclut des outils pour la conguration et la gestion. Il comporte également un serveur HTTP. Tomcat est un serveur Web qui gère les servlets et les JSP. le compilateur Jasper compile les pages JSP pour en faire des servlets. Le moteur de servlet Tomcat est souvent employé en combinaison avec un serveur Web Apache ou d'autres serveurs Web. Tomcat a été écrit en langage Java, il s'exécuter via la machine virtuelle Java sur n'importe quel système d'exploitation la supportant. M. Belguidoum (UMC) Servlets et JSP 11 / 78 Servlet et JSP Organisation des repertoires de Tomcat M. Belguidoum (UMC) Servlets et JSP 12 / 78 Servlet et JSP Application web avec un conteneur M. Belguidoum (UMC) Servlets et JSP 13 / 78 Servlet et JSP Principe de fonctionnement JSP-Servlet M. Belguidoum (UMC) Servlets et JSP 14 / 78 Servlet et JSP Algorithme d'exécution de la JSP M. Belguidoum (UMC) Servlets et JSP 15 / 78 Servlet et JSP Quel code dans une JSP ? : entre <% et %> code Java inséré dans _jspservice() de la servlet : utilisation de out, request, response. scriptlet <\% \% > String [] langages = {" Java " , "C ++ " , " Smalltalk " , " Simula 67 " } out . println ( " <h3 > Principaux langages orientés objets : </h3 >" for ( int i =0; i < langages . length ; i ++) { out . println ( " <p >" + langages [i] + " </p >" ); } : entre <%= et %> : retourne une String qui est passée à out.println dans _jspService : <%= SALUT %> équivalent <% out.println(SALUT) ; %> expressions : entre <% ! et %> : déclaration de variables et de méthodes d'instances. déclarations M. Belguidoum (UMC) Servlets et JSP 16 / 78 Servlet et JSP Une page jsp est traitée par le serveur (tomcat par exemple) crée le code d'une classe java associée. Par exemple, pour une page jsp nommée helloworld.jsp, tomcat crée uneclasse helloworld$jsp.java. À chaque page jsp correspond donc une classe java. Le code html et une partie du code jsp sont utilisés par le serveur pour produire la méthode _jspService appelée à l'exécution de jsp pour créer la page résultat. M. Belguidoum (UMC) Servlets et JSP 17 / 78 Servlet et JSP Génération de servlet à partir de JSP M. Belguidoum (UMC) Servlets et JSP 18 / 78 Servlet et JSP Servlets L'API pour les servlets constituée de deux packages : javax.servlet javax.servlet.http JSDK (Java Servlet Development Kit) téléchargeable à http://java.sun.com/products/servlet M. Belguidoum (UMC) Servlets et JSP 19 / 78 Servlet et JSP Variable JSP prédénies Nom de la variable Classe exception java.lang.Throwable Description application javax.servlet.ServletContext config javax.servlet.ServletConfig out javax.servlet.jsp.JspWriter page java.lang.Object pageContext javax.servlet.jsp.PageContext request response session javax.servlet.ServletRequest javax.servlet.ServletResponse javax.servlet.http.HttpSession M. Belguidoum (UMC) Servlets et JSP l'application Web de la page JSP informations d'initialisation de la servlet JSP accessible seulement depuis les pages d'erreur le ot de sortie l'instance de la servlet JSP les composants web en rapport avec une requête la requête courante la réponse la session courante 20 / 78 Servlet et JSP Utilisation d'une servlet Une servlet doit implémenter l'interface javax.servlet.Servlet soit directement, soit en dérivant d'une classe qui implémente déjà cette interface (comme GenericServlet ou HttpServlet) L'interface javax.servlet.Servlet possède les méthodes pour : initialiser la servlet : init() recevoir et répondre aux requêtes des clients : service() Contient deux paramètres : protected void service ( HttpServletRequest req , HttpServletResponse resp ) throws ServletException , java . io . IOException Cette méthode écrite dans HttpServlet redirige la requête suivant son type http. Méthode HTTP GET => doGet(...) doPost(...) Méthode HTTP POST => détruire la servlet et ses ressources : destroy() M. Belguidoum (UMC) Servlets et JSP 21 / 78 Servlet et JSP doGet(...), doPost(...) Ont les mêmes paramètres que service(...) de HttpServlet : public void doXXX ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , java . io . IOException En général on spécialise l'une des deux méthodes et la seconde appelle la première. M. Belguidoum (UMC) Servlets et JSP 22 / 78 Servlet et JSP ServletsHTTP M. Belguidoum (UMC) Servlets et JSP 23 / 78 Servlet et JSP Requêtes et réponses HTTP M. Belguidoum (UMC) Servlets et JSP 24 / 78 Servlet et JSP Récupérer des paramètres de la requête La requête envoie ses données par http Souvent des champs d'un formulaire On récupère ces données à travers l'objet request en utilisant la méthode String getParameter(String nomComposantFormulaire) qui cherche la valeur d'un paramètre d'un formulaire Exemple : <% String MotDePasse= request.getParameter("MotDePasse">) la méthode : getParameterValues() est utilisée pour récupérer un paramètre avec une valeur multiple, elle renvoie un tableau de chaîne de caractères. Exemple : String[] sportsFavoris = request.getParameterValues("sport"); Les paramètres peuvent être indiqués directement dans l'URL de la requête (réécriture d'URL) : http://serveur/servlet?param1=valeur1¶m2=valeur2 M. Belguidoum (UMC) Servlets et JSP 25 / 78 Servlet et JSP Envoyer une réponse On positionne le type MIME par : void setContentType(String type) On récupère le canal de sortie texte par : PrintWriter getWriter() // le résultat est en HTML response . setContentType ( " text / html " ); // récupère un flux pour générer le résultat PrintWriter out = response . getWriter (); quelques types MIME courants text/html image/gif video/mpeg audio/mp3 application/pdf M. Belguidoum (UMC) Servlets et JSP 26 / 78 Servlet et JSP Correspondance JSP/Servlet JSP d'origine <h1 >Un nombre aléatoire </ h1 > <%= Math . random () %> Code du servlet résultant de la traduction public void _jspService ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException { response . setContentType (" text / html " ); HttpSession session = request . getSession (); JspWriter out = response . getWriter (); out . println ( " <h1 > Un nombre aléatoire </ h1 >" ); out . println ( Math . random ()); ... } M. Belguidoum (UMC) Servlets et JSP 27 / 78 Servlet et JSP Cycle de vie d'une servlet M. Belguidoum (UMC) Servlets et JSP 28 / 78 Servlet et JSP Exemple servlet import java . io .*; import javax . servlet .*; import javax . servlet . http .*; public class HelloServlet extends HttpServlet { public void doGet ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException { // 1. Spécifier le type MIME du contenu de la réponse response . setContentType (" text / html " ); // 2. Récupère le PrintWriter pour envoyer des données au client PrintWriter out = response . getWriter (); // 3. Envoyer l ' information au client out . println ( " <html >" ); out . println ( " <head >< title > Bonjour </ title > </ head >" ); out . println ( " <body >" ); out . println ( " <h1 > Bonjour à tous </h1 >" ); out . println ( " </ body > </ html >" ); } public void doPost ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException { doGet ( request , response );} } M. Belguidoum (UMC) Servlets et JSP 29 / 78 Servlet et JSP Notion de module Web (.war) Un servlet ne peut pas être déployé directement dans un conteneur, il doit faire partie d'un module Web Un module Web est un ensemble de librairies, de chiers de congurations, de code Java (bytecode des servlets), JavaServer Pages, servlets, classes Java, chiers XML, et des pages web statiques (HTML, Javascript, ...) le tout constituant une application web. Le module Web (chier WAR, pour Web Application ARchive, est utilisé pour déployer une application web sur un serveur d'application (Tomcat ou GlassFish) WEB-INF/ web.xml lib/ Classes/ M. Belguidoum (UMC) Servlets et JSP 30 / 78 Servlet et JSP Notion de module Web (.war) M. Belguidoum (UMC) Servlets et JSP 31 / 78 Servlet et JSP Notion de module Web (.war) web.xml Est un chier XML dénissant la structure et le paramétrage de l'application web qui a une syntaxe précise Par exemple : il contient le nom de la Classe (implémentant l'interface Servlet) à utiliser pour tel ou tel chemin d'une URL Web Si l'application est fondée uniquement sur des chiers JSP, alors web.xml peut être omis. Si l'application est fondée sur des servlets, alors web.xml indique quelles sont les URL associées à chaque servlet. Lib/ : contient tous les .jar dont notre programme a besoin Classes/ : contient toutes les .class que lon produit Le serveur d'applications va savoir, pour chaque application qu'il héberge, lire le web.xml et créer automatiquement un classpath spécique à l'application à partir des répertoires lib et classes M. Belguidoum (UMC) Servlets et JSP 32 / 78 Servlet et JSP Notion de module Web (.war) Problématique : comment diuser une application à base de servlets ? souvent plusieurs servlet (chiers .class) des ressources additionnelles (.gif, .jpeg, .html, .xml, ...) Solution chier .war qui représente une archive pour les applications web diusion d'un seul chier prêt à l'emploi chiers .war se manipulent (création, extraction, ...) avec la commande jar création : jar cvf app.war app ache le contenu : jar tf app.war extraction : jar xvf app.war M. Belguidoum (UMC) Servlets et JSP 33 / 78 Servlet et JSP Descripteur de déploiement web.xml Chaque archive .war doit être accompagnée d'un chier web.xml décrivant les servlets inclues dans l'archive 2 balises principales : <servlet> et <servlet-mapping> <web - app > < servlet > < servlet - name > HelloServlet </ servlet - name > < servlet - class > mypackage . MaPremiereServlet </ servlet - class > </ servlet > < servlet - mapping > < servlet - name > HelloServlet </ servlet - name > <url - pattern >/ version / beta / Hello </ url - pattern > </ servlet - mapping > </ web - app > M. Belguidoum (UMC) Servlets et JSP 34 / 78 Servlet et JSP Descripteur de déploiement web.xml une balise <servlet> par servlet un nom et une classe par servlet le chier .class de la servlet doit être stockés dans WEB-INF/classes éventuellement sous-répertoires correspondant aux packages : WEB-INF/classes/mypackage/HelloServlet.class une balise <servlet-mapping> par servlet un nom (doit correspondre à une balise <servlet> existante) une URL relative permettant d'accéder à la servlet plusieurs autres balises peuvent être utilisées voir http://java.sun.com/j2ee/dtds/web-app_2_2.dtd M. Belguidoum (UMC) Servlets et JSP 35 / 78 Servlet et JSP Installation d'une archive .war dans Tomcat dans le répertoire <tomcat_root>/webapps webapps |-> myapp.war |-> myapp |-> index.html |-> WEB-INF |-> web.xml |-> classes |-> mypackage |-> HelloServlet.class URL pour accéder à la servlet : http://machine.com:8080/myapp/version/beta/Hello dépend <url-pattern> fournit dans web.xml M. Belguidoum (UMC) Servlets et JSP 36 / 78 Servlet et JSP Descripteur de déploiement web.xml Paramètres d'initialisation possibilité d'inclure des paramètres d'initialisation de la servlet dans web.xml avantage : peuvent être changés sans avoir à recompiler < servlet > < servlet - name > HelloServlet </ servlet - name > < servlet - class > mypackage . HelloServlet </ servlet - class > <init - param > < param - name > nom </ param - name > < param - value > valeur </ param - value > </ init - param > </ servlet > Dans le code de la servlet (par ex. méthode init) String valeur = getInitParameter("nom"); M. Belguidoum (UMC) Servlets et JSP 37 / 78 Quelques fonctionnalités 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 38 / 78 Quelques fonctionnalités Session Session le web n'ore par défaut aucun suivi de session. Cette fonctionnalité est supportée par les servlets à l'aide de l'objet HttpSession obtenu à l'aide de request.getSession() Objectif : être capable de "suivre" l'activité du client sur plusieurs pages HttpSession session = request.getSession(true) : retourne la session courante pour cet utilisateur ou une nouvelle session HttpSession session = request.getSession(false) : retourne la session courante pour cet utilisateur ou null Les méthodes public void putValue(String name, Object value) et public Object getValue(String name) permettent respectivement d'attribuer (i.e. modier) et consulter une valeur de session identiée par son nom. M. Belguidoum (UMC) Servlets et JSP 39 / 78 Quelques fonctionnalités Session Session Méthodes d'un objet de type HttpSession void setAttribute(String name, Object value) : ajoute un couple (name, value) pour cette session Object getAttribute(String name) : retourne l'objet associé à la clé name ou null void removeAttribute(String name) : enlève le couple de clé name java.util.Enumeration getAttributeNames() : retourne tous les noms d'attributs associés à la session void setMaxIntervalTime(int seconds) : spécie la durée de vie maximum d'une session long getCreationTime() / long getLastAccessedTime() : retourne la date de création / de dernier accès de la session en ms depuis le 1/1/1970, 00h00 GMT new Date(long) M. Belguidoum (UMC) Servlets et JSP 40 / 78 Quelques fonctionnalités Session Session : exemple Suivi de session pour un compteur public class HttpSessionServlet extends HttpServlet { protected void doGet ( HttpServletRequest req , HttpServletResponse res ) throws ServletException , IOException { res . setContentType (" text / plain " ); PrintWriter out = res . getWriter (); HttpSession session = req . getSession (); Integer count = ( Integer ) session . getAttribute (" count " ); if ( count == null ) count = new Integer (1); else count = new Integer ( count . intValue () + 1); session . setAttribute (" count " , count ); out . println (" Vous avez visité cette page " + count + " fois ." ); } } M. Belguidoum (UMC) Servlets et JSP 41 / 78 Quelques fonctionnalités Cookies Les cookies Permettent à un serveur Web de stocker de l'information chez un client Un cookie est une information envoyée au navigateur (client) par un serveur WEB qui peut ensuite être relue par le client Lorsqu'un client reçoit un cookie, il le sauve et le renvoie ensuite au serveur chaque fois qu'il accède à une page sur ce serveur Le client a la possibilité d'interdire leur dépôt dans son navigateur La valeur d'un cookie pouvant identier de façon unique un client, ils sont souvent utilisés pour le suivi de session Les cookies ont été introduits par la première fois dans Netscape Navigator M. Belguidoum (UMC) Servlets et JSP 42 / 78 Quelques fonctionnalités Cookies Les cookies L'API Servlet fournit la classe javax.servlet.http.Cookie pour travailler avec les Cookies : Cookie(String name, String value) : construit un cookie String getName() : retourne le nom du cookie String getValue() : retourne la valeur du cookie setValue(String new_value) : donne une nouvelle valeur au cookie setMaxAge(int expiry) : spécie l'âge maximum du cookie Pour la création d'un nouveau cookie, il faut l'ajouter à la réponse (HttpServletResponse) addCookie(Cookie mon_cook) : ajoute à la réponse un cookie La Servlet récupère les cookies du client en exploitant la réponse (HttpServletRequest) Cookie[] getCookies() : récupère l'ensemble des cookies du site M. Belguidoum (UMC) Servlets et JSP 43 / 78 Quelques fonctionnalités Cookies Les cookies : exemples Code pour créer un cookie et l'ajouter au client Cookie cookie = new Cookie (" Id " , " 123 " ); res . addCookie ( cookie ); Code pour récupérer les cookies Cookie [] cookies = req . getCookies (); if ( cookies != null ) { for ( int i = 0; i < cookies . length ; i ++) { String name = cookies [ i ]. getName (); String value = cookies [i ]. getValue (); } } M. Belguidoum (UMC) Servlets et JSP 44 / 78 Quelques fonctionnalités Cookies Les cookies Le plus gros problème des cookies est que les navigateurs ne les acceptent pas toujours L'utilisateur peut congurer son navigateur pour qu'il refuse ou pas les cookies Les navigateurs n'acceptent que 20 cookies par site, 300 par utilisateur et la taille d'un cookie peut être limitée à 4096 octets M. Belguidoum (UMC) Servlets et JSP 45 / 78 Quelques fonctionnalités Upload Upload Par exemple dans le cas de récupération de chiers uploadés à partir d'un fomulaire Dénition des formulaires avec upload <HTML > < BODY > < FORM ACTION =" url servlet traitement du formulaire " METHOD = POST ENCTYPE = " multipart / form - data " > Sélectionner un fichier < INPUT TYPE = FILE NAME =" fichier " > < INPUT TYPE = SUBMIT VALUE =" Envoi " > < INPUT TYPE = RESET VALUE =" Remise à zéro " > <P > </ FORM > </ BODY > </ HTML > M. Belguidoum (UMC) Servlets et JSP 46 / 78 Quelques fonctionnalités Upload Upload M. Belguidoum (UMC) Servlets et JSP 47 / 78 Quelques fonctionnalités Upload Upload Récupération des chiers uploadés à partir d'un formulaire récupération du ux binaire, programmer le décodage / librairie existante Commons FileUpload : http://jakarta.apache.org/commons/fileupload/ le upload est traité dans la méthode service d'une servlet import org . apache . commons . fileupload . FileItem ; import org . apache . commons . fileupload . FileUploadBase ; FileUploadBase fub = new FileUploadBase (); List files = fub . parseRequest ( request ); for ( Iterator i = files . iterator () ; i. hasNext () ; ) { FileItem fi = ( FileItem ) i. next (); File monFichier = new File (" ... " ); fi . write ( monFichier ); } M. Belguidoum (UMC) Servlets et JSP 48 / 78 Quelques fonctionnalités Chaînage et collaboration des servlets Chaînage et collaboration des servlets Les Servlets s'exécutant dans le même serveur peuvent dialoguer entre elles Deux principaux styles de collaboration : Partage d'information : un état ou une ressource. Exemple : un magasin en ligne pourrait partager les informations sur le stock des produits ou une connexion à une base de données Partage du contrôle : une requête. Réception d'une requête par une Servlet et laisser l'autre Servlet une partie ou toute la responsabilité du traitement M. Belguidoum (UMC) Servlets et JSP 49 / 78 Quelques fonctionnalités Chaînage et collaboration des servlets Partage d'information La collaboration est obtenue par l'interface ServletContext L'utilisation de ServletContext permet aux applications web de disposer de son propre conteneur d'informations unique Une Servlet retrouve le ServletContext de son application web par un appel à getServletContext() Exemples de méthodes void setAttribute(String name, Object o) : lie un objet sous le nom indiqué Object getAttribute(String name) : retrouve l'objet sous le nom indiqué Enumeration getAttributeNames() : retourne l'ensemble des noms de tous les attributs liés void removeAttribute(String name) : supprime l'objet lié sous le nom indiqué M. Belguidoum (UMC) Servlets et JSP 50 / 78 Quelques fonctionnalités Chaînage et collaboration des servlets Exemple : partage d'information public class PizzasAdmin extends HttpServlet { protected void doGet ( HttpServletRequest req , HttpServletResponse res ) throws ServletException , IOException { res . setContentType (" text / plain " ); PrintWriter out = res . getWriter (); ServletContext context = this . getServletContext (); context . setAttribute (" Specialite " , "4 Fromage " ); context . setAttribute (" Date " , new Date ()); out . println (" La pizza du jour a été définie . " );}} public class PizzasClient extends HttpServlet { protected void doGet ( HttpServletRequest req , HttpServletResponse res ) throws ServletException , IOException { ... ServletContext context = this . getServletContext (); String pizza_spec = ( String ) context . getAttribute ( " Specialite " ); Date day = ( Date ) context . getAttribute ( " Date " ); DateFormat df = DateFormat . getDateInstance ( DateFormat . MEDIUM ); String today = df . format ( day ); out . println (" Aujourd ' hui (" + today + ") , notre specialite est : " + pizza_spec );}} M. Belguidoum (UMC) Servlets et JSP 51 / 78 Quelques fonctionnalités Chaînage et collaboration des servlets Partage du contrôle Les Servlets peuvent partager ou distribuer le contrôle de la requête Deux types de distribution Distribuer un renvoi : une Servlet peut renvoyer une requête entière Distribuer une inclusion : une Servlet peut inclure du contenu généré Les avantages sont : aggrégation des résultats fournis par plusieurs servlets : meilleure modularité et meilleure réutilisation La délégation de compétences Une meilleure abstraction et une plus grande souplesse Architecture logicielle MVC (Servlet = contrôle et JSP = présentation) M. Belguidoum (UMC) Servlets et JSP 52 / 78 Quelques fonctionnalités Chaînage et collaboration des servlets Partage de contrôle Utilisation d'un RequestDispatcher obtenu via un objet request RequestDispatcher rd = request.getRequestDispatcher(String path); path est un chemin relatif ou absolu ne pouvant pas sortir du contexte Inclusion du résultat d'une autre servlet : rd.include(request, response); Délégation du traitement à une autre servlet : rd.forward(request, response); sendRedirect() est utilisée pour les redirections externes eectuées par le client car aucune recherche getContext() n'est nécessaire Pour distribuer en dehors du contexte courant il faut : Identier le contexte extérieur (utilisation de getContext()) Utiliser la méthode getRequestDispatcher(String path) Le chemin est uniquement en absolu M. Belguidoum (UMC) Servlets et JSP 53 / 78 Quelques fonctionnalités Concurrence Gestion de la concurrence Par défaut les servlets sont exécutées de façon multi-threadée Si une servlet doit être exécutée en exclusion mutuelle (ex. : accès à des ressources partagées critiques) implantation de l'interface marqueur SingleThreadModel public class CompteurServlet extends HttpServlet implements SingleThreadModel { public void service ( ServletRequest request , ServletResponse response ) throws ServletException , IOException { /* * Du code en exclusion mutuelle avec lui - même */ } } Autre solution : dénir du code synchronized dans la servlet M. Belguidoum (UMC) Servlets et JSP 54 / 78 Quelques fonctionnalités sécurité Sécurité : authentication Conserver les informations sensibles dans les mains des utilisateurs Nous distinguons plusieurs types d'autorisation : BASIC : fournit par le protocole HTTP basé sur un modèle simple de demande/réponse (codage Base64) FORM : authentication ne reposant pas celle du protocole HTTP M. Belguidoum (UMC) Servlets et JSP 55 / 78 Quelques fonctionnalités sécurité Sécurité : authentication BASIC FORM M. Belguidoum (UMC) Servlets et JSP 56 / 78 Quelques fonctionnalités sécurité Sécurité : identication par les Servlets Gérée par le conteneur de Servlets (Ident 1) : Spécication d'un domaine de sécurité dans le chier de conguration web.xml Les utilisateurs sont gérés (l'utilisateur existe-il, le mot de passe est-il correct, etc.) uniquement par le conteneur de Servlets Basée sur les rôles (BASIC) ou à base de formulaire (FORM) Eectuée à l'intérieur des Servlets (Ident 2) : Les utilisateurs sont stockés dans une base de données, un chier, etc. La vérication est eectuée dans les Servlets (besoin d'un codage) Personnalisée (BASIC) ou personnalisée à base de formulaire (FORM) M. Belguidoum (UMC) Servlets et JSP 57 / 78 Quelques fonctionnalités sécurité Authentication basée sur les rôles : Ident 1 Exemple : Servlet qui après identication ache un ensemble d'informations M. Belguidoum (UMC) Servlets et JSP 58 / 78 Quelques fonctionnalités sécurité Authentication basée sur les rôles : Ident 1 Besoin de modication du chier de conguration web.xml de l'application WEB considérée M. Belguidoum (UMC) Servlets et JSP 59 / 78 Quelques fonctionnalités sécurité Authentication personnalisée à base de formulaire : Ident 2 Exemple : Servlet qui traite les autorisations de type FORM M. Belguidoum (UMC) Servlets et JSP 60 / 78 Quelques fonctionnalités Accès aux bases de données Exemple : connexion à une base de données public class DataBaseServlet extends HttpServlet { protected void doGet ( HttpServletRequest req , HttpServletResponse res ) throws ServletException , IOException { res . setContentType (" text / html " ); PrintWriter out = res . getWriter (); try { Class . forName (" com . mysql . jdbc . Driver " ); Connection ma_connexion = DriverManager . getConnection ( " jdbc : mysql :// localhost :1527/ PersonDB " ); Statement mon_statement = ma_connexion . createStatement (); ResultSet mon_resultat = mon_statement . executeQuery ( " SELECT NAME , FIRSTNAME , OLDYEAR FROM PERSON " ); while ( mon_resultat . next ()) { out . print (" Nom : " + mon_resultat . getString (1)); out . print (" Prénom : " + mon_resultat . getString (2)); out . println (" Age : " + mon_resultat . getInt (3)); out . println (" <br > " ); } } catch ( SQLException e) { ... } } M. Belguidoum (UMC) Servlets et JSP 61 / 78 JavaBeans 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 62 / 78 JavaBeans JSP et Java beans : motivation Les protocoles web classiques ne gèrent pas de session : pas de conservation sur le serveur des informations sur l'utilisateur, comme un mot de passe utilisé pour interroger une base de données, etc. L'architecture JSP/Servlets propose une solution simple et élégante les javabeans. avoir le moins de code Java possible dans une page JSP (HTML) Sous-traiter le code à un Java bean M. Belguidoum (UMC) Servlets et JSP 63 / 78 JavaBeans JSP et Java beans : motivation Un javabean est un objet java, identié par un nom (une chaîne de caractères), dont la durée de vie peut dépasser la simple requête http. Les beans sont utilisables à partir des jsp : <jsp:useBean> Pour qu'un objet java puisse être utilisé comme bean sa classe doit : implémenter java.io.Serializable ; disposer d'un constructeur par défaut (i.e. sans argument) ; avoir des accesseurs nommés setXX et getXX, où XX est le nom d'un champ. la classe doit être explicitement située dans un package. M. Belguidoum (UMC) Servlets et JSP 64 / 78 JavaBeans Exemple de bean : le bean Compteur package test ; public class Compteur implements java . io . Serializable private int valeur ; public Compteur ( int v) { valeur = v; } public Compteur () { valeur = 0; } public void incremente () { valeur ++; } public int getValeur () { return this . valeur ; } public void setValeur ( int argValeur ) { this . valeur = argValeur ; } } M. Belguidoum (UMC) Servlets et JSP { 65 / 78 JavaBeans Accès aux beans depuis les jsp Les balises spéciques au beans sont : <jsp:useBean ... /> : déclarer un bean avec un nom (id), une durée de vie (scope) et le nom de la classe utilisée pour implémenter le bean (class) de la forme nompackage.NomClasse la durée peut être xée à : page, request, session ou application. request : le bean est détruit lorsque le client demande une nouvelle page. Le passage des paramètres de suivi de session doit ainsi être réalisé manuellement. page : rarement employée, cette portée est limitée à la page en cours (aucune information de session ne peut être récupérée) : ce bean est accessible à n'importe quel endroit de la page. session : commence à la connexion, et se termine quand l'utilisateur arrête son navigateur, ou après un temps d'inactivité paramétrable (xable par la méthode setMaxInactiveInterval(int interval) de la classe HttpSession. Chaque utilisateur connecté aura sa propre version d'un bean session. application signie que le bean existe pour toute la durée de vie du serveur tomcat ; le bean est alors unique pour tous les utilisateurs. M. Belguidoum (UMC) Servlets et JSP 66 / 78 JavaBeans Accès aux beans depuis les jsp Les balises spéciques au beans sont : <jsp:getProperty ... /> permet de remplir les valeurs des champs du bean : name : nom du bean (id="...") property : nom de la propriété, qui doit être un des champs dénis par le bean. <jsp:setProperty ... /> permet de xer la valeur d'un champ du bean : name : nom du bean ; property : nom du champ ; value : valeur à donner au champ. M. Belguidoum (UMC) Servlets et JSP 67 / 78 JavaBeans Accès aux beans depuis les jsp <! doctype html PUBLIC ' -// W3C // DTD HTML 3.2// EN '> <html > <head > < title > test Beans 1 </ title > </ head > <body > <!-- déclaration du bean --> < jsp : useBean id =" cpt " scope =" application " class =" test . Compteur "/> <!-- utilisation du bean --> Le compteur vaut : < jsp : getProperty name = " cpt " property = " valeur "/> Quand on fixe la valeur , on utilise en plus l ' attribut <tt > param </ tt >. <% // Utilisation du bean par du code java : cpt . incremente (); %> </ body > </ html > M. Belguidoum (UMC) Servlets et JSP 68 / 78 JavaBeans accès aux beans depuis les servlets La création et la lecture des beans depuis des servlets dièrent selon la portée (scope) du bean : session et application. session : On doit procéder en deux temps. Il faut d'abord récupérer un objet de classe HttpSession HttpSession session= request.getSession(true); : On peut ensuite récupérer ou donner une valeur d'un bean en utilisant : les méthodes getAttribute et setAttribute application : la méthode getServletContext() de la classe GenericServlet (dont hérite toute servlet) renvoie un objet de classe ServletContext, qui représente l'application. Cet objet dispose lui aussi de méthodes setAttribute et getAttribute. M. Belguidoum (UMC) Servlets et JSP 69 / 78 JavaBeans Architecture JSP : modèle 1 M. Belguidoum (UMC) Servlets et JSP 70 / 78 JavaBeans Architecture JSP : modèle 2 M. Belguidoum (UMC) Servlets et JSP 71 / 78 JavaBeans Architecture MVC modèle etc.) = les données accédées par un code Java (JDBC, RMI, EJB, = JSP contrôleur = servlets vues M. Belguidoum (UMC) Servlets et JSP 72 / 78 JavaBeans Architecture MVC : principe de fonctionnement 1 2 3 4 5 Par le biais d'une page web, l'utilisateur émet une requête HTTP au serveur web en cliquant sur un lien ou sur un bouton. Cette requête est prise en charge par le contrôleur (servlet). Le contrôleur exécute les traitements nécessaires (appelle un EJB Stateless par exemple) et récupère le modèle, c'est-à-dire les entity beans. Le contrôleur sélectionne alors la JSP qui sera en charge de la construction de la réponse et lui transmet les entity beans contenant les données à acher. La JSP construit la réponse en faisant appel aux accesseurs des entity beans. La réponse HTTP est transmise au navigateur qui l'ache sous forme de page web. M. Belguidoum (UMC) Servlets et JSP 73 / 78 JavaBeans Architecture MVC Syntaxe dans la servlet pour lancer la JSP : public void doPost ( HttpServletRequest request , HttpServletResponse response ){ // héritée de GenericServlet ServletContext context = getServletContext (); RequestDispatcher dispatcher = context . getRequestDispatcher ( "/ maPageMiseEnForme . jsp " ); dispatcher . forward ( request , response ); } La JSP extrait les objets de request grâce à getAttribute() <% ArrayList theList = ( ArrayList ) request . getAttribute (" nomDelObjet " ); // maintenant , utiliser l ' ArrayList %> M. Belguidoum (UMC) Servlets et JSP 74 / 78 JavaBeans Architecture MVC La servlet peut passer des valeurs à la JSP appelé grâce à setAttribute() public void doPost ( HttpServletRequest request , HttpServletResponse response ) { ArrayList theList = // un objet à passer // ajoute à la requête request . setAttribute (" nomDelObjet " , theList ); ServletContext context = getServletContext (); RequestDispatcher dispatcher = context . getRequestDispatcher ( "/ jspAAppeler . jsp " ); dispatcher . forward ( request , response ); } M. Belguidoum (UMC) Servlets et JSP 75 / 78 Conclusion 1 Introduction 2 Servlet et JSP 3 Quelques fonctionnalités 4 JavaBeans 5 Conclusion M. Belguidoum (UMC) Servlets et JSP 76 / 78 Conclusion Conclusion les Servlets permettent de développer des applications Web en Java Plusieurs fonctionnalités traitement des données fournies par les utilisateurs gestion de session gestion de cookies Collabiration et partage d'information et de contrôle format d'archivage .war servlet : représente la partie contrôle de l'architecture MVC d'une application web intéraction avec JSP et java beans M. Belguidoum (UMC) Servlets et JSP 77 / 78 Conclusion Références JSP et servlets ecaces : production de sites dynamiques, cas pratiques, Jean Luc Deleage Documentation : http://java.sun.com/javaee/5/docs/api/index.html Tutorial à : http: //java.sun.com/javaee/5/docs/tutorial/doc/bnafd.html http://java.sun.com/products/servlet/index.html basé sur les cours de : Lionel Seinturier, Mickaël BARON, Gaël Thomas, etc. M. Belguidoum (UMC) Servlets et JSP 78 / 78