Les passerelles BD/WEB Coordonnateur du cours Bruno DEFUDE Dept INFormatique
Programme du séminaire Jour 1 : (salle E405) objectifs du séminaire rappels sur les SGBD relationnels rappels sur Internet/web principes des passerelles Jour 2 : (salle E405) quelques solutions industrielles démonstration/programmation de différentes solutions
Intervenants Bruno Defude (jour 1) : enseignant/chercheur au dept INF depuis 1992, docteur informatique INPGrenoble, enseigne les BD depuis 1986 Claire Carpentier (Jour 2) : enseignant/chercheur au dept INF depuis 1998, docteur informatique Univ. Evry, enseigne les BD depuis 1995
Objectifs du cours Présenter les problèmes de couplage entre le Web et les SGBD classifier les différentes approches utilisées pour le couplage présenter différentes solutions industrielles
Plan du cours Les SGBD relationnels Le système World Wide Web Les interfaces entre le Web et les BD principes solutions Microsoft (IDC, ASP) L'approche Java (servlet, JSP) Evolution du Web : XML
Bases de données relationnelles
Les SGBD relationnels Fonctionnalités Modèles de données langages de requêtes SQL transactions et contrôle de concurrence
Fonctionnalités d'un SGBD permettre de représenter des informations (modèle de données) permettre un accès facile aux informations stockées via des langages de requêtes déclaratifs Stocker de l'information de manière fiable, efficace, évolutive et répartie (transactions, contrôle de concurrence, middleware) offrir différentes interfaces de programmation (langage de requêtes, Web, langages programmation, ...)
Les modèles pour les bases de données Modèle orienté conception : Entité/Association Modèle orienté implantation : modèle relationnel
Modèle Entité/Association [Chen 77] Exemple de modèle
Modèle Entité/Association Critique du modèle Entité/Association Avantages Inconvénients Sémantique riche Uniquement un modèle de Extension aux description de données concepts objets (héritage, ...) Pas de lg de manipulation associé Aspect visuel Pas de SGBD E/A Modèle de conception de BD Pas un modèle d’implantation de BD
Modèle relationnel [CODD 70] « A Relational Model for Large Shared Data Banks » Exemple Employé(NoSs, Nom, Adresse, Age, salaire) Projet(NoProjet, Libellé, ChefProjet) Travaille_sur(NoSs, NoProjet)
Exemples de relations 21 Maisel Meunier 3 20 CROUS Millot 2 Bélaïd 1 Age Adresse Nom Num Elève 10 BD 2 20 1 18 IO 3 17 Note CodeUV NumElève Inscrit
Modèle relationnel (suite) Schéma BD Structure de relation BD Ensemble d’enregistrements reliés par des valeurs (clés étrangères) Langage de manipulation Ensembliste Déclaratif Standard international [ SQL 8, 89]
Modèle relationnel (suite) Prototypes de recherche System/R chez IBM (197) Ingres à Berkeley (197) Systèmes commerciaux SQL/DS et DB2 d’IBM (1982) Oracle (1983) Ingres (1983) Informix (1981) Sybase (1984)
Modèle relationnel (suite) Avantages Indépendance logique/physique Langage de manipulation simple Basé sur une théorie mathématique solide Standard
Langages associés au modèle relationnel Langages de Définition de Données (LDD) : Définition /mise à jour des schémas des relations Langages de manipulation de données (LMD) : Interrogation : recherche de données Mises à jour : insertion, suppression, modification SQL Des langages de définition et de manipulation sont associés au modèle relationnel. De façon formelle on trouve deux classes de langages. Les langages algébriques et les langages prédicatifs. Ces langages sont strictement équivalents sur le plan de la puissance d'expression (n'importe quelle requête qui peut s'exprimer dans un de ces langages peut s'exprimer dans l'autre). Sur un plan industriel, les langages algébriques ont dérivé SQL (Structured Query Language, défini par IBM et qui s'impose comme la norme supportée par tout SGBD du commerce) et les langages prédicatifs QBE (Query By Example).
Exemples de requêtes en algèbre relationnelle Base de données exemple : les vins Vins(num, cru, annee, degre) Recoltes(nvin, nprod, quantite) Producteurs(num, nom, prenom, region) Buveurs(num, nom, prenom, ville) Commandes(ncde, date, nb, nvin, qte) Livraisons(ncde, no_ordre, qteLivree) V R P B C L
Modèle E/A de la BD des vins Buveurs num num cru nom degré prenom annee ville 0,n 0,n 0,n concerne recoltes Passer quantite 0,n 1,1 1,1 Producteurs Livraisons Commandes Donner_lieu num 0,n (1,1) No_ordre ncde nom qteLivrée qté prenom date date region
Présentation de SQL Fonctionnalités : Le langage de manipulation Introduction Fonctionnalités : définition et manipulation de données au format relationnel contrôle des données Le langage de manipulation non procédural emprunté à l'algèbre relationnelle et au calcul relationnel de tuples Puissance du langage de manipulation Algèbre Relationnelle + Fonctions-Agrégats + Tri Une requête SQL (sans fonctions et tri) Suite d'opérations de l'algèbre relationnelle
Présentation de SQL (2) Origine Normalisation ISO Introduction Origine langage SEQUEL du prototype de SGBD relationnel SYSTEM/R (74-76) laboratoire de recherche IBM à San José Normalisation ISO norme SQL1 (1986, 1989) norme SQL2 (1992) nouvelle norme en préparation SQL3 Langage de requêtes des SGBD relationnels ORACLE (Oracle Corporation - 1977) INGRES (Ingres Technology - 1980) DB2 (IBM - 1984) INFORMIX (Informix Inc - 1981) SYBASE (Sybase Inc - 1984) MySQL (1995)
Schéma d’une relation Création Mise à jour Suppression (norme SQL2 !) Définition des données Création CREATE TABLE Vins ( num Integer, cru Char(20), annee Integer) Mise à jour Ajout d'un attribut (norme SQL2 !) ALTER TABLE Vins ADD COLUMN degre Integer Suppression (norme SQL2 !) DROP TABLE Vins
Contraintes d’intégrité Définition des données règle qui définit la cohérence d'une donnée ou d'un ensemble de données de la BD Contraintes définies en SQL non nullité des valeurs d'un attribut unicité de la valeur d'un attribut ou d'un groupe d'attributs valeur par défaut pour un attribut contrainte de domaine clé primaire (un attribut ou un groupe) intégrité référentielle "minimale" CREATE TABLE Vins ( num integer PRIMARY KEY, cru char (40) NOT NULL, annee integer CONSTRAINT Cannee CHECK (annee between 1970 and 2010), degre number(4,2) CONSTRAINT Cdegre CHECK (degre between 9.0 and 15.0))
Syntaxe générale de recherche SELECT <liste d’attributs projetés> FROM <liste de relations> [WHERE <liste des critères de restriction et de jointure>] Comment remplir les clauses ? Quel résultat souhaite voir l’utilisateur, schéma du résultat ? Où sont les attributs dont j’ai besoin ? Y-a t-il des conditions sur les valeurs exprimées dans ma requête ? Ai-je plusieurs relations dans ma clause FROM ?
Projection "Donner tous les vins" SELECT * FROM Vins "Donner la liste de tous les crus, avec élimination des doublons" SELECT DISTINCT cru
Restriction et tri "Donner les vins dont le cru commence par p ou P" SELECT * FROM Vins WHERE cru LIKE ‘p%’ OR cru LIKE ‘P%’ "Donner les crus des vins de millésime 1995 et de degré 12, triés par ordre croissant" SELECT cru WHERE annee=1995 AND degre = 12 ORDER BY cru
Jointure "Donner les noms des producteurs de Pommard" SELECT nom Recherche des données "Donner les noms des producteurs de Pommard" SELECT nom FROM Vins V, Recoltes R, Producteurs P WHERE V.num = R.nvin AND R.nprod=P.num AND cru = ‘Pommard’ Conditions de jointures Produit cartésien Nom d’attribut non ambigü
Exemples avec fonctions "Donner la moyenne des degrés de tous les vins" SELECT Avg(degre) FROM Vins "Donner la quantité totale commandée par le buveur Bac" SELECT Sum (qte) FROM Commandes, Buveurs WHERE Buveurs.nom= 'Bac' AND Buveurs.num=Commandes.nb
Exemples de partitionnement " Donner, pour chaque cru, la moyenne des degrés des vins de ce cru …" SELECT cru, AVG(degre) FROM Vins GROUP BY cru " … avec un tri par degré décroissant" ORDER BY 2 DESC " … uniquement si ce cru concerne plus de 3 vins" HAVING COUNT(*)>=3
Calcul de la partition 13 Tavel 12 Pommard 11 degre cru Vins initiale Trier la relation selon les attributs de groupement Créer une sous-relation pour chaque paquet ayant même valeur sur l'attribut sur l'ensemble des attributs de groupement, ici « cru » Appliquer la clause SELECT sur chaque partition (dans notre exemple la valeur de cru et la moyenne des degrés sur la partition Unifier les résultats Appliquer la restriction du HAVING 13 Tavel 12 11 Pommard degre cru Vins et et 12 Tavel 12,5 Pommard degre cru Vins
Synthèse Tri des tuples obtenus en (4) suivant les valeurs Al <liste d’attributs Al ou n° ordre dans le SELECT> ORDER BY 5 Sélection des groupes de (3) vérifiant C2 <condition sur groupes -fonctions> : C2 HAVING 4 Partitionnement de l’ensemble obtenu en (2) suivant les valeurs Ak <liste attributs Ak Aj> GROUP BY 3 Sélection des tuples de (1) respectant la condition C1 <Conditions sur les tuples> : C1 WHERE 2 Produit cartésien des relations Ri <liste de relations Ri> FROM 1 Projection de l’ensemble obtenu en (5) sur les Aj, calcul des expressions, calcul des fonctions (appliquées aux groupes s’il y en a) sur Ap <liste et/ou expressions attributs Aj et/ou fonctions sur Attributs Ap> SELECT 6
Synthèse (2) Condition de recherche : Condition élémentaire : WHERE (sélection de tuples), HAVING (sélection de groupes) Compositions de conditions élémentaires (AND, OR, NOT) Évaluée à Vrai ou Faux Condition élémentaire : Évaluée à Vrai ou Faux Prédicat : Comparaison : =, <, <=, >, >=, <> Attribut/valeur Attribut/attribut Intervalle :BETWEEN Chaîne : LIKE Nullité : IS NULL Appartenance : IN Quantification : EXISTS, ANY, ALL
Exemple complet "Donnez par ordre croissant le nom et la somme des quantités commandées par des buveurs bordelais, uniquement si chaque commande est d'une quantité strictement supérieure à 20 litres." SELECT B.nom, Sum(C.qte) FROM Buveurs B, Commandes C WHERE B.num=C.nb AND B.ville = 'Bordeaux' GROUP BY B.num, B.nom HAVING MIN(C.qte) > 20 ORDER BY B.nom
Mise à jour Insertion Suppression Modification
Insertion Insertion d’un seul tuple Insertion d’un ensemble de tuples INSERT INTO Vins VALUES (100, 'Jurançon', 1979, 12) INSERT INTO Vins (num, cru) VALUES (200, 'Gamay') Insertion d’un ensemble de tuples CREATE TABLE BORDEAUX(num Integer, annee Integer, degre number(4,2)) INSERT INTO BORDEAUX SELECT num, annee, degre FROM Vins WHERE cru = 'Bordeaux' CREATE TABLE BORDEAUX AS
Suppression "Supprimer tous les tuples de Vins" DELETE FROM Vins ou TRUNCATE TABLE Vins "Supprimer le vin de numéro 150" DELETE FROM Vins WHERE num = 150 "Supprimer les vins de degré <9 ou >12" WHERE degre < 9 OR degre > 12 "Supprimer les commandes passées par Belaïd" DELETE FROM Commandes WHERE nb IN ( SELECT num FROM Buveurs WHERE nom= ‘Belaïd')
Modification « Le producteur 150 habite dans le sud ouest » UPDATE Producteurs SET region = ‘Sud Ouest' WHERE num = 150 « Les degrés des Gamays augmentent de 10 % » UPDATE Vins SET degre = degre * 1.1 WHERE cru = 'Gamay' « Le buveur ‘Bac’ augmente ses commandes de 10 unités » UPDATE Commandes SET qte = qte + 10 WHERE nb IN ( SELECT num FROM Buveurs WHERE nom='Bac')
Vues relationnelles Objectifs : Indépendance logique Adaptation aux applications Intégration des applications existantes Dynamique du schéma de la base Confidentialité et sécurité Décentralisation de l’administration d’une BD Hétérogénéité des modèles
Vues relationnelles Relation virtuelle Définie par une requête SQL Ensemble de tuples n ’existe pas physiquement Calculable à l ’exécution Définie par une requête SQL Utilisable comme une relation Utilisable pour définir une autre vue Le modèle relationnel, grâce à la manipulation ensembliste des données, autorise la définition d’un ensemble particulier de tuples à l’aide d’un critère de recherche. Ces tuples peuvent être composés à partir de plusieurs relations de base. Le résultat de n’importe quelle requête est une relation au même titre que n’importe quelle relation effectivement implantée en machine: le résultat d’une requête peut servir de base à l’expression d’une autre requête.
Exemples Create view crus (nom) as select distinct cru from vins; Create view buveurs_beaujolais_paris (num, nom, qté_cdée) as select B. nb, B.nom, sum(qté) from buveurs B, cdes C, Vins V where B. nb = C.nb and C.nv=V.nv and V.cru = ‘ Beaujolais’ and B.ville = ‘Paris’ group by B. nb, B.nom;
Manipulation de la BD au travers des vues Consultation Toujours possible Nom de la vue dans la clause from SELECT * FROM vins_beaujolais; Mises à jour : Rarement possible Une vue peut être référencée dans un ordre SELECT au même titre qu’une relation. Tout se passe comme cette vue était une relation pour l’utilisateur. En fait, cette relation est virtuelle: seule la définition de la vue est stockée.
Transactions Ensemble logique d'opérations élémentaires sur une BD (unité de traitements séquentiels). Une transaction fait passer la BD d'un état cohérent à un autre état cohérent Ensemble de requêtes consultatives, modificatives
Exemple de transaction T1: virement d'une somme N. T2: dépôt d'une somme M. Transaction T1 Transaction T2 DEBUT B := Lire(X) A := Lire(X) B := B + M A := A - N X := Ecrire(B) X := Ecrire(A) FIN A := Lire(Y) A := A + N Y := Ecrire (B) FIN
Propriétés d'une transaction (assurées par le SGBD) Atomicity Consistency Isolation Durability
Atomicity Une transaction est un ensemble de traitement qui doit être effectué dans sa totalité ou pas du tout (principe du tout ou rien). Mécanisme de validation (commit), système de reprise après panne.
Consistency Une transaction doit faire passer la BD d'un état cohérent à un autre état cohérent (respect des CI). Développeurs d'application.
Isolation Une transaction ne doit pas laisser voir ses modifications à une autre transaction tant qu'elle n'est pas validée (COMMIT). Contrôle de concurrence, sérialisation, verrouillage
Durability Les modifications réalisées par une transaction ne doivent pas être perdues une fois celle-ci validée. La fin de transaction est un point de non-retour, mécanisme de reprise. Le SGBD garantit la propagation et la persistance des modifs
Le WWW
Le système WWW architecture de base les standards du Web le stockage des documents la protection des documents extensibilité du Web synthèse
Vocabulaire Système programme exécutable processus "classique" processus "multi-thread"
Vocabulaire Système Programme exécutable un programme exécutable est un objet inerte qui est le résultat d’une compilation suivie d’une édition de liens
Vocabulaire Système Processus "classique" objet dynamique correspondant à l’exécution d’un programme exécutable un processus comporte: le code du programme les données du programme le contexte d'exécution chaque processus possède son propre espace d’adressage
Vocabulaire Système Processus "multi-thread" un processus définit un ensemble de ressources système un thread est une activité correspondant à un flot d’exécution dans le contexte d’un processus plusieurs thread peuvent s'exécuter en parallèle dans le contexte d'un processus, en partageant ses ressources
Vocabulaire Système Critique des thread avantages limite le nombre de processus optimise l'utilisation des ressources autorise le parallélisme inconvénients synchronisation des différents thread risque de "corruption" d'un thread par un autre thread
Utilisation des threads Implantation efficace d ’un serveur de requêtes un thread pour servir une requête et non pas un processus pour éviter le coût de lancement d ’un thread/processus on peut gérer un pool
WWW - Architecture de base HTTP Client W3 Serveur W3 page HTML affichée pages HTML système de fichiers chaque page possède un URL
WWW - Le client W3 logiciel de consultation hypertexte interprète et affiche le texte HTML affiche le texte plat sans interprétation visualise les images fixes gif, jpeg et x-bitmap contient des plug-in ou des visualiseurs externes spécialisés pour divers formats son, image animée, Postcript, ..
WWW - Le serveur W3 fonctions assurées gère les connexions des clients W3 assure la protection des documents statiques (HTML, images, ..) vérifie la validité des requêtes et les droits des clients exécute les requêtes des clients renvoyer un document statique exécuter un programme externe
WWW - Le protocole HTTP HTTP est un protocole simple (GET, EXEC, HEAD, ...) HTTP est un protocole sans session la nouvelle version HTTP 1.1 permet de maintenir une connexion persistante HTTP est un protocole peu sécurisé évolution avec S-HTTP (Secure) du NCSA ou SSL (Secure Socket Layer) de Netscape
WWW - Stockage des documents système de fichiers de la machine serveur arborescence de fichiers par défaut, à partir du serveur W3 avec un répertoire racine fixé par l'administrateur à partir d’un compte utilisateur avec le répertoire racine /public_html un fichier de l’espace de stockage W3 doit être en lecture pour tous
WWW - Protection documents protections standard du système d’exploitation protections propres au système Web pour accéder un document accès avec un nom utilisateur et un mot de passe accès à partir d’un domaine IP accès depuis une machine particulière
WWW - Architecture étendue protocole dédié HTTP CGI script CGI client W3 serveur W3 appli externe BD ou système de fichiers form W3 page W3 système de fichiers Pages HTML statiques Pages HTML dynamiques
WWW - Les formulaires HTML un formulaire autorise l’interactivité entre le client et le serveur un formulaire contient: des zones de saisie avec des boutons, des listes de choix, .. un attribut action qui définit l'URL d'un programme exécutable sur le serveur un attribut method qui définit le mode de transfert des données vers le programme
Exemple de formulaire <html><body> <form name="f1" action="http://www-inf.int-evry.fr/prog.cgi" method="get" target="resultat"> Donner une valeur pour att1 : <input name="att1" value="0"> <input type="hidden" name="att2" value=""> <input type="submit" value="lancer"> </form> </body></html>
Programme CGI Interface CGI définit le moyen de passer des informations du client vers le prog. CGI et retour un prog. CGI reçoit un seul argument de type chaine de caractères cette chaine se décompose en couples attributs-valeurs deux modes de transmission GET et POST
Programmation CGI (suite) Programme CGI doit décoder la chaine pour extraire les paramètres il renvoie son résultat sur sa sortie standard en ayant préalablement déclaré le type (content-type: text/html par exemple) langages utilisés : Perl souvent, mais on peut choisir n'importe lequel
Exemple de CGI en Perl #!/usr/bin/perl -w use CGI qw (:standard); $ior = param('IOR'); print header; print "<HTML><HEAD>\n"; print "<TITLE>Résultat décodage IOR</TITLE></HEAD>\n"; print "<H4>IOR décodé</I></H4><BR>"; print "<HR WIDTH=80%><BR>\n"; open(FILE, "-|") || exec "/inf/QOS_CORBA/Olivier/bin/iordump", "-f", $ior; while ($LIG=<FILE>) { print "$LIG<br>\n"; } close(FILE); print "</BODY>\n"; print "</HTML>\n";
WWW - Programmation CGI communication serveur W3 <->script CGI: un ensemble de variables d’environnement l’entrée standard du processus CGI en exécution la sortie standard du processus CGI en exécution le problème de la sécurité exécution du script avec le minimum de droits éviter l'accessibilité du code source du script vérifier les données en provenance du formulaire
WWW - Formulaires et CGI principe de fonctionnement l’utilisateur remplit un formulaire le formulaire est envoyé au serveur W3 le serveur positionne les variables d'env. CGI le serveur lance l'exécution du script CGI et lui passe le contenu du formulaire le script CGI fabrique le document et le renvoie au serveur W3 sur sa sortie standard le serveur renvoie le document au client
WWW - Formulaires et CGI (2) contenu d'un formulaire chaîne de caractères représentant une liste d'éléments de la forme (champ,valeur) méthode GET la chaîne est ajoutée à l'URL désignant le script elle est mise dans la var. d'env. QUERY_STRING méthode POST la chaîne est envoyée dans une séquence http spéciale elle est transmise au script sur son entrée standard
WWW - Problème du CGI Process 1 Client 1 C G I Process 1 Client 2 du serveur Process 1 Client 2 Serveur W3 Process 1 Client 3 Scripts CGI
WWW - Solution des API Client 1 Serveur W3 Thread 1 API Client 2 Process du serveur Thread 2 ensemble de fonctions Thread 3 Client 3 les scripts CGI deviennent des fonctions d'une librairie dynamique DLL, exécutées dans des thread du process serveur W3
FastCGI Genre de script CGI persistant (démon) script décomposé en 3 parties : initialisation : une fois corps : à chaque requête terminaison : une fois initialisation doit inclure le code coûteux (connexion à une BD, …) bien adapté à un accès BD, mais une fois lancé est persistant
WWW - Intérêts du Web client universel facilité d'emploi standards ouverts intégration des autres services Internet extensibilité du système faibles coûts logiciel et réseau utilisation au sein d'une entreprise (Intranet)
WWW - Limites du Web les performances la sécurité le réseau Internet => augmenter le débit les scripts CGI => solution FastCGI la sécurité HTTP => version sécurisée S-HTTP niveau TCP/IP => solution SSL
WWW - Limites du Web (2) la gestion des transactions pas possible avec HTTP 1.0 ne travaille pas en mode session une solution est d'utiliser des "cookies" la version HTTP 1.1 intègre la notion de connexion persistante (au niveau TCP) la construction d’interfaces utilisateur limitation de HTML dans sa version actuelle utilisation de Java
WWW - Evolution du Web initialement aujourd'hui accès à des informations réparties sur un réseau sous la forme de documents hypermédia aujourd'hui développement et exécution d'applications client/serveur, hétérogènes au sein d'une même organisation (Intranet)
Architecture des passerelles BD/WEB
Interfacer le Web et les BD Principes des passerelles Exemples des solutions Microsoft IDC ASP Passerelle Web/Oracle INT Solutions Java (applets, servlets, JSP)
Principes des passerelles
Principes des passerelles Passerelles mono-requête Passerelles multi-requêtes (transactionnelles)
Fonctionnalités à assurer (1) décodage de la requête http (passage var. environnements vers SQL) (2) exécution de la requête sur le SGBD (3) formatage HTML du résultat
Exécution d ’une requête SQL Programme écrit avec une interface BD solution dépendante du SGBD solution indépendante du SGBD (ODBC, JDBC ou DBI pour Perl) Langages de programmation utilisables classiques : C, C++, Ada, … si embedded SQL Perl (avec DBI)
Habillage HTML du résultat Solution générique (et automatisable) : select : tableau HTML autre requête : chaine de caractères Solution spécifique : codage spécifique pour chaque requête dans la passerelle (une passerelle / requête !) dans le SGBD (procédure stockée) Solution intermédiaire : paramétrisation du résultat (formulaire de mise à jour, parcours hypertexte d ’une BD ,…)
Accès à la BD (html pur) Serveur HTTP CGI url résultat html query string rés. HTML Client browser Passerelle SQL résultat SGBD
Exemple HTML pur <html><body> <form name="f1" action="http://mica/multi2.cgi" method="get"> <input type="hidden" name="uid" value="citcom/citcom@MICA"> <input type="hidden" name="sqlstatement" value="select * from vins where cru="> Donner un cru : <input name="vcru" value=""> <p> <input type="submit" value="lancer"> </form> </body></html>
Accès à la BD (script client) Serveur HTTP query string Passerelle url résultat html rés. HTML SQL résultat Client browser SGBD
Exemple HTML avec Javascript <html><body> <form name="f1" action="http://mica/multi2.cgi" method="get"> <input type="hidden" name="uid" value="citcom/citcom@MICA"> <input type="hidden" name="sqlstatement" value="select * from vins where cru="> Donner un cru : <input name="vcru" value=""> <p> <input type="button" value="lancer" onClick="f1.sqlstatement.value+=f1.vcru.value; f1.submit();"> </form> </body></html>
Accès à la BD (hors http) SGBD protocole spécifique Client browser + programme Java, Tcl, ... protocole spécifique : JDBC, IIOP (CORBA)
Qui fait quoi ? (1) (2) (3) cgi spécifique passerelle ou SGBD HTML pur script client client SGBD SGBD client hors http
Variations dépendance / indépendance par rapport au SGBD (natif ou ODBC) langage de requêtes supporté (SQL ou un sous-ensemble, statique vs dynamique) formattage du résultat (personnalisable ou non) performances
Performances CGI vers NSAPI, ISAPI (mais propriétaire) diminuer le nombre de processus (si grand nombre de clients : passerelle multithread
Transactions Rappels transaction = programme BD (séquence de lire, écrire) propriétés = ACID A : Atomicity C : consistency I : Isolation D : Durability
Exemples d’applis transactionnelles commandes on-line (vente par correspondance, train, avion, ...) banque assurance une bonne partie du e-business!!!!
Transactions et Web Transaction = séquence d’invocations url (gestion du contexte par le web?) Transaction = propriétés ACID (assurées par le SGBD) HTTP = pas de support de session gérer le contexte côté client (cookies) simuler des sessions http (web transactionnel) supporter un langage avec un run-time côté serveur (PHP, ASP, JSP, ...)
Transactions et cookies Client browser Serveur http cgi 1 1 1’ c1 1’ c1 2 c1 2 c1 2’ c1, c2 2’ c1, c2 3 fin c1, c2 3 fin c1, c2 5’ del(c1, c2) 5’ del(c1, c2) 1 : premier accès 1’ : retour du cookie c1 2 : autre accès avec transport du cookie c1 2’ : retour des cookies c1, c2 3 : fin transaction avec transport c1, c2 4 : construction de la transaction et exécution sur le SGBD 5’ : suppression des cookies 4’ ok 4 sql(c1, c2) SGBD
Transaction et cookies (2) Contexte est géré chez le client (cookies) avantages : simplicité de la mise en œuvre accès en maj de la BD se fait en une fois à la fin (pas de ressources bloquées) si pas de terminaison de la transaction par l ’utilisateur, rien à faire
Transaction et cookies (3) Inconvénients pas vraiment transactionnel fonctionnalité limitée beaucoup de cgi à écrire (sauf programme de maj générique qui prenne une séquence d ’instructions SQL en entrée) Problèmes des cookies global à l ’utilisateur (pas de différenciation entre fenêtres) global à une url (pas deux transactions en même temps sur le même site)
Passerelle transactionnelle Client browser Serveur http cgi démon passerelle SGBD
Passerelle transactionnelle principes Contexte géré par un démon côté serveur besoin d ’un identifiant de transaction stocké côté client (cookie ou variable selon client) et côté démon (dans une table) passerelle ne traite pas une seule requête mais toute une transaction (plusieurs requêtes)
Passerelle transactionnelle Fonctionnement (1) 1 : demande de création de transaction (implicite ou explicite) allocation d ’un idf par le démon, maj de la table des transactions, lancement d ’une passerelle, renvoi de l ’idl au client (cookie ou variable) 2 : demande d ’opérations sur la BD routage de la demande par le démon sur la bonne passerelle en utilisant l ’idf et sa table
Passerelle transactionnelle Fonctionnement (2) 3 : terminaison de la transaction implicite : plantage, timeout explicite : idem 2 + maj de la table des transactions, annulation de l ’idf côté client et arrêt de la passerelle
Passerelle transactionnelle Bilan Avantages vraiment transactionnel solution générique Inconvénients architecture complexe blocage des ressources nécessité de détecter un « abandon » de l ’utilisateur (timeout)
Support d ’un langage Offrir un langage de programmation intégré au Web (possibilité de faire des appels depuis une page Web, support par le serveur HTTP) run-time du langage offre un support de session (donc de transactions) PHP, servlet - JSP, ASP, XSP (Cocoon) voir partie sur Java pour plus de détails
Quelques solutions industrielles Passerelles BD/WEB Quelques solutions industrielles
Solutions industrielles Solutions Microsoft IDC ASP Passerelle Web/Oracle INT Solution Java appels, servlets, JSP
Web/BD - La solution Microsoft Internet Information Server (IIS) serveur W3 de Microsoft fourni avec Windows NT 4.0 possède une API propriétaire: ISAPI Internet Database Connector (IDC) un composant de IIS sous la forme d'une librairie dynamique httpodbc.dll s’appuie sur ODBC pour accéder une BD SQL
Web/BD - IIS + IDC Architecture .htx SQL (via API ODBC) HTTP pilote SQL Server client W3 IIS IDC ODBC SQL (via API SQL Server) .idc SQL Server BD ISAPI
Web/BD - IIS + IDC Contenu d’un fichier .idc nom de la source de données ODBC nom utilisateur et mot de passe pour la connexion à la source de données accès BD en interrogation ou maj via: une requête SQL un appel de procédure stockée référence vers le fichier .htx
Web/BD - IIS + IDC Contenu d’un fichier .htx code HTML étendu avec des balises spécifiques à IDC délimitées par <%%> <%begindetail%>, <%enddetail%> <%if%>, <%else%>, <%endif%> <%nom de variable%> modèle de présentation de la page Web fabriquée à partir des données extraites de la base de données
Web/BD - IIS + IDC Fonctionnement le client W3 invoque un fichier .idc soit comme un lien HREF soit comme un script de formulaire réception de l’URL par IIS IIS appelle la librairie dynamique IDC IDC utilise le fichier .idc pour: se connecter à la source de données ODBC lui adresser la requête SQL
Web/BD - IIS + IDC Fonctionnement IIS+IDC (2) ODBC exécute la requête SQL et renvoie les données de la BD à IDC IDC récupère les données de la BD IDC met les données au format HTML en utilisant le fichier .htx IDC renvoie la page Web au serveur IIS IIS renvoie la page Web au client W3
Web/BD - IIS + IDC Formulaire avec un script .idc <form method=“post” action=“/scripts/bigsal.idc”> <p> Donnez salaire: <input name=“sal” value=“10000> <input type=“submit” value=“go”> </form>
Web/BD - IIS + IDC Un exemple de fichier .idc Datasource: personnel Username: scott Template: bigsal.htx SQLStatement: + select nom, sal +from personnel +where sal > %sal%
Web/BD - IIS + IDC Un exemple de fichier .htx <html> <head><title>Gros salaires</title></head> <body> <%begindetail%> <%if CurrentRecord eq 0%> <b>Voici les gros salaires > <%idc.sal%></b><br> <%endif%> <%nom%><%sal%> <%enddetail%> <p>
Web/BD - IIS + IDC Un exemple de fichier .htx (2) <%if CurrentRecord eq 0%> <i>Désolé, pas de salaire sup. à <%idc.sal%> </i> <%else%> <h2>Page Web créée par IDC</h2> <%endif%> <p> </body> </html>
Web/BD - IIS + IDC Critique avantages relativement simple à mettre en oeuvre plus performant que le CGI ouverture vers les SGBD ODBC inconvénients solution propriétaire (IIS et ISAPI) pas de gestion de transactions pas d'outil de développement (sauf IIS Add-In)
Interface BD/Web les ASP (Microsoft) Solution Microsoft la plus complète et la plus puissante ASP programmes s ’exécutant côté serveur (généralise CGI et ISAPI) permet l ’utilisation de contrôles ActiveX et d ’applets JAVA interface BD à travers un composant spécifique ADO
Principe ASP Serveur Client Browser Page demandée Page active ASP Vbscript ou Jscript Données Ajout enveloppe HTTP Décodage HTTP Encodage HTTP Page dynamique
Architecture générale Internet Appli. ISAPI IIS Appli. CGI Scripts Perl, AWK DLL Interface ASP SSinclude Interprète VBscript Interprète Jscript Composant ADO Pilote ODBC Composants personnalisés Composants Active Server Données Pages actives (fichiers ASP)
Plan d ’une page ASP Sections HTML normales <HEAD> … </HEAD> <BODY> <% …………….. %> <SCRIPT LANGUAGE=Vbscript> </SCRIPT> <SCRIPT LANGUAGE=Vbscript RUNAT SERVER> <!--#Include … --> <TABLE> </TABLE> </BODY> </HTML> Sections HTML normales Script serveur (création page) Script client (interprétation page) Script serveur (procédures, fonctions) SSI (script ou HTML dans fichier séparé) HTML normal
Le modèle objet d ’ASP Client Serveur Objet REQUEST Collections : Cookies Form QueryString ServerVariables ClientCertificate Objet RESPONSE Collection : Cookies (propriétés et méthodes) Objet APPLICATION (propriétés et méthodes) Objet SESSION (propriétés et méthodes) Objet SERVER (méthodes)
Composants ASP standards Content Linking (liste de liens) Browser Capabilities (caractéristiques du navigateur) Ad Rotator (gestion de flashes publicitaires) Active Database (accès aux BD)
Accès à la BD (ADO) Active Server Pages Composant Active Database ADO Source de données Pilote ODBC Interface du fournisseur d ’accès
Le modèle objet ADO Objet Connection Objet RecordSet Objet Property Collection Properties Objet Field Collection Fields Objet Command Objet Property Collection Properties Objet Parameter Collection Parameters Objet Error Collection Errors Objet Property Collection Properties
Exemple de transaction Set oConn = Server.CreateObject(« ADODB.Connection ») oConn.Open « Contacts » oConn.BeginTrans oConn.Execute « DELETE * FROM Contact WHERE State=‘ LA ’ » Nberror = oConn.Errors.Count oConn.Execute « DELETE * FROM Names WHERE State=‘ LA ’ » Nberror=Nberror + oConn.Errors.Count if Nberror = 0 Then oConn.CommitTrans Else oConn.RollbackTrans End If oConn.Close Set Oconn = Nothing
Exemple de fichier ASP <HTML> <HEAD> // ATTENTION LES COMMENTAIRES RAJOUTES NE SONT PAS CONFORMES A LA SYNTAXE ASP // SI ON VEUT EXECUTER LE FICHIER DANS UN CONTEXTE ASP IL FAUT ENLEVER // TOUTES LES LIGNES COMMENCANT PAR // <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=windows-1252"> <TITLE>Logiciel</TITLE> </HEAD> <BODY> // RECUPERATION DANS LA QUERYSTRING DES VALEURS DES VARIABLES PARAM // ET DATA (SI ELLES EXISTENT) <% Param = Request.QueryString("Param") Data = Request.QueryString("Data") %> // TEST DE L'EXISTENCE D'UNE SESSION WIZ_conn // SI OUI ON POSITIONNE conn SINON ON EN CREE UNE NOUVELLE If IsObject(Session("WIZ_conn")) Then Set conn = Session("WIZ_conn") Else Set conn = Server.CreateObject("ADODB.Connection") conn.open "WIZ","","" Set Session("WIZ_conn") = conn End If
Exemple ASP (2) // PREPARATION DE LA REQUETE SQL A EXECUTER <% sql = "SELECT * FROM [Logiciel]" If cstr(Param) <> "" And cstr(Data) <> "" Then sql = sql & " WHERE [" & cstr(Param) & "] = " & cstr(Data) End If // ON CREE UN OBJET RECORDSET QUI VA PERMETTRE D'ACCEDER AU RESULTAT // DE LA REQUETE Set rs = Server.CreateObject("ADODB.Recordset") // ON LANCE LA REQUETE EN PASSANT EN ARGUMENTS LA CHAINE REPRESENTANT // LA REQUETE ET L'OBJET SESSION rs.Open sql, conn, 3, 3 %> // AFFICHAGE DU RESULTAT SOUS FORME DE TABLE <TABLE BORDER=1 BGCOLOR=#ffffff CELLSPACING=0><FONT FACE="Arial" COLOR=#000000><CAPTION><B>Logiciel</B></CAPTION> <THEAD> <TR> <TH>CléLogiciel></TH> <TH >NomLogiciel></TH> <TH>PrixVente></TH> <TH>PrixAchat></TH> <TH>Stock></TH> <TH>Photo></TH> <TH>Détails></TH> </TR> </THEAD> <TBODY>
Exemple ASP (3) // ON SE POSITIONNE SUR LE PREMIER ELEMENT DU RESULTAT <% On Error Resume Next rs.MoveFirst // TANT QUE IL RESTE DES TUPLES A TRAITER do while Not rs.eof %> // TRAITEMENT D'UN TUPLE (AFFICHAGE EN FORMAT HTML DE CHACUN DES ATTRIBUTS) <TR VALIGN=TOP> <TD><%=Server.HTMLEncode(rs.Fields("CléLogiciel").Value)%><BR><TD> <TD><%=Server.HTMLEncode(rs.Fields("NomLogiciel").Value)%><BR></TD> <TD><%=Server.HTMLEncode(rs.Fields("PrixVente").Value)%><BR></TD> <TD><%=Server.HTMLEncode(rs.Fields("PrixAchat").Value)%><BR></TD> <TD><%=Server.HTMLEncode(rs.Fields("Stock").Value)%><BR></TD> <TD><BR></TD> <TD><><%=Server.HTMLEncode(rs.Fields("Détails").Value)%><BR></TD> </TR> // TUPLE SUIVANT rs.MoveNext // FIN TANT QUE loop%> </TBODY> <TFOOT></TFOOT> </TABLE> </BODY> </HTML>
Bibliographie Interface entre web et bases de données sous windows NT, A. Homer, D. Gill, S. Jakab, Eyrolles 1998 http://www.activeserverpages.com http://www.asphole.com http://www.15seconds.com
Passerelle BD/Web INT Passerelle « mono-requête » dédiée Oracle (CGI écrit en Pro*C) « générique » pour l ’affichage des résultats tout se fait sur le client (variables à positionner dans le formulaire) pas de travail à faire côté serveur
Programmation de la passerelle Écriture de formulaires HTML devant déclarer et positionner des variables : obligatoires : uid (chaine de connexion Oracle), mode (NOR le plus simple), sqlstatement (instruction SQL à exécuter, peut être vide) optionnelles : title par exemple des contraintes entre les variables (une variable ne peut être positionnée si une autre ne l ’est pas également)
Exemple de formulaire <html><body> <h1>GENERATION D ’UN FORMULAIRE D ’INSERTION DANS LA RELATION VINS</h1><P></P> <form name=‘f1’ action=‘http://cgi’ mode=‘get’> <input type=‘hidden’ name=‘uid ’ value=‘toto/titi@MICA’> <input type=‘hidden’ name=‘mode’ value=‘INS’> <input type=‘hidden’ name=‘table’ value=‘VINS’> <input type=‘hidden’ name=‘sqlstatement’ value=‘’> <input type=‘button’ value=‘insertion dans VINS’ onClick=‘f1.submit();’> <P></P> </form> </body> </html>
Les modes NORmal : tableau INSertion : formulaire d ’insertion MAJ : formulaire de maj SUPpression : formulaire de suppression QBE : formulaire d ’interrogation à la QBE HYPertexte : permet une navigation hypertexte dans les clés étangères et primaires COPy : menu construit par SELECT
Support des URLs Stockage des urls dans la BD (par exemple des liens sur des fichiers images) il faut que la passerelle traite les urls (chaine de caractères) différemment nom des attributs correspondants à des urls ont un préfixe fixe (URL_ ou IMG_)
Générateur d ’application Source XML générateur Description de l ’application Formulaires HTML à personnaliser
Exemple de source XML <?xml version=« 1.0 »?> <appli> <entete> <uid>titi/toto@MICA</uid> <titre>Mon Appli</titre> </entete> <liste_form> <formulaire> <nom_table>VINS</nom_table> <mode><mode_ins></mode_ins></mode> </formulaire> </liste_form> </appli>
Solution Java
Java et le Web Notion de JVM se prête bien au Web grande diffusion du langage JDBC (API standard pour les SGBDR) Applets servlets Java Server Pages
Java - Java et le Web langage pour le client W3 applet = "petite application" Java compilée téléchargée à partir d'un serveur W3 exécution sécurisée par la JVM du client langage pour le serveur W3 servlet = application Java compilée résidant sur le serveur exécution par la JVM du serveur
JDBC API Java pour manipuler des relations via SQL (dans des fichiers locaux ou via un SGBD) Une seule API uniforme (même niveau que SQL CLI de X/open) Indépendance / SGBD cible (via des pilotes) Code portable de bout en bout Pas forcément construit au dessus de ODBC
Pilotes JDBC JDBC non supporté en natif par les SGBD du commerce (ou les systèmes de fichiers) Transformations des appels JDBC en appels natifs Un pilote pour chaque SGBD 4 catégories de pilotes en fonctions de : La présence ou non de pilote SGBD (non java) sur le client Protocole de communication entre le client Java et le serveur
Les pilotes (suite) API JDBC Driver ODBC (c/c++) Application Java Commutateur JDBC (Driver Manager) JDBC NetDriver (Java) Pont JDBC-ODBC (Java) Driver Java ou Java/C Driver ODBC (c/c++) Protocole d’accès au middleware JDBC Protocole d'accès propriétaire spécifiques aux SGBDR
Principes de programmation Quel que soit le gestionnaire de BD considéré, les phases de l’interaction sont identiques : Charger le driver Connexion à la base Création d'un statement Exécution de la requête Récupération des résultats Gestion transactionnelle (commit/abort)
Classes et interfaces du "paquage"java.sql Driver Statement Connection ResultSet ResultSetMetaData DatabaseMetaData PreparedStatement CallableStatement Java.lang.Object Java.util.Date DriverManager DriverPropertyInfo Types Date Time TimeStamp
Connexion JDBC Classe java.sql.Connection URL d’une source de données jdbc:<subprotocol>:<subname> jdbc:oracle:oci8:@ jdbc:oracle:thin:@mica:1521:ENSE jdbc:msql//athens.com:4333/db_test
Connexion à la base (suite) Class.forName("oracle.jdbc.driver.OracleDriver"); chargement dynamique de la classe implémentant le pilote Oracle String dburl = "jdbc:oracle:thin:@mica:1521:ENSE"; construction de l’url pour Oracle INT Connection conn = DriverManager.getConnection(dburl, "toto", "titi"); connexion à l’url avec un (user, passwd)=(toto, titi)
Création d'un Statement Un objet Statement symbolise une instruction SQL 3 types de statement : Statement : requêtes simples PreparedStatement : requêtes précompilées CallableStatement : procédures stockées Création d'un Statement : Statement stmt = conn.createStatement();
Execution d'une requête (1/2) 3 types d'executions : executeQuery : pour les requêtes qui retournent un ensemble (SELECT) executeUpdate : pour les requêtes INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE execute : pour quelques cas rares (procédures stockées)
Execution d'une requête (2/2) Execution de la requête : String myQuery = "SELECT nom, adresse " + "FROM client " + "WHERE (nom=’L%') " + "ORDER BY nom"; ResultSet rs = stmt.executeQuery(myQuery);
Récupération des résultats (1/2) executeQuery() renvoit un ResultSet Le RS se parcourt itérativement ligne par ligne Les colonnes sont référencées par leur numéro ou par leur nom L'accès aux valeurs des colonnes se fait par les méthodes getXXX() où XXX représente le type de l'objet ou bien par un getObject suivi d’une conversion explicite Pour les types longs, on peut utiliser des streams.
Récupération des résultats (2/2) java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { // print the values for the current row. int i = rs.getInt("a"); String s = rs.getString("b"); byte b[] = rs.getBytes(3); System.out.println("ROW = " + i + " " + s + " " + b[0]); }
Exemple de SQL dynamique Class Employe { ... Public static int updateEmploye(int num, String nom) throws SQLException, ClassNotFoundException { try { Class.forName("oracle.jdbc.driver.OracleDriver"); String dburl "jdbc:oracle:thin:@mica:1521:ENSE"); Connection conn = DriverManager.getConnection(dburl, "toto", "titi"); conn.setAutoCommit(false); PreparedStatement pstmt = conn.prepareStatement("UPDATE Employe SET salary=?, name=?, WHERE numemp=?"); PSMT.setNull(1); psmt.setString(2, nom); psmt.setInt(3, num); int nbLignesModifiees = psmt.executeUpdate(); if (nbLignesModifiees == 1) conn.commit(); else conn.rollback(); } catch (Exception e) {e.printStackTrace();} }
Accès aux méta-données La méthode getMetaData() permet d'obtenir les méta- données d'un ResultSet. Elle renvoit des ResultSetMetaData. On peut connaitre : Le nombre de colonne : getColumnCount() Le nom d'une colonne : getColumnName(int col) Le type d'une colonne : getColumnType(int col) ...
Exemple de MetaData Class HTMLResultSet { private ResultSet rs; public HTMLResultSet (ResultSet rs){this.rs=rs;} public String toString() { StringBuffer out = new StringBuffer(); out.append("<TABLE>"); ResultSetMetaData rsmd=rs.getMetaData(); int numcols=rsmd.getColumnCount(); out.append("<TR>"); for (int i=0;i<numcols;i++) { out.append("<TH>").append(rsmd.getColumnName(i)); } out.append("</TR>"); ...
Correspondance de type SQL/Java
JDBC et la sécurité Respecte les principes sécurité de Java application et trusted applets : accès bases locales et serveur BD Untrusted applets ou untrusted JDBC driver connexion seulement au site de chargement
Evolution de JDBC JDBC 1.0 (janvier 1996) JDBC 2.0 (Mars 1998) Extensions de JDBC 2.x parcours avant/arrière d’un ResultSet mise à jour depuis un ResultSet batch de plusieurs ordres SQL support des types SQL3 validation 2 phases via XA notion de DataSource et utilisation de JNDI pool de connexion, cache sur le client
SQLJ Initiative de plusieurs éditeurs (Oracle, IBM, ...) Offre une interface de plus haut niveau que JDBC (moins de code à écrire) Peut se mixer avec du JDBC (pas de SQL dynamique p.e dans SQLJ) SQLJ compilé en JDBC
Exemples SQLJ public static void updateDuration(String projName, int numDays) throws SQLException { #sql {UPDATE projects SET duration=duration+:numDays WHERE id=:projName}; #sql {COMMIT}; } public static voidlistOpenProjects() throws SQLException { ProjIter projs=null; // déclaration de l'instance d'itérateur #sqlprojs={SELECT start_date, name FROM projects }; while(projs.next()) { System.out.println("Projet "+ projs.name() + "commence le "+projs.start_date()); projs.close(); }
Applets Programme Java pouvant être téléchargé depuis un serveur Web et exécuté dans le contexte d'un navigateur attention à ce que la version de la JVM du navigateur soit compatible avec celle du développement de l'applet
Applet (exemple) Hello.html HelloWorld.java <html><body> <h2>Test d'applet</h2> Voici le test : <applet code="HelloWorld.class"> </applet> </body></html> HelloWorld.java import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint (Graphics g) { g.DrawString("HelloWorld!", 50, 25); } }
Servlets Servlet 2.2 (http://java.sun.com/servlet) Tomcat implantation pour Apache équivalent du CGI pour Java extensions au CGI (session, bufferisation, redirection/chainage)
Architecture servlet Client Serveur navigateur HTTP Web Servlet container servlet1 servlet2 Container gère les servlets (activation, désactivation)
Modèle d ’objets servlet Objet session getAttribute Objet request servlet1 Objet Response getParameter getAttribute getHeaders getCookies setBufferSize setHeader setRedirect
JSP JSP 1.1 (http://java.sun.com/jsp) Tomcat implantation pour Apache inclusion de script dans des pages HTML équivalent de ASP, PHP pour Java est compilé sous forme de servlet portabilité de Java extensibilité du langage de script serveur via les librairies de tag
Exemple de page JSP <html> <%@ page language=« java » import=« java.util.* » %> <h1>Bienvenue</h1> <p>Jour : <p> <jsp:usebean id=« clock » class=« jspCalendar »/> <ul><li>Jour : <%= clock.getDayOfMonth() %> <li>Annee : <%= clock.getYear() %></ul> <%-- Test pour AM ou PM --%> <%! Int time = Calendar.getInstance().get(Calendar.AM_PM); %> <% if (time == Calendar.AM) { %> Good Morning <% } else { %> Good Afternoon <% } %> <@ include file=« copyright.html » %> </html>
Composants d ’une page JSP (1) JSP actions (ou tags) : permet d ’appeler des beans (syntaxe XML) directives : traitées par le moteur JSP lors de la compilation de la page en servlet (include, import, ...) déclarations : comme en Java
Composants d ’une page JSP (2) expressions : variables ou constantes intégrées dans la page résultat scriplets : blocs de code Java intégrés dans une page JSP commentaires
Tags personnalisés On peut ajouter ses propres tags pour simplifier l ’écriture de pages JSP librairies de tags mécanisme de définition de nouveaux tags (assez complexe)
Exemple d ’utilisation de tags <html> <%@ taglib uri=« http://acme.com/taglibs/simpleDB.tld »prefix=« x » %> <x:queryBlock connData=« defude/bruno@MICA »> <x:queryStatement>select num, cru from vins</x:queryStatement> Les 10 premiers vins sont : <table> <tr><th>Numero</th><th>Cru</th> <x:queryCreateRows from =« 1 » to=« 10 »> <td><x:queryDisplay field=« num »/></td> <td><x:queryDisplay field=« cru »/></td> </x:queryCreateRows> </table> </x:queryBlock> </html>
Exemple (suite) Définition d ’un tag queryBlock lui même composé d ’autres tags (queryStatement, queryCreateRows) permet de cacher JDBC au codeur de la page un tag est défini par un descipteur (document XML) + une classe Java l ’implémentant
Evolution du WWW Le monde XML
De SGML à XML SGML Inventé par Charles Goldfarb, juriste chez IBM. Du balisage typographique au balisage logique. HTML Inventé par Tim Berners-Lee comme langage de description des pages du Web. Concept d’ancre : hypertexte. HyTime Langage très ambitieux pour la description des liens intra et inter documents. XML Une synthèse de SGML, HTML et HyTime.
Le monde XML (ou plutôt un extrait !)
Qu'est XML? Extensible Markup Language une syntaxe pour des documents un méta-langage de balisage une façon de représenter de l'information n'est pas réservé aux pages Web
XML est un méta-langage Permet de se définir ses propres "tags" les "tags" peuvent être définis dans une grammaire associée au document (DTD et bientôt schémas) permet de définir des langages de balises spécialisés (MathML, MusicML, XHTML, ...)
XML ne décrit pas la présentation Un document XML est un arbre les noeuds de l'arbre sont des éléments qui peuvent être qualifiés par des attributs la présentation est définie à l'extérieur du document, soit via CSS, soit via XSL
Pourquoi utiliser XML Langages de balisages spécialisés données auto-descriptives échange de données entre applications publication de documents
Itinéraires skieurs dans la Vallée de la Clarée Un exemple de document Itinéraires skieurs dans la Vallée de la Clarée par Jean-Gabriel Ravary Le Polygraphe, éditeur 1991 Vallon des Muandes Vallon situé à l’est du refuge des Drayères. Le vallon le plus utilisé pour la traversée sur la Vallée Etroite. Ce vallon est également accessible du refuge Laval. Col de Névache (2 794 m) ** n° 1 S’élever au-dessus du refuge des Drayères en direction est. Suivre la rive droite du torrent de Brune puis s’engager sur le flanc droit du ravin des Muandes que l’on quitte vers 2500 m pour rejoindre le col situé au nord. Descente possible sur Valmeinier. Départ assez raide. Pointe de Névache (2 892 m) *** n° 2 Du col de Névache (itinéraire n° 1), suivre la ligne de crête qui mène à la pointe de Névache. Attention : corniches possibles. Crampons utiles au printemps.
Le guide “Itinéraires skieurs” en XML (1) <?xml version="1.0" encoding="ISO-8859-1" ?> <guide> <titre>Itinéraires skieurs dans la vallée de la Clarée</titre> <auteur>Jean-Gabriel Ravary</auteur> <editeur>Le Polygraphe</editeur> <annee>1991</annee> <vallon> <nom>Vallon des Muandes</nom> <intro> <para>Vallon situé à l’est du refuge des Drayères.</para> <para>Le vallon le plus utilisé pour la traversée sur la Vallée Etroite. Ce vallon est également accessible du refuge Laval.</para> </intro> ... Itinéraires ... </vallon> </guide>
Le guide “Itinéraires skieurs” en XML (2) <itineraire id="I15.1"> <nom>Col de Névache</nom><alt>2794</alt><cotation>**</cotation> <num>1</num> <para>S’élever au-dessus du refuge des Drayères en direction est. Suivre la rive droite du torrent de Brune puis s’engager sur le flanc droit du ravin des Muandes que l’on quitte vers 2500 m pour rejoindre le col situé au nord. Descente possible sur Valmeinier. <note type="prudence">Départ assez raide.</note></para> </itineraire> <itineraire id="I15.2"> <nom>Pointe de Névache</nom><alt>2892</alt><cotation>***</cotation> <num>2</num> <para>Du col de Névache <renvoi cible="I15.1"/>, suivre la ligne de crête qui mène à la pointe de Névache. <note type="prudence">Attention : corniches possibles.</note> <note type="materiel">Crampons utiles au printemps.</note></para>
DTD “Itinéraires Skieurs” <?xml version="1.0" ?> <!ELEMENT guide (titre, auteur+, editeur, annee, vallon+)> <!ELEMENT titre (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT editeur (#PCDATA)> <!ELEMENT annee (#PCDATA)> <!ELEMENT vallon (nom, intro, itineraire+)> <!ELEMENT nom (#PCDATA)> <!ELEMENT intro (para+)> <!ELEMENT para (#PCDATA | renvoi | note)*> <!ELEMENT renvoi EMPTY> <!ATTLIST renvoi cible IDREF #REQUIRED> <!ELEMENT note (#PCDATA)> <!ATTLIST note type (prudence | materiel) "prudence"> <!ELEMENT itineraire (nom, alt, cotation, num, para+)> <!ATTLIST itineraire id ID #REQUIRED> <!ELEMENT alt (#PCDATA)> <!ELEMENT cotation (#PCDATA)> <!ELEMENT num (#PCDATA)>
Présentation via XSL <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head><title>Le guide de la clarée</title></head> <body> <xsl:value-of select="."/> </body> </html> </xsl:template> </xsl:stylesheet>
Documents bien-formés et valides Un document est bien-formé si son balisage est correct un document est valide s'il est bien formé et qu'il est conforme à sa DTD
Programmer avec XML Java le plus abouti C, Perl, Python etc. aussi support Unicode est le plus compliqué SAX, Simple Api for Xml (dirigé par les événements) DOM, the Document Object Model (permet de manipuler l'arbre)
XML et Web XML offre une séparation claire entre structure logique (contenu) et présentation permet de proposer des chaines de production de documents sous différentes présentations à partir du même contenu (HTML vs PDF, WML vs HTML,...)
Environnements de publication XML Environnement logiciel permettant de servir différentes présentations de documents XML Cocoon de XML-Apache, Qweelt de Univ. Penn. Souvent basé sur des implantations Java (Servlet, JSP)
Cocoon Client navigateur Web ou portable 1 2 Apache + Tomcat Doc. XML QL Apache + Tomcat Doc. XML 6 Cocoon 5 3a Interprète XSP Doc. HTML 3b 4 Interprète XSLT Doc. WML 4 Doc. PDF Interprète FOP
XSP Xml Server Pages généralisation des JSP pour XML permet de générer dynamiquement un document XML (au moins en partie) avant qu ’il soit transformé document XSP est un document XML (bien formé)
Conclusion de nombreux produits et diverses techniques choix dépend du type de site visé : web de consultation : passerelles simples ou langages de script serveur PHP, ASP webs multiples à partir d ’une même source : XML portail d ’entreprise : JSP ou Cocoon