XML - Architecture 3-tiers
Objectifs du chapitre
Les objectifs sont d’apprendre à :
-
Concevoir et développer un serveur de chaînes au format XML.
-
Développer des applications clientes de ce serveur.
XML : eXtensible Markup Language
1. Le langage XML
XML est un langage à balises, dont l’un des objectifs est de faciliter l’échange d’informations entre applications.
XML est extensible, car les balises ne sont pas prédéfinies.
2. Document XML
a. Exemple de document XML
Le document XML contient :
-
Un prologue, qui comprend une déclaration XML, comme dans l’exemple ci-dessus.
-
Le corps du document, qui est la description des données proprement dites.
b. Corps du document XML
Les balises sont entourées de chevrons. Un élément est défini entre une balise ouvrante et une balise fermante.
Exemple : <nom> est une balise ouvrante, </nom> est la balise fermante qui lui correspond. On parle de l’élément nom.
c. XML est une structure arborescente
Le document XML précédent peut être représenté par le schéma d’une arborescence :
Chacun des symboles graphiques (hexagone, ellipse, rectangle, rectangle arrondi) représente un nœud (node) de l’arbre.
d. Un document XML bien formé
Pour qu’un document XML soit bien formé, il doit respecter les règles suivantes :
-
Il ne doit posséder qu’un élément racine incluant tous les autres éléments.
-
Tous les éléments doivent être fermés.
-
Les éléments doivent...
Java et XML
1. Le DOM (Document Object Model)
Le DOM est un ensemble de classes qui permet de manipuler un document XML.
Un certain nombre d’interfaces permettent de représenter les différents nœuds de l’arbre.
Pour désigner cet arbre, on parle parfois de l’arbre DOM.
2. La hiérarchie des interfaces Node (extrait)
Node
C’est le type de données de base du DOM. Tous les autres types en dérivent.
Document
Un objet Document représente le document XML entier. Il contient le prologue et le corps du document.
Élément
Un objet Element représente une balise du document XML.
Attr
Un objet Attr représente un attribut.
Text
Un objet Text désigne le contenu d’une balise.
Comment
Un objet Comment désigne un commentaire.
Parseurs XML
Un parseur XML est une classe qui possède des méthodes permettant d’obtenir une représentation mémoire du document XML. On peut ainsi parcourir l’arbre, en extraire des données et les manipuler.
1. Parseur DOM
a. Programme
Un parseur DOM lit l’ensemble du document XML et le charge en mémoire. Il permet de générer un objet Document à partir d’un fichier XML.
public class TestDocumentDom
{
public static void main(String args[]) throws IOException,
ParserConfigurationException,
SAXException
{
-
DocumentBuilderFactory est une classe qui permet d’obtenir un parseur (analyseur syntaxique) de type DOM.
-
DocumentBuilder est la référence du parseur obtenu.
DocumentBuilderFactory usineParseurXml;
DocumentBuilder parseurXml;
-
File est la référence du fichier XML à convertir.
-
Document est la référence du document obtenu par le parseur.
-
Element est la référence d’un élément (ici la racine de l’arbre).
-
Node est l’interface dont dérivent toutes les interfaces représentant un nœud de l’arbre DOM.
-
NodeList est une collection de nœuds (Node).
File fichierXml;
Document documentDom;
Element racine;
NodeList enfants;
Node enfant;
Création de l’objet parseurXml :
usineParseurXml = DocumentBuilderFactory.newInstance();
usineParseurXml.setIgnoringComments(true);
parseurXml = usineParseurXml.newDocumentBuilder();
La méthode setIgnoringComments() permet d’indiquer que le parseur ne doit pas tenir compte des commentaires présents dans le fichier XML.
Le programme présenté convertit un fichier...
Travail pratique : Projet ServeurXML
1. Objectifs
-
Développer un serveur d’application connecté à une base de données qui émet du XML en réponse aux requêtes SQL des clients.
-
Développer une application dans une architecture 3 tiers.
2. Architecture du projet : 3-tiers
3. Sujet
a. Fenêtre graphique du serveur
Mis à part le titre, la fenêtre est identique à celle du Serveur d’objets du chapitre précédent.
b. Protolole d’échange entre client et serveur
-
Le serveur d’objets sérialisés du chapitre précédent, échange des objets Java avec son client. Celui-ci est donc écrit en Java.
-
Le serveur XML échange des flux de caractères (une requête SQL ou un programme XML) avec son client. Celui-ci peut être écrit dans n’importe quel langage, pour peu que ce langage permette l’analyse syntaxique d’un fichier XML.
c. Classes utiles au développement
-
Classe JeuResultatXML
Le constructeur de la classe JeuResultatXML du package utilitairesMG.jdbc reçoit un objet ResultSet en paramètre et fabrique une chaîne XML, récupérable par la méthode getResultatXML().
La DTD de cette chaîne XML a la structure suivante :
<!DOCTYPE RACINE [ <!ELEMENT RACINE (COLONNE*, LIGNE*)>
La description de l’élément COLONNE ne dépend pas du SELECT effectué :
<!ELEMENT COLONNE (NomColonne, TailleColonne, ClasseColonne)> <!ELEMENT NomColonne (#PCDATA)> <!ELEMENT TailleColonne (#PCDATA)> <!ELEMENT ClasseColonne (#PCDATA)>
La description de l’élément ligne dépend du SELECT. Dans l’exemple ci-dessous (SELECT * FROM CONTACT), chaque ligne sélectionnée a six colonnes. À chaque colonne correspond un élément contenant la valeur lue (texte) :
<!ELEMENT LIGNE (NUMERO, NOM, ADRESSE, CODE_POSTAL, VILLE,
CODE_SECTEUR)>
<!ELEMENT NUMERO (#PCDATA)>
<!ELEMENT NOM (#PCDATA)>
<!ELEMENT ADRESSE (#PCDATA)>
<!ELEMENT CODE_POSTAL (#PCDATA)>
<!ELEMENT VILLE...
Travail pratique : Projet GestionContactXML
1. Objectif
Développer le client graphique du projet 3 tiers.
2. Écrans du client et du serveur
3. Sujet
a. Présentation
Ce projet reprend le projet GestionContactReseau du chapitre précédent. Il s’agit d’adapter les classes d’accès aux données au serveur XML.
b. Travail
-
Créer le package utilitairesDivers.daoServeurXML.
-
Y recopier toutes les classes du package utilitairesDivers.daoServeurObjets.
-
La classe PriseServeur est inchangée.
-
La classe AccesServeur doit être modifiée. Elle possède les méthodes suivantes :
-
AccesServeur(PriseServeur prise)
-
PriseServeur getPrise()
-
Socket getConnection() throws IOException
-
void closeConnection() throws IOException
-
JeuResultat executeQuery(String select) throws ParserConfigurationException, SAXException, IOException
-
public Integer executeUpdate(String requete) throws ParserConfigurationException, SAXException, IOException
Les méthodes de la classe AccesServeur sont les mêmes que celles du package utilitairesDivers.daoServeurObjets, mais leur code est différent et la signature diffère à cause des exceptions.
-
Adapter les classes ContactDAO et SecteurDAO (les exceptions).
-
Créer un projet GestionContactXML.
-
Y recopier toutes les classes du projet GestionContactReseau.
-
Adapter la classe Controleur (les exceptions).
c. Diagramme de séquence
4. Projet GestionContactXML : proposition de correction
a. Classe AccesServeur du package daoServeurXMLDom
Cette solution utilise le parseur DOM. Une solution qui utilise le parseur SAX est disponible depuis la page Informations générales (les packages sont appelés daoServeurXMLDom et daoServeurXMLSax).
Les propriétés de la classe AccesServeur sont :
-
PriseServeur prise : localisation du serveur
-
Socket socketClient : socket qui permet l’accès au serveur
-
PrintWriter sortie : flux d’écriture vers le serveur
-
InputStreamReader entree et InputSource sourceXML : flux pour lire la réponse XML du serveur
package daoServeurXMLDom;
public class AccesServeur
{
private PriseServeur prise;
private Socket socketClient;
private InputStreamReader entree;
private InputSource sourceXml;
private PrintWriter sortie; ...