1 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB ARCHITECTURE WEB – COURS III ( )
2 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB OBJECTIFS Introduction à un langage objet pour le Web Montrer les avantages de l’objet appliqué au Web Serveurs d’applications
3 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB PLAN Java et le Web Les Servlets Les JSP
4 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Java et le Web –Applets, Servlets, JSP –Apports de Java pour le Web –Les serveurs de servlets Java Les Servlets Les JSP
5 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Java et le Web Applet Java –« Petite Application » Java compilée Téléchargée à partir d’un serveur Web Exécution sécurisée par la JVM du client Web Servlets –Équivalent du CGI pour Java avec des extensions –Application Java compilée Réside sur le serveur Exécution par la JVM du serveur Java Server Pages (JSP) –Langage de script
6 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Java et le Web (2) Quel est l’apport de Java pour le web? –Langage de haut niveau (OO) –Un ensemble de classes/packages dans l ’API HTTP Servlet/Jsp De l’objet dans le web… –Encapsulation du protocole –Objets request, response Accesseurs sur des attributs d’objets plutôt que sur des chaînes de caractères –Gestion plus fine et plus simple des fonctionnalités Authentification, session...
7 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Servlet2 Servlet1 Java et le Web (3) HTTP Client WebServeur Web Servlet container
8 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les serveurs de servlet Tomcat, Jakarta Project (gratuit) –Open Source –Respecte toujours les dernières spécifications des normes WebSphere Application Server ($795 à $6000) BEA Weblogic Application Server ( $4000) –Écrit entièrement en Java Allaire Jrun Web Server –Gratuit pour une utilisation non commerciale iPlanet Web Server Entreprise Edition ( $1495/processeur ) –Netscape/Sun –Une des meilleures implantations d’un serveur de Servlet
9 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Le serveur applicatif Tomcat Jakarta ( –Ensemble de projets Open Source autour d’Apache et Java Librairies, outils, Api (Ant, Log4j, Taglibs, …) Frameworks, moteurs (Struts, Turbine, cactus, …) Serveurs d’applications (Tomcat, Jetspeed, James, …) Respect des normes du W3C –Tomcat 4.x Java Servlet 2.2 Java Server Page 1.2
10 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets Java et le Web Les Servlets –Rappel sur le CGI –Introduction aux Servlets –Structure et exemples –API –Gestion des sessions (Session Tracking) Les JSP
11 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Rappel sur les formulaires et CGI Client WebServeur Web Script CGI 1- Requête 2- Envoi 3- Validation 4- Envoi vers CGI 5- Expédition sortie 6- Envoi sortie Chargement du formulaire Traitement des données Réception sortie (HTML) Complètement puis HTML/HTTPCGI
12 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Exemple de CGI Affiche les variables d’environnement #!/bin/bash # Affiche les variables d’environnement # #En-tête HTTP echo “Content-type: text/html “ echo “” #Corps HTTP echo " " echo " Variables CGI " echo " " # #La commande set affiche les variables d’environnement # set # #Fermeture des balises ouvertes echo " "
13 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets Modèle objet des servlets Servlet1 Objet RequestObjet Response Objet Session setBufferSize setHeader setRedirect getParameter getAttribute getHeaders getCookies getAttribute
14 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets (2) Parallèle CGI / servlet –Procédurale (C, script shell, perl, …) / OO Avantages des servlets –Efficacité : CGI : 1 utilisateur / 1 processus Servlet –Initialisation = JVM –Processus légers (thread) Système // objet –Convivialité Pas de nouveau langage (!) Langage OO, haut niveau
15 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets (3) –Puissances Fonctionnalités dans l’API –HTTP est invisible pour le programmeur (protocole de transport) –Facilités de l’API Java (JDBC, caching, tracking, …) –Portabilités (API standard) Code indépendant du système Code indépendant du serveur d’applications Une servlet est du bytecode Java (.class) –Elle doit être compilée! (javac)
16 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets - structures MaServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MaServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Objet "request" permet de lire l’en-tête HTTP (ex: cookies, …) // ainsi que les données d’un formulaire HTML // Objet "response" permet de spécifier la réponse (en-tête HTTP) comme // le type des données en retour (Cf. content-type) PrintWriter out = response.getWriter(); // objet out permet de renvoyer le contenu HTML au navigateur client }
17 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets - exemples HelloWWW.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + " \n" + " Hello WWW \n" + " \n" + " Hello WWW \n" + " "); }
18 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets – exemples (2) UtilitaireServlet.java package monPackage; public class UtilitaireServlet { public static final String DOCTYPE = " "; public static String headWithTitle(String title) { return(DOCTYPE + "\n" + " \n" + " " + title + " \n"); } }
19 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les Servlets – exemples (3) HelloWWW2.java package monPackage; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(UtilitaireServlet.headWithTitle("Hello WWW") + " \n" + " Hello WWW \n" + " "); }
20 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB API javax.servlet.* Javax.servlet.HttpServlet –Méthode d’initialisation Init() –Traitement et réponse à une requête HTTP GET doGet(HttpServletRequest request, HttpServletResponse response) –Traitement et réponse à une requête HTTP POST doPost(HttpServletRequest request, HttpServletResponse response) –Traitement et réponse à une requête HTTP GET ou POST service(HttpServletRequest request, HttpServletResponse response)
21 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB API javax.servlet.*(2) Objets utiles et fonctionnement de base –javax.servlet.http.HttpServletRequest Gestion de la requête HTTP –Lire des données d’un formulaire / URL –Lire l’entête HTTP Méthodes sur Header –Enumeration getHeaderNames() Méthodes sur données d’un formulaire et des cookies –Enumeration getParameterNames() –String getParameter(String nomParam) –String[] getParameterValues(String nomParam) –Cookie[] getCookies() Variables CGI –String getRemoteHost() –String getMethod() –String getQueryString() –Enumeration getHeaderNames()
22 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB API javax.servlet.*(3) –javax.servlet.http.HttpServletResponse Méthodes sur le code de retour (status code) –Les codes de retour sont des attributs static –Ex : response.sendError (int code, String message) Méthodes sur Header –setContentType(String type) –setContentLength() –addCookie(Cookie cookie) –sendRedirect(String location) –SetHeader(String name, String value) Méthodes sur les données (corps HTTP) –PrintWriter getWriter()
23 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Formulaires et Servlets Lecture de trois paramètres package monPackage; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class TroisParams extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = « Lecture de trois paramètres d’un formualire"; out.println(ServletUtilities.headWithTitle(title) + ….
24 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Formulaires et Servlets (2) Lecture de trois paramètres (suite) " \n" + " " + title + " \n" + " \n" + " param1: " + request.getParameter("param1") + "\n" + " param2: " + request.getParameter("param2") + "\n" + " param3: " + request.getParameter("param3") + "\n" + " \n" + " "); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
25 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB API javax.servlet.*(4) –javax.servlet.http.Cookie Constructeur –Cookie Cookie(String name, String value) Accesseurs sur attributs d’un Cookie –String getName() –String getValue() –setValue(String newValue) Exemple d’envoie d’un cookie au client Cookie userCookie = new Cookie(" user ", " uid1234" ); Response.addCookie(userCookie);
26 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Session Tracking Le protocole HTTP bien que persistant est un protocole sans état (respect des propriétés des transactions pour le télécommerce) Solutions –Problème: bien que simple dans leur implantation, mécanisme complexe sont nécessaires Cookie (solution la plus répandue) URL rewriting Hidden form fields – Session tracking API (HttpSession API) –Offre une interface de haut niveau pour gérer ces solutions
27 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Session Tracking (2) –Créer une session HttpSession session = request.getSession(true) –Obtenir des informations sur une session –boolean isNew() Obtenir l’identifiant d’une session –String getId() Obtenir la date de création d’une session –Long getCreationTime() … –Associer des informations à une session Associer un objet à une session: –setAttribute(String name, Object objet) Retourne un objet à partir d’une clé: –Object getValue(String name)
28 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Session Tracking - exemple Gestion d’un caddy HttpSession session = request.getSession(true); //Ici on écrase la précédente valeur de la page de référence session.setAttribute("referringPage", (String)request.getHeader("Referer")); Caddy articles = (Caddy)session.getAttribute("articles"); if (articles == null) { articles = new Caddy(...); } String itemID = request.getParameter("itemID"); articles.addArticles(Catalog.getArticles(itemID)); // On fait un setAttribute pour sauvegarder le caddy au cas où // c’est la création du caddy. Ici, on met maj le Caddy session.setAttribute("articles", (Caddy) articles);
29 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP Java et le Web Les Servlets Les JSP
30 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP Parallèle avec les langage de scripts PHP ou ASP –Langage de script –Au sein du code HTML, on insert du code java qui sera compilé (lors du premier accès à une page JSP) –Exécutées sur le serveur –Extensible via des librairies de tag existantes ou définis par le développeur Avantages par rapport au Servlet et CGI –Une page dynamique générée par un CGI ou une servlet possède toujours une partie statique –Les JSP permettent de bien séparer les deux
31 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP - exemples Mapage.jsp Bienvenue au cours d’architecture Web Bienvenue Bonjour, Pour accéder au serveur Tomcat, cliquer ici.
32 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP (2) Vie d’une JSP –Le serveur d’applications (tomcat) transforme le fichier.jsp en source java –Le code source correspond au code d’une servlet Le HTML est transformé en –out.print(« mon code HTML ») Le code java est transformé et inclus dans le corps de la méthode servlet.service() –Le fichier java est ensuite compilé en.class la servlet est prête à être exécutée Importance du serveur d’applications dans la phase de génération du code (respect de l’API et de ses spécifications)
33 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP – exemple de code généré Mapage.java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { printWriter out = response.getWriter(); out.println(" \n"); … out.println(Utils.getUserNameFromCookie(request));... out.println("Pour accéder au serveur Tomcat, cliquer"); out.println(" ici. "); … out.println(" "); out.close(); }
34 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP (3) Balises –JSP Expressions out.print(expression java) –JSP Scriptlets Code java inclus dans le corps de la méthode service() –JSP Déclarations Déclaration d’attributs ou de méthodes de la classe servlet générée Ex : redéfinition de la méthode init()
35 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP (4) –JSP Directives JSP page directive –Ensemble de raccourcis vers des attributs du protocoles HTTP et du contenu HTML »Content-Type »Session »isErrorPage JSP include directive –Inclus un fichier dans la jsp juste avant la génération du code java –ex : header, tailer, menu, … –Actions jsp:include –Inclus une page(URL) au moment ou la servlet répond à une requête –Inclusion dynamique de contenu »choix dynamique de la page à inclure : l ’attribut page peut être une expression java »si la page est une jsp, celle-ci est executée avant d ’être incluse
36 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP (5) jsp:useBean, jsp:setProperty et jsp:getProperty –Instancie un objet et l’initialise en dehors d’une JSP Scriptlet jsp:forward –Équivaut setLocation() jsp:plugin –Description XML d’un plugin dans une page HTML Variables prédéfinies –request, response, out, session,.. –Accesseurs sur des attributs des objets Servlet –session Les arguments de la méthode service –request –response
37 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Les JSP (6) Limites des JSP –Propreté du code : mélange code applicatif et code de présentation Ex : connexion JDBC, mise en page, … Les JSP doivent essentiellement (exclusivement) être utilisées pour la présentation (modèle MVC) Solution : JSP Action et taglib qui permettent de décrire en XML du code –une JSP est son propre contrôleur Pas de génération de code dynamique Problèmes rencontrés lors d’inclusions multiples
38 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Expressions Variables ou constantes intégrées dans la page résultat Code JSP Code Java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {... out.print( "tralala" ); … }
39 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Scriptlets Bloc de code Java intégrés dans la JSP <% String s = "tralala"; out.print(s); %> Code JSP Code Java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {... String s = "tralala"; out.print(s);... }
40 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Declarations Comme en Java <%! String s = "tralala"; public String maMethode(String s) { return "Chaine à traiter : " + s; } %> Code JSP Code Java public class test$jsp extends HttpJspBase { String s = "tralala"; public String maMethode(String s) { return "Chaine à traiter : " + s; }
41 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Page Directive Traitées lors de la compilation de la page en servlet: include ou Code JSP Code Java package org.apache.jsp; import java.util.Vector; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.jasper.runtime.*; public class test$jsp extends HttpJspBase {...
42 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Page Directive (2) Paramètres HTTP ou Code JSP Code Java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {... response.setContentType("text/plain");... }
43 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP Include Directive Include Code JSP Code Java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {... out.write("Contenu du fichier file.txt");... }
44 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP useBean, setProperty, getProperty Accesseurs et modifieurs d’attributs Code JSP
45 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP useBean, setProperty, getProperty (2) Code Java public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {... test.MonBean monBean = null; boolean _jspx_specialmonBean = false; synchronized (pageContext) { monBean= (test.MonBean) pageContext.getAttribute("monBean",PageContext.PAGE_SCOPE); if ( monBean == null ) { _jspx_specialmonBean = true; try { monBean = (test.MonBean) java.beans.Beans.instantiate(this.getClass().getClassLoader(), "test.MonBean"); } catch (ClassNotFoundException exc) { throw new InstantiationException(exc.getMessage()); } catch (Exception exc) {
46 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB JSP useBean, setProperty, getProperty (3) Code Java (suite) throw new ServletException (" Cannot create bean of class "+"test.MonBean", exc); } pageContext.setAttribute("monBean", monBean, geContext.PAGE_SCOPE); } if(_jspx_specialmonBean == true) { JspRuntimeLibrary.introspecthelper(pageContext.findAttribute("monBean"), "att1","valeur1",null,null, false); JspRuntimeLibrary.introspecthelper(pageContext.findAttribute("monBean"), "att2","valeur2",null,null, false); }... }
47 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Formulaires et JSP Lecture de deux paramètres Exemple JSP Exemple JSP <% String sn1, sn2; int param1,param2; sn1 = request.getParameter(" param1"); sn2 = request.getParameter(" param2"); param1 = Integer.parseInt(sn1); param2 = Integer.parseInt(sn2); out.println("Les paramètres sont: " + sn1 + " et " + sn2); out.println(" "); out.println("La somme est égale à: " + (param1+param2)); %>
48 / / 01 / 2003 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB Questions ? ? ? ? ? ? ?