Les Servlets LPRO CMSII Olivier FLAUZAC [email protected] http://cosy.univ-reims.fr/flauzac lundi 21 novembre 11 Plan • Généralités • Architecture de base • API standard 2 lundi 21 novembre 11 Généralités 3 lundi 21 novembre 11 Exécutions WEB côté serveur • Intégration du code dans du HTML • approche Server Page • PHP, ASP, JSP (Java J2EE) • Approche «interface d’accès» • CGI (Common Gateway interface) • Servlet 4 lundi 21 novembre 11 Servlets • Classe java autonome • Exécutable sur un serveur étendu d’un moteur de servlet • Persistance des données • Gestion des informations et flux WEB • formulaires • cookies • sessions • ... 5 lundi 21 novembre 11 Principe général des Servlets • Fichier .class sur le serveur • Instanciation à la première utilisation • attention à la latence • Définit dans un contexte • Accès par un URL : • http://serveur/contexte/maServlet • Exécution dans un thread • Accès multiple simultanée 6 lundi 21 novembre 11 Motivation des servlets • Efficacité (code semi compilé) • Résidence • Multithreadé • Gestion du cache • Portabilité • Gestion de tous les aspects du WEB 7 lundi 21 novembre 11 Environnement Requête Serveur WEB Conteneur de Servlets Requête ServletRequest Client Servlet Réponse Réponse ServletResponse 8 lundi 21 novembre 11 Cycle de vie fin début chargement et instanciation init() servlet prête service() fin du thread de traitement 9 lundi 21 novembre 11 traitement de la requête destroy() fin de vie Architecture de base 10 lundi 21 novembre 11 Application WEB 11 lundi 21 novembre 11 Servlet élémentaire • Classe : javax.servlet.Servlet • Classe servlet générique • pas lié à un contenu • pas lié à un protocole • Classe mère pour les servlet WEB • Gestion du cycle de vie • Gestion des traitements • Objet requête • Objet réponse 12 lundi 21 novembre 11 API servlet • Initialisation • void init(ServletConfig config) • Gestion du traitement • void service(ServletRequest req, ServletResponse res) • Destruction • void destroy() • Accès à la configuration • ServletConfig getServletConfig() • Accès aux informations • String getServletinfo() 13 lundi 21 novembre 11 Servlet HTTP • Classe : javax.servlet.http.HttpServlet • Servlet adns le cadre HTTP • Hérite de javax.servlet.Servlet • Ajout de méthodes : • gestion des requêtes POST • gestion des requêtes GET 14 lundi 21 novembre 11 API • Gestion des requêtes GET • void doGet(HttpServletRequest req, HttpServletResponse resp) • Gestion des requêtes POST • void doGet(HttpServletRequest req, HttpServletResponse resp) • Informations liées à la requête • String getRemoteUser() • String getRemoteAddr() • String getRemoteHost() • int getRemotePort() 15 lundi 21 novembre 11 Architecture des fichiers 16 lundi 21 novembre 11 Architecture des fichiers •Adaptation en fonction de l’environnement : •d’exécution (serveur) •de développement •de déploiement 16 lundi 21 novembre 11 Configuration et contexte • Définition d’une application WEB • Définition de la liste des servlets • association nom / URL • mapping de d’accès 17 lundi 21 novembre 11 Exemple <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/ xml/ns/javaee/web-app_3_0.xsd"> </web-app> 18 lundi 21 novembre 11 Exemple <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/ xml/ns/javaee/web-app_3_0.xsd"> <servlet> <servlet-name>Toto</servlet-name> <servlet-class>CoursServlets.Toto</servlet-class> </servlet> </web-app> 18 lundi 21 novembre 11 Exemple <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/ xml/ns/javaee/web-app_3_0.xsd"> <servlet> <servlet-name>Toto</servlet-name> <servlet-class>CoursServlets.Toto</servlet-class> </servlet> <servlet-mapping> <servlet-name>Toto</servlet-name> <url-pattern>/Toto</url-pattern> </servlet-mapping> </web-app> 18 lundi 21 novembre 11 Première servlet avec NetBeans • Utilisation du Wizard de développement • création des descripteurs • intégration des fichiers • création du squelette de classe • Déploiement • Exécution et gestion du serveur • Attention aux copier / coller !!! 19 lundi 21 novembre 11 Code généré /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import import import import import import java.io.IOException; java.io.PrintWriter; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; /** * * @author oflauzac */ 20 lundi 21 novembre 11 Code généré /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import import import import import import java.io.IOException; java.io.PrintWriter; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; /** * * @author oflauzac */ public class Hello extends HttpServlet { 20 lundi 21 novembre 11 Code généré (suite) /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>Servlet Hello</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet Hello at " + request.getContextPath () + "</h1>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } 21 lundi 21 novembre 11 Code généré (suite) // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); 22 } lundi 21 novembre 11 Code généré (fin) /** * Returns a short description of the servlet. * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> } 23 lundi 21 novembre 11 API Standard 24 lundi 21 novembre 11 Gestion des formulaires • Gestion des méthodes POST et GET • Récupération des noms des champs • Accès aux données 25 lundi 21 novembre 11 Formulaire API Accès aux noms des paramètres Enumeration getParameterName() Accès aux valeurs des paramètres String[] getParameterValues(String name) String getParameter(String name) 26 lundi 21 novembre 11 Formulaire : exemple Le formulaire : ... <form name="f" method="GET" action="http://localhost:8084/LPRO/Form"> <p> Entrez votre nom <input type="text" name="nom"> </p> <p> <input type="submit"> </p> </form> ... Le traitement : ... // récupération de la valeur du paramètre String s = (String) request.getParameter("nom"); ... // récupération de quelques informations out.println("<p> La méthode utilisée est : " + request.getMethod() + "</p>"); out.println("<p> La requête est issue de " + request.getRemoteAddr() +"</p>"); out.println("<p> la valeur entrée est : " + s + "</p>"); ... 27 lundi 21 novembre 11 Gestion des cookies • Cookies : élément du protocole HTTP • Stockage d’informations sur le client • Information = chaînes de caractères • dépose dans HttpServletResponse • récupération dans HttpServletRequest • gestion javax.servlet.http.Cookie 28 lundi 21 novembre 11 COOKIE API Dépôt et récupération void addCookie(Cookie c) Cookie[] getCookie() L’objet cookie Cookie(String name, String value) String getName() int getMaxAge() String getValue() void setMaxAge(int expir) 29 void setValue(String newValue) lundi 21 novembre 11 Cookie : exemple Le dépôt : ... Cookie c = new Cookie("monCookie", "Bonjour"); c.setMaxAge(3600); response.addCookie(c); ... La lecture : ... Cookie[] tabCook = request.getCookies(); ... // récupération de quelques informations out.println("<p> Il y a " + tabCook.length + " cookie(s) </p>"); out.println("<p> les cookies sont : </p>"); for(int i=0;i<tabCook.length;i++){ out.println("<p> nom du cookie " + tabCook[i].getName()); out.println(" valeur du cookie : " + tabCook[i].getValue() + "</p>"); } ... 30 lundi 21 novembre 11 Gestion des sessions • Gestion de l’information sur le serveur • Suivi de navigation • Transmission de l’id de session ! • réencodage des l’URL • javax.servlet.http.HttpSession 31 lundi 21 novembre 11 Session API Gestion de l’URL String encodeURL(String URL) L’objet HttpSession Object getAttribute(String name) Enumeration getAttributeNames() String getId() void setAttribute(Sting name, Object value) void RemoveAttribute(String name) 32 lundi 21 novembre 11 Session : exemple Création de la session : HttpSession sess = request.getSession(true); Poursuite de la session : HttpSession sess = request.getSession(false); Test de la session : if(sess == null){ ... } else{ ... } Encodage de l’URL : String lien = response.encodeURL("http://localhost:8084/LPRO/Session2"); out.println("<a href=\"" + lien + "\"> pour la suite </a>"); 33 lundi 21 novembre 11 Session : exemple Enregistrement des données : String s = (String) request.getParameter("nom"); .... sess.setAttribute("nom",s); Lecture des données : String s = (String) sess.getAttribute("nom"); out.println("<p> Bonjour " + s + "</p>"); Id de session : out.println("<p> id de session " + sess.getId() + "</p>"); 34 lundi 21 novembre 11 Inclusion • Inclusion du résultat d’une requête • inclusion de html • inclusion d’une autre servlet • Utilisation d’un RequestDispatcher • méthode de ServletRequest 35 lundi 21 novembre 11 Inclusion API Récupération du dispatcher RequestDispatcher getRequestDispatcher(String path) Inclusion void include (ServletRequest request, ServletResponse response) Ne pas fermer les flux dans la servlet incluse ! 36 lundi 21 novembre 11 Inclusion : exemple Récupération d’un RequestDispatcher : // cas d’une inclusion RequestDispatcher r1 = // cas d’une inclusion RequestDispatcher r2 = HTML request.getRequestDispatcher("incluse.html"); de servlet request.getRequestDispatcher("Incluse"); Réalisation de l’inclusion «simple» : r1.include(request,response); Inclusion avec paramètres : request.setAttribute("nom","Olivier"); r2.include(request,response); 37 lundi 21 novembre 11 Délégation • Délégation de l’exécution à une autre servlet • Création de chaînes d’exécutions • Réponse depuis la servlet déléguée • Utilisation d’un RequestDispatcher • méthode de ServletRequest 38 lundi 21 novembre 11 Délégation API Récupération du dispatcher RequestDispatcher getRequestDispatcher(String path) Délégation void forward (ServletRequest request, ServletResponse response) 39 lundi 21 novembre 11 Délégation : exemple Récupération d’un RequestDispatcher // cas d’une inclusion RequestDispatcher r1 = // cas d’une inclusion RequestDispatcher r2 = HTML request.getRequestDispatcher("Delegue"); de servlet request.getRequestDispatcher("err.html"); Réalisation de la délégation : r1.forward(request,response); r2.forward(request,response); 40 lundi 21 novembre 11