I. Outils et ressources

Outils utilisés
  • Axis 1.4
  • Apache Tomcat 5.5.17
  • Eclipse 2.1
Ressources
  • La source du web service
  • La source du client java
  • Librairies d'activation d'Axis : ici

II. Remerciements

Merci à Neo41 pour sa lecture et ses corrections, à RideKick pour sa relecture. Merci à Ricky81 pour ses conseils, et un grand merci également à Nono40, réalisateur de l'éditeur xml.

III. Lancement et configuration d'Axis

Le serveur de déploiement " Axis " est installé comme une application Web au sein du moteur de servlets et de JSP " Apache Tomcat ".

Note : pour réaliser notre web service dans les meilleures conditions, c'est préférable de faire une installation standard de Tomcat et la machine virtuelle JDK, en effet pendant l'installation ne changer pas les chemins d'installation standard, car sinon on peut se retrouver dans des situations où on aura des erreurs étranges et difficiles à interpréter.

III-A. Configuration de Tomcat

Avant de lancer Tomact vous devez vérifier que Tomcat pointe sur le JDK et non pas le JRE, car ceci peut causer une erreur assez fréquente concernant le fichier tools.jar (tools.jar est présent dans le dossier "lib" du JDK mais il n'existe pas dans le JRE), et voici l'erreur que vous pouvez avoir : "java.lang.RuntimeException: No compiler found in your classpath! (you may need to add 'tools.jar')". Donc votre Java Virtual Machine doit être comme ceci : "JAVA_HOME\jre\bin\server\jvm.dll".

Image non disponible

III-B. Démarrage de Tomcat

Vous devez, pour accéder aux possibilités de " Axis ", activer préalablement le serveur " Apache Tomcat " (j'utilise la version 5.5.17 de Tomcat). Pour cela, sous Tomcat 4, vous double-cliquez sur : "dossierInstallation\Tomcat 4\bin\startup.bat". Sous Tomcat 5.5.x, vous double-cliquez sur : "dossierInstallation\Tomcat 5.5\bin\tomcat5.exe". Ou tout simplement, si le service Tomcat est installé, utiliser "Monitor Tomcat" puis le menu "Start Service".

Image non disponible

III-C. Démarrage d'Axis

Pour installer Axis (j'utilise la version 1.4), décompresser le fichier "axis-bin-1_4.zip", puis copier le dossier "axis-1_4\webapps\axis" dans "dossierInstallation\Tomcat 5.5\webapps\", comme ça Axis sera une application web déployée sous Tomcat. Il vous manquera la librairie "activation.jar" et d'autres optionnelles: "soap.jar" et "mail.jar",… que vous pouvez copier dans "dossierInstallation\Tomcat 5.5\common\lib\". Pour vérifier la bonne installation et éventuellement accéder aux services web existants sur " Axis ", vous redémarrez Tomcat et vous tapez dans un navigateur : http://localhost:8080/axis. Ensuite, vous pouvez cliquer sur " Validate " puis "List":

Image non disponible

La validation teste l'existence des librairies requises par Axis:

Image non disponible

IV. Méthode de déploiement 1

IV-A. Création du web service

La première étape consiste à définir la classe du service web qui retournera au client la somme de 2 entiers.

La définition de cette classe est la suivante :

Le web service
Sélectionnez
public class sommer {
    public int getsomme(int a, int b) {
        return a+b;
    }
}

Utilisez un éditeur de texte simple, Kate sous Unix ou Bloc-notes sous Windows.

Attention, vous devez sauvegardez votre classe sous le fichier portant le même nom de la classe et suffixé par " jws " ! Ici, le fichier de sauvegarde sera donc : "sommer.jws".

IV-B. Déploiement du web service

La deuxième étape consiste à déployer le service au sein d'un fournisseur de services web. L'environnement d'exécution et de déploiement des services web que nous utilisons est, comme vous l'avez déjà constaté, l'outil " Axis ". Le premier mode de déploiement sous " Axis " que nous allons mettre en oeuvre est le plus simple qui soit ; c'est le déploiement instantané par fichier " JWS ". Vous noterez qu'il n'est pas nécessaire de compiler le fichier source java.

Pour réaliser le déploiement, il suffit de copier le fichier "sommer.jws" dans le domaine applicatif de " Axis ". Le domaine d'application de " Axis " est : "dossierTomcat/webapps/axis", vous devez donc copier le fichier "sommer.jws" dans ce dossier.

Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante : http://localhost:8080/axis/sommer.jws.

Vous devez alors constater que votre service a bien été déployé sur " Axis " en ayant en retour la page " html " suivante :

Image non disponible

Si vous cliquez sur ce dernier lien, vous verrez la définition " WSDL " (générée automatiquement par " Axis ") de votre service web.

Image non disponible

IV-C. Test du web service

La dernière étape consiste à mettre en oeuvre votre service qui est désormais accessible à travers tout le net ! 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/sommer.jws?method=getsomme&a=2&b=3

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 " et vous précisez les valeurs des paramètres a et b. La réponse affichée est le contenu " SOAP ", c'est-à-dire un fichier " XML " dont voici un extrait :

Image non disponible

V. Méthode de déploiement 2

Dans l'exercice précédent, nous avons mis en oeuvre un mode de déploiement 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éfinir le ou les services. En effet, le mode de déploiement automatique d'Axis travaille sur la source des classes Java, Impossibilité de décrire des particularités de déploiement (classes publiques et privées). Ce sont pour ces raisons, que nous devons parfois réaliser un déploiement explicite. Cela implique la définition d'un fichier particulier, appelé descripteur de déploiement du service web. Ce fichier porte l'extension " wsdd " pour "Web Service Deployment Descriptor".

V-A. Compilation de la classe du web service

La première étape consiste à compiler la classe que vous avez définie, renommer le fichier "sommer.jws" en "sommer.java" et compiler le par commande "javac sommer.java", après vous devez copier la classe résultante dans le dossier "jwsClasses" ou "Classes" dépendement de votre version du serveur Tomcat.

V-B. Définition du descripteur de déploiement

Le descripteur de déploiement doit être placé dans le même dossier que le " .wsdl " définissant le service. Appelons ce descripteur " deploy.wsdd ". Son contenu sera minimalement celui-ci :

Déploiement du web service
Sélectionnez

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="sommer" style="java:RPC">
<parameter name="className" value="sommer"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>

Expliquons les différents éléments :

 
Sélectionnez
Balise de début avec comme attributs les espaces de noms des balises mises en oeuvre dans un descripteur de déploiement.
deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
Le nom d'invocation du service, avec le mode, ici "RPC". Ce sera le principal mode que nous mettrons en oeuvre.
service name="sommer" style="RPC"
Ensuite, la classe compilée associée au service
parameter name="className" value="sommer"
Ensuite, les autorisations d'accès au service (ici toutes les méthodes)
parameter name="allowedMethods" value="*"
Fin de la balise "service"
service
Fin de la balise "deployment"
deployment

V-C. Déploiement du web service

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, il convient d'utiliser l'utilitaire " AdminClient " du serveur " Axis ".

La ligne de commande est alors : "java org.apache.axis.client.AdminClient deploy.wsdd"

Si les librairies Axis ne sont pas spécifiées dans le classpath, vous devez le faire comme suit dans un fichier "deploy.bat" de préférence:

Le classpath
Sélectionnez
set OLD_CLASSPATH=%CLASSPATH%
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\activation.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\mail.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\wsdl4j.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-discovery.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-logging.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\log4j-1.2.4.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\xerces.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\servlet-api.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\naming-factory.jar
set CLASSPATH="%CLASSPATH%"
java - CLASSPATH="%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd
set CLASSPATH=%OLD_CLASSPATH%

Parmi les librairies Axis inclues dans le classpath, il faut faire attention aux versions de quelques unes, donc il vaux mieux vérifier manuellement la correspondance des noms des fichiers existants dans le dossier "Axis\lib" et leurs noms dans le classpath définit ci-dessus. Si vous rencontrez encore des problèmes avec le classpath essayez de remplacer la commande "(java - CLASSPATH="%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd) par (java - CLASSPATH=".;%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd).

Si vous n'arrivez pas à lancer correctement la commande à l'aide du classpath, vous pouvez décompressez ces librairies dans le dossier "AXIS_HOME\WEB-INF", ça ne sera pas assez propre comme solution mais c'est efficace, et vous aurez seulement à lancer la commande : "java org.apache.axis.client.AdminClient deploy.wsdd"

L'arborescense du dossier Axis (avec l'utilisation du classpath) devra être comme illustré dans la figure suivante :

Image non disponible

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 " sommer ". Cela signifie donc qu'à la réception d'une requête " HTTP-SOAP ", le serveur pourra appliquer la méthode spécifiée dans la requête à une instance de la classe correspondant à notre service (en lui passant, le cas échéant des valeurs). Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante : http://localhost:8080/axis/services/sommer.

Le nom " sommer " 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 :

Image non disponible

V-D. Exécution du web service par son alias

La dernière étape consiste à mettre en oeuvre votre service qui est désormais accessible à travers tout le net ! 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/sommer?method=getsomme&a=2&b=3

Par rapport à la méthode précédente, vous précisez ici le nom du web service par son alias (ici "sommer"). La réponse affichée est le contenu " SOAP ", c'est-à-dire un fichier " XML " comme :

Image non disponible

VI. Consommer le web service en Java

Jusqu'à ce stade, nous avons toujours utilisé le navigateur Web pour invoquer les services et visualiser (sous le format SOAP) les résultats retournés. Nous allons étudier maintenant, un autre mode de communication avec les services plus adapté à leur mise en oeuvre, et surtout à l'intégration avec d'autres applications. Ce deuxième modèle consiste à la mise en oeuvre des Services Web depuis le langage Java en générant automatiquement la définition du Proxy côté client. Cela sous-entend la création de toutes les interfaces et classes nécessaires à la mise en oeuvre du service depuis Java. Ce modèle est caractérisé par:

  • Utilisation du stub côté client et du skeleton côté serveur
  • Utilisation des interfaces représentant les types des objets Java à manipuler

VI-A. Création du fichier de description du web service "wsdl"

Pour ce faire, nous utiliserons le même service précédent, dans le navigateur utiliser le menu "Fichier puis Enregistrer sous", Puis nommer le fichier "sommer.wsdl" dans le dossier "Tomcat 5.5\webapps\axis\WEB-INF".

Note : "wsdl" signifie selon http://dico.developpez.com: Langage de description des web services, respectant la syntaxe XML. Il donne une définition abstraite des services, le détail des types de données échangées, les opérations possibles, le protocole à utiliser ainsi que l'adresse (URL) du service.

VI-B. Utilisation du générateur " WSDL2Java "

L'outil " Axis " qui permet la génération des définitions Java côté client et côté serveur, s'appelle " org.apache.axis.wsdl.WSDL2Java ". L'invocation depuis une fenêtre DOS, est la commande: "java org.apache.axis.wsdl.WSDL2Java sommer.wsdl".

Remarque :

le fichier " sommer.wsdl " peut-être créé simplement, comme on l'a déjà fait, en sauvegardant le contenu de la fenêtre navigateur, lorsque l'on visualise la définition " wsdl " du service : http://localhost:8080/axis/services/sommer?wsdl . L'outil " WSDL2Java " génère l'ensemble des définitions dans un sous-dossier correspondant au nom "targetNamespace="http://127.0.0.1:8080/axis/services/sommer"" du descripteur " wsdl ". En effet, les namespaces sont mappés en packages Java.

Image non disponible

VI-C. Définition du client Java

Avant de définir le client Java, je commence par clarifier quelques ambiguïtés qui peuvent vous passer par la tête:

  • A quoi il sert le Stub généré ?
    Ce fichier est le seul point d'entrée pour le web service, il contient toute l'information dont on a besoin pour invoquer le web service :noms des méthodes, types des paramètres et les types de retour, et c'est qui permet à l'auteur du web service de protéger son code
  • Aurais-je besoin des librairies d'Axis pour consommer le web service ?
    NON, c'est seulement le serveur déployant le web service qui doit contenir les librairies Axis
  • Quels sont les fichiers aux quels j'ai besoin pour consommer le web service ?
    Nous aurons seulement besoin des fichiers générés (Stub) par la commande wsdl2java, il faut juste importer ces fichiers dans l'application et utiliser les interfaces présentes dans ce Stub.

On définit maintenant le client Java qui met en oeuvre les classes générées lors de l'étape précédente. Pour cela, votre client ressemblera à ceci :

Client Java
Sélectionnez
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import _1._0._0._127.axis.sommer_jws.*;
public class SommerClient {
	public static void main(String[] args) {
// Création du service depuis le endpoint
// SommerService correspond au nom du service dans le fichier "wsdl"
// c'est la balise : wsdl:service name="sommerService"
	 SommerService service = new SommerServiceLocator();
	 try {
// Utilisation du service pour obtenir un stub qui implemente le SDI
// (Service Definition Type ; i.e. PortType).
// Pour le typage, c'est la balise : wsdl:portType name="sommer"
// Pour le getsommer(), le sommer correspond à la balise :
// wsdl:port binding="impl:sommerSoapBinding" name="sommer"
		Sommer port = service.getsommer();
		int s;
		try {
// Mise en oeuvre du service par application directe des méthodes
			s = port.getsomme(2, 3);
			System.out.println("2+3 = " + s);
		} catch (RemoteException e1) {
			e1.printStackTrace();
		}
	 } catch (ServiceException e) {
		e.printStackTrace();
	}
	}
}

Sous Eclipse vous aurez comme ceci (j'ai utilisé "http://127.0.0.1" au lieu de "http://localhost", c'est pourquoi j'ai le chemin généré "_1._0._0.127":

Image non disponible

Pour connaître les noms des classes et interfaces à utiliser, vous devez examiner le contenu du dossier contenant les classes et interfaces générées ainsi que le fichier " wsdl " ayant permis cette génération.

VII. Désactivation du web service

Enfin pour retirer un service déployé, il suffit d'appliquer l'utilitaire " AdminClient ", créer un fichier " undeploy.wsdd " correspondant au service. Le contenu du fichier " undeploy.wsdd " sera toujours le même, au nom de service près. Pour le service " sommer ", nous aurons :

Suppression du web service
Sélectionnez

<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="sommer"/>
</undeployment>

Ensuite, la ligne de commande est simplement : "java org.apache.axis.client.AdminClient undeploy.wsdd".

Bibliographies: