Développement d`Application Web Plan De l`architecture 1
Transcription
Développement d`Application Web Plan De l`architecture 1
Plan • • • • • • • • • • Développement d’Application Web De l’architecture 1-tiers au n-tiers Fonctionnement d'une requête HTTP HTML Applets JDBC Le mécanisme des exceptions en Java Les servlets JSP Javascript PHP / MySQL 1 2 De l’architecture 1-tiers au n-tiers • Les niveaux d'abstraction – La couche de présentation • Présentation des informations • Interaction avec l’utilisateur De l’architecture 1-tiers au n-tiers – La couche de traitements • Regroupe l’ensemble des travaux à réaliser par l’application – Traitements locaux (contrôle du dialogue) – Traitements globaux (application) – La couche de données • Regroupe l’ensemble des mécanismes permettant la gestion et le stockage des informations 3 4 Le schéma du Gartner Group • Les trois couches s’exécutent sur le même serveur • Informatique centralisée, maître/esclave Présentation distribuée Présentation distante Gestion distante des données Traitements distribués Bases de données distribuées Données et traitements distribués Données Données Données Données Données Données Traitements Traitements • Les plus – Simplicité d’administration – Centralisation des données Système central Traitements Serveur L’architecture 1-tiers Traitements Présentation Présentation • Les moins Postes passifs Traitements Données Présentation ! Alléger le serveur Présentation Données Données Traitements Traitements Traitements Traitements Présentation Présentation Présentation Présentation 5 6 L’architecture 2-tiers L’architecture 2-tiers • Client-serveur de données • Les plus – Client (présentation et traitements) – Serveur (gestion des données) – Le plus répandu Client – Interface – Montée en charge – Interface plus riche – Application(s) sur le poste client • Les moins Utilisateur Client Serveur Présentation SGBD – – – – dialogue requête Traitements Données réponse Client très sollicité, lourd Dialogue avec le serveur très important Clients et protocoles non standards ⇒ maintenance difficile Relation étroite entre programme client et organisation des données côté serveur ⇒ difficulté d’évolution ! Alléger le client ! Rendre le système plus souple 7 8 L’arrivée des premiers standards Internet L’arrivée des premiers standards Internet • HTML • TCP/IP – Description des pages web – Texte + balise de mise en forme – Protocole de communication réseau – IP se charge du routage des informations (couche réseau) – TCP se charge du contrôle des données transmises (couche transport) • HTTP • CGI – Protocole d'échange d'informations sur le web sans établissement de connexion entre le client et le serveur – Permet de • • • • • – Langage de script – Interface entre un programme exécutable et un serveur web – Langage quelconque (Perl, C, …) Charger (GET) des documents textes (html) ou binaires (jpg, gif, mpeg) Envoyer (POST) des informations vers le serveur Déposer (PUT) des documents sur le serveur Effacer (DELETE) des documents Tracer (TRACE) les requêtes reçues par le serveur 9 L’architecture 3-tiers 10 L’architecture Internet / Intranet • Principes – Le client gère la présentation et les traitements locaux (moins lourd, moins évolué, moins coûteux) – Le serveur d’application gère les traitements – Le serveur de données accueille un SGBD • Caractéristiques Client Présentation requête HTTP Traitements locaux réponse Windows Unix - Linux Macintosh – Les trois niveaux sont indépendants ! Implantation sur différentes machines ! Évolutions plus faciles Navigateur – Répartition des tâches plus homogène ! Montée en charge plus facile à prendre en compte 11 Serveur d’application HTML Applet Javascript Serveur de données requête SQL SGBD Traitements HTTP Apache IIS réponse Données JDBC Oracle MySql Access CGI Servlet PHP ASP 12 L’architecture n-tiers • Exemples – Plusieurs serveurs d’application • Serveur html + moteur de servlets • Répartition de la logique d’application dans des objets métiers – Base de données distribuées Fonctionnement d'une requête HTTP • Les plus – Évolution facile – Montée en charge • Les moins – Complexité du système – Coûts de mise en oeuvre 13 Fonctionnement d'une requête HTTP Client Serveur d’application 14 Saisie des informations Serveur de données • Les solutions les plus utilisées sont – Formulaire HTML Présentation Traitements locaux requête HTTP requête SQL SGBD • Saisie des données dans des objets identifiés par leur nom • Envoi de la requête HTTP (submit) Traitements réponse réponse Données – Contrôles de saisie à l'aide de Javascript 1. 2. 3. 4. Saisie des données de l'utilisateur (formulaire html, applet) Contrôles locaux (javascript) Envoi de la requête HTTP Interprétation de la requête ⇒ exécution d'un script ou d’un programme (cgi, servlet, jsp, php...) 5. Construction et envoi de la réponse – Applets Java • Mise en forme enrichie • Interface dynamique • Ouverture de connexion possible 15 16 Envoi de la requête Interprétation de la requête et réponse • Une requête est composée : • Le serveur web – De l'adresse (URL) de la ressource distante – Analyse la requête en fonction • protocole://adresse_machine[:port]/fichier[#ancre|?paramètre=valeur] • De l'extension du fichier .html, .jsp, .cgi, .php • Du répertoire servlet/, cgi-bin/ – D'éventuelles informations préalablement saisies par l'utilisateur – Charge l'environnement d'exécution nécessaire ou redirige le fichier • Programmes CGI • Module PHP • JVM pour les servlets et les JSP • Types de requêtes : – La requête GET • Demande d'une page • Ajoute les données après l'URL • Le script ou le programme exécuté – http://www.univ-tlse1.fr/servlet/test?nom=igsi&... – Précise le type du contenu de la réponse (HTML, image, ...) – Construit la réponse dans un flot de sortie – La requête POST • Envoi de données vers le serveur • Les données ne sont pas visibles 17 18 Applets HTML http://eva.univ-tlse1.fr/berro/cours/applet/ 19 20 JDBC • API permettant d’interagir avec n’importe quelle base de données relationnelle par l’intermédiaire du langage SQL • Ensemble d’interfaces décrivant le comportement des pilotes pour interagir avec une BD (package java.sql) JDBC Java DataBase Connectivity Application Java JDBC Oracle MySql Access 21 Les types de pilotes 22 Les étapes de fonctionnement • Type 1 – Pont JDBC - ODBC – JDBC ⇒ Pilote OBDC ⇒ SGBD " • Type 2 # DriverManager – Pilote natif sur le client – JDBC ⇒ Pilote natif ⇒ SGBD création $ Connection création SQL lien avec le SGBD • Type 3 – Pilote de protocole réseau indépendant du SGBD – JDBC ⇒ Protocole réseau ⇒ SGBD création Statement % ResultSet & données Pilote du SGBD Base de données • Type 4 – Pilote pur java – JDBC ⇒ SGBD 23 24 Les étapes de fonctionnement Les étapes de fonctionnement 1. Chargement du driver par la JVM 3. Création de l'espace d’exécution de la requête try { Class.forName("nom_driver"); } catch (ClassNotFoundException e) { } Statement st = cx.createStatement(); *** – Il existe trois types de Statement : • Statement : requête statique – Oracle : oracle.jdbc.driver.OracleDriver – MySql : com.mysql.jdbc.Driver – Access : sun.jdbc.odbc.JdbcOdbcDriver • PreparedStatement : requête dynamique, précompilée • CallableStatement : requête dynamique stockée dans la BD 4. Envoi d’une requête 2. Ouverture de la connexion avec la BD – Pour les requêtes qui retournent un résultat (select) : executeQuery Connection cx; try { cx = DriverManager.getConnection(url, user, passwd); } catch (SQLException e) { } ResultSet rs = st.executeQuery("requête"); *** – Pour les autres (insert, update, ...) : executeUpdate int nb = st.executeUpdate("requête"); *** executeUpdate – Url : jdbc:protocole:serveur:port/nom_bd retourne le nombre de lignes modifiées 25 Les étapes de fonctionnement 26 Les étapes de fonctionnement while (rs.next()) { String n = rs.getString("nom"); int i = rs.getInt("taille"); } 5. Récupération du résultat – Les données renvoyées par la requête sont récupérées sous forme de tableau dans un objet ResultSet – La méthode next()*** permet de parcourir le tableau de ligne en ligne – Remarque : un objet ResultSet est automatiquement fermé si l'utilisateur fait une autre requête sur le même Statement – Les méthodes getXXX("nom_du_champ")*** permettent de récupérer la valeur d'un champ en fonction de son nom – Les méthodes getXXX(index_du_champ)*** permettent de récupérer la valeur d'un champ en fonction de sa position dans le résultat (1 pour la première colonne, 2 pour la deuxième, …) 27 28 Les étapes de fonctionnement Gestion des transactions 6. Fermeture • Transaction : groupe de requêtes indivisibles – Par défaut le JDBC est en mode auto commit rs.close(); *** st.close(); *** cx.close(); *** *** • Exemple cx.setAutoCommit(false); *** nécessite la récupération de l'SQLException définit le mode de la connexion Statement st = cx.createStatement(); st.executeUpdate("req1"); st.executeUpdate("req2"); cx.commit(); 29 30 Autres services • Accès aux meta-données – De la base de données DataBaseMetaData dbmd = cx.getMetaData(); *** – D'un résultat ResultSetMetaData rsmd = rs.getMetaData(); *** rsmd.getColumnCount(); *** String name = rsmd.getColumnName(int index), *** Les exceptions en Java • Traitement par lots st.addBatch("req1"); *** st.addBatch("req2"); St.executeBatch(); *** 31 32 Les exceptions Mécanisme de récupération d'exception • Définition • Permet de capturer l'exception – Événement qui survient pendant l'exécution d'un programme et qui interrompt le fil d'exécution normal – Les causes peuvent être multiples • • • • – Évite une terminaison anormale – Va permettre de traiter l'erreur Division par zéro Ouverture de connexion impossible (SQLException) Chargement de classe impossible (ClassNotFoundException) Dépassement mémoire • Avantages – Séparation entre le code normal et le code de gestion des erreurs – Propagation de l'erreur à la méthode appelante – Regroupement en type d'erreurs – Si l'exception n'est pas traitée • RuntimeException • SQLException • Terminaison anormale du programme • Ressources non libérées ! Mise en place d'un mécanisme de récupération des exceptions 33 34 Attraper et traiter une exception ? Traitement particulier • Clause try • Clause finally – Encapsule la partie de code susceptible de générer une exception – Cette partie sera suivie par au moins une clause catch ou finally – Permet de fermer un fichier ou de libérer des ressources systèmes – S'exécute indépendamment des événements survenus dans le try try { code } • Exemple try { code } catch (Exception1 nom) { traitement1 } catch (Exception2 nom) { traitement2 } finally { libération des ressources } • Clause catch – Encapsule le traitement associé à l'exception – Plusieurs clauses catch peuvent être associées à la clause try catch (Exception nom) { traitement associé } 35 36 Comment jeter une exception ? • Déclaration d'une méthode pouvant jeter une exception public type_retour nom_fonction() throws nom_exception – Tout appel à cette méthode devra être englobé dans une bloc try-catch sinon une erreur de compilation sera générée (unreported exception) Les servlets • Instruction pour jeter une exception throw new nom_exception(paramètres); 37 Les différentes techniques côté serveur 38 CGI • Principe de fonctionnement – Interpréteur embarqué dans le serveur web – Un processus est lancé à chaque requête • CGI (Common Gateway Interface) • Avantages • ASP (Active Server Page) – Standard pris en charge par tous les serveurs web actuels – Gratuit – Programmation variée (Perl, C, ...) • PHP (Php Hypertext Preprocessor) • Inconvénients • Servlet Java et JSP (JavaServer Pages) – Pas de persistance – Beaucoup de processus ⇒ serveur très sollicité • Amélioration : FastCGI – Lent 39 40 Les servlets Avantages • Programmes Java côté serveur (fichier .class) permettant de construire des pages web dynamiques • Portabilité et évolutivité – Langage Java • Langage objet • Compilé • Servlet = Applet côté serveur, mais – Association possible avec de nombreux serveurs web – Elle n'a pas d'interface graphique – Elle n'est pas soumise aux mêmes règles de sécurité • Interne (Serveur web écrit en Java) • Module embarqué • Serveur externe • Elle peut lire sur le disque du serveur (chargement des drivers JDBC) • Elle peut ouvrir des connexions • Rapidité – Persistance des servlets en mémoire (objet) après leur instanciation – Multithreading 41 Avantages 42 Principe de fonctionnement • Utilité Client – Gestion facile des cookies, formulaires, sessions, … Serveur d’application requête HTTP • Mécanismes puissants – – – – réponse Partage de données entre servlets Gestion des suivis de session (e-commerce) Pool de servlets (instances de la même servlet) Chaînage Serveur web " % Moteur de servlet JVM # prog.class $ 1. Le serveur web transmet le nom de la servlet et les paramètres éventuels : ./servlet/Bonjour?nom=igsi 2. Exécution de la servlet 3. Retour du flot de sortie contenant le code de la page HTML 4. Transmission du flot au serveur web 43 44 Le cycle de vie Développement d'une servlet HTTP • Le chargement peut être effectué • La classe HttpServlet implémente l'interface Servlet – Au démarrage du moteur de servlet – Au moment de l'expression du besoin de la servlet • Elle définit les méthodes • L'initialisation (init) – doGet() pour répondre aux requêtes GET – Permet d'initialiser les variables d'instance – doPost() pour répondre aux requêtes POST • Le rechargement – Fonctionnalité utile en phase de développement et gérée par le moteur de servlet • L'exécution • Votre servlet doit obligatoirement redéfinir l'une des deux méthodes en fonction du type d'envoi de la requête – Lorsque le moteur reçoit une requête, il examine son type pour appeler la méthode correspondante de la servlet (GET, POST,...) • La destruction (destroy) – Processus géré par le moteur de servlet 45 46 Servlet GET Classes d'entrée/sortie import javax.servlet.*; import javax.servlet.http.*; • HttpServletRequest – Contient les informations transmises du client • Formulaire HTML public class VotreServlet extends HttpServlet { public void init(HttpServletConfig c) throws ServletException {…} – Récupération par la méthode String getParameter(String nom) • Session • Lecture de cookies • Variables d’environnement – req.getMethod() : retourne la méthode HTTP de la demande (GET, POST, ...) public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} – req.getHeader("User-Agent") : retourne le nom du navigateur – req.getRemoteHost() : retourne le nom de la machine cliente – req.getServerName() : retourne le nom du serveur public void destroy() {…} } 47 48 Classes d'entrée/sortie Exemple de méthode doGet() • HttpServletResponse public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); // Format de sortie PrintWriter out = res.getWriter(); //Flot de sortie – Permet construire le flot de sortie de la servlet • Page HTML • Redirection – res.sendRedirect("http://eva.univ-tlse1.fr/berro/") out.println("<html>"); out.println("<body>"); out.println("<h2>Bonjour</h2>") ; out.println("</body>"); out.println("</html>"); } – Dépôt de cookies 49 50 Exemple de méthode doPost() Modèles de fonctionnement public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); // Format de sortie PrintWriter out = res.getWriter(); //Flot de sortie • Plusieurs personnes demandent le même service en même temps ! String nom = req.getParameter("nom"); String prenom = req.getParameter("prenom"); – Mode multithread • • • • Une seule instance de servlet est chargée en mémoire Occupation mémoire faible Bonne vitesse d'exécution Problème éventuel de synchronisation – Implémentation de SingleThreadModel – Bloc synchronized out.println("<html>"); out.println("<body>"); out.println("<h2>Bonjour " + nom + " " + prenom + "</h2>") ; out.println("</body>"); out.println("</html>"); } • Cadre d'utilisation – Peu de requêtes simultanées – Gestion centralisée des ressources 51 52 Modèles de fonctionnement – Mode monothread • • • • Le pool de servlets : plusieurs instances sont créées Occupation mémoire plus élevée Meilleur temps de réponse Thread safe Les cookies • Cadre d'utilisation – Association avec des systèmes gérant déjà le multithread (SGBD) – Beaucoup de requêtes simultanées 53 54 Les cookies Gestion à l'aide de servlet • Qu'est-ce ? • Création d'un cookie – Informations sous forme de texte envoyées par le serveur et stockées sur le poste client (forme de persistance) – Limite de 4 Ko pour un cookie et durée de vie réglable – 300 cookies par navigateur et 20 par site • Utilité Cookie leCookie = new Cookie(nom, valeur); – String nom : nom du cookie – String valeur : valeur du cookie • Dépôt du cookie sur le poste client res.addCookie(leCookie); – Gestion des paramètres des utilisateurs – Saisie automatique (login, password, adresse, ...) – État de visite (date de dernière visite, fréquence, ...) • Lecture des cookies – Cookie [] cookies = req.getCookies(); • Méthodes de la classe Cookie • Sécurité – getName / setName : nom du cookie – Pas de transmission de virus possible – Danger : pas d'encodage des informations écrites – getValue / setValue : valeur du cookie – getMaxAge / setMaxAge : âge maximum du cookie en secondes 55 56 Problématique • Le protocole HTTP est déconnecté – Pas de persistance de connexion – Les requêtes ne sont pas liées entre elles – Le serveur n'a aucun moyen de reconnaître qu'une séquence de requêtes provient du même client Le suivi de session • Les applications de type caddie ont besoin d'enregistrer un certain nombre d'informations (nom, numéro, choix, ...) !Il est nécessaire de mettre en place un mécanisme de suivi de session 57 58 Solutions Solutions • Solutions • URL + paramètres – – – – Cookie URL + paramètres Champ de formulaire caché HttpSession – Principe : on ajoute à l'URL les différentes informations de suivi • Champ de formulaire caché – Principe : on ajoute un formulaire contenant un ou plusieurs champs caché(s) dans la page html • <input type="hidden" name="login" value="monlogin"> • Cookie – Avantages – Voir paragraphe précédent – Gestion assez lourde • Client anonyme • Supporté par tous les navigateurs – Inconvénients • Informations visibles (identifiant, password, ...) • Données de plus en plus volumineuses • La séquence ne doit pas être interrompue 59 60 Utilisation des servlets de session • Principe – Un objet HttpSession va servir de conteneur pour les informations de suivi – Les requêtes d'un même utilisateur vont être associées à une même session – Une session a une durée limitée JSP • Méthodes – Pour obtenir la session courante de l'utilisateur HttpSession session = request.getSession(true); – Pour ajouter un couple (nom, valeur) à la session void setAttribute(String nom, Object valeur); – Pour consulter une information Object getAttribute(String nom); 61 JavaServer Pages 62 Principe de fonctionnement Client • Technologie côté serveur Serveur d’application requête HTTP • Code java inclus dans des pages HTML réponse Serveur web " Moteur de servlet # & JVM $ % • Balises <% et %> 1. Le serveur web transmet la page .jsp au moteur de servlet 2. Le moteur de servlets transforme la page .jsp en page .java puis il compile cette dernière pour obtenir une servlet (.class) 3. Transmission du .class et exécution 4. Retour du flot de sortie de la servlet 5. Transmission du flot au serveur web • Extension du fichier .jsp • Les fichiers peuvent être stockés n'importe où sous la racine du serveur web (dépende de la configuration du serveur) 63 64 Les balises de script Les balises de script • <%= expression %> • <% bloc de code java %> (Scriplet) – Permet d'intégrer des valeurs dans le code HTML – Accès aux variables et aux méthodes déclarées – Accès aux objets implicites <%= request.getRemoteHost() %> // Machine cliente <%= cpt %> // Affichage de la valeur d'une variable • <%! déclaration %> – Permet de définir des variables et des méthodes d'instance – Persiste entre deux invocations de la page <%! int nb = 10; int carre() { nb = nb*nb; } %> 65 <HTML><BODY> <H1>Table de multiplication du nombre 7</H1> <% int i; // variable locale int mult; for (i=0 ; i<9 ; i++) { mult = i*7; out.print( "7*" + i + " = " + mult + "<BR>" ); } %> </BODY></HTML> Les variables prédéfinies Les directives de script • Pour chaque JSP les variables suivantes sont accessibles • La directive page – – – – – – 66 <%@ page import="java.util.Vector, java.sql.*" %> <%@ page errorPage="chemin_de_la_page" %> request : HttpServletRequest response : HttpServletResponse session : HttpSession out : PrintWriter application : ServletContext config : ServletConfig • La directive include <%@ include file="chemin_de_la_page" %> – L'insertion s'effectue avant la compilation de la page JSP 67 68 Les actions • Pour instancier un bean dans une page JSP <jsp:useBean id="name" class="pack.class" scope="page" /> • id : nom de la classe • class : nom de la classe • scope : portée du bean (page, request, session, application) Javascript • Pour inclure une page <jsp:include page="url" flush="true" /> • Pour rediriger une page <jsp:forward page="url" /> • Pour transmettre des paramètres aux pages incluses ou déléguées <jsp:param name="nom" value="dupont" /> 69 70 Javascript, ce n'est pas du Java ! Objectifs • Faiblement typé • Contrôle local de saisie • Faiblement orienté objet • Interaction avec le document HTML • Langage interprété • Gestion des cookies • Intégré au HTML • Écriture de parties dynamiques de la page HTML • Pas mécanisme de sécurité • Non standard 71 72