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