Escolar Documentos
Profissional Documentos
Cultura Documentos
Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
@mickaelbaron
keulkeul.blogspot.com
http://creativecommons.org/licenses/by-sa/2.0/fr
Mickaël BARON
https://java.developpez.com
keulkeul.blogspot.com
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 4
Déroulement du cours
Pédagogie du cours
Illustration avec de nombreux exemples qui sont disponibles à
l’adresse http://mbaron.developpez.com/soa/jaxws/
Des bulles d’aide tout au long du cours
Survol des principaux concepts en évitant une présentation
exhaustive
Logiciels utilisés
@mickaelbaron
Pré-requis
keulkeul.blogspot.com
Exemples
https://github.com/mickaelbaron/jaxws-examples
JAX-WS - M. Baron - Page 5
Ressources
java.sun.com/developer/technicalArticles/J2SE/jax_ws_2/
www.jroller.com/gmazza/entry/adding_jax_ws_handlers_to
blog.vinodsingh.com/2008/09/using-jax-ws-handlers_25.html
keulkeul.blogspot.com
Cours
java.sun.com/webservices/docs/1.6/tutorial/doc/index.html
www.javapassion.com/webservices/jaxwsbasics.pdf
JAX-WS - M. Baron - Page 6
Ressources : bibliothèque
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.1</version>
</dependency>
dépendance manquante
<dependency>
keulkeul.blogspot.com
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
Développement de
clients dans des Description
WSDL
JAVA
Servlet JAX-WS
PHP SOAP
@mickaelbaron
Approche Bottom / Up
.NET Serveur
Web Conteneur Java
Classes JAVA annotées
implémentant le
keulkeul.blogspot.com
service web
Utilisation du service
web par envoi /
réception de messages
Couche Cliente Couche Serveur
SOAP
JAX-WS - M. Baron - Page 13
Généralités JAX-WS : fonctionnement
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 15
Développement Serveur : généralités
WSDL 1
UnMarshall
Servlet JAXB
Marshall
SOAP
Serveur
Web
1
Classes Java décrivant
Request / Response
@mickaelbaron
Approche Bottom / Up
JAX-WS
Conteneur Java
service web
Légende
Déployer l’application
service web
@WebService
public class HelloWorldService {
L’opération makeHelloWorld
public String makeHelloWorld(String value) { contenant un message input et
@mickaelbaron
L’opération simpleHelloWorld
contenant un message output
uniquement
HelloWorldService.java du projet
jaxws-helloworldquietwebservice
JAX-WS - M. Baron - Page 19
Développement Serveur : Bottom / Up
Document WSDL du
service web développé
keulkeul.blogspot.com
@WebService(name="HelloWorld",targetNamespace="http://helloworldwebservice.mickaelbaron.fr/")
@SOAPBinding(style=Style.RPC, use=Use.LITERAL)
public interface HelloWorldService { Utilisation d’une interface pour
définir les paramètres du
@WebMethod(operationName="makeHelloWorld")
@WebResult(name="helloWorldResult")
service web
String makeHelloWorld(
@WebParam(name = "value")String value);
@WebMethod(operationName="simpleHelloWorld")
@WebResult(name="helloWorldResult")
HelloWorldService.java du projet
String simpleHelloWorld(); jaxws-helloworldwebservice
}
package fr.mickaelbaron.helloworldwebservice;
@mickaelbaron
@WebService(endpointInterface="fr.mickaelbaron.helloworldwebservice.HelloWorldService",
serviceName="HelloWorldService", portName="HelloWorldPort")
public class HelloWorldServiceImpl implements HelloWorldService {
}
return "Hello World to everybody";
Classe qui fournit
} l’implémentation du service web
HelloWorldServiceImpl.java du projet
jaxws-helloworldwebservice JAX-WS - M. Baron - Page 21
Développement Serveur : Bottom / Up
@WebService(name="HelloWorld",targetNamespace="http://helloworldwebservice.mickaelbaron.fr/")
@SOAPBinding(style=Style.RPC, use=Use.LITERAL)
public interface HelloWorldService { Utilisation d’une interface pour
définir les paramètres du
@WebMethod(operationName="makeHelloWorld")
@WebResult(name="helloWorldResult")
service web
String makeHelloWorld(
@WebParam(name = "value")String value);
@WebMethod(operationName="simpleHelloWorld")
@WebResult(name="helloWorldResult")
HelloWorldService.java du projet
String simpleHelloWorld(); jaxws-helloworldwebservice
}
package fr.mickaelbaron.helloworldwebservice;
@mickaelbaron
@WebService(endpointInterface="fr.mickaelbaron.helloworldwebservice.HelloWorldService",
serviceName="HelloWorldService", portName="HelloWorldPort")
public class HelloWorldServiceImpl {
Pas nécessaire d’indiquer
public String makeHelloWorld(String value) {
return "Hello World to " + value; l’implémentation puisqu’elle
est précisée dans l’annotation
keulkeul.blogspot.com
<configuration>
<sei>fr.mickaelbaron.helloworldwebservice.HelloWorldServiceImpl</sei>
<genWsdl>true</genWsdl>
<keep>true</keep>
<executable>${java.home}/bin/wsgen</executable>
</configuration>
</plugin>
keulkeul.blogspot.com
</plugins>
</build> Nécessaire pour fonctionner avec la
</project>
version 9 et 10 de Java (Sous OS Win
remplacer par wsgen.exe)
pom.xml du projet
jaxws-helloworldwebservice JAX-WS - M. Baron - Page 24
Développement Serveur : Top / Down
Document WSDL
décrivant le service web
2
Classes Java décrivant
Request / Response
~ Proxy du
WSDL 1 service web
UnMarshall
@mickaelbaron
2
Interface Java
Servlet JAXB du PortType
Marshall
SOAP
JAX-WS
Conteneur Java
keulkeul.blogspot.com
Serveur
Web
Classes JAVA
Cette classe décrit le
Légende annotées
traitement du service web
implémentant le
1 Générer implicitement service web
par l’outil WSGEN
2 Générer explicitement
par l’outil WSIMPORT Couche Serveur JAX-WS - M. Baron - Page 25
Développement Serveur : Top / Down
<service name="NotebookService">...</service>
</definitions>
L’interface NotebookService
définit la classe Java
annotée avec JAX-WS
@mickaelbaron
@WebMethod
@WebResult(name = "addPersonWithComplexTypeResult", targetNamespace = "")
keulkeul.blogspot.com
...
} Interface NotebookService.java du projet
jaxws-notebookwebservicefromwsdl
JAX-WS - M. Baron - Page 28
Développement Serveur : Top / Down
first.setName("Ken BLOCK");
first.setBirthyear("1967");
first.setAddress("United States");
développer)
Person second = new Person();
second.setName("Colin MCRAE");
second.setBirthyear("1968");
second.setAddress("Scotland");
tabPerson.add(first);
tabPerson.add(second);
return tabPerson;
NotebookServiceImpl.java du projet
} jaxws-notebookwebservicefromwsdl
public void addPersonWithSimpleType(String name, String address, String birthyear) {
System.out.println("Name : " + name + " Address : " + address + " birthyear : " + birthyear);
}
}
<project ...>
... Plug-in à utiliser pour la
<build>
<plugins> génération des classes Java
<plugin>
<groupId>org.codehaust.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.5</version>
Le document WSDL
<executions> disponible depuis un fichier
<execution>
<goals><goal>wsimport</goal></goals>
</execution>
</executions>
<configuration>
<wsdlDirectory>${project.basedir}/src/wsdl</wsdlDirectory>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
@mickaelbaron
<keep>true</keep>
<executable>${java.home}/bin/wsimport</executable>
<packageName>fr.mickaelbaron.notebookwebservicefromwsdl</packageName>
</configuration>
</plugin>
</plugins> Package par défaut des
</build>
</project> classes générées
keulkeul.blogspot.com
pom.xml du projet
jaxws-notebookwebservicefromwsdl
<project ...>
... Plug-in à utiliser pour la
<build>
<plugins> génération des classes Java
<plugin>
<groupId>org.codehaust.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.5</version> Le document WSDL
<executions>
<execution>
disponible depuis une URL
<goals><goal>wsimport</goal></goals>
</execution>
</executions>
<configuration>
<wsdlUrls>
<wsdlUrl>http://localhost:8080/notebookwebservice/notebook?wsdl</wsdlUrl>
@mickaelbaron
</wsdlUrls>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<keep>true</keep>
<executable>${java.home}/bin/wsimport</executable>
<packageName>fr.mickaelbaron.notebookwebservicefromwsdl</packageName>
</configuration>
</plugin>
</plugins> Package par défaut des
classes générées
</build>
</project>
keulkeul.blogspot.com
pom.xml du projet
jaxws-notebookwebservicefromwsdl
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 32
Développement Client Java
System.out.println(addPersonWithComplexType);
@mickaelbaron
}
}
return true;
}
...
}
keulkeul.blogspot.com
<enableAsyncMapping>true</enableAsyncMapping>
</bindings>
binding.xml du projet
jaxws-notebookwebserviceasyncclient
JAX-WS - M. Baron - Page 39
Développement Client Java
</wsdlUrls>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<keep>true</keep>
<executable>${java.home}/bin/wsimport</executable>
<packageName>fr.mickaelbaron.notebookwebserviceasyncclient</packageName>
<bindingFiles>
<bindingFile>
${basedir}/src/jaxws/binding.xml
</bindingFile>
</bindingFiles>
keulkeul.blogspot.com
</configuration>
</plugin>
</plugins>
</build>
Permet de spécifier le
</project> fichier binding.xml
pom.xml du projet
jaxws-notebookwebserviceasyncclient JAX-WS - M. Baron - Page 40
Développement Client Java
} catch (Exception e) {
e.printStackTrace();
}
}
de l’opération sera terminé
);
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 42
Annotations : généralités
Attributs de l’annotation
Attributs de l’annotation
sortie
sortie
JAX-WS - M. Baron - Page 47
Plan du cours
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 48
Handler : généralités
Enveloppe SOAP
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>NOM DU HANDLER</handler-name>
<handler-class>CLASSE DU HANDLER</handler-class>
</handler>
</handler-chain>
</handler-chains>
keulkeul.blogspot.com
out.println("");
} catch (Exception e) {
out.println("Exception in handler: " + e);
}
}
}
SOAPLoggingHandler.java du projet
jaxws-notebookwebservicewithsoaphandler JAX-WS - M. Baron - Page 53
Handler : côté serveur
@WebService(endpointInterface = "fr.mickaelbaron.notebookwebservicefromwsdl.Notebook")
@HandlerChain(file = "handlers.xml")
public class NotebookServiceImpl {
@mickaelbaron
...
}
NotebookServiceImpl.java du projet
jaxws-notebookwebservicewithsoaphandler JAX-WS - M. Baron - Page 54
Handler : côté serveur
} catch (Exception e) {
out.println("Exception in handler: " + e);
}
}
}
SOAPLoggingHandler.java du projet
jaxws-notebookwebserviceclientwithsoaphandler JAX-WS - M. Baron - Page 56
Handler : côté client
((BindingProvider)noteBookPort).getBinding().setHandlerChain(myHandler);
NotebookClient.java du projet
jaxws-notebookwebserviceclientwithsoaphandler
keulkeul.blogspot.com
Généralités JAX-WS
Développement serveur
Bottom -> Up
Développement client
@mickaelbaron
Annotations
keulkeul.blogspot.com
Handler
Déploiement
JAX-WS - M. Baron - Page 58
Déploiement
Usages
keulkeul.blogspot.com
du service web
@WebService( endpointInterface="fr.mickaelbaron.notebookwebservice.NotebookService",
serviceName="NotebookService",
portName="NotebookPort")
public class NotebookServiceImpl implements NotebookService {
@Override
public boolean addPersonWithComplexType(Person newPerson) { ... }
@Override
public Person getPersonByName(String name) { ... }
keulkeul.blogspot.com
@Override
public Person[] getPersons() { ... }
@Override
public void addPersonWithSimpleType(String name, String address, String birthyear) { ... }
}
startPublish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
NotebookService current = new NotebookServiceImpl();
publish = Endpoint.publish("http://localhost:8080/notebookwebservice/notebook", current);
startPublish.setEnabled(false);
stopPublish.setEnabled(true);
}
});
Utilisée pour publier le
@mickaelbaron
stopPublish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
service web
publish.stop();
stopPublish.setEnabled(false);
startPublish.setEnabled(true);
}
});
Utilisée arrêter la publication
keulkeul.blogspot.com
...
} du service web
public static void main(String[] args) {
new NotebookServicePublish();
}
}
Classe NotebookServiceSOAPPublishUI.java du
projet jaxws-notebookwebservice JAX-WS - M. Baron - Page 64
Déploiement sur un serveur d’application Java
http://jcp.org/en/jsr/summary?id=109
Conteneur nécessitant une gestion par Servlet
Nécessite une configuration explicite du service web
keulkeul.blogspot.com
Exemple : Tomcat
Note : un composant additionnel se propose de fournir le support
JSR 109 (http://tomcat.apache.org/tomcat-6.0-doc/extras.html)
JAX-WS - M. Baron - Page 65
Déploiement sur un serveur d’application Java
Fichiers de configuration
keulkeul.blogspot.com
classes *.class
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<session-config>
keulkeul.blogspot.com
web.xml du projet
jaxws-helloworldwebService JAX-WS - M. Baron - Page 67
Déploiement sur un serveur d’application Java
<profiles>
<profile>
Utilisation d’une variable pour
<id>jar</id> définir la valeur du packaging
<activation>
<activeByDefault>true</activeByDefault> (JAR ou WAR)
</activation>
<properties>
<project.packaging>jar</project.packaging>
@mickaelbaron
</properties>
</profile>
<profile>
<id>war</id>
<build>
<finalName>helloworldwebservice</finalName>
</build>
<properties> En fonction du profil choisi la
keulkeul.blogspot.com
<project.packaging>war</project.packaging>
</properties>
variable ${project.packaging}
</profile> est modifié en jar ou war
</profiles>
</project>
pom.xml du projet
jaxws-helloworldwebservice JAX-WS - M. Baron - Page 69
Déploiement sur un serveur d’application Java
$ mvn clean package –P war # Compile et build le projet JAXWS-HelloWorldWebService en invoquant le profil war
=> Fichier helloworldwebservice.war disponible dans le répertoire target/
return tabPerson;
}
@WebServiceRef(wsdlLocation = "http://localhost:8080/NotebookWebServiceFromEJB/Notebook?wsdl")
private Notebook_Service service;
La référence à
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>"); Notebook_Service est donnée
out.println("<head>");
par le conteneur EJB
out.println("<title>Servlet NotebookWebServiceFromEJBClientServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet NotebookWebServiceFromEJBClientServlet at " + request.getContextPath() + "</h1>");
try {
@mickaelbaron
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
https://developer.ebay.com/DevZone/account/
}
}
itemFilter.add(objFilter2);
itemFilter.add(objFilter3);
Une liste de
liens d’aperçu
d’image est
générée par
keulkeul.blogspot.com
rapport à la
recherche
effectuée