480 likes | 597 Views
ARCHITECTURE WEB – COURS III. ARCHITECTURE WEB. Laurent.granie@free.fr Franck.legendre@lip6.fr (01 44 27 88 77). OBJECTIFS. Introduction à un langage objet pour le Web Montrer les avantages de l’objet appliqué au Web Serveurs d’applications. PLAN. Java et le Web Les Servlets Les JSP.
E N D
ARCHITECTURE WEB – COURS III ARCHITECTURE WEB Laurent.granie@free.fr Franck.legendre@lip6.fr (01 44 27 88 77) 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 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
PLAN • Java et le Web • Les Servlets • Les JSP Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Java et le Web • Java et le Web • Applets, Servlets, JSP • Apports de Java pour le Web • Les serveurs de servlets Java • Les Servlets • Les JSP 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 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 ... Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Java et le Web (3) Client Web Serveur Web HTTP Servlet container Servlet1 Servlet2 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 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Le serveur applicatif Tomcat • Jakarta (http://jakarta.apache.org) • 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 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 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Rappel sur les formulaires et CGI Client Web Serveur Web HTML/HTTP CGI Script CGI 1- Requête Chargement du formulaire 2- Envoi Complètement puis 3- Validation 4- Envoi vers CGI Traitement des données 5- Expédition sortie Réception sortie (HTML) 6- Envoi sortie 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 “” echo “” #Corps HTTP echo "<html>" echo "<body>" echo "<h1>Variables CGI</h1>" echo "<pre> " # #La commande set affiche les variables d’environnement # set # #Fermeture des balises ouvertes echo "</pre>" echo "</body> " echo "</html> " Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Les Servlets • Modèle objet des servlets Objet Session • getAttribute Servlet1 Objet Request Objet Response • getParameter • getAttribute • getHeaders • getCookies • setBufferSize • setHeader • setRedirect 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 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) 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 } } 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" + "<HTML>\n" + "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" + "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>"); } } 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 = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; public static String headWithTitle(String title) { return(DOCTYPE + "\n" + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n"); } } 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") + "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>"); } } 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) 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() 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() 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) + …. …. Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Formulaires et Servlets (2) • Lecture de trois paramètres (suite) "<BODY>\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<UL>\n" + " <LI>param1: " + request.getParameter("param1") + "\n" + " <LI>param2: " + request.getParameter("param2") + "\n" + " <LI>param3: " + request.getParameter("param3") + "\n" + "</UL>\n" + "</BODY></HTML>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 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); 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 • <input type=«hidden» name=« session » value=« valeur »> • Session tracking API (HttpSession API) • Offre une interface de haut niveau pour gérer ces solutions 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) 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); Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Les JSP • Java et le Web • Les Servlets • Les JSP 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 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Les JSP - exemples • Mapage.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Bienvenue au cours d’architecture Web</TITLE> </HEAD> <BODY> <H1>Bienvenue</H1> <SMALL>Bonjour, <!– getUserName renvoie le nom de l’utilisateur associé à son cookie --> <% out.println(Utils.getUserNameFromCookie(request)); %> Pour accéder au serveur Tomcat, cliquer <A HREF=« http://tparchiweb:8080">ici.</A></SMALL> <P> <!– Reste de la page --> </BODY> </HTML> 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) 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(" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\n"); … out.println(Utils.getUserNameFromCookie(request)); ... out.println("Pour accéder au serveur Tomcat, cliquer"); out.println("<A HREF="http://tparchiweb:8080">ici.</A></SMALL>"); … out.println("</HTML>"); out.close(); } Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Les JSP (3) • Balises • JSP Expressions • <%= expression java %> • out.print(expression java) • JSP Scriptlets • <% … %> • Code java inclus dans le corps de la méthode service() • JSP Déclarations • <%! Java code %> • Déclaration d’attributs ou de méthodes de la classe servlet générée • Ex : redéfinition de la méthode init() 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 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 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 Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
JSP Expressions • Variables ou constantes intégrées dans la page résultat <%= "tralala" %> Code JSP public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ... out.print( "tralala" ); … } Code Java 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 public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ... String s = "tralala"; out.print(s); ... } Code Java 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 public class test$jsp extends HttpJspBase { String s = "tralala"; public String maMethode(String s) { return "Chaine à traiter : " + s; } Code Java 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 <%@ page import="java.util.Vector" %> ou <jsp:directive.page import="java.util.Vector"/> Code JSP 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 { ... Code Java Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
JSP Page Directive (2) • Paramètres HTTP <%@ page contentType="text/plain"%> ou <% response.setContentType("text/plain"); %> Code JSP public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ... response.setContentType("text/plain"); ... } Code Java Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
JSP Include Directive • Include Code JSP <%@ include file="file.txt" %> public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ... out.write("Contenu du fichier file.txt"); ... } Code Java Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
JSP useBean, setProperty, getProperty • Accesseurs et modifieurs d’attributs <jsp:useBean id="monBean" class="test.MonBean"> <jsp:setProperty name="monBean" property="att1" value="valeur1"/> <jsp:setProperty name="monBean" property="att2" value="valeur2"/> </jsp:useBean> Code JSP 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) { 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); } ... } Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Formulaires et JSP • Lecture de deux paramètres <html> <head> <title> Exemple JSP </title> </head> <body> <h1>Exemple JSP </h1> <% 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("<br>"); out.println("La somme est égale à: " + (param1+param2)); %> </body> </html> Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB
Questions ? ? ? ? ? ? ? Laurent GRANIE & Franck LEGENDRE – MIAGE 3ème année - ARCHITECTURE WEB