48
A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

Embed Size (px)

Citation preview

Page 1: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

AXIS

Master MIAGE/SID – Université NANCY2

Page 2: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Généralités

Open source de Apache Software FoundationMoteur SOAP

Compatible JAX-RPCDistribué avec des outils de développement et

de monitoringAccompagné de documentation et d'exemples

Page 3: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Architecture JAX-RPC

HTTP

SOAP

JAX-RPC JAX-RPC

API Client API Serveur

WSDLCLIENT SERVICE

Page 4: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Architecture Axis

JVM

Moteur de Servlet

AxisServlet

La Servlet AxisServlet reçoit et renvoie les messages SOAP et transmet aux objets Java correspondant Les Objets Java effectuent

les services. Ils sont des objets Java classiques.

Objets Java et Servlet sont dans la même JVM (pas de répartition).

SOAP/HTTP

Le client envoie des messages SOAP/HTTP

D'après Xavier Blanc

Page 5: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Axis2

JVM

Moteur de Servlet

AxisServlet

Archives au format .aar

SOAP/HTTP

Page 6: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Activité : développer un serveur

Développer un serveur qui fournit le change de différentes monnaies par rapport au DM

Ecrire ensuite une application de conversion de monnaies (client)

Exemple d’opérations:getDollar()getFrancSuisse()getLivre()getYen()

Page 7: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

ARCHIVES

Page 8: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Créer un service web avec Axis2…

…et Eclipse for J2EE developper

Page 9: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Configuration

Page 10: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Créer un projet

Page 11: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ajouter automatiquement les jar de Axis2 dans lib

Page 12: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 13: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 14: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Créer une classe

Page 15: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Générer le WS

Page 16: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 17: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 18: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 19: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Page 20: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Tester le service

Page 21: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Axis

Ecriture d’un serveur

Page 22: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Projet Eclipse/Tomcat

build.xmlproject.properties

deploy.wsddundeploy.wsddindex.jsp…

axis-change

src classeslib

fr.miage.sid.axis.server

<ext-jars>axis.jar

axis-ant.jarwsdl4j.jarmail.jar

activation.jar….java

.class

WEB-INF

web.xmlserver-config.wsdd

perms.lstusers.lst…

Page 23: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Propertiesname=poubversion=1.0year=2006debug=ondeploy.file=deploy.wsddundeploy.file=undeploy.wsddservice.host=localhostservice.port=80service.package=fr.miage.sid.axis.server

Page 24: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Service « rapide »

Dans un premier temps, il nous faut un service ;Axis permet d’en créer de manière très rapide. Pour notre application, nous allons créer un service qui

nous permet d’obtenir le cours de différentes monnaies en euro.

Exemple d’opérations:getDollar()getFrancSuisse()getLivre()getYen()

Page 25: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Change : service

Créer un programme source javaexemple : une classe Change qui fournit le taux

de change de l’USD, CHF, JPY, GBPModifier l'extension .java du fichier source en .jws Déployer le fichier .jws

copie dans %tomcat%\webapps\axis

Page 26: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Listing : Change.jws

public class Change {

private double EU_USD = 1.251;

private double EU_CHF = 1.592;

private double EU_JPY = 149.00;

private double EU_GBP = 0.670;

public double getDollar(){return EU_USD;}

public double getFrancSuisse(){return EU_CHF;}

public double getYen(){return EU_JPY;}

public double getLivre(){return EU_GBP;}

}

Page 27: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Test du service Change

Examiner sa description WSDL http://localhost:8080/axis/Change.jws?wsdl

Enregistrer le fichier WSDL dans un projet EclipseExemple : change.wsdl

Tester ce service avec les outils Eclipse/WTPMenu contextuel Web Services sur change.wsdl

et Test with Web services Explorer…

Page 28: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Change : client

On peut maintenant écrire une application cliente du service change.

Par exemple, un convertisseur de monnaie :

Page 29: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ecriture « normale » d’un service

Usage des fichiers JWS limité :Obligation de travailler avec le code source Pas de possibilité de mappingsPas de possibilité de contrôle avec un handler

On est donc amené à déployer des classes (ou éventuellement des jars)

Page 30: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ecriture « normale » d’un service

Le point de départ peut être :

1. un fichier WSDL : On utilise alors l’outil WSDL2JAVA pour

engendrer le « squelette » d’un serveur (skeleton)

2. une classe JAVA : Le fichier WSDL est dynamiquement engendré

par le servlet Axis

Page 31: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Etapes

1. Développer le service et l’intégrer dans un projet Tomcat contenant le servlet Axis (autrement dit déployer le servlet Axis sous Tomcat)

2. A l’aide d’un fichier de descripteur de déploiement (WSDD) propre à Axis, déployer le service Axis

Il s’agit de mettre à jour le fichier de configuration server-config.wsdd qui se trouve dans le dossier WEB-INF d’Axis

On utilise l’outil AdminClient d’Axis

Page 32: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ant<taskdef name="axis-admin" classname="org.apache.axis.tools.ant.axis.AdminClientTask">

<classpath refid="classpath" /></taskdef>

<target name="deployer" description="Déploiement du serveur"><axis-admin port="${service.port}" hostname="$

{service.host}" failonerror="true" servletpath="${name}/services/AdminService" debug="true" xmlfile="${deploy.file}" /></target>

Page 33: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

WSDD<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<service name="change" provider="java:RPC"> <parameter name="className" value="fr.miage.sid.axis.server.Change"/> <parameter name="allowedMethods" value="*"/> </service>

</deployment>

Page 34: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Explications

L’outil AdminClient s’appuie (1) sur les informations contenues dans le fichier WSDD et (2) sur les arguments passés en paramètres (host, port, axis-root) axis.jar et axis-ant.jar doivent être dans le classpath.

Axis crée un servive appelé http://<host>:<port>/<axis-root>/services/<service-name>

Le WSDL du service is accessible à http://<host>:<port>/<axis-root>/services/<service-name>?wsdl

Une liste des services est visible à http://<host>:<port>/<axis-root>/services

Page 35: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

WSDD avancée

Scope<service name=<service>...>

<parameter name="scope" value=<valeur>/> ...

</service>

<valeur> : "Request" "Session"   "Application"

Page 36: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Annexes

(archives)

Page 37: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Exemple client n°1 (DII)public String endPoint = "http://localhost:8080/axis/AddFunction.jws";

public String operationName = "addInt";

public int invokeService(int a, int b) throws Exception{

Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName(new QName(endPoint, operationName)); call.setTargetEndpointAddress( new URL(endPoint) ); Integer ret = (Integer) call.invoke( new Object[] { new Integer(a), new Integer(b)} );

return ret.intValue();}

Page 38: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Exemple client n°2 (PROXY)

public String wsdlUrl = "http://localhost:8080/axis/AddFunction.jws?wsdl";public String nameSpaceUri = "http://localhost:8080/axis/AddFunction.jws";public String serviceName = "AddFunctionService";public String portName = "AddFunction";

public int invokeService(int a, int b) throws Exception{

ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service afService = serviceFactory.createService( new URL(wsdlUrl), new QName(nameSpaceUri, serviceName)); AddFunctionServiceIntf afsIntf =(AddFunctionServiceIntf)afService .getPort(new QName(nameSpaceUri, portName), AddFunctionServiceIntf.class); return afsIntf.addInt(a, b);}

Page 39: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Exemple client n°2 (PROXY)

public interface AddFunctionServiceIntf extends java.rmi.Remote {

public int addInt(int a, int b) throws java.rmi.RemoteException;

}

Page 40: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Exemple client n°3 (STUB)

public int invokeService(int a, int b) throws Exception{

AddFunctionService afs = new AddFunctionServiceLocator(); AddFunction af = afs.getAddFunction();

return af.addInt(a, b);}

Générer préalablement le stub à l'aide de l'outil WSDL2Java

Page 41: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Déploiement de service

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MyService" provider="java:RPC"> <parameter name="className" value="samples.userguide.example3.MyService"/> <parameter name="allowedMethods" value="*"/> </service>

</deployment>

%java org.apache.axis.client.AdminClient MyService.wsdd

Page 42: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Axis

Ecriture d’un client

Page 43: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ecriture d'un client

On a le choix entre 3 méthodes :Proxy

• Cas d’utilisation : type des paramètres et résultat connus (voir exemple annexe de présentation)

Interface d'invocation dynamique (DII) :• Cas d’utilisation : on ne connaît que l’url du service =>

invocation dynamique des méthodes (voir exemple annexe de présentation)

Génération d'un Stub à partir d'une description WSDL• Cas d’utilisation : connaissance préalable du WSDL• On se place dans ce cas dans la suite…

Page 44: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Synopsis de l’application

Change.wsdl

WSDL2JAVA

ChangeSoapBindindStub.java

UI.java

Convertisseur.java

JAVAC

ChangeServiceLocator

ChangeService.java

Change.java

Page 45: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Projet Eclipse

build.xmlproject.properties

ChangeAxisClient

src binlib

fr.miage.sid.axis.clientimg

stub

axis.jaraxis-ant.jarwsdl4j.jarmail.jar

activation.jar…

.java

.java(wsdl2java)

.class

.jpg

Page 46: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ant<project default="compiler" basedir=".">

<!-- Variable d'accès aux variables d'environnement --><property environment="env" /><!-- Accès aux variables locales du projet --><property file="project.properties" />

<!-- Où se trouvent les jar --><property name="lib.dir" value="lib" /><!-- Où se trouvent les src --><property name="src.dir" value="src" /><!-- Où se trouvent les img --><property name="img.dir" value="${src.dir}/img" /><!-- Où se trouvent les class --><property name="bin.dir" value="bin" /><!-- Où se trouvent les javadoc --><property name="javadoc.dir" value="${bin.dir}/javadoc" />

</project>

Page 47: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ant<!-- Definition de la tache ant wsdl2java --><taskdef name="wsdl2java"

classname="org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask"><classpath refid="classpath" />

</taskdef>

Page 48: A. Roussanaly - Université Nancy2 AXIS Master MIAGE/SID – Université NANCY2

A. Roussanaly - Université Nancy2

Ant<!--

====================================================================Créer un stub avec wsdl2java

====================================================================--><target name="wsdl2java"

description="Génération d'un stub (client)"><wsdl2java url="${wsdl.file}" output="${src.dir}">

<mapping namespace="${service.urn}" package="${service.package}"/></wsdl2java>

</target>