Les servlets Java Les bases de la génération dynamique HTML en Java Sébastien Limet etGérard Rozsavolgyi Licence Professionnelle
Licence Professionnelle Réseaux Télécoms « Internet/extranet »2 J2EE – Les servlets Les servlets Une première approche de la couche Web Dans le monde Java on trouve deux possibilités pour générer du HTML dynamique : les servlets. les Java Server Pages (JSP). Pas ce qui a de plus attirant dans J2EE, mais il faut en passer par là pour comprendre les JSP et ce qui s’ensuit…
Licence Professionnelle Réseaux Télécoms « Internet/extranet »3 J2EE – Les servlets Qu’est-ce que c’est, une servlet ? C’est une classe Java qui répond aux requêtes d’un navigateur Web Permet de faire rapidement et simplement des pages Web dynamiques (genre PHP, mais en Java et on est obligé de générer l’intégralité de la page) Comme tous les composants J2EE, c’est le serveur d’applications qui prend en charge tout ce qui est autorisations, authentifications, sécurité, transactions, cycles de vie, montée en charge, etc.
Licence Professionnelle Réseaux Télécoms « Internet/extranet »4 J2EE – Les servlets Architecture Servlet
Licence Professionnelle Réseaux Télécoms « Internet/extranet »5 J2EE – Les servlets Plus précisément… Extensions puissantes, modulaires, fiables, sécurisées et portables, les servlets sont des classes java utilisées pour générer du HTML dynamique côté serveur. La classe utilisée hérite de javax.servlet.http.HttpServlet. La servlet est associée à une URL lors du déploiement. Le plus souvent une instance de la Servlet est partagée entre les utilisateurs d’une même application.
Licence Professionnelle Réseaux Télécoms « Internet/extranet »6 J2EE – Les servlets La servlet, c’est bien pratique Elle est écrite en Java, et bénéficie de toute l’API Java ( manipulation d’URL, multithreading, manipulation d’images, compression de données, sérialisation d’objets, connection aux bases de données, RMI,...) Elle n’est chargée en mémoire qu’une seule fois, ce qui permet une bonne montée en puissance Elle ne consomme qu’un processus Elle permet un partage des ressources Elle peut émuler des sessions et contourner les limitations de HTTP (Protocole « amnésique »)
Licence Professionnelle Réseaux Télécoms « Internet/extranet »7 J2EE – Les servlets … et ca a bien des avantages Efficacité et robustesse : essentiellement parce que les servlets sont éxécutés dans le cadre de threads, plus “légers”, plus aisés à manipuler, avec des capacités de communications bien meilleures que les processus classiques Sécurité : de part la robustesse du langage Java (typage fort, pas de manipulations de pointeurs, d’exceptions, Garbage Collector, Security Manager…)
Licence Professionnelle Réseaux Télécoms « Internet/extranet »8 J2EE – Les servlets Servlet : un premier exemple package exemples; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class UnExempleDeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" "); out.println(" Ceci est le texte de la barre de titre "); out.println(" "); out.println("Bien le bonjour, m'sieurs-dames !"); out.println(" "); out.close(); }
Licence Professionnelle Réseaux Télécoms « Internet/extranet »9 J2EE – Les servlets Explications… C’est une classe Java, qui étend la classe HttpServlet Une série de méthodes doXxx permettent de répondre aux requêtes HTTP ( Xxx est soit Get soit Post ) Dans ces méthodes, on écrit du HTML dans un Writer fournit par l’objet HttpServletResponse. A étudier : le javadoc de HttpServlet, HttpServletRequest et HttpServletResponse
Licence Professionnelle Réseaux Télécoms « Internet/extranet »10 J2EE – Les servlets C’est tout ? Hélas non! Une servlet s'exécute au sein d'une application web J2EE Il faut la déployer dans une application Les étapes du déploiement: Ecrire l’objet (ici, notre servlet) Ecrire le descripteur de déploiement Packager Déployer
Licence Professionnelle Réseaux Télécoms « Internet/extranet »11 J2EE – Les servlets Application Web Se définit par un contexte: un répertoire particulier sur le serveur web
Licence Professionnelle Réseaux Télécoms « Internet/extranet »12 J2EE – Les servlets Application Web Un war (Web Application Archive) est un ensemble de ressources web (jsp, images, modèles...) configurées de manière à pouvoir être déployées sur tout serveur web supportant les servlets. Le répertoire WEB-INF contient les classes, les librairies, les descripteurs de déploiement (web.xml, jonas-web.xml…) permettent de configurer l’application et doivent être construits selon des DTD normalisées).
Licence Professionnelle Réseaux Télécoms « Internet/extranet »13 J2EE – Les servlets Un descripteur de déploiement <!DOCTYPE web-app"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" PUBLIC " MaServletAMoi Nom facultatif de ma servlet à moi Ceci est un exemple basique de servlet exemples.UnExempleDeServlet MaServletAMoi /servlet/hello
Licence Professionnelle Réseaux Télécoms « Internet/extranet »14 J2EE – Les servlets Explications… Une servlet, appelée MaServletAMoi, prend pour classe de base exemples.UnExempleDeServlet.class Cette servlet, une fois déployée, sera appelée en tapant « » (sous Tomcat) A faire : fabriquer soi-même son petit descripteur de déploiement…
Licence Professionnelle Réseaux Télécoms « Internet/extranet »15 J2EE – Les servlets Développement d'une servlet Avoir conscience du cycle de vie Écrire une méthode de service Utiliser d’autres ressources Web Partager de l’information Maintenir un état « Finaliser » proprement une servlet
Licence Professionnelle Réseaux Télécoms « Internet/extranet »16 J2EE – Les servlets Création de servlets Pour créer des servlets, il faut étendre la classe HttpServlet. Les servlets Java n’ont pas de méthode main(). Cycle de vie, un peu semblable à celui d’une Applet Chaque fois qu’un serveur reçoit une requête pointant sur une servlet, il fait appel à la méthode service() de la servlet concernée, qui redirige vers la méthode appropriée (doGet, do Post, etc.)
Licence Professionnelle Réseaux Télécoms « Internet/extranet »17 J2EE – Les servlets Packages Deux packages constituent l’architecture servlet javax.servlet : comporte les interfaces génériques et les classes implémentées et étendues par toutes les servlets. javax.servlet.http : contient les classes qui sont étendues lorsqu’on crée des servlets spécifiques
Licence Professionnelle Réseaux Télécoms « Internet/extranet »18 J2EE – Les servlets Avoir conscience du cycle de vie Lors du premier appel : La classe de la servlet est chargée et instanciée La méthode init est appelée A chaque appel, y compris le premier, la méthode de service correspondante est appelée En général doGet() ou/et doPost() On peut aussi surcharger service()
Licence Professionnelle Réseaux Télécoms « Internet/extranet »19 J2EE – Les servlets L’interface javax.servlet.Servlet Elle fournit le cadre pour toutes les servlets. Elle définit cinq méthodes. Les trois les plus importantes sont les suivantes : init(), qui initialise une servlet. destroy(), qui assure le nettoyage. service(), qui reçoit les requêtes du client et y répond
Licence Professionnelle Réseaux Télécoms « Internet/extranet »20 J2EE – Les servlets Profils Une méthode service protected void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Une méthode doGet protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Une méthode doPost protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
Licence Professionnelle Réseaux Télécoms « Internet/extranet »21 J2EE – Les servlets Écrire une méthode de service Ce sont les méthodes appelées sur action de l’utilisateur, qui doivent être surchargées : doGet, doDelete, doOptions, doPost, doPut, doTrace Obtenir des informations à partir des requêtes Au travers de l’interface HttpServletRequest qui représente la requête Construire les réponses Au travers de l’interface HttpServletResponse, qui représente la réponse
Licence Professionnelle Réseaux Télécoms « Internet/extranet »22 J2EE – Les servlets doGet() Reçoit et traite les requêtes de type GET. Demande d’une URL (page HTML, Servlet,…) Éventuellement avec un passage de paramètres. Limité en taille (2Ko). On peut lire les paramètres du GET à partir du HttpServletRequest : public void doGet( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String nom = req.getParameter("nom"); }
Licence Professionnelle Réseaux Télécoms « Internet/extranet »23 J2EE – Les servlets doPost() Reçoit et traite les requêtes de type POST. Demande d’une URL (Servlet,…) Envoi de données d’un formulaire. Pas de limite de taille.
Licence Professionnelle Réseaux Télécoms « Internet/extranet »24 J2EE – Les servlets Exemple de méthode public class QuiSertARienServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" "); out.println("Bien le bonjour, m'sieurs-dames !"); String param1 = request.getParameter("valeur1"); String param2 = request.getParameter("valeur2"); out.println("Vous avez passé les valeurs: " + param1 + " et " + param2); out.println(" "); } Si vous tapez quelque chose du genre : Vous obtiendrez le message : Vous avez passé les valeurs ABCDEF et 1234
Licence Professionnelle Réseaux Télécoms « Internet/extranet »25 J2EE – Les servlets Utiliser d’autres ressources Web Il s’agit d’utiliser un autre composant soit directement soit indirectement. Par exemple, une servlet peut implémenter l’affichage d’une bannière générique, utilisée par toutes les autres servlets Deux possibilités : inclure le résultat, ou transmettre la requête à une autre ressource Dans les deux cas, obtenir d’abord un RequestDispatcher par la méthode getRequestDispatcher() sur le ServletContext Puis inclure le contenu d’autres ressources dans la réponse : méthode include() Ou transférer le contrôle à un autre composant Web : méthode forward()
Licence Professionnelle Réseaux Télécoms « Internet/extranet »26 J2EE – Les servlets Utiliser d’autres ressources Web public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // On peut commencer avant … RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/banniere"); if (dispatcher != null) { dispatcher.include(request, response); } // On peut continuer après… } public void doGet(HttpServletRequest request, HttpServletResponse response) { throws ServletException, IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/autre_servlet"); if (dispatcher != null) { dispatcher.forward(request, response); } // Attention : pas de out.println() dans ce cas ! } Exemples
Licence Professionnelle Réseaux Télécoms « Internet/extranet »27 J2EE – Les servlets Communication des servlets Avec le client: Les paramètres => communication à sens unique Au sein de l'application A l'intérieur de la servlet, gestion des clients: HttpSession Entre servlets lors d'une requete ServletRequest Dans le contexte global ServletContext
Licence Professionnelle Réseaux Télécoms « Internet/extranet »28 J2EE – Les servlets Communication des servlets
Licence Professionnelle Réseaux Télécoms « Internet/extranet »29 J2EE – Les servlets Partager de l’information Portée des objets Différentes portées différentes existent. Le partage d’information se fait par appel aux méthodes [get|set]Attribute de chaque classe représentant la portée Request : javax.servlet.ServletRequest Web context : javax.servlet.ServletContext Session : javax.servlet.http.HttpSession Pour partager de l’information entre les appels, utiliser l’interface session A étudier : le javadoc des classes de portée
Licence Professionnelle Réseaux Télécoms « Internet/extranet »30 J2EE – Les servlets Maintenir un état Pourquoi faire ? Il faut pouvoir distinguer les clients dans le flux de requêtes, c’est-à-dire les sessions Comment faire ? Les sessions sont représentées par l’objet HttpSession, fourni par la méthode getSession Associer des attributs à une session Par les méthodes [get|set]Attribute Exemple : public void doGet(HttpServletRequest request, HttpServletResponse response) { throws ServletException, IOException { HttpSession session = request.getSession(); Attribut monAttribut = (Attribut)session.getAttribute("nom_attribut");...
Licence Professionnelle Réseaux Télécoms « Internet/extranet »31 J2EE – Les servlets Maintenir un état Gestion des sessions Le serveur Web garde les informations de sessions jusqu’à ce que : La méthode invalidate() soit appelée La session tombe en timeout, dont la valeur est spécifiée soit dans le descripteur de déploiement, soit au travers des méthodes [get|set]MaxInactiveInterval Le tracking des sessions Deux méthodes : Par les cookies Par l’enrichissement de l’URL Les deux méthodes sont entièrement gérées par le conteneur
Licence Professionnelle Réseaux Télécoms « Internet/extranet »32 J2EE – Les servlets « Finaliser » proprement une servlet Surcharger la méthode destroy et libérer toutes les ressources utilisées Fermer les connexions aux bases de données Fermer les fichiers Terminer les traitements asynchrones …