Applications Web (Java) Mohamed Quafafou 4A – Polytech'Marseille [email protected] 1 Servlets [ ] Bases – Exemples 2 Java Servlets Java Servlet est une extension générique de serveur qui signifie qu’une classe java peut-être télécharger dynamiquement pour étendre les fonctionnalités d’un serveur. Les Servlets sont utilisées par les serveurs web et sont exécutés dans la Java Virtual Machine (JVM) dans le serveur. A l’inverse des applets qui ne nécessitent par de support java dans un navigateur web. A l’inverse des CGI, les servlets n’utilisent pas de multiple processus qui traitent des requêtes séparément. Les servlets peuvent être traitées par différents threads au sein du même processus. Les servlets sont aussi portable et indépendant des plateformes. Java Servlets Qu’est ce qu’une servlet ? Servlets sont des composants coté serveur qui fournissent un mécanisme puissant pour le développement de programmes coté serveur. Les servlets fournissent des méthodes basées sur les composants et indépendant des plateformes pour construire des applications web sans hériter des limitations des performances des programmes CGI. A l’inverse des mécanismes des serveur propriétaire (Netscape Server API, modules Apaches), les servlets sont serveur et plateforme indépendant. Ce ci vous laisse la liberté de choisir votre serveurs, les plateformes et les outils. Java Servlets En utilisant les servlets, les développeurs web peuvent crée rapidement et efficacement des applications (coté serveur) qui peuvent exécuter n’importe quelle servlet supportée par le serveur web. Les servlets s’exécutent entièrement au sein de le web virtuel machine. Comme les servlets s’exécutent du coté serveur alors elles ne vérifient pas la compatibilité avec le navigateur. Les servlets peuvent accéder à toute la famille d’API Java incluant l’API JDBC (dédiée aux bases de données). Les servlets peuvent aussi accéder à une libraire HTTP et profiter de la maturité du langage Java incluant la portabilité, performance, réutilisation, etc. Java Servlets Aujoud’hui les servlets sont populaires pour la construction d’applications web. Les conteneurs (3-tiers) de servlets sont disponible (Apache Web Server, Microsoft IIS, etc.). Les conteneurs de servlets sont souvent les composants de serveurs web et d’application tels que les serveurs d’application, BEA, WebLogic, IBM WebSphere, Sun Java System Web Server, Sun Java System Application Server, etc. Une servlet HTTP est typiquement utilisée pour : Fournir un contenu dynamique en récupérant par exemple les résultats d’une requête base de données en les retournant au client. Traite et/ou sauvegarde les données soumises par le HTML Gèrer les informations sur l’état, par exemple, l’achat en ligne où il faut gérer des requêtes concurrentes concernant différents utilisateurs. Squelette de Servlets Le squelette d’une servlet est le suivant les packages javax.servlet et javax.servlet.http offrent les interfaces et les classes nécessaires pour programmer avec les servlets les servlets servent généralement à étendre la classe ‘HttpSevlet’ et surchage les méthodes doGet et doPost import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class <nom servlet> extends HttpServlet { Public void doGet (HttpServlet request, HttpResponse response) throws ServletException, IOException { // code pour la logique métier // utiliser l’objet ‘request’ pour lire les requêtes du client // Utiliser l’objet ‘response’ envoyer le retour au client } // fermer le doGet } // fermer le programme Methodes des Servlets Une servlet générique contient les cinq méthodes suivantes: init() public void init(ServletConfig config) throws ServletException La méthode init() est appelée uniquement une fois par le conteneur de servlet pendant toute la vie de la servlet. La method init() a pour parameter l’objet ServletConfig qui contient les paramètres d’initialisation et la configuration de la servlet et lancer ServletException si une exception arrive. service() public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException Une fois la servlet commence à recevoir les requêtes, la méthode service() est appelée par le conteneur pour répondre. Pour cela la servlet utilise les deux objets suivants : javax.servlet.ServletRequest et javax.servlet.ServletResponse Methodes des Servlets Une servlet générique contient les cinq méthodes suivantes: Les paramètres de la méthode service() sont les objets ServletRequest qui contient la requête du client et l’objet ServletResponse qui compte à lui contient la réponse de la servlet. La méthode services lance les exceptions ServletException et IOExceptions. getServletConfig() public ServletConfig getServletConfig() Cette méthode contient les parameters d’initialisation et de démarrage de la servlet. Elle retourne l’objet ConfigServlet. Cette objet est ensuite passé à la méthode init(). Lorsque cette interface est implémentée alors elle stock l’objet ServletConfig afin de retourner. Ceci est effectué à l’aide une classe générique qui implémente cette interface. Methodes des Servlets Une servlet générique contient les cinq méthodes suivantes: getServletInfo() public String getServletInfo() Les informations concernant la servlet sont retournées par cette méthode, par exemple, la version, l’auteur, etc. Cette méthode retourne une chaine de caractère sous forme de texte clair (plain text). destroy() public void destroy() Cette méthode est appelée lorsqu’on souhaite fermée la servlet. Ainsi, avant de supprimer l’instance de la servlet du service, le conteneur de servlet appel la méthode destroy(). Cycle de vie Le cycle de vie d’une servlet est le suivant (quatre étapes): Exemple But : illuster le cycle de vie d’une servlet Exemple: init(), doGet(), destroy import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class servlet_lifecycle extends HttpServlet { int i; public void init() throws ServletException { i = 0; // initialisation de i } // incrémenter la valeur de i dans la méthode de doGet public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); if (i==0) { out.println("<html>"); out.println("<head>"); out.println("<title> Cycle de vie d'une servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>la valeur de i est initialisée par la méthode init</h1>"+ "<h1>"+ i + "</h1>"); out.println("</body>"); out.println("</html>"); } Exemple But : illuster le cycle de vie d’une servlet Exemple: init(), doGet(), destroy i = i + 1; if (i==10) { out.println("<html>"); out.println("<head>"); out.println("<title> Cycle de vie d'une servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>lorsque la valeur de i atteind 10 alors on appel la méthode destroy pour l'initialiser à Zéro </h1>" + "<h1>"+ i+ "</h1>"); out.println("</body>"); out.println("</html>"); destroy(); // appel destroy si i = 10} if (i<10) // incrémenter i { // afficher valeur de i } } public void destroy() // initialiser i { i = 0; } } http://localhost:8080/myexamples/servlet_lifecycle Conteneur Un conteneur de servlets est un programme compilable et exécutable. La fonction principale consiste en le chargement, l’initialisation et l’exécution de servlets. Le conteur de servlets is l’implémentation officielle de référence pour les technologies servlets Java et les JSP (JavaServer Pages). Les spécifications des servlets Java et les JSP sont développées par SUN (java Community Process). Un conteneur manipule un grand nombre de requêtes car il peut disposer de plusieurs servlets actives, des écouteurs (listeners, etc.). Noter que le conteneur de servlet peut être exécuté seul (standalone : sans serveur web encore sur un autre ordinateur). Développement Installation, configuration et execution de servlets (à la main !) : Compiler votre programme (servlet) Attention, ni javax.servlet.* ni the javax.servlet.http.* ne font partie du JDK Standard. Modifier le CLASSPATH en pointant l’API des servlets Créer de votre application web Il faut créer un repertoire pour votre application web, par exemple myservlet, qui doit être dans le répertoire webapps Créer WEB-INF Créer le répertoire WEB-INF dans le répertoire de votre application web Créer le web.xml et le répertoire classes Créer le fichier web.xml dans le répertoire WEBINF Créer aussi le répertoire classes toujours dans le répertoire WEB-INF. Développement Installation, configuration et execution de servlets (à la main !) : Copier la class Copier maintenant le fichier class de la servlet dans le répertoire classes Servlet et web.xml Inclure le nom de la servlet, par exemple « servlet_lifecycle », dans le document web.xml en mentionnant son URL (motif). Pour cela vous devez modifier le fichier web.xml : <servlet> <servlet-name> servlet_lifecycle</servlet-name> <servlet-class>servlet_lifecycle</servlet-class> </servlet> Développement Installation, configuration et execution de servlets (à la main !) : Servlet et web.xml Ensuite, il faut inclure le mapping à l’aide de la balise <servlet-mapping> : <servlet-mapping> <servlet-name>servlet_lifecycle</servlet-name> <url-pattern>/servlet_lifecycle</url-pattern> </servlet-mapping> Execution Lancer le serveur Tomcat Executer la servlet (http://localhost:8080/myexamples/ servlet_lifecycle) Exemple But : première servlet Exemple: afficher ‘Hello World’ (HelloWorld.java): import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html"); PrintWriter pw = response.getWriter(); pw.println("<html>"); pw.println("<head><title>Hello World</title></head>"); pw.println("<body>"); pw.println("<h1>Hello World</h1>"); pw.println("</body></html>"); }} http://localhost:8080/myexamples/HelloWorld Exemple suite Une servlet éténde HttpServlet (extends the HttpServlet) et surrchage la méthode doGet() qu’elle hérite de la classe HttpServlet. Le serveur invoque la méthode doGet() lorsqu’il recoie une requête GET de la servlet. La méthode doGet() prend deux arguments, le premier est l’objet HttpServletRequest alors que le second est l’objet HttpServletResponse. Si l’utilisateur envoie une requête au serveur alors celuici génère les deux objets HttpServletRequest et HttpServletResponse qui représentent respectivement la requête du client et la réponse du serveur. Exemple suite La method doGet() de notre servlet utilize d’abord la method setContentType de l’objet response qui indique que le contenu de la reponse est de type test/html. C’est un contenu de type MIME standard pour les pages HTML. Après cela, on utilise la méthode getWriter() de l’objet response pour recevoir un objet PrintWriter. Pour afficher la sortie sur le navigateur, on utilise la méthode println() de la classe PrintWriter. Exemple But : Gestion de compteur Exemple: compter le nombre de fois que la servlet a été invoquée: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SimpleCounter extends HttpServlet{ int counter = 0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter pw = response.getWriter(); counter++; pw.println(“A présent le compteur est " + counter); } } http://localhost:8080/myexamples/SimpleCounter Page dynamique But : générer une page HTML qui change dans le temps à l’aide d’une servlet Exemple: afficher la date (DisplayingDate.java): import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class DisplayingDate extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ PrintWriter pw = response.getWriter(); Date d = new Date(); pw.println("<html>"+"<body><h1>La date d’aujourd’hui est </h1>"); pw.println("<b>"+ d+"</b></body>"+ "</html>"); } } http://localhost:8080/myexamples/DateDisplay Page dynamique But : générer une page HTML qui change dans le temps à l’aide d’une servlet Exemple: afficher la date (HelloWorld.java): Ne pas oublier le web.wml <servlet> <servlet-name>Hello</servlet-name> <servlet-class>DateDisplay</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/DateDisplay</url-pattern> </servlet-mapping> Passage de paramètres But : Saisir les paramètres via une page HTML et les traiter par une Servlet Exemple: saisir le login/password et les afficher par une Servlet (LoginServlet.java) Page de Saisie (html) <html> <head> <title>New Page 1</title> </head><body> <h2>Login</h2> <p>Entrer votre nom utilisateur et votre mot de passé</p> <form method="GET" action="/htmlform/LoginServlet"> <p> Username <input type="text" name="username" size="20"></p> <p> Password <input type="text" name="password" size="20"></p> <p><input type="submit" value="Submit" name="B1"></p> </form> <p>&nbsp;</p> </body></html> Passage de paramètres But : Saisir les paramètres via une page HTML et les traiter par une Servlet Exemple: saisir le login/password et les afficher par une Servlet (LoginServlet.java) Servlet pour afficher les paramètres saisies (LoginServlet.java) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class LoginServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String name = request.getParameter("username"); String pass = request.getParameter("password"); out.println("<html>"); out.println("<body>"); out.println("Merci Mr/Mme + " " + name + " " + "pour votre visite<br>" ); out.println("votre mot de passe est : " + " " + pass + "<br>"); out.println("</body></html>"); }} Passage de paramètres But : Saisir les paramètres via une page HTML et les traiter par une Servlet Exemple: saisir le login/password et les afficher par une Servlet (LoginServlet.java) Web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app> http://localhost:8080/myexamples/login.html Redirection But : Utilisation de la méthode sendRedirect() pour permettre le traitement de la réponse d’une servlet par un autre servlet. Exemple: saisir, contrôler puis traiter les informations formulaire pour saisir un login et un password <html> <head> <title>Nouvelle page 1</title> </head> <body> <form method="POST" action="/SendRedirect/SendRedirectServlet"> <p>Entrer votre nom utilisateur&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="username" size="20"></p> <p>Entrer votre mot de passe&nbsp; <input type="text" name="password" size="20"></p> <p><input type="submit" value="Submit" name="B1"></p> </form> </body></html> Redirection But : Utilisation de la méthode sendRedirect() pour permettre le traitement de la réponse d’une servlet par un autre servlet. Exemple: saisir, contrôler puis traiter les informations Servlet (contrôleur) qui vérifie si les données saisies et redirige vers une autre servlet pour les traiter (SendRedirectServlet.java) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SendRedirectServlet extends HttpServlet{ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter pw = response.getWriter(); String name = request.getParameter("username"); String password = request.getParameter("password"); if(name.equals("Mohamed")&& password.equals("memet")){ response.sendRedirect("/SendRedirect/ValidUserServlet"); } else{ pw.println("Utilisateur invalide");}}} Redirection But : Utilisation de la méthode sendRedirect() pour permettre le traitement de la réponse d’une servlet par un autre servlet. Exemple: saisir, contrôler puis traiter les information Servlet pour traiter les données (ValidUserServlet .java) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ValidUserServlet extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); pw.println("Merci de visiter notre site " + " "); pw.println("Vous pouvez commencer maintenant le travail !"); } } Redirection But : Utilisation de la méthode sendRedirect() pour permettre le traitement de la réponse d’une servlet par un autre servlet. Exemple: saisir, contrôler puis traiter les information web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN« "http://java.sun.com/dtd/webapp_2_3.dtd"> <web-app> <servlet> <servlet> <servlet-name>rediriger</servlet-name> <servlet-name>Hello</servlet-name> <servlet-class>SendRedirectServlet</servlet-class> <servlet-class>ValidUserServlet</servlet-class> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>rediriger</servlet-name> <servlet-name>Hello</servlet-name> <url-pattern>/SendRedirectServlet</url-pattern> <url-pattern>/ValidUserServlet</url-pattern> </servlet-mapping> </servlet-mapping> </web-app> http://localhost:8080/myexamples/SendRedirect.html Exemple But : Passage des paramètres Exemple: QCM avec un paramètre qui a plusieurs valeurs. Page de saisie (qcm-questionmultiple.html) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>QCM - paramètre à plusieurs valeurs</title> </head> <body> <form method = "post" action = "GetParameterValues"> <p>Quels joueurs préférez-vous ?</p> <input type = "checkbox" name ="joueur" value = "zidane">Zidane<br> <input type = "checkbox" name ="joueur" value = "maradonna">Maradonna<br> <input type = "checkbox" name ="joueur" value = "pelé">Pelé<br> <input type = "checkbox" name ="joueur" value = "platini">platini<br> <input type ="submit" name= "submit"> </form> </body></html> http://localhost:8080/myexamples/qcm-questionmultiple.html Exemple But : Passage des paramètres Exemple: QCM avec un paramètre qui a plusieurs valeurs. Servlet (GetParameterValues.java) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class GetParameterValues extends HttpServlet{ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter pw = response.getWriter(); String[] joueurs = request.getParameterValues("joueur"); for(int i=0; i<joueurs.length; i++){ pw.println("<br>joueur : " + joueurs[i]); }} }