Table des matières

Transcription

Table des matières
Université de Reims
Champagne-Ardenne
U.F.R. de Sciences
Exactes et Naturelles
Licence professionnelle CMSII
UE2
Services Web
(P. Moreaux)
Exercices Axis -Tomcat Février 2005
Réaliser les exercices proposés
Rédiger un compte rendu en incluant les sorties écran ou chier.
L'énoncé comporte 13 pages.
Soigner la présentation et la rédaction.
Table des matières
1 Contexte
2 Exercices d'introduction
2.1
2.2
Service1 : un premier service simple . . . . . . . . . .
2.1.1 Étape 1 : dénition de la classe du service . . .
2.1.2 Étape 2 : déploiement du service par chier jws
2.1.3 Étape 3 : exécution du service . . . . . . . . . .
Service2 : un deuxième service simple . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Deploiement1 : un premier déploiement simple . . . . . .
3.1.1 Étape 1 : compilation de la classe du service . . . .
3.1.2 Étape 2 : dénition du descripteur de déploiement
3.1.3 Étape 3 : déploiement . . . . . . . . . . . . . . . .
3.1.4 Étape 4 : installation du code du service . . . . . .
3.1.5 Étape 5 : exécution du service . . . . . . . . . . . .
Déploiement2 : un deuxième déploiement simple . . . . .
Désactivation1 : pour désactiver un service web . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Déploiement3 : un service plus complet . . . . . . . . . . . . . . .
4.1.1 Étape 1 : dénition et compilation de la classe du service
4.1.2 Étape 2 : dénition du descripteur de déploiement . . . .
4.1.3 Étape 3 : déploiement . . . . . . . . . . . . . . . . . . . .
4.1.4 Étape 4 : installation du service . . . . . . . . . . . . . . .
4.1.5 Étape 5 : exécution du service . . . . . . . . . . . . . . . .
DeploiementAvance1 : un service plus complet . . . . . . . . . . .
4.2.1 Étape 1 : restriction des accès client . . . . . . . . . . . .
4.2.2 Étape 2 : retrait (désactivation) du service . . . . . . . .
4.2.3 Étape 3 : (re)déploiement . . . . . . . . . . . . . . . . . .
4.2.4 Étape 4 : exécution du service . . . . . . . . . . . . . . . .
DéploiementAvance2 : persistance des données . . . . . . . . . . .
4.3.1 Étape 1 : modication du mode d'interaction . . . . . . .
4.3.2 Étape 2 : exécution de votre service . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Exercices de déploiement
3.1
3.2
3.3
4 Exercices de déploiement avancé
4.1
4.2
4.3
5 Clients pour les Services Web Axis
5.1
5.2
5.3
2
.
.
.
.
.
3
3
3
3
3
4
5
5
5
5
5
6
6
6
6
8
8
8
8
9
9
9
10
10
10
10
10
10
10
11
12
Client1 : dénition d'un client Java pour ServiceBonjour . . . . . . . . . . . . . . . . . . . . . . . 12
Client2 : dénition d'un client Java pour Carre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Client3 : dénition d'un client Java pour Compte . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
2/13
1 Contexte
On travaille avec le couple Tomcat - Axis développés par apache (www.apache.org). Les versions
utilisées sont Tomcat 5.5.7 et Axis 1_2RC2 pour Java 1.5.
Tomcat est le logiciel serveur HTPP en écoute sur le port 8080 (par défaut). Il intègre un moteur
de pages JSP et de servlets.
On communique en boucle locale : les requêtes HTTP sont envoyées à http://localhost sur le
port 8080.
On suppose que Tomcat et Axis sont installés sous votre compte (problèmes de droits d'accès aux
chiers). On note tomcat le répertoire racine de l'installation de Tomcat, et axis celui de Axis.
On utilise un navigateur comprenant XML, par exemple Firefox 1.x. Les versions utilisées de Tomcat
et Axis supposent que le jdk 1.5 de Java est installé et accessible (la variable d'environnement PATH
doit contenir le chemin d'accès au répertoire bin du jdk et le jre accesible doit être celui du jdk 1.5).
Axis est un ensemble logiciel qui permet d'exposer du code Java comme service Web. Il dispose de
diérents modes d'exposition et gère également la génération des chiers WSDL des services exposés
à partir de leur code Java. Les fonctionnalités d'Axis sont disponibles par accès HTTP car Axis est
installé comme une application Web au sein du moteur de servlets et de JSPs Tomcat. Ceci est automatique sous Tomcat à partir du moment où le code de Axis est placé dans le répertoire webapps/axis
de Tomcat, ce qu'on appelle le domaine applicatif Axis sous Tomcat.
On suppose que Tomcat et Axis ont été correctement installés (pas d'erreur dans la réalisation des
opérations d'installation de Axis (voir install.html).
Vériez cela en entrant l'URL http://localhost:8080/axis dans le navigateur. Vous pouvez ensuite
cliquer sur Validate et View.
Bien entendu, le serveur Tomcat doit avoir été lancé pour réaliser les exercices (voir tomcat/bin/startup.sh
ou le gestionnaire de services sous Windows).
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
3/13
2 Exercices d'introduction
2.1 Service1 : un premier service simple
Ce premier exercice1 renvoie la chaîne Bonjour, à votre service. Revoyez éventuellement la démarche de développement d'applications en Java. Dans ce mode très simple, la phase de déploiement
du service que vous allez développer est automatique avec Axis.
2.1.1 Étape 1 : dénition de la classe du service
La première étape consiste à écrire la classe du service web qui retournera au client la chaîne de
caractères Bonjour, à votre service. Le code Java de cette classe est le suivant :
1
public class ServiceBonjour {
2
public String message (){
3
return " Bonjour , à votre service " ;
4
}
5
}
Enregistrez ce code dans le chier ServiceBonjour.java.
2.1.2 Étape 2 : déploiement du service par chier jws
La deuxième étape consiste à déployer le service au sein de l'environnement d'exécution et de
déploiement de services Axis-Tomcat. Le premier mode de déploiement sous Axis que nous allons
mettre en ÷uvre est on ne peut plus simple : c'est le déploiement instantané par chier jws. Vous
noterez qu'il n'est pas nécessaire de compiler le source java.
Pour réaliser le déploiement, il sut de copier le chier ServiceBonjour.java (en le renommant
ServiceBonjour.jws) dans le domaine applicatif de Axis sous Tomcat (le répertoire webapps/axis
dans l'arborescence de Tomcat ).
Vous devez donc copier ServiceBonjour.java sous le nom tomcat/webapps/axis/ServiceBonjour.jws.
Vous êtes désormais en mesure d'accéder à votre service à l'URL :
http://localhost:8080/axis/ServiceBonjour.jws.
Vous devez alors constater que votre service a bien été déployé dans Tomcat en ayant en retour la
page html suivante :
There i s a Web S e r v i c e h e r e
C l i c k t o s e e t h e WSDL
Si vous cliquez sur ce dernier lien, vous verrez la dénition WSDL de votre service web, générée
automatiquement par Axis.
2.1.3 Étape 3 : exécution du service
La dernière étape consiste à utiliser votre service qui est désormais accessible à travers Internet !
Pour exécuter une méthode de votre service et obtenir la réponse SOAP correspondante, tapez l'expression suivante dans votre navigateur :
http://localhost:8080/axis/ServiceBonjour.jws?method=message.
Par rapport à l'expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la
forme de la valeur de l'attribut method. Le navigateur ache la réponse qui est un message SOAP,
c'est-à-dire un chier XML particulier, dont voici un extrait :
<s o a p e n v : E n v e l o p e>
<soapenv:Body>
<messageResponse s o a p e n v : e n c o d i n g S t y l e=" h t t p : // schemas . xmlsoap . o r g / soap / e n c o d i n g /">
<messageReturn x s i : t y p e=" x s d : s t r i n g ">Bonjour , à v o t r e s e r v i c e</ messageReturn>
</ messageResponse>
</ soapenv:Body>
</ s o a p e n v : E n v e l o p e>
1
Une version initiale de ces exercices a été rédigée par R. Voyer, à l'INT d'Evry en 2002
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
4/13
2.2 Service2 : un deuxième service simple
En procédant comme précédemment, dénir un service Web qui calcule le carré d'un nombre. Il y
a deux diérences par rapport à l'exercice précédent : le service retourne cette fois-ci un nombre et la
méthode à invoquer possède un paramètre. Pour traiter les méthodes avec paramètres, supposons que
votre service possède la méthode ayant la signature suivante :
public int calculer(int nb);
L'invocation sera alors réalisée de la façon suivante pour nb=10 :
http://localhost:8080/axis/Carre.jws?method=calculer&nb=10
Vous obtiendrez la réponse suivante (toujours au format SOAP) dont voici un extrait :
<s o a p e n v : E n v e l o p e>
<soapenv:Body>
<c a l c u l e r R e s p o n s e s o a p e n v : e n c o d i n g S t y l e=" h t t p : // schemas . xmlsoap . o r g / soap / e n c o d i n g /">
<c a l c u l e r R e t u r n h r e f="#i d 0 " />
</ c a l c u l e r R e s p o n s e>
<m u l t i R e f i d=" i d 0 " s o a p e n c : r o o t="0" s o a p e n v : e n c o d i n g S t y l e=" h t t p : // schemas . xmlsoap . o r g / soap / e n c o d i n g /"
x s i : t y p e=" x s d : i n t ">25</ m u l t i R e f>
</ soapenv:Body>
</ s o a p e n v : E n v e l o p e>
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
5/13
3 Exercices de déploiement
Dans les exercices précédents, le déploiement était entièrement pris en charge par Axis. Ce mode
automatique de déploiement présente les contraintes suivantes :
nécessité de disposer des sources des classes dont on veut dénir le ou les services. En eet, le
mode de déploiement automatique d'Axis travaille avec le source des classes Java ;
impossibilité de décrire (en l'état actuel du système Axis ) des particularités de déploiement.
Pour ces raisons, nous devons parfois réaliser un déploiement manuel. Cela implique la dénition d'un
chier particulier, appelé descripteur de déploiement du service Web. Ce chier a pour extension wsdd
("Web Service Deployment Descriptor").
3.1 Deploiement1 : un premier déploiement simple
Nous allons reprendre l'exercice Service1 qui retourne la chaîne de caractères Bonjour, à votre
service et dénir son descripteur de déploiement. Avant de commencer, créez un nouveau répertoire
de travail et placez-y la dénition Java de votre futur service, à savoir ServiceBonjour.java.
3.1.1 Étape 1 : compilation de la classe du service
La première étape consiste à compiler la classe que vous avez dénie. Pour ce faire dans une fenêtre
Dos ou Shell, vous tapez : javac ServiceBonjour.java. À l'issue de cette étape, vous devrez avoir dans
votre répertoire de travail, le chier de classe compilée ServiceBonjour.class.
3.1.2 Étape 2 : dénition du descripteur de déploiement
Le descripteur de déploiement doit être placé dans le même répertoire que le chier .class dénissant le service. Appelons ce descripteur deploy.wsdd. Son contenu sera au minimum le suivant :
<deployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/"
x m l n s : j a v a=" h t t p : // xml . apache . o r g / a x i s /wsdd/ p r o v i d e r s / j a v a ">
< s e r v i c e name=" S e r v i c e B o n j o u r " s t y l e="RPC">
<parameter name=" className " v a l u e=" S e r v i c e B o n j o u r "/>
<parameter name=" allowedMethods " v a l u e=" ∗ "/>
</ s e r v i c e>
</ deployment>
Expliquons les diérents éléments :
1. La balise de début avec comme attributs les espaces de noms des balises mises en ÷uvre dans un
descripteur de déploiement :
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
2. Le nom d'invocation du service, avec le mode, ici "RPC". Ce sera le principal mode que nous
mettrons en ÷uvre :
<service name="ServiceBonjour"style="RPC">.
3. Ensuite, la classe compilée associée au service :
<parameter name="className"value="ServiceBonjour"/>
4. Ensuite, les autorisations d'accès au service (ici toutes les méthodes) :
<parameter name="allowedMethods"value="*"/>
5. Fin de la balise service : </service>
6. Fin de la balise deployment : </deployment>
3.1.3 Étape 3 : déploiement
Le descripteur de déploiement doit être maintenant pris en compte par Axis qui exécute le service :
c'est le déploiement du service. Pour ce faire, on utilise l'utilitaire AdminClient du système Axis. La
ligne de commande est alors :
java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient deploy.wsdd
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
6/13
3.1.4 Étape 4 : installation du code du service
Nous avons, lors de l'étape précédente, demandé au serveur Axis d'être en mesure de traiter toutes
les requêtes SOAP correspondant à notre service ServiceBonjour. Cela signie donc qu'à la réception
d'une requête HTTP-SOAP, le serveur pourra exécuter la méthode (spéciée dans la requête) d'une instance de la classe correspondant à notre service (en lui passant, le cas échéant des valeurs). Cependant,
pour que le serveur Axis soit en mesure d'utiliser la classe de notre service, il faut qu'il puisse y accéder.
Techniquement, cela implique que la classe soit accessible par le chemin d'accès aux classes (classpath)
du serveur Axis. Pour ce faire, vous devez copier votre classe compilée (ServiceBonjour.class) dans
le répertoire tomcat/webapps/axis/WEB-INF/classes.
Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante :
http://localhost:8080/axis/services/ServiceBonjour.
Le nom ServiceBonjour correspond au nom du service que nous avons indiqué dans le descripteur de
déploiement. Vous pouvez alors constater que votre service a bien été déployé sur Axis en ayant en
retour la page HTML suivante :
ServiceBonjour
Hi t h e r e , t h i s i s an AXIS s e r v i c e !
Perhaps t h e r e w i l l be a form f o r i n v o k i n g t h e s e r v i c e h e r e . . .
3.1.5 Étape 5 : exécution du service
La dernière étape consiste à mettre en ÷uvre votre service qui est désormais accessible à travers
tout Internet !
Pour exécuter une méthode de votre service et obtenir la réponse SOAP correspondante, vous tapez
l'expression suivante dans votre navigateur :
http://localhost:8080/axis/services/ServiceBonjour?method=message.
Par rapport à l'expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme
de la valeur de l'attribut method. La réponse achée est le contenu SOAP, c'est-à-dire un chier XML
comme :
−
<? xml version=" 1 . 0 " e n c o d i n g="UTF−8" ?>
<s o a p e n v : E n v e l o p e x m l n s : s o a p e n v=" h t t p : // schemas . xmlsoap . o r g / soap / e n v e l o p e / "
x m l n s : x s d=" h t t p : //www. w3 . o r g /2001/XMLSchema"
x m l n s : x s i=" h t t p : //www. w3 . o r g /2001/XMLSchema− i n s t a n c e ">
− <soapenv:Body>
− <messageResponse
s o a p e n v : e n c o d i n g S t y l e=" h t t p : // schemas . xmlsoap . o r g / soap / e n c o d i n g /">
<messageReturn x s i : t y p e=" x s d : s t r i n g ">Bonjour , à v o t r e s e r v i c e</ messageReturn>
</ messageResponse>
</ soapenv:Body>
</ s o a p e n v : E n v e l o p e>
3.2 Déploiement2 : un deuxième déploiement simple
En vous basant sur le modèle de l'exercice précédent, on vous demande d'eectuer le déploiement
du service Service2 qui retourne le carré d'un nombre passé en paramètre de méthode.
3.3 Désactivation1 : pour désactiver un service web
Pour retirer un service de l'ensemble des services déployés, il sut d'appliquer l'utilitaire AdminClient
au chier undeploy.wsdd correspondant au service. Le contenu du chier undeploy.wsdd sera toujours
le même, au nom de service près. Pour le service ServiceBonjour, nous aurons :
<undeployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/">
< s e r v i c e name=" S e r v i c e B o n j o u r "/>
</ undeployment>
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
7/13
La ligne de commande est alors simplement :
java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient undeploy.wsdd
Essayez de désactiver les deux services que vous avez déployés dans les deux exercices précédents.
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
8/13
4 Exercices de déploiement avancé
Exercices illustrant le déploiement avancé des Services Web sous Axis.
4.1 Déploiement3 : un service plus complet
4.1.1 Étape 1 : dénition et compilation de la classe du service
On vous demande dans un premier temps de dénir un service web de gestion de compte. Pour
cela, vous allez dénir une classe Java Compte.java très simple, qui ne contient qu'un seul attribut (ou
champ) d'instance, solde, représentant le solde du compte. La classe comporte les méthodes suivantes :
public void deposer(int montant) : permet d'eectuer un dépôt spécique sur le compte ;
public void retirer(int montant) : permet d'eectuer un retrait spécique sur le compte. On
interdit les retraits qui conduiraient à un solde négatif ;
public int solde() : retourne la valeur du solde du compte.
Voici le squelette de la classe que vous devez compléter :
1 public class Compte {
2
// declaration de la variable solde
3
// insérez votre code ici
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
}
}
}
}
}
}
// le constructeur
public Compte () {
solde = 0;
public void deposer ( int montant ) {
// insérez votre code ici
// actualiser le solde
public boolean retirer ( int montant ) {
// insérez votre code ici
// verifier que le solde ne devient pas negatif
// si c ' est OK alors actualiser le solde et retourner true
// si ce n ' est pas OK alors retourner false
public boolean retraitAutorise ( int montant ) {
// insérez votre code ici
// retourne true si le solde ne devient pas negatif
// retourne false si le solde ne devient pas negatif
public int solde () {
// insérez votre code ici
4.1.2 Étape 2 : dénition du descripteur de déploiement
Le descripteur de déploiement doit être placé dans le même répertoire que le .class dénissant le
service. Appelons ce descripteur deploy.wsdd. Son contenu sera au minimum :
<deployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/"
x m l n s : j a v a=" h t t p : // xml . apache . o r g / a x i s /wsdd/ p r o v i d e r s / j a v a ">
< s e r v i c e name=" CompteService " s t y l e="RPC">
<parameter name=" className " v a l u e="Compte"/>
<parameter name=" allowedMethods " v a l u e=" ∗ "/>
</ s e r v i c e>
</ deployment>
Expliquons les diérents éléments :
1. Balise de début avec comme attributs les espaces de noms des balises mises en ÷uvre dans un
descripteur de déploiement :
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
9/13
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
2. Le nom d'invocation du service, avec le mode, ici "RPC". Ce sera le principal mode que nous
mettrons en ÷uvre :
<service name="CompteService"style="RPC">
3. Ensuite, la classe compilée associée au service :
<parameter name="className"value="Compte"/>
4. Ensuite, les autorisations d'accès au service (ici toutes les méthodes) :
<parameter name="allowedMethods"value="*"/>
5. Fin de la balise service : </service>
6. Fin de la balise deployment : </deployment>
4.1.3 Étape 3 : déploiement
Le descripteur de déploiement doit être maintenant pris en compte par le serveur Axis (i.e. le
fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, on utiliser l'utilitaire
AdminClient du serveur Axis. La ligne de commande est alors :
java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient deploy.wsdd
4.1.4 Étape 4 : installation du service
Nous avons, lors de l'étape précédente, demandé au serveur Axis d'être en mesure de traiter toutes
les requêtes SOAP correspondant à notre service CompteService. Cela signie donc qu'à la réception
d'une requête HTTP-SOAP, le serveur pourra appliquer la méthode spéciée dans la requête à une
instance de la classe Compte correspondant à notre service CompteService (en lui passant, le cas échéant
des valeurs). Cependant, pour que le serveur Axis soit en mesure d'utiliser la classe de notre service,
il doit être en mesure d'y accéder. Techniquement, cela implique que la classe soit accessible par le
chemin d'accès aux classes (classpath) du serveur Axis. Pour ce faire, vous devez copier votre classe
compilée (Compte.class) dans le répertoire tomcat/webapps/axis/WEB-INF/classes.
Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante :
http://localhost:8080/axis/services/CompteService
Le nom CompteService correspond au nom du service que nous avons indiqué dans le descripteur de
déploiement. Vous pouvez alors constater que votre service a bien été déployé sur Axis en ayant en
retour la page HTML suivante :
CompteService
Hi t h e r e , t h i s i s an AXIS s e r v i c e !
Perhaps t h e r e w i l l be a form f o r i n v o k i n g t h e s e r v i c e h e r e . . .
4.1.5 Étape 5 : exécution du service
La dernière étape consiste à mettre en ÷uvre votre service qui est désormais accessible à travers
Internet ! Pour exécuter une méthode de votre service et obtenir la réponse SOAP correspondante,
vous tapez l'expression suivante dans votre navigateur :
http://localhost:8080/axis/services/CompteService?method=solde
Par rapport à l'expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme
de la valeur de l'attribut method. La réponse achée est le contenu SOAP, c'est-à-dire un chier XML
comme :
<? xml version=" 1 . 0 " e n c o d i n g="UTF−8" ?>
<s o a p e n v : E n v e l o p e x m l n s : s o a p e n v=" h t t p : // schemas . xmlsoap . o r g / soap / e n v e l o p e / "
x m l n s : x s d=" h t t p : //www. w3 . o r g /2001/XMLSchema"
x m l n s : x s i=" h t t p : //www. w3 . o r g /2001/XMLSchema− i n s t a n c e "> <soapenv:Body>
<s o l d e R e s p o n s e
s o a p e n v : e n c o d i n g S t y l e=" h t t p : // schemas . xmlsoap . o r g / soap / e n c o d i n g /">
<s o l d e R e t u r n x s i : t y p e=" x s d : i n t ">0</ s o l d e R e t u r n>
</ s o l d e R e s p o n s e>
</ soapenv:Body>
</ s o a p e n v : E n v e l o p e>
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
10/13
4.2 DeploiementAvance1 : un service plus complet
4.2.1 Étape 1 : restriction des accès client
Lors de l'exercice précédent, en eectuant un déploiement qui autorise l'accès à toutes les méthodes
du service, nous donnons une trop grande visibilité du service. En eet, la méthode retraitAutorise est
une méthode interne de travail de notre service. Pour interdire l'accès à cette méthode, nous avons les
deux possibilités suivantes : déclarer la méthode retraitAutorise comme private. De cette façon, lors
du déploiement, Axis, en générant le document WSDL, rend cette méthode invisible pour les clients
du service. Cependant, cette façon de faire n'est pas toujours possible, car parfois, on veut rendre
accessible une méthode pour d'autres objets (serveur en autres), sans pour autant qu'elle soit visible
pour les clients. Si on conserve la déclaration private de la méthode, elle ne sera pas utilisable par les
autres objets serveur.
Pour pallier cette diculté, on peut conserver la méthode comme public (pas de modication pour
le développement), mais empêcher l'accès aux client. Dans ce cas, on doit l'indiquer explicitement
comme information de déploiement. Vous devez modier le contenu du descripteur de déploiement de
votre service, le chier deploy.wsdd, en précisant uniquement les méthodes accessibles aux clients. Le
chier devra ressembler à :
<deployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/"
x m l n s : j a v a=" h t t p : // xml . apache . o r g / a x i s /wsdd/ p r o v i d e r s / j a v a ">
< s e r v i c e name=" CompteService " s t y l e="RPC">
<parameter name=" className " v a l u e="Compte"/>
<parameter name=" allowedMethods " v a l u e=" s o l d e d e p o s e r r e t i r e r "/>
</ s e r v i c e>
</ deployment>
On indique pour l'attribut allowedMethods, uniquement les noms de méthodes accessibles à distance.
4.2.2 Étape 2 : retrait (désactivation) du service
Pour retirer un service déployé, il sut d'appliquer l'utilitaire AdminClient avec le chier undeploy.wsdd
correspondant au service. Le contenu du chier undeploy.wsdd sera toujours le même, au nom de service près. Pour le service CompteService, nous aurons :
<undeployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/">
< s e r v i c e name=" CompteService "/>
</ undeployment>
La ligne de commande est alors simplement :
java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient undeploy.wsdd
Essayez de désactiver les deux services que vous avez déployés dans les deux exercices précédents.
4.2.3 Étape 3 : (re)déploiement
Le (nouveau) descripteur de déploiement doit être maintenant pris en compte par le serveur Axis
(i.e. le fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, il convient d'utiliser
l'utilitaire AdminClient du serveur Axis. La ligne de commande est alors :
java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient deploy.wsdd
4.2.4 Étape 4 : exécution du service
Maintenant, vous pouvez vérier si la méthode interdite retraitAutorise est toujours accessible à
distance !
4.3 DéploiementAvance2 : persistance des données
4.3.1 Étape 1 : modication du mode d'interaction
L'exercice précédent met en évidence un problème de fonctionnement essentiel. En eet, si vous
eectuez un dépôt (en passant par l'URL d'activation de la méthode du service, comme nous l'avons
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
11/13
fait depuis le début) d'un montant quelconque et qu'ensuite vous demandez la visualisation du solde,
vous obtiendrez toujours la même valeur : 0 ! Pourquoi ?
La réponse est simple : à chaque fois que vous invoquez une méthode du service (en fait à chaque
utilisation du service), le serveur Axis, avant d'appliquer la méthode demandée, crée une nouvelle
instance de la classe correspondante (ici Compte). De ce fait, à chaque invocation de méthode, nous
aurons toujours une nouvelle instance qui sera obtenue avec le constructeur par défaut qui initialise la
variable solde à la valeur 0 ! :
1
// le constructeur
2
public Compte () {
3
solde = 0;
4
}
Détaillons ce qui ce passe avec les deux appels suivants :
http://localhost:8080/axis/services/CompteService?method=deposer&montant=100
http://localhost:8080/axis/services/CompteService?method=solde
Le premier appel correspond à une demande de dépôt de 100 et le second correspondant à une demande
de visualisation du solde.
Premier appel : le serveur crée une nouvelle instance : C1 = new Compte();
Il applique la méthode correspondant à l'appel : C1.deposer(100);
À ce moment l'instance C1 dispose bien d'un solde de 100. Si on eectuait sur cette instance, l'appel
suivant : C1.solde();, nous obtiendrions bien la valeur : 100
Deuxième appel : le serveur crée une nouvelle instance. Nous la nommons C2 pour bien montrer
qu'elle est diérente de C1 : C2 = new Compte();
C2 dispose alors d'un solde initial égal à 0. Le serveur Axis applique la méthode correspondant à
l'appel : C2.solde();
Nous obtenons alors : 0. Pour éviter que le serveur ne crée une nouvelle instance à chaque appel, nous
devons lui préciser que l'accès au service doit être associée à la session utilisateur. En d'autres termes,
nous voulons que lors du premier accès, le serveur crée une nouvelle instance, puis lors des appels
suivants, à partir du même navigateur (en fait dans la même session), le serveur utilise toujours la
même instance. Pour ce faire, vous devez inclure dans le descripteur de déploiement de votre service :
<parameter name="scope"value="application"/>.
Vous devrez donc avoir quelque chose comme :
<deployment xmlns=" h t t p : // xml . apache . o r g / a x i s /wsdd/"
x m l n s : j a v a=" h t t p : // xml . apache . o r g / a x i s /wsdd/ p r o v i d e r s / j a v a ">
< s e r v i c e name=" CompteService " s t y l e="RPC">
… // l e s a u t r e s e l e m e n t s h a b i t u e l s de d é p l o i e m e n t
<parameter name=" s c o p e " v a l u e=" a p p l i c a t i o n "/>
</ s e r v i c e>
</ deployment>
4.3.2 Étape 2 : exécution de votre service
Exécutez plusieurs fois les méthodes de dépôt et de retrait et visualisez à chaque fois votre solde
pour constater que les diérentes opérations s'appliquent bien au même objet serveur !
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
12/13
5 Clients pour les Services Web Axis
Exercices illustrant l'utilisation des services Web par des applications en langage Java.
Jusqu'à présent, nous avons toujours utilisé le navigateur Web pour invoquer les services et visualiser les résultats retournés (au format SOAP). Nous allons étudier maintenant, un autre mode
de communication avec les services plus adapté à leur mise en ÷uvre, et surtout à l'intégration avec
d'autres applications. Ce deuxième modèle consiste à dénir une application Java qui réalise les étapes
suivantes :
1. Création d'un accès au service
2. Création d'un appel vers le service
3. Récupération de l'URL du service accédé
4. Récupération de la méthode à appliquer
5. Mise en place des éventuelles valeurs des paramètres de la méthode
6. Invocation du service
7. Récupération du résultat
Le squelette standard et très général de dénition d'un client d'accès à un service est :
1 // importation des paquetages
2 import org . apache . axis . client .*;
3 import javax . xml . namespace .*;
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// definition de la classe
public class ClientServiceBonjour {
// definition de main
public static void main ( String [] args ) {
try {
// étape 1 : creation de l ' accès vers le service
Service service = new Service ();
// étape 2 : creation d ' un appel vers le service
Call call = ( Call ) service . createCall ();
// étape 3 : récupération de l ' adresse URL du service accédé
String endpoint = " http :// localhost :8080/ axis / services / ServiceBonjour " ;
call . setTargetEndpointAddress ( new java . net . URL ( endpoint ));
}
}
}
// étapes 4 -5 -6 -7 :
Récupération de la méthode à appliquer
Mise en place des éventuels valeurs des paramètres de la méthode
Invocation du service
// Récupération du résultat :
String message = ( String ) call . invoke ( " message " new Object []{});
System . out . println ( " Retour de ServiceBonjour : " + message );
} catch ( Exception e ) {
System . err . println ( e . toString ());
5.1 Client1 : dénition d'un client Java pour ServiceBonjour
On vous demande, en reprenant directement le modèle précédent, d'écrire un client pour le service
Web, déjà déployé, ServiceBonjour.
5.2 Client2 : dénition d'un client Java pour Carre
Écrire un client Java qui utilise le service CarreService.
Licence professionnelle CMSII - UE2 - Services Web - Exercices Axis -Tomcat - Février 2005
5.3 Client3 : dénition d'un client Java pour Compte
Écrire un client Java qui utilise le service CompteService. On veut pouvoir :
eectuer des dépôts ;
eectuer des retraits ;
visualiser le solde.
13/13

Documents pareils