Vous êtes sur la page 1sur 17

TP: Web Services

Université Grenoble Alpes 1 / 17


Sujet du TP 11

L3MIAGE - Langages pour le Web

L3MIAGE - Langages pour le Web

TP11
Web Services

Objectifs
● Priorité est donnée au projet PAI !
● L'objectif de ce TP est d'apprendre à mettre en place des Web Services (SOAP), de les déployer, et
de les utiliser dans des applications clientes.
● Plus précisément, ce TP consistera, dans le cadre du PAI, en la mise en place d'un Web Service
Serveur (et d'un client de test) permettant de faire le lien entre des données XML et une IHM (le
client). Nous procéderons ainsi en plusieurs étapes. Toute la partie serveur sera réalisée dans un
seul et même projet netbeans, la partie client (test) correspondant à un autre projet. L'une d'elle,
la partie serveur, correspond au projet déjà réalisé lors de la dernière séance et nommé
CabinetInfirmierServer. En ce qui concerne le projet TUX, ceux qui ont choisi de suivre l'option
[WebService] mettront en place un WebService, serveur de mots du dictionnaire, et l'appeleront
dans la partie cliente, le jeu TuxGame, pour obtenir ces mots. Cette partie concernant TUX sera
rapide. Dans les deux cas, projets PAI et TUX, les objectifs sont les suivants :
● (1) Mettre en place un Web Service partie serveur
● (2) Proposer des services avec des traitements sur les données
● (3) Utiliser ce Web Service dans un client de test
● (4) Tester le Web Service du PAI avec l'IHM
● Lors de cette séance, vous terminerez les projets TUX et PAI. Rendu : pour le projet PAI, le rendu
se fera sous la forme d'une présentation de minutes par binome le lundi 04/12 pendant votre projet
réseau. Pour le projet TUX, le rendu se fera la semaine d'après [date à définir, mais probablement
le 11/12], sous la forme d'une archive ZIP de l'ensemble du projet, c'est à dire comprenant les
parties XML, XSD, XSL, Java, Binding et éventuellement Web Service, selon option. Si l'option
[WebService] a été choisie, cette archive contiendra les deux projets netbeans : la partie serveur et
la partie cliente. L'archive devra porter le nom NOM1_NOM2_2017.zip. Elle sera récupérée par
l'enseignant. Aucun délais ne sera accordé.

Mise en place
● Ayez sous les yeux vos cours sur le Data Binding et les Web Services, ainsi que les sites de
référence donnés en bas de ce document.

Université Grenoble Alpes 2 / 17


Exercices

1. PAI : Binding du cabinet d'infirmier


1. PAI : Binding du cabinet d'infirmier

Description de l'exercice
Cet exercice est le début d'une série d'exercices visant à transformer notre cabinet d'infirmiers en
Web Service. La suite de ce travail sera donc composée de plusieurs parties:

● A. Creation de l'application Java [Web Application]


● B. XML Binding du cabinet d'infirmiers [avec JAXB]
● C. Mise en place du Web Service de type SOAP
● D. Modification, Déploiement et premier Test du Web Service
● E. Mise à disposition des données du cabinet par le WebService
● F. Test du WebService à l'aide d'une application cliente [Java]
● G. Page de l'infirmière
● H. Déploiement manuel sur un serveur GlassFish [Facultatif]

Dans le présent exercice, nous ne traiterons que les poins A et B.

Il est extrêmement important que chaque partie soit parfaitement fontionnelle avant de passer à
l'étape d'après. Vérifiez donc que vous avez respecté chacun des points.

A. Creation de l'application Java [Web Application]


Nous allons commencer par créer une application Java qui hébergera le futur Web Service SOAP
coté serveur. Elle contiendra un XML Binding du Cabinet.

Question 1.1
Créez une nouvelle application Java de type Web Application (File -> NewProject -> JavaWeb
-> Web Application) que vous nommerez CabinetInfirmierServer
Vérifiez bien que le serveur est Glassfish et que JavaEE sont selectionnés ; pas besoin de
sélectionner un Framework.

B. XML Binding du cabinet d'infirmiers [avec JAXB]


Nous allons maintenant réaliser un Data Binding du Cabinet à partir du fichier XML Schema
cabinet.xsd.

Le fichier XmlRootBinding.xml ,le fichier de configuration pour le compilateur xjc est fourni. Ce
fichier de configuration est nécessaire lors du binding pour simplifier la manipulation des classes en
Java.

Nous allons le compilateur de schema inclu dans Java, le compilateur xjc, cf le site de JAXB, pour
Java Architecture for XML Binding.

Les étapes suivantes sont valables pour tout Data Binding ultérieur dans les autres exercices.

Université Grenoble Alpes 3 / 17


Question 1.2
Creez un nouveau package fr.ujfGrenoble.miage.cabinetinfirmier.resources
Attention à l'orthographe de resources : un seul s !
Question 1.3
Dans le dossier resource, copier le fichier XmlRootBinding.xml ainsi que le fichier de schéma
cabinet.xsd.
Question 1.4
Par un clic bouton droit sur le projet, dans l'onglet Projects, créez un nouveau document de
binding (New > Other > XML > JAXB Binding). Lisez les explications ci-dessous pour
comprendre les paramètres présentés et observez les recommandations pour remplir les champs
dans le texte figurant après la figure.

Vous devriez obtenir une fenêtre similaire à celle présentée ci-dessous que vous paramètrerez de la
même manière.

Figure 1.1. le "wizard" pour JAXB ; voir explication ci-dessous

Les paramètres de cette fenêtre sont associés à la compilation de schema :

● Binding Name : nom, c'est à dire identité, du binding JAXB ; ex: CabinetBinding
● Project : nom du projet courant ; ici: TuxGame par exemple, selon comment vous l'avez appelé
● Schema File : nom du fichier utilisé pour la génération de schema. Le wizard JAXB de netbeans
reconnait un certain nombre de formats de schema : XML Schema, Relax NG normal et compact,
XML DTD, et WSDL ; cf cours sur les web services.
Ici, nous voulons faire le binding du Cabinet, donc nous utiliserons cabinet.xsd.
● Package Name : nom du package java utilisé pour la génération des objets ; disons tux.
● Compiler Options : plusieurs options sont possibles : nv, pas de validation stricte ; readOnly,
le code Java généré ne sera pas modifiable ; npa, suppression des annotations de package ;
verbose, la compilation indiquera plus d'informations et affichera les warnings ; quiet, la
compilation se fera "en silence", aucun message ne sera affiché.
● Use Extension : permet d'utiliser les extensions pour la compilation de schema ; les extensions
sont dépendantes du type de compilateur utilisé : xmlbeans, jaxb, ...etc...
Pensez à cocher cette case.
● Use Binding File : permet de définir un fichier de configuration spécifique afin de
"personnaliser" la compilation.
Pensez à ajouter le fichier XmlRootBinding.xml .
● Use Catalog File : permet d'importer et d'éditer des "catalogues" de fichiers, utiles lorsqu'on
utilise des DTD.

Question 1.5
Remplissez les paramètres comme indiqué sur l'image ci-dessus :

Lorsque vous cliquez sur Finish, JAXB compile le schema et génère les classes correspondantes.

Ouvrez l'onglet Files, pour une vision classique des fichiers de votre projet Netbeans, et explorez
la branche build > generated-sources > jaxb. Examinez et ouvrez les fichiers Java générés ;
passez outre d'éventuelles alertes à l'ouverture.

Testons maintenant notre Data Binding.

Université Grenoble Alpes 4 / 17


Question 1.6
Copiez votre cabinet.xml dans le dossier resources, dans les sources.
Question 1.7
Ecrivez une nouvelle classe que vous nommerez CabinetProcessing, possédant (1) un attribut
privé de type Cabinet, (2) deux constructeurs différents avec (i) un constructeur prenant comme
paramètre un cabinet déjà instancié pour initialiser l'attribut de la classe, et (ii) un constructeur
prenant en paramètre un nom de fichier et construisant l'attribut à partir de la lecture d'un fichier
XML.
Cette classe possèdera en outre (3) une méthode toXML, de la forme toXML(nomFichier:String)
:void, qui réalise le marshalling de l'attribut et l'enregistre dans un fichier XML. Enfin, nous
disposerons aussi (4) d'une méthode fromXML, de la forme fromXML(nomFichier:String)
:Cabinet, qui réalise le unmarshalling d'un Cabinet. Le code de ces deux méthodes est fourni
ci-dessous.
Pensez à réutiliser la méthode fromXML(nomFichier:String):Cabinet dans le constructeur !
Rappelez vous qu'un constructeur sert à instancier et initialiser ses attributs !
Question 1.8
Créez une classe de test contenant une méthode statique main dans laquelle vous créerez une
instance de CabinetProcessing que vous testerez : testez le constructeur utilisant un fichier XML
ainsi que l'écriture dans une nouvelle instance de fichier XML.

Servez vous pour la suite des méthodes proposées dans la classe XMLUtils déjà utilisée. Les
fichiers nécessaires sont fournis : XMLUtil.java et URLUtil.java

Question 1.9
Ajoutez une méthode getNomCabinet():String qui renvoie le nom du cabinet.
Question 1.10
[Optionnel selon le temps] Ajoutez une méthode getListePatientsStr(id:int):String qui
renvoie la liste des noms et prénoms des patients du cabinet de l'infirmiere d'identifiant
infirmierId sous la forme d'une chaine de caractères comme suit : "Patients de
l'infimiere [id] : [nom, prénom] [nom, prénom] .... Vous pouvez soit passer par les
classes Java (facile) soit utiliser sur le document DOM les méthodes permettant de manipuler des
expressions XPATH dans la classe XMLUtil
Question 1.11
Ajoutez une méthode assez semblable, getListePatients(id:int):List<Patient> qui renvoie
la liste des patients, de type Patient de l'infirmiere d'identifiant infirmierId sous la forme d'une
List<Patient>.
Question 1.12
Ajoutez la méthode getHTML():String ci-dessous qui utilise une feuille de transformation XSLT et
renvoie sous la forme d'un String une page HTML affichant le nom du cabinet et le nombre de
patients de l'infirmiere d'identifiant infirmierId.

Pour cela, vous pouvez utiliser pour commencer la feuille de transformation XSLT de test test.xsl et
utiliser le code suivant pour la méthode getHTML.

Question 1.13
[Optionel mais pouvant être intéressant] Ajoutez une méthode getCoutPatient(id:int):double
qui calcule le cout total des visites d'un patient.

Pour cela, vous allez devoir utiliser le parsing DOM du fichier actes.xml

Il est recommandé pour cela d'utiliser une Map<key:String, value:Double>, instanciée sous la

Université Grenoble Alpes 5 / 17


forme d'une HashMap pour lier code et cout de chaque acte dans la liste des actes, donnée dans
actes.xml que vous avez déjà utilisé. Cette map constitue dans ce cas un attribut de la classe est
est instanciée à la construction.
Il est également recommandé de commencer par construire la hashmap, une fois le document des
actes parsé, le tout dans une méthode séparée createCodeCoutMap():void
[Fermer]

2. PAI : Mise en place d'un Web Service pour gérer le cabinet d'infirmiers
2. PAI : Mise en place d'un Web Service pour gérer le cabinet d'infirmiers

Description de l'exercice
Pour rappel, cet exercice est composé de plusieurs parties visant à transformer notre cabinet
d'infirmiers en Web Service. Les parties A et B ont été réalisée lors de la séance précédente. La suite
de ce travail sera donc composée des parties C à E :

● A. Creation de l'application Java [Web Application] --> déjà réalisé


● B. XML Binding du cabinet d'infirmiers [avec JAXB] --> déjà réalisé
● C. Mise en place du Web Service de type SOAP
● D. Modification, Déploiement et premier Test du Web Service
● E. Mise à disposition des données du cabinet par le WebService
● F. Utilisation du WebService par une application cliente [Java]
● G. Page de l'infirmière

Il est extrêmement important que chaque partie soit parfaitement fontionnelle avant de passer à
l'étape d'après. Vérifiez donc que vous avez respecté chacun des points (questions).

C. Mise en place du Web Service de type SOAP


Nous allons commencer par ajouter un Web Service de type SOAP à notre application
CabinetInfirmierServer.

Question 2.1
Dans l'onglet Projects, sélectionnez votre projet et, dans le menu contextuel, sélectionnez New ->
Web Services -> Web Service.
Question 2.2
Appelez votre service CabinetInfirmier, et entrez
fr.univ-grenoble-alpes.miage.cabinetinfirmier comme nom de package.

Le web service ici créé correspond au type SOAP, pour Service Oriented Architecture Protocol et
utilise le framework JAX-WS.

Question 2.3
Les Web Services

❍ SOAP correspondent à un standard à la différence des services de type REST


❍ SOAP incluent directement le protocole HTTP
❍ SOAP comme REST fonctionnent par échange de fichiers XML
❍ SOAP, peuvent être utilisés pour transférer des pièces jointes.

Vérifiez votre réponse

Université Grenoble Alpes 6 / 17


Maintenant vous pouvez voir qu'un package s'est créé et contient une classe, c'est à dire un fichier
java, du nom de votre web service. Vous devriez voir également un nouvel onglet web Services. Cet
onglet contient votre webService.

Vérifiez qu'une classe implémentant le service, appelée CabinetInfirmier.java, est créée.


Si vous ouvrez ce fichier, vous verrez apparaitre 3 onglets : Source, Design et History.
L'onglet Source donne accès au code Java ouvert, donc qu'on peut modifier. Depuis l'onglet Design
on dispose d'une fenêtre spéciale de conception de Web Services. Enfin, l'onglet History vous
permet de suivre les modifications faites à votre Web Service.

D. Modification, Déploiement et premier Test du Web


Service
Nous allons maintenant apprendre à déployer le Web Service depuis Netbeans. Nous en profiterons
pour tester des opérations élementaires.

Vous aurez constaté que, pour l'instant, notre Web Service ne dispose que d'une seule opération
générée par défaut (hello). Evidemment nous allons, plus tard, rajouter des opérations plus
complexes. Mais dans un premier temps, nous allons voir comment créer une opération élémentaire.

Question 2.4
Dans le Design de CabinetInfirmier.java, en utilisant Add Operation, ajoutez une opération
simple que vous nommerez getStrLength renvoyant un type int et prenant comme paramètre un
String. Cette fonction de test devra renvoyer longueur de la chaine de charactères passée en
paramètre.
Question 2.5
Il faut maintenant déployer le Web Service. Pour cela, dans l'onglet Projects, choisissez Deploy
depuis le menu contextuel [clic droit].

Votre Web Service est maintenant déployé sur le serveur GlassFish. Il est prêt à être utilisé par un
client.

Par la suite, lorsque vous ferez une modification dans le code source de CabinetInfirmier.java,
ou de toute autre classe appelée par cette dernière, vous ne devrez pas utiliser la compilation (build)
pour prendre en compte vos changements, comme cela est le cas lorsqu'on fait de la programmation
Java classique dans NetBeans, mais cette fonctionnalité Deploy". A noter que toute modification du
code du service, alors que le service est encore déployé est prise en compte ; il suffit juste alors de
recharger la page web avec la touche F5 si travaillez avec la plupart des navigateurs.
Question 2.6
Pour tester ce Web Service, dans l'onglet Projects, sélectionnez Web Services ->
CabinetInfirmier et dans le menu contextuel [clic_droit], choisissez Test Web Service. Une
page html s'ouvre dans un navigateur, depuis laquelle nous voyons apparaire nos opérations. Testez
les deux opérations disponibles en leur donnant un paramètre.
Désormais, vous devrez idéalement répéter cette opération de déploiement + test pour tester les
nouvelles fonctionnalités de votre WS. A noter qu'en pratique, toute modification du code du service,

Université Grenoble Alpes 7 / 17


alors que le service est encore déployé est prise en compte par Netbeans qui gère à la fois le Web
Service et le serveur glassfish ; il suffit juste alors de recharger la page web de test.

En haut de la page de test, vous voyez apparaitre un lien vers le fichier WSDL. Etudiez ce fichier et
notez son URL.

Question 2.7
A quoi sert le WSDL ?

❍ c'est un log de l'activité du service


❍ il contient toutes les informations nécessaires à une connexion distante au service
❍ il permet de créer de nouvelles opérations dans le service

Vérifiez votre réponse

Question 2.8
Le WSDL

❍ est necessaire pour l'utilisation des web services SOAP seulement


❍ est necessaire pour l'utilisation des web services REST seulement
❍ est necessaire pour l'utilisation des web services SOAP et REST

Vérifiez votre réponse

Question 2.9
L'URL du WSDL est

❍ http://cabinetinfirmier.miage.ujfGrenoble.fr/
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier?WSDL
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier?xsd=1
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier

Vérifiez votre réponse

E. Mise à disposition des données du cabinet par le


WebService
Vous avez mis en place le Binding du Cabinet et vous avez compris les principes du Data Binding.
Nous allons maintenant permettre au WebService d'utiliser les données du Cabinet. Pour ce faire,
ajoutez le code suivant à la classe CabinetInfirmier. Cela génère des erreurs que vous pouvez fixer
en utilisant la commande FixImports du menu contextuel. Ces deux méthodes permettent de
récupérer les données vues comme ressources distantes, donc accessible via une URI. Elles
renvoient soit une instance de Cabinet, la méthode réalisant donc un unmarshalling à partir d'une

Université Grenoble Alpes 8 / 17


URI, soit une StreamSource, pouvant être utilisée directement par plusieurs méthodes de la classe
XMLUtil.java.
Copiez également les fichiers XMLUtil.java et URLUtil.java dans le même répertoire que
CabinetInfirmier.java par exemple, mais ce n'est pas essentiel.

Question 2.10
Nous devons aussi indiquer au Web Service comment utiliser le Binding de Cabinet pour les tests.
Par un clic bouton droit sur le projet, dans l'onglet Projects, selectionnez Properties, le dernier item
du menu contextuel, selectionnez ensuite "Libraries" dans la partie gauche, puis l'onglet "Compile
Tests", puis "Add Jar/Folder" et selectionnez le répertoire
build/generated/jaxbCache/Cabinet de votre projet. Ceci est illustré dans la figure ci-dessous.

Figure 2.1. Propriétés du WS ; voir explication ci-dessus

Vous allez maintenant écrire des opérations exploitant ces ressources.

Notez que ces opérations seront très semblables à celles que vous avez écrites pour tester votre
Data Binding de Cabinet. Elles ne nécessiteront que très peu d'adaptations.

Question 2.11
A partir de l'onglet Design, ajoutez une opération getNomCabinet():String. Editez ensuite le
code de cette opération de façon à ce qu'elle déclare un Cabinet et en récupère une instance à
l'aide de la méthode fromResource. Il exploite ensuite les méthodes de la classe de Cabinet liée
(Binding) pour renvoyer le nom du cabinet.
Question 2.12
Comme précédemment, déployez le service s'il ne l'est pas déjà et testez cette nouvelle opération.
Si le service est déjà déployé et que votre page HTML de test est encore ouverte, il vous suffit de la
rafraîchir (F5).

Assurez vous que votre opération de test fonctionne. Si c'est le cas, vous pouvez passer à la suite.

F. Utilisation du WebService par une application cliente


(Java)
Nous allons réaliser une petite application cliente en Java, appelant ce WebService et utilisant ses
opérations.

Question 2.13
Créez un nouveau projet de type Web Application, appelez le CabinetInfirmierClient et
munissez le d'un Web Service Client ayant pour URL celle du WSDL de votre WebService
CabinetInfirmier hébergé par l'application CabinetInfirmierServer.

Rmq : il n'est pas nécessaire de définir de proxy car vous allez travailler en local, sur votre propre
machine.

Question 2.14
Créez une nouvelle Java Main class nommée TestCabinetInfirmier.java, positionnez vous

Université Grenoble Alpes 9 / 17


dans le corps de la méthode main et, depuis le menu contextuel, sélectionnez Insert Code >
Call Web Service Operation. Déployez l'arborescence proposée et sélectionnez l'opération
getNomCabinet que vous avez programmée préalablement dans votre WebService, puis cliquez sur
Ok.

La méthode générée devrait se présenter comme ceci.

Observez qu'elle appelle une classe CabinetInfirmier_Service. Cette classe a été générée dans
le package fr.ujfgrenoble.miage.cabinetinfirmier que vous trouverez dans l'onglet
Generated Sources. Cette classe assure l'interface de votre client avec le WebService. Elle
permet notamment d'assurer la connexion à l'URL du WebService.
Prenez le temps de regarder comment cela fonctionne en regard de vos connaissances sur les
WebServices.

Question 2.15
Dans la méthode main, ajoutez une ligne permettant d'afficher la chaine de caractère renvoyée par
la méthode getNomCabinet():String que vous venez de générer dans votre client.
Question 2.16
Compilez et lancez ce programme. Le nom de votre cabinet devrait s'afficher dans la console.
Assurez vous d'avoir déployé votre WebService récemment. Notez que le WebService a un time out
par défaut de 30 minutes, au delà desquelles il faut le re-déployer.

Ce client peut être utilisé pour toute autre opération que vous rajouteriez à votre WebService. Il
suffit pour cela de rajouterau client le code nécessaire pour exploiter ces opérations : insertion de
code et appel des opérations du Web Service.

G. Page de l'infirmière
Nous allons maintenant rajouter l'opération principale de notre cabinet d'infirmier, à savoir la page
de l'infirmière. Nous allons nous focaliser sur cette opération qui est appelée par l'application cliente
que vous avez programmée dans le module IHM. Notez que vous pourriez, si vous le souhaitiez,
complexifier votre service et votre IHM pour proposer/utiliser d'autres opérations ; le principe serait
le même.

L'opération en question prendra comme paramètre un identifiant d'infirmier, sous la forme d'un
String, et renverra une page HTML entièrement contenue dans une chaine de caractères (String
). Cette page sera obtenue suite à des traitements éventuels faits à partir de l'instance Java de
Cabinet et d'une transformation XSLT permettant de tranformer un document DOM, généré à
partir de l'instance de Cabinet, en page HTML.

Question 2.17
Dans l'onglet Design, ajoutez une opération que vous nommerez getHTML, qui prend un String en
paramètre et qui renvoie un String.
Question 2.18
Copiez et collez ce code de l'opération getHTML pour remplacer le code qui a été généré.
Question 2.19
Lisez attentivement le code de cette opération et ses commentaires pour en comprendre le

Université Grenoble Alpes 10 / 17


fonctionnement.
Question 2.20
Utilisez une feuille de transformation XSLT simple pour tester cette opération ... par exemple celle
que vous avez développé pour tester le binding de cabinet (test.xsl). Pour utiliser cette feuille XSLT,
il suffit de la copier dans le répertoire resources du WebService si ce n'est déjà fait.
Question 2.21
Vous pouvez mainetant utiliser cette nouvelle opération, soit en lançant le test du WebService
depuis la page de test, soit en utilisant votre application cliente. Dans ce dernier cas, vous pouvez
soit afficher la chaine de caractère générée dans la console, soit, plus judicieusement utiliser les
méthodes des classes FileUtil.java et BrowserUtil.java en ajoutant ce code dans la méthode main de
votre application de test.
Question 2.22
Utilisez cette opération avec votre IHM !

Maintenant, vous pouvez écrire une page de l'infirmière digne de ce nom. Le soin apporté à cette
partie du travail sera autant de bonus pris en compte dans la notation. Par défaut, la page
devra afficher les renseignements sur l'infirmière, et la liste de ses patients.
Voici des suggestions pour l'améliorer :

● Un message d'accueil citant le prénom de l'infirmière


● La photo de l'infirmière est affichée
● Le nombre de patients du jour
● Le nom, le prénom et l'âge de chaque patient
● les patients triés par ordre alphabétique
● le coût total des actes pour chaque patient

Plus compliqué [mais pas demandé cette année] : en rajoutant à votre WebService la possibilité
d'envoyer des requêtes Google (ou OpenStreetMap) et en utilisant votre algorithme de RO, vous
pourriez afficher :

● la distance au cabinet de chaque patient


● le coût de déplacement pour chaque patient

Question 2.23
Améliorez la page de l'infirmière !
[Fermer]

3. TUX [à utiliser en remplacement éventuel du Binding de Profile] : Gestion du profil et des parties
(version DOM)
3. TUX [à utiliser en remplacement éventuel du Binding de Profile] : Gestion du profil et des parties
(version DOM)

Dans cet exercice, nous allons créer une classe Profil pour gérer notre profil, c'est à dire pour
modifier et sauvegarder un profil, et de gérer une liste de parties individuelles, de type Partie. Vu
qu'un Profil stocke le résultat de plusieurs parties, nous avons aussi besoin de créer une classe
Partie pour gérer les parties individuelles.

Nous n'aurons pas le temps de tout faire pendant les TPs ! Mais imaginez tout ce que l'on pourrait
faire avec les notions vues en cours. On pourrait ainsi, créer plusieurs profils, stockés sous forme de

Université Grenoble Alpes 11 / 17


XML ; ces profils pourraient alors être affichés à l'aide d'une feuille XSLT ; notez qu'à ce stade, vous
disposez de tous les outils nécessaires pour cela. Encore mieux, un flux RSS des scores des élèves
d'une classe et pleins d'autres choses...

Commençons par coder la classe Partie. Cette classe sert à manipuler des parties individuelles.
Ci-dessous, vous trouverez l'UML de cette classe.

Figure 3.1. Diagramme UML de la classe Partie

Voici quelques explications sur la composition et le but de chaque méthode de la classe Partie:

● La classe possède 4 attributs : un mot et une date, de type String, et 3 attributs de type int, le
niveau, trouve le nombre de lettres trouvées et le temps en secondes.
● Il y a 2 constructeurs. Celui à trois paramètres permet de construire une nouvelle partie et
initialise donc tous ses attributs comme il se doit. L'autre constructeur, lui, est utilisé pour
permettre la construction et la réinitialisation d'une Partie déjà faite et issue du XML. Ce
constructeur prend comme paramètre un élément DOM correspondant à une partie ; cet élément
est obtenu par parsing du document DOM ; le constucteur utilisera cet élément pour récupérer les
bonnes valeurs et initialiser la partie.
● Les méthodes setTemps(temps:int):void, getNiveau():int et toString():String
permettent la gestion des parties.
● La méthode setTrouve(nbrLettreRestantes):int qui permet de renvoyer un pourcentage en
fonction du nombre de lettres trouvées.
● La méthode getPartie(doc:Document):Element Cette méthode crée le bloc XML représentant
une partie à partir du paramètre doc(pour créer les éléments du XML) et renvoie ce bloc en tant
que Element.

Question 3.1
Implémentez cette classe.

Maintenant, vous allez créer la classe Profil en suivant le diagramme UML donné ci-après et les
indications suivantes.

Figure 3.2. Diagramme UML de la classe Profil

● La classe comporte 4 attributs : Les 3 attributs nom, dateNaissance et avatar sont de type
String ; l'attribut parties stocke chaque Partie individuelle dans une ArrayList<Partie>
● Elle comporte deux constructeurs : le premier initialisant un profil à partir du nom et de la date de
naissance du joueur passés en paramètres ; le second lit un fichier XML, parse le document et
utilise le document DOM pour extraire les données nécessaires à la récupération des valeurs du
profil et des parties existantes.
● La méthode ajoutePartie(p : Partie):void permet de rajouter à la liste des parties une
Partie instanciée.
● La méthode sauvegarder(filename:String):void permet de sauvegarder le document DOM
dans un fichier XML.
● La classe comporte en outre 4 autres méthodes utilitaires : fromXML(filename:String)
:Document fromXML(filename:String):void, xmlDateToProfileDate(String xmlDate)
:String et profileDateToXMLDate(String xmlDate):String.

Université Grenoble Alpes 12 / 17


Le squelette de la classe Profil et les fonctions utilitaires sont fournis.

une date est de la forme dd/mm/aaaa en String pour notre projet ! C'est le cas de la date de profil et
de la date de partie.
Question 3.2
Programmez cette classe.
Pensez à utiliser les fonctions utilitaires.

Nous allons maitenant intégrer ces deux classes à notre projet.

Revenons à l'endroit où le jeu se passe: dans la méthode jouer de la classe Jeu.

Question 3.3
Créer un attribut profil de type Profil dans la classe Jeu.
Question 3.4
Créer un nouveau constructeur dans Jeu qui a pour paramètre le chemin d'un profil XML. Ce
constructeur intialise le dictionnaire avec les méthodes développées lors de la dernière séance,
initialise l'attribut profile à l'aide du chemin vers le XML et initialise niveau au dernier niveau fait
dans le profil.
Question 3.5
Modifier le code de votre projet de manière à ce que ce constructeur soit dorénavant appelé. Par
défaut, utiliser un exemple d'instance de profil, profile.xml, contenant des parties déjà jouées.

Maintenant que nous avons un objet de type Profil dans la classe Jeu, nous allons pour récupérer
les données pour chaque partie réalisée et stockée chacune d'entre elles.

Question 3.6
Dans la boucle while, créer une nouvelle Partie pour chaque nouvelle partie jouée et l'ajouter à la
fin de la partie au Profil.
Question 3.7
A la fin du jeu, veillez à imprimer à la fois dans la console Netbeans et dans un fichier XML les
parties réalisées si l'utilisateur le désire. Idéalement, vous pouvez aussi faire une sortie HTML
directement ; les transformations XSLT sont facilitées avec la classe XMLUtil.
Si l'utilisateur le désire signifie faire une lecture clavier pour demander à l'utilisateur s'il veut sauver
ses parties et dans quel fichier.
[Fermer]

4. TUX [WebService] : Le Dictionnaire comme un WebService


4. TUX [WebService] : Le Dictionnaire comme un WebService

Description de l'exercice
Dans cet exercice, nous souhaitons faire en sorte que le dictionnaire soit vu comme un WebService
(SOAP) muni d'opérations pour récupérer les mots d'un niveau donné. Nour allons seulement munir
notre application d'un WebService et ajouter les opérations nécessaires. La fois précédente, vous
avez réalisé une application nommée TuxDicoServer de type Web Application.

Cette exercice comporte 4 parties:

● A. Mise en place du Web Service de type SOAP


● B. Mise à disposition des données du Dictionnaire par le WebService

Université Grenoble Alpes 13 / 17


● C. Déploiement et Test du Web Service
● D. Utiliser du WebService par l'application cliente : le jeu TuxGame

A. Mise en place du Web Service de type SOAP


Nous allons commencer par ajouter un Web Service de type SOAP à notre application
TuxDicoServer.

Question 4.1
Dans l'onglet Projects, sélectionnez votre projet et, dans le menu contextuel, sélectionnez New ->
Web Services -> Web Service.
Question 4.2
Appelez votre service TuxDico, et entrez fr.miage.tux comme nom de package.

Le web service ici créé correspond au type SOAP, pour Service Oriented Architecture Protocol, et
utilise le framework JAX-WS.

Maintenant vous pouvez voir qu'un package s'est créé et contient une classe, c'est à dire un fichier
java, du nom de votre web service. Vous devriez voir également un nouvel onglet Web Services.
Cet onglet contient votre webService.

Vérifiez qu'une classe implémentant le service, appelée TuxDico.java, est créée.


Si vous ouvrez ce fichier, vous verrez apparaitre 3 onglets : Source, Design et History.
L'onglet Source donne accès au code Java ouvert, donc qu'on peut modifier. Depuis l'onglet Design
on dispose d'une fenêtre spéciale de conception de Web Services. Enfin, l'onglet History vous
permet de suivre les modifications faites à votre Web Service.

B. Mise à disposition des données du Dictionnaire par le


WebService
Vous avez mis en place le Binding du Dictionnaire et vous avez compris les principes du Data
Binding. Nous allons maintenant permettre au WebService d'utiliser les données du Dictionnaire.
Pour ce faire, ajoutez ce code à la classe TuxDico. Cela génère des erreurs que vous pouvez fixer en
utilisant la commande FixImports du menu contextuel. Ces deux méthodes permettent de récupérer
les données vues comme ressources distantes, donc accessible via une URI. Elles renvoient soit une
instance de Dictionnaire, la méthode réalisant donc un unmarshalling à partir d'une URI, soit une
StreamSource, pouvant être utilisée directement par plusieurs méthodes de la classe XMLUtil.
Copiez également les fichiers XMLUtil.java et URLUtil.java dans le même répertoire que
TuxDico.java par exemple, mais ce n'est pas essentiel.

Question 4.3
Nous devons aussi indiquer au Web Service comment utiliser le Binding de Dictionnaire pour les
tests. Par un clic bouton droit sur le projet, dans l'onglet Projects, selectionnez Properties, le dernier
item du menu contextuel, selectionnez ensuite "Libraries" dans la partie gauche, puis l'onglet
"Compile Tests", puis "Add Jar/Folder" et selectionnez le répertoire
build/generated/jaxbCache/Dictionnaire de votre projet.

Université Grenoble Alpes 14 / 17


Vous allez maintenant écrire des opérations exploitant ces ressources.

Notez que ces opérations seront très semblables à celles que vous avez écrites pour tester votre
Data Binding de Dictionnaire. Elles ne nécessiteront que très peu d'adaptations.

Question 4.4
A partir de l'onglet Design, ajoutez une opération getMot(level:int):String. Editez ensuite le
code de cette opération de façon à ce qu'elle déclare un Dictionnaire et en récupère une instance
à l'aide de la méthode fromResource. Cette opération doit permettre la sélection d'un mot de
niveau level au hasard dans la liste de mots. Attention à ce que le niveau soit valide.
Question 4.5
A partir de l'onglet Design, ajoutez une opération getMot(level:int, id:int):String . Editez
ensuite le code de cette opération de façon à ce qu'elle déclare un Dictionnaire et en récupère
une instance à l'aide de la méthode fromResource. Cette opération doit permettre la sélection la
sélection du idieme mot de niveau level dans la liste de mots. Attention à ce que le niveau et le
numéro du mot soient valides.

C. Déploiement et Test du Web Service


Nous allons maintenant déployer le Web Service depuis Netbeans et nous testerons nos opérations.

Question 4.6
Dans l'onglet Projects, choisissez Deploy depuis le menu contextuel [clic droit].

Votre Web Service est maintenant déployé sur le serveur GlassFish. Il est prêt à être utilisé par un
client.

Question 4.7
Pour tester ce Web Service, dans l'onglet Projects, sélectionnez Web Services -> TuxDico et
dans le menu contextuel [clic droit], choisissez Test Web Service. Une page html s'ouvre dans un
navigateur, depuis laquelle nous voyons apparaire nos opérations. Testez les deux opérations
disponibles en leur donnant des paramètres, bons et mauvais.
Désormais, vous devrez idéalement répéter cette opération de déploiement + test pour tester les
nouvelles fonctionnalités de votre WS. A noter qu'en pratique, toute modification du code du service,
alors que le service est encore déployé est prise en compte par Netbeans qui gère à la fois le Web
Service et le serveur glassfish ; il suffit juste alors de recharger la page web de test.

En haut de la page de test, vous voyez apparaitre un lien vers le fichier WSDL. Etudiez ce fichier et
notez son URL.

D. Utiliser du WebService par l'application cliente : le jeu


TuxGame
Nous n'avons plus qu'à munir notre jeu TuxGame d'un moyen de se connecter au WebService pour
utiliser ses opérations.

Université Grenoble Alpes 15 / 17


Question 4.8
Dans votre projet TuxGame ajoutez un Web Service Client ayant pour URL celle du WSDL de
votre WebService TuxDico hébergé par l'application TuxDicoServer.

Rmq : il n'est pas nécessaire de définir de proxy car vous allez travailler en local, sur votre propre
machine.

Question 4.9
Dans le corps de la classe Dico que vous avez déjà développé, depuis le menu contextuel,
sélectionnez Insert Code > Call Web Service Operation. Déployez l'arborescence proposée
et sélectionnez l'opération getMot que vous avez programmée préalablement dans votre
WebService, puis cliquez sur Ok.

La méthode générée devrait se présenter comme ceci :

Observez qu'elle appelle une classe TuxDico_Service. Cette classe a été générée dans le package
fr.miage.tux que vous trouverez dans l'onglet Generated Sources. Cette classe assure
l'interface de votre client avec le WebService. Elle permet notamment d'assurer la connexion à l'URL
du WebService.
Prenez le temps de regarder comment cela fonctionne en regard de vos connaissances sur les
WebServices.

Question 4.10
Adaptez votre classe Dico pour qu'elle utilise maintenant ces opérations distantes fournies par le
WebService.
[Fermer]

5. Deploiement manuel d'un Web Service SOAP sur un serveur GlassFish


5. Deploiement manuel d'un Web Service SOAP sur un serveur GlassFish
Les projets Tux et PAI doivent être terminés avant de faire cet exercice.

Description de l'exercice
Dans cet exercice, on montre comment déployer manuellement un WebService sur un serveur
GlassFish.

Question 5.1
La première étape consister à créer un package java de notre application. Comme il s'agit d'un
WebService, le package se présentera sous la forme d'un fichier à l'extension .war ; c'est
l'équivalent des .jar pour les applications java classiques. Pour le générer, il suffit de compiler le
projet, donc de faire un Clean + Build de votre projet. Le fichier .war est généré dans le
répertoire dist du projet Netbeans.
Question 5.2
Nous avons besoin d'un serveur GlassFish actif. Vous devez disposer d'un serveur GlassFish installé
sur votre machine. Il est présent sous la forme de services dans netbeans. Vous pouvez aussi décider
d'en installer un en dur sur votre machine en suivant les instructions suivantes :
* sous Linux
* sous windows
Plus simplement, pour démarrer le serveur depuis Netbeans (voir), le plus simple pour nous est de
se servir de l'interface de Netbeans. Dans le menu contextuel de Services > Servers >

Université Grenoble Alpes 16 / 17


GlassFish Server 4.1.1, utilisez start pour démarrer le service.
Question 5.3
Nous allons maintenant déployer notre application CabinetInfirmierServeur, ou toute autre
WebService que vous souhaiteriez déployer, dans le serveur GlassFish (voir).
Ouvrez un navigateur et entrez l'adresse suivante : http://localhost:8080. C'est l'URI
correspondant au localhost.

Vous devriez obtenir une fenêtre similaire à celle présentée ci-dessous.

Figure 5.1. Test à l'adresse http://localhost:8080 avant déploiement.


Question 5.4
Allez dans la console d'administration du serveur en entrant l'adresse http://localhost:4848
dans un navigateur. Dans l'arbre des taches, choisissez Applications comme montré dans la
figure ci-dessous.

Figure 5.2. Console d'administration du serveur GlassFish.


Question 5.5
Clickez sur Deploy et choisissez le fichier .war à uploader dans le serveur. Précisément, ce fichier
sera téléversé (upload) dans le répertoire autodeploy du serveur GlassFish. En ce qui nous
concerne, ce fichier se trouve dans le répertoire dist du projet Netbeans.

Vous devriez avoir une fenêtre comme celle-ci :

Figure 5.3. Upload du paskage de l'application depuis la console d'administration du serveur


GlassFish.
Question 5.6
Validez le déploiement (OK). Votre application est déployée sur le serveur.

Vous devriez avoir une fenêtre comme celle-ci :

Figure 5.4. Deploiement de l'application depuis la console d'administration du serveur GlassFish.


Question 5.7
Visitez la page http://localhost:8080/CabinetInfirmierServer/ . C'est la racine de votre
WebService. Il peut y avoir une erreur affichée sur votre application si elle ne dispose pas d'une
page d'accueil (ex: index.html, index.jsp ...). Par défaut, si vous avez créé un projet Netbeans de type
Web Service, une telle page index.html est créée. Elle se trouve dans le dossier web du projet. A
noter que vous pouvez bien sûr modifier cette page HTML pour en faire une page d'accueil du
service. Les différents services de votre application peuvent appelés depuis cette page..
Question 5.8
Testez votre WebService en lançant la page
http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier?Tester.
Question 5.9
Vous pouvez maintenant utiliser correctement votre Web Service à l'aide de votre application Java
ou de votre IHM. Depuis la console d'administration, vous devriez voir apparaître également
l'application cliente.
[Fermer]
Université Joseph Fourier © 2017

Université Grenoble Alpes 17 / 17

Vous aimerez peut-être aussi