Jaxws
Jaxws
Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
[Link]
[Link]
Généralités JAX-WS
Développement serveur
Bottom -> Up
Top -> Down
Développement client
Annotations
Handler
[Link]
Pédagogie du cours
Illustration avec de nombreux exemples qui sont disponibles à
l’adresse TODO
Des bulles d’aide tout au long du cours
Survol des principaux concepts en évitant une présentation
exhaustive
Logiciels utilisés
Navigateur Web, Netbeans 6.8, Tomcat 6, Glassfish 3, Maven 2
Pré-requis
[Link]
Cours
[Link]/webservices/docs/1.6/tutorial/doc/[Link]
[Link]/webservices/[Link]
JAX-WS - M. Baron - Page 5
Ressources : Bibliothèque
s’appelait JAX-RPC
Développement de
clients dans des Description
WSDL
JAVA
Servlet JAX-WS
PHP SOAP
Approche Bottom / Up
.NET Serveur
Web Conteneur Java
Classes JAVA annotées
[Link]
implémentant le
Web Service
Utilisation du Web
Service par envoie /
Couche Cliente
réception de messages Couche Serveur
SOAP
JAX-WS - M. Baron - Page 10
Généralités JAX-WS
WSDL 1
UnMarshall
Servlet JAXB
Marshall
SOAP
Serveur
Web
1
Classes Java décrivant
Request / Response
Approche Bottom / Up
JAX-WS
Conteneur Java
implémentant le
Web Service
Légende
Couche Serveur
Générer implicitement
1
par l’outil WSGEN
JAX-WS - M. Baron - Page 13
Développement Serveur : Bottom / Up
@WebService
public class HelloWorldService {
L’opération makeHelloWorld
public String makeHelloWorld(String value) { contenant un message input et
return "Hello World to " + value;
} un message output
public String simpleHelloWorld() {
return "Hello World to everybody";
}
[Link]
L’opération simpleHelloWorld
contenant un message output
uniquement
[Link] du projet
HelloWorldQuietWebService
Document WSDL du
Web Service développé
@WebService(name="HelloWorld",targetNamespace="[Link]
@SOAPBinding(style=[Link], use=[Link])
public interface HelloWorldService {
Utilisation d’une interface pour
définir les paramètres du Web
@WebMethod(operationName="makeHelloWorld")
@WebResult(name="helloWorldResult")
Service
public String makeHelloWorld(
@WebParam(name = "value")String value);
@WebService(endpointInterface="[Link]",
serviceName="HelloWorld", portName="HelloWorldPort")
public class HelloWorldServiceImpl implements HelloWorldService {
}
return "Hello World to everybody";
Classe qui fournit
} l’implémentation du Web Service
[Link] du projet
HelloWorldWebService JAX-WS - M. Baron - Page 17
Développement Serveur : Bottom / Up
@WebService(name="HelloWorld",targetNamespace="[Link]
@SOAPBinding(style=[Link], use=[Link])
public interface HelloWorldService {
Utilisation d’une interface pour
définir les paramètres du Web
@WebMethod(operationName="makeHelloWorld")
@WebResult(name="helloWorldResult")
Service
public String makeHelloWorld(
@WebParam(name = "value")String value);
@WebService(endpointInterface="[Link]",
serviceName="HelloWorld", portName="HelloWorldPort")
public class HelloWorldServiceImpl {
Pas nécessaire d’indiquer
public String makeHelloWorld(String value) {
[Link]
(marshall et unmarshall)
<layout>legacy</layout>
</repository> téléchargement des
<repository>
<id>[Link]</id> dépendances
<name>[Link] Repository for Maven 2</name>
<url>[Link]
</repository>
</repositories>
</project>
[Link] du projet
HelloWorldQuietWebService JAX-WS - M. Baron - Page 20
Développement Serveur : Bottom / Up
classes *.class
Fichiers de configuration
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout> La Servlet est accessible
</session-config>
</web-app> via cette URL
[Link] du projet
HelloWorldWebService JAX-WS - M. Baron - Page 23
Développement Serveur : Bottom / Up
Document WSDL
décrivant le Web Service
2
Classes Java décrivant
Request / Response
~ Proxy du
WSDL 1 WebService
UnMarshall
2
Interface Java
Servlet JAXB du PortType
Marshall
SOAP
[Link]
JAX-WS
Serveur Conteneur Java
Web
Classes JAVA
Cette classe décrit le
Légende annotées
traitement du Web Service
implémentant le
Générer implicitement Web Service
1
par l’outil WSGEN
Générer explicitement
2 Couche Serveur
par l’outil WSIMPORT JAX-WS - M. Baron - Page 25
Développement Serveur : Top / Down
</portType>
<binding name="NoteBookPortBinding" type="tns:Notebook">...</binding>
<service name="Notebook">...</service>
</definitions>
L’interface Notebook
définit la classe Java
annotée avec JAX-WS
@WebMethod
@WebResult(name = "addPersonWithComplexTypeResult", targetNamespace = "")
@RequestWrapper(localName = "addPersonWithComplexType", targetNamespace = "[Link]
className = "[Link]")
@ResponseWrapper(localName = "addPersonWithComplexTypeResponse", targetNamespace = "[Link]
className = "[Link]")
public boolean addPersonWithComplexType(
@WebParam(name = "newPerson", targetNamespace = "")Person newPerson);
...
} Interface [Link] du projet
NotebookWebServiceFromWSDL
JAX-WS - M. Baron - Page 28
Développement Serveur : Top / Down
<url>[Link]
<layout>legacy</layout> Package par défaut des
</repository>
<repository> classes générées
<id>[Link]</id>
<name>[Link] Repository for Maven 2</name>
<url>[Link]
</repository>
</repositories>
</project>
[Link] du projet
NotebookWebServiceFromWSDL JAX-WS - M. Baron - Page 30
Développement Client Java
paquets SOAP
messages SOAP
[Link](addPersonWithComplexType);
}
}
[Link]
return true;
}
...
}
[Link]
try {
[Link](10000);
} catch (InterruptedException e) {
[Link]();
}
[Link]("Terminé");
Pour éviter de terminer le
} programme
}
[Link] du projet
NotebookWebServiceAsyncClient JAX-WS - M. Baron - Page 38
Annotations : généralités
Attributs de l’annotation
boolean header : précise si le paramètre doit être transmis dans
l’en-tête du message (true) ou dans le corps (false)
Attributs de l’annotation
sortie
MessageContext
Corps du message SOAP
(body) Logical Message
Enveloppe SOAP
</handler-chains>
[Link] du projet
NotebookWebServiceWithSOAPHandler JAX-WS - M. Baron - Page 48
Handler : côté Serveur
@WebService(endpointInterface = "[Link]")
@HandlerChain(file = "[Link]")
public class NotebookServiceImpl {
public boolean addPersonWithComplexType(Person newPerson) {
...
}
[Link] du projet
NotebookWebServiceWithSOAPHandler JAX-WS - M. Baron - Page 49
Handler : côté Serveur
[Link] du projet
NotebookWebServiceClientWithSOAPHandler JAX-WS - M. Baron - Page 51
Handler : côté Client
((BindingProvider)noteBookPort).getBinding().setHandlerChain(myHandler);
[Link] du projet
[Link]
NotebookWebServiceClientWithSOAPHandler
du Web Service
@WebService(endpointInterface="[Link]",
serviceName="Notebook",
portName="NoteBookPort")
public class NotebookServiceImpl implements NotebookService {
@Override
[Link]
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
NotebookService current = new NotebookServiceImpl();
publish = [Link]("[Link] current);
[Link](false);
[Link](true);
} Utilisée pour publier le Web
});
Service
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
[Link]();
[Link]
[Link](false);
[Link](true);
} Utilisée arrêter la publication
});
du Web Service
...
}
public static void main(String[] args) {
new NotebookServicePublish();
}
} Classe [Link] du projet
NotebookWebServiceFromJavaSE JAX-WS - M. Baron - Page 57
Web Service avec les EJB : généralités
[Link](first);
[Link](second);
return tabPerson;
}
@WebServiceRef(wsdlLocation = "[Link]
private Notebook_Service service;
try {
Notebook port = [Link]();
Person newPerson = new Person();
[Link]("BARON Mickael");
[Link]("Poitiers");
[Link]("1976");
boolean result = [Link](newPerson);
[Link]("<div>Result = " + result + "</div>");
} catch (Exception ex) {
[Link]
[Link]();
}
[Link]("</body>");
[Link]("</html>");
} finally {
[Link]();
}
}
}
Classe NotebookWebServiceFromEJBClientServlet
du projet NotebookWebServiceFromEJBClient JAX-WS - M. Baron - Page 62
JAX-WS « in actions » : Web Services eBay
// Edit the following line to insert your AppID to set the X-EBAY-SOA-SECURITY-APPNAME correctly
[Link]("X-EBAY-SOA-SECURITY-APPNAME", [Link](KEY_PERSONAL));
[Link]
[Link](MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);
[Link](BindingProvider.ENDPOINT_ADDRESS_PROPERTY, strBaseURL);
[Link]("279");
[Link](SortOrderType.END_TIME_SOONEST);
[Link]("Harry Potter"); Recherche des produits en
// Suite dans le prochain transparent relation avec Harry Potter
}
}
Choisir la construction
d’une Web Application
(Catégories : Java Web)
[Link]
2
Faire Next JAX-WS - M. Baron - Page 69
Web Service avec les EJB : serveur
Définir le nom du projet
NotebookWebServiceFromEJB
3
[Link]
4
Faire Next JAX-WS - M. Baron - Page 70
[Link] Web Service avec les EJB : serveur
7
Recopier les fichiers Java
dans ce nouveau package
[Link]
...
}
}
10
Déploiement de
l’application sur Glassfish
[Link]
11
Tester le Web
Service
[Link]
Choisir la construction
d’une Web Application
(Catégories : Java Web)
[Link]
2
Faire Next JAX-WS - M. Baron - Page 80
Web Service avec les EJB : client
Définir le nom du projet
NotebookWebServiceFromEJBClient
3
[Link]
4
Faire Next JAX-WS - M. Baron - Page 81
[Link] Web Service avec les EJB : client
8
[Link]
Choisir la bibliothèque
JAX-WS 2.2
9
Faire Add Library
JAX-WS - M. Baron - Page 84
Web Service avec les EJB : client
Indiquer l’URL du
document WSDL 10
Préciser le package 11
des fichiers générés
[Link]
12
Faire Finish JAX-WS - M. Baron - Page 85
Web Service avec les EJB : client
13
14
[Link]
15
Faire Finish JAX-WS - M. Baron - Page 88
Web Service avec les EJB : client
@WebServiceRef(wsdlLocation = "[Link]
private Notebook_Service service;
try {
Notebook port = [Link]();
Person newPerson = new Person();
[Link]("BARON Mickael");
[Link]("Poitiers");
[Link]("1976");
boolean result = [Link](newPerson);
[Link]("<div>Result = " + result + "</div>");
} catch (Exception ex) {
[Link]();
[Link]
}
[Link]("</body>");
[Link]("</html>");
} finally {
[Link]();
}
}
}
Classe NotebookWebServiceFromEJBClientServlet
du projet NotebookWebServiceFromEJBClient JAX-WS - M. Baron - Page 89