Beruflich Dokumente
Kultur Dokumente
Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
keulkeul.blogspot.com
http://creativecommons.org/licenses/by-sa/2.0/fr
Généralités JAX-WS
Développement serveur
Bottom -> Up
Top -> Down
Développement client
Annotations
Handler
keulkeul.blogspot.com
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
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 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
keulkeul.blogspot.com
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";
}
keulkeul.blogspot.com
L’opération simpleHelloWorld
contenant un message output
uniquement
HelloWorldService.java du projet
HelloWorldQuietWebService
Document WSDL du
Web Service développé
@WebService(name="HelloWorld",targetNamespace="http://helloworldwebservice.lisi.ensma.fr/")
@SOAPBinding(style=Style.RPC, use=Use.LITERAL)
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="fr.ensma.lisi.helloworldwebservice.HelloWorldService",
serviceName="HelloWorld", portName="HelloWorldPort")
public class HelloWorldServiceImpl implements HelloWorldService {
}
return "Hello World to everybody";
Classe qui fournit
} l’implémentation du Web Service
HelloWorldServiceImpl.java du projet
HelloWorldWebService JAX-WS - M. Baron - Page 17
Développement Serveur : Bottom / Up
@WebService(name="HelloWorld",targetNamespace="http://helloworldwebservice.lisi.ensma.fr/")
@SOAPBinding(style=Style.RPC, use=Use.LITERAL)
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="fr.ensma.lisi.helloworldwebservice.HelloWorldService",
serviceName="HelloWorld", portName="HelloWorldPort")
public class HelloWorldServiceImpl {
Pas nécessaire d’indiquer
public String makeHelloWorld(String value) {
keulkeul.blogspot.com
(marshall et unmarshall)
<layout>legacy</layout>
</repository> téléchargement des
<repository>
<id>maven2-repository.dev.java.net</id> dépendances
<name>Java.net Repository for Maven 2</name>
<url>http://download.java.net/maven/2/</url>
</repository>
</repositories>
</project>
pom.xml 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
web.xml 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
keulkeul.blogspot.com
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 = "http://notebookwebservice.lisi.ensma.fr/",
className = "fr.ensma.lisi.notebookwebservicefromwsdl.AddPersonWithComplexType")
@ResponseWrapper(localName = "addPersonWithComplexTypeResponse", targetNamespace = "http://notebookwebservice.lisi.ensma.fr/",
className = "fr.ensma.lisi.notebookwebservicefromwsdl.AddPersonWithComplexTypeResponse")
public boolean addPersonWithComplexType(
@WebParam(name = "newPerson", targetNamespace = "")Person newPerson);
...
} Interface Notebook.java du projet
NotebookWebServiceFromWSDL
JAX-WS - M. Baron - Page 28
Développement Serveur : Top / Down
<url>http://download.java.net/maven/1/</url>
<layout>legacy</layout> Package par défaut des
</repository>
<repository> classes générées
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven 2</name>
<url>http://download.java.net/maven/2/</url>
</repository>
</repositories>
</project>
pom.xml du projet
NotebookWebServiceFromWSDL JAX-WS - M. Baron - Page 30
Développement Client Java
paquets SOAP
messages SOAP
System.out.println(addPersonWithComplexType);
}
}
keulkeul.blogspot.com
return true;
}
...
}
keulkeul.blogspot.com
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Terminé");
Pour éviter de terminer le
} programme
}
NotebookAsyncClient.java 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>
SOAPLoggingHandler.java du projet
NotebookWebServiceWithSOAPHandler JAX-WS - M. Baron - Page 48
Handler : côté Serveur
@WebService(endpointInterface = "fr.ensma.lisi.notebookwebservicefromwsdl.Notebook")
@HandlerChain(file = "handlers.xml")
public class NotebookServiceImpl {
public boolean addPersonWithComplexType(Person newPerson) {
...
}
NotebookServiceImpl.java du projet
NotebookWebServiceWithSOAPHandler JAX-WS - M. Baron - Page 49
Handler : côté Serveur
SOAPLoggingHandler.java du projet
NotebookWebServiceClientWithSOAPHandler JAX-WS - M. Baron - Page 51
Handler : côté Client
((BindingProvider)noteBookPort).getBinding().setHandlerChain(myHandler);
NotebookClient.java du projet
keulkeul.blogspot.com
NotebookWebServiceClientWithSOAPHandler
du Web Service
@WebService(endpointInterface="fr.ensma.lisi.notebookwebservicefromjavase.NotebookService",
serviceName="Notebook",
portName="NoteBookPort")
public class NotebookServiceImpl implements NotebookService {
@Override
keulkeul.blogspot.com
startPublish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
NotebookService current = new NotebookServiceImpl();
publish = Endpoint.publish("http://localhost:8080/notebook", current);
startPublish.setEnabled(false);
stopPublish.setEnabled(true);
} Utilisée pour publier le Web
});
Service
stopPublish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
publish.stop();
keulkeul.blogspot.com
stopPublish.setEnabled(false);
startPublish.setEnabled(true);
} Utilisée arrêter la publication
});
du Web Service
...
}
public static void main(String[] args) {
new NotebookServicePublish();
}
} Classe NotebookServicePublish.java du projet
NotebookWebServiceFromJavaSE JAX-WS - M. Baron - Page 57
Web Service avec les EJB : généralités
tabPerson.add(first);
tabPerson.add(second);
return tabPerson;
}
@WebServiceRef(wsdlLocation = "http://localhost:8080/NotebookWebServiceFromEJB/Notebook?wsdl")
private Notebook_Service service;
try {
Notebook port = service.getNoteBookPort();
Person newPerson = new Person();
newPerson.setName("BARON Mickael");
newPerson.setAddress("Poitiers");
newPerson.setBirthyear("1976");
boolean result = port.addPersonWithComplexType(newPerson);
out.println("<div>Result = " + result + "</div>");
} catch (Exception ex) {
keulkeul.blogspot.com
ex.printStackTrace();
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
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
httpHeaders.put("X-EBAY-SOA-SECURITY-APPNAME", Collections.singletonList(KEY_PERSONAL));
keulkeul.blogspot.com
requestProperties.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);
requestProperties.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, strBaseURL);
catID.add("279");
req.setSortOrder(SortOrderType.END_TIME_SOONEST);
req.setKeywords("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)
keulkeul.blogspot.com
2
Faire Next JAX-WS - M. Baron - Page 69
Web Service avec les EJB : serveur
Définir le nom du projet
NotebookWebServiceFromEJB
3
keulkeul.blogspot.com
4
Faire Next JAX-WS - M. Baron - Page 70
keulkeul.blogspot.com Web Service avec les EJB : serveur
7
Recopier les fichiers Java
dans ce nouveau package
keulkeul.blogspot.com
...
}
}
10
Déploiement de
l’application sur Glassfish
keulkeul.blogspot.com
11
Tester le Web
Service
keulkeul.blogspot.com
Choisir la construction
d’une Web Application
(Catégories : Java Web)
keulkeul.blogspot.com
2
Faire Next JAX-WS - M. Baron - Page 80
Web Service avec les EJB : client
Définir le nom du projet
NotebookWebServiceFromEJBClient
3
keulkeul.blogspot.com
4
Faire Next JAX-WS - M. Baron - Page 81
keulkeul.blogspot.com Web Service avec les EJB : client
8
keulkeul.blogspot.com
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
keulkeul.blogspot.com
12
Faire Finish JAX-WS - M. Baron - Page 85
Web Service avec les EJB : client
13
14
keulkeul.blogspot.com
15
Faire Finish JAX-WS - M. Baron - Page 88
Web Service avec les EJB : client
@WebServiceRef(wsdlLocation = "http://localhost:8080/NotebookWebServiceFromEJB/Notebook?wsdl")
private Notebook_Service service;
try {
Notebook port = service.getNoteBookPort();
Person newPerson = new Person();
newPerson.setName("BARON Mickael");
newPerson.setAddress("Poitiers");
newPerson.setBirthyear("1976");
boolean result = port.addPersonWithComplexType(newPerson);
out.println("<div>Result = " + result + "</div>");
} catch (Exception ex) {
ex.printStackTrace();
keulkeul.blogspot.com
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
Classe NotebookWebServiceFromEJBClientServlet
du projet NotebookWebServiceFromEJBClient JAX-WS - M. Baron - Page 89