Threads
Rseau
Outils
EJB
WS
1 / 258
Introduction 1-2-7
Threads
Rseau
Outils
EJB
WS
Bibliographie (trs) partielle : Java La synthse, Des concepts objet aux architectures Web, Clavel et alii, Dunod Informatiques, 2000 Programmation rseau avec Java, E. Rusty Harold, OReilly, 2001 XHTML, I. Graham, Eyrolles, 2001 EJB fondamental, Ed Roman, S. Ambler, T. Jewel, Eyrolles, 2002 et bien sr http://java.sun.com item en particulier http://java.sun.com/javase/6/docs/api/
2 / 258
Introduction 1-3-7
Threads
Rseau
Outils
EJB
WS
Introduction
3 / 258
Introduction 1-4-7
Threads
Rseau
Outils
EJB
WS
URL
Classes URL et URLConnection Gestion de protocole
RMI et RMI-IIOP
RMI : Remote Method Invocation
4 / 258
Introduction 1-5-7
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
5 / 258
Introduction 1-6-7
Threads
Rseau
Outils
EJB
WS
6 / 258
Introduction 1-7-7
Threads
Rseau
Outils
EJB
WS
7 / 258
Introduction 8-8-14
Threads
Rseau
Outils
EJB
WS
Introduction
8 / 258
Introduction 8-9-14
Threads
Rseau
Outils
EJB
WS
Objectifs du cours : Usage denvironnements de dveloppements (Eclipse, Netbeans) : apprentissage en TP Comprhension des pratiques logicielles en environnement ouvert (des sockets aux encapsulations beans) Cas des sites web et services web : mcanismes sous-jacents et mise en oeuvre pratique Questions lies la scurit (typage, ...)
9 / 258
Introduction 8-10-14
Threads
Rseau
Outils
EJB
WS
De plus en plus, le dveloppement de logiciels est modulaire dans sa conception, sa forme, sa mise en exploitation. Le dploiement des services web en est exemplaire. Un service web est une technologie dinformatique distribue qui offre interaction et collaboration entre "agents" (clients, vendeurs, logiciels) en donnant un sentiment dubiquit. "Web Services are loosely coupled software components delivered over Internet-standard technologies."
10 / 258
Introduction 8-11-14
Threads
Rseau
Outils
EJB
WS
1969 : Arpanet 1979 : Internet 1974-1982 : TCP 1991 : Web 1989-1996 : standard CORBA (Common Object Request Broker Architecture) de lOMG (Object Management Group) 1990-1996 : modle COM (Component Object Model) puis DCOM puis ActiveX de Microsoft 1994 : Java 1997 : 1er "web service", plateforme Jini de Sun 1998- : Dveloppement dun ensemble de protocoles par standardisation (W3C, OMG, groupes de constructeurs) 2000- : Protocoles Web2.0, BPEL, ...
11 / 258
Introduction 8-12-14
Threads
Rseau
Outils
EJB
WS
Solutions des problmes cls (utilisant en partie les mcanismes comme CORBA, DCOM, RPC) : Interoperabilit : XML utilis comme un standard de codage et transfert dinformations. Transfert sur internet via pare-feu : CORBA nutilise pas de port standard ! Les services Web utilisent HTTP comme le protocole de transport (plus prcisment le port 80 ou sa version scurise 8080)
12 / 258
Introduction 8-13-14
Threads
Rseau
Outils
EJB
WS
Pour comprendre les technologies ncessaires la mise en oeuvre dun logiciel ouvert, comme un Service Web, il faut comprendre linteraction de base : ils suivent le modle publication - recherche - lien : un fournisseur de service (service provider) publie un Service Web sur un registre (registry). le client questionne le serveur de registre pour le choix du service le client tlcharge la description de service et effectue la liaison pour utiliser ce service.
13 / 258
Introduction 8-14-14
Threads
Rseau
Outils
EJB
WS
Interoprabilit des transferts de donnes par lutilisation de 4 protocoles (en fait plus) : Publication et recherche de service
(p.e. UDDI, Universal Description Discovery Integration)
Description de services
(p.e. WSDL, Web Services Description Language, WSCL, BPEL, ...)
Description de donnes
(p.e. XML, eXtended Markup Language, XHTML, ...)
14 / 258
Introduction 15-15-40
Threads
Rseau
Outils
EJB
WS
15 / 258
Introduction 15-16-40
Threads
Rseau
Outils
EJB
WS
16 / 258
Introduction 15-17-40
Threads
Rseau
Outils
EJB
WS
Package : java.lang.Thread distribution (locale) des calculs effectuer : 1 tche effectue par une unit de calcul avec autonomie mmoire totale partage de la mmoire Excution dun processus lger : cration phase dinitialisation phase de calcul phase darrt destruction ==> ==> ==> ==> ==>
thread() start() run() interrupt()
(ou stop() redni)
==> ==>
processus thread
17 / 258
Introduction 15-18-40
Threads
Rseau
Outils
EJB
WS
en phase de calcul :
des calculs peuvent ncessiter la terminaison dautres calculs, ou lattente de donnes ou dune date ==> interrupt() / join() / sleep() des calculs peuvent porter sur la mme zone de donnes (problme de lecture/criture partage) ==> synchronized
18 / 258
Introduction 15-19-40
Threads
Rseau
Outils
EJB
WS
19 / 258
Introduction 15-20-40
Threads
Rseau
Outils
EJB
WS
instance de Thread = contrleur de processus lger. linitialisation : un unique thread lanant main() de la classe appele. classe Thread
static Thread currentThread()
permet de donner un nom au Thread (utilis par toString) (par dfaut Thread-i et Thread-0 pour le main)
cest lappel start() qui cre vraiment un processus lger. un appel run() direct excute run() sans crer de nouveau processus.
20 / 258
Introduction 15-21-40
Threads
Rseau
Outils
EJB
WS
class T implements Runnable{ public void run() { for (int i = 0; i<5; i++) { System.out.println("Processus lger T" + i); try { Thread.sleep(500);} // 500 msec = 1/2 s catch (InterruptedException e) { System.out.println("Interruption"); } } System.out.println("Processus lger T termin"); } } public class TTest{ public static void main(String[] args) throws Exception { Thread t = new Thread(new T()); t.start(); for (int i = 0; i<5; i++) { System.out.println("Processus lger main" + i); Thread.sleep(500); } System.out.println("Processus lger main termin"); } }
21 / 258
Introduction 15-22-40
Threads
Rseau
Outils
EJB
WS
Priorit :
entre Thread.MIN_PRIORITY=1 et
Thread.MAX_PRIORITY=10
22 / 258
Introduction 15-23-40
Threads
Rseau
Outils
EJB
WS
Protection via un objet (au plus un thread excutant). A chaque objet est associ un descripteur contenant des informations sur cet objet. La synchronisation passe par le mcanisme suivant :
une information particulire (un drapeau) indique si lobjet est en cours dutilisation synchronise. lexcution dune instruction (ou dun groupe, ou dune mthode) peut tre conditionne par ce drapeau
... public void maMthode(C a, ...) { ... synchronized(o) { // flag sur o ... o.f(...) ... } ... } ...
23 / 258
Introduction 15-24-40
Threads
Rseau
Outils
EJB
WS
on peut prendre this comme objet de synchronisation (cest implicitement ce qui est fait lors dune synchronisation sur mthode) les mthodes sont synchronisables sauf :
les mthodes dinterface les constructeurs
la spcication de synchronisation nest pas hritable la synchronisation de champs statiques est possible sur les objets-classes correspondants (... synchronized(C.class) ...)
24 / 258
Introduction 15-25-40
Threads
Rseau
Outils
EJB
WS
class ExpandableArray { protected Object[] data; protected int size = 0; public ExpandableArray(int cap) {data = new Object[cap];} public synchronized int size() { return size;} public synchronized Object get(int i) throws NoSuchElementException { if (i<0 || i>= size) throw new NoSuchElementException(); return data[i]; } public synchronized void add(Object x) { if (size == data.length) { Object[] olddata = data; data = new Object[3 * (size + 1) / 2]; System.arraycopy( olddata, 0, data, 0, olddata.length); } data[size++] = x; } public synchronized void removeLast() throws NoSuchElementException { if (size == 0) throw new NoSuchElementException(); data[--size] = null; } } class NoSuchElementException extends Exception {};
25 / 258
Introduction 15-26-40
Threads
Rseau
Outils
EJB
WS
Gestion mmoire locale / partage chaque instance (de Runnable) a ses propres variables tous les threads lancs sur la mme instance partagent ces variables le modieur volatile force la synchronisation des variables partages entre threads
26 / 258
Introduction 15-27-40
Threads
Rseau
Outils
EJB
WS
Exemple :
public class TestRunnable implements Runnable { volatile int x; public TestRunnable(int x) {this.x = x;} public void run() { System.out.print(x++);System.out.print(" ");System.out.println(this); try {Thread.sleep(2000);} catch (InterruptedException e) {System.err.println(e);}; System.out.print(x);System.out.print(" ");System.out.println(this); } public static void main(String args[]) { TestRunnable r = new TestRunnable(0); TestRunnable s = new TestRunnable(10); Thread tr1 = new Thread(r); Thread tr2 = new Thread(r); Thread ts = new Thread(s); tr1.start(); tr2.start();ts.start(); } }
A lexcution :
0 1 TestRunnable@119298d 10 TestRunnable@119298d TestRunnable@f72617 2 TestRunnable@119298d 2 TestRunnable@119298d 11 TestRunnable@f72617
27 / 258
Introduction 15-28-40
Threads
Rseau
Outils
EJB
WS
Exemple :
public class R implements Runnable { Object o; // variable partagee ThreadLocal v = new ThreadLocal(); // variable locale ... o = ...; v.set(u); // o u est un objet quelconque ... .. = .. o ..; .. = .. v.get() ..; }
28 / 258
Introduction 15-29-40
Threads
Rseau
Outils
EJB
WS
Groupe de threads classe ThreadGroup (par dfaut la cration du thread, le groupe est celui du crateur) :
ThreadGroup ThreadGroup(String s) cre un threadgroup de nom s void setMaxPriority(int priority) xe la valeur
classe Thread :
ThreadGroup getThreadGroup() renvoie le threadgroup
du thread
Thread Thread(ThreadGroup g, ImplRun r, String s) cre un nouveau thread dans le groupe g avec le Runnable r (ImplRun doit implanter Runnable) et le nom s
29 / 258
Introduction 15-30-40
Threads
Rseau
Outils
EJB
WS
30 / 258
Introduction 15-31-40
Threads
Rseau
Outils
EJB
WS
Introduction 15-32-40
Threads
Rseau
Outils
EJB
WS
// Serveur import java.io.*; public class CbDigestServer { private File input; private byte[] digest; public CbDigestServer(File input) { this.input = input; } public void calculateDigest() { CbDigest cb = new CbDigest(input, this); // this = continuation Thread t = new Thread(cb); // appel du thread t.start(); } void setDigest(byte[] digest) { this.digest = digest; System.out.println(this); } ... // cf page suivante // mthode de reception
32 / 258
Introduction 15-33-40
Threads
Rseau
Outils
EJB
WS
... public String toString() { String result = input.getName() + ": "; if (digest != null) { for (int i = 0; i< digest.length; i++) { result += digest[i] + " "; } } else { result += "unusable digest"; } return result; } public static void main(String args[]) { for (int i = 0; i< args.length; i++) { File f = new File(args[i]); CbDigestServer d = new CbDigestServer(f); d.calculateDigest(); } } }
33 / 258
Introduction 15-34-40
Threads
Rseau
Outils
EJB
WS
Introduction 15-35-40
Threads
Rseau
Outils
EJB
WS
public class CbDigestServer implements DigestListener { ... public void setDigest(byte[] digest) { // mthode de rception ... } ... }
35 / 258
Introduction 15-36-40
Threads
Rseau
Outils
EJB
WS
36 / 258
Introduction 15-37-40
Threads
Rseau
Outils
EJB
WS
// Serveur import java.io.*; public class CbDigestServer { public static void main(String args[]) { CbDigest[] cbDigestTab = new CbDigest[args.length]; int i; for (i=0;i<args.length;i++) { File f = new File(args[i]); cbDigestTab[i] = new CbDigest(f); cbDigestTab[i].start(); // lancement des threads } for (i=0;i<args.length;i++) { try { cbDigestTab[i].join(); // blocage jusqu ce que le thread termine byte[] digest = cbDigestTab[i].getDigest(); String fileName = cbDigestTab[i].getFileName(); System.out.print(fileName + ": "); ... } }
37 / 258
Introduction 15-38-40
Threads
Rseau
Outils
EJB
WS
et notify() sont des mthodes de Object entrane une attente de leve du verrou
Versions de notify() :
notify() rveil dun thread notifyAll() rveil de tous les threads
38 / 258
Introduction 15-39-40
Threads
Rseau
Outils
EJB
WS
// Esclave import java.io.*; import java.security.*; public class CbDigest implements Runnable { private File input; private byte[] digest; private CbDigestServer server; // objet de notification public CbDigest (File input, CbDigestServer server) { this.input = input; this.server = server; } public void run() { synchronized (server) { try { ... server.setDigest(digest); server.notify(); // notification } ... } }
39 / 258
Introduction 15-40-40
Threads
Rseau
Outils
EJB
WS
// Serveur import java.io.*; public class CbDigestServer { private File input; private byte[] digest; public CbDigestServer(File input) { this.input = input; } public void setDigest(byte[] digest) { this.digest = digest; } ... public void calculateDigest() { synchronized(this) { CbDigest cb = new CbDigest(input, this); // this = objet dattente Thread t = new Thread(cb); // appel du thread t.start(); try { wait(); } catch (InterruptedException e) { // thread interrompu avant la fin } System.out.println(this); // la signature est maintenant connue } } ... } 40 / 258
Introduction 41-41-104
Threads
Rseau
Outils
EJB
WS
URL
Classes URL et URLConnection Gestion de protocole
RMI et RMI-IIOP
RMI : Remote Method Invocation
41 / 258
Introduction 41-42-104
Threads
Rseau
Outils
EJB
WS
URL
Classes URL et URLConnection Gestion de protocole
RMI et RMI-IIOP
RMI : Remote Method Invocation
42 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
43 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
44 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
le://<host>/<path> chier sur disque local file:///etc/services <host> par dfaut machine locale ftp://<user>:<pwd>@<machine>:<port>/chemin;type=<typecode> ftp://ftp.univ-mrs.fr/f.txt chier distant (transfert) <user> par dfaut anonymous <pwd> par dfaut adresse lectronique <port> par dfaut 21 <typecode> : d lister un rpertoire a transfert ASCII i transfert binaire http://<machine>:<port>/<path>?<requete> http://www.univ-paris13.fr (par dfaut complt index.html) mailto:<adressee-mail> envoi de courriers mailto:christophe.fouquere@univ-paris13.fr imap://<user>:<passwd>@<host>/<chemin> serveur de messagerie imap://login@adresseMachine/repertoire pop3://login@adresseMachine/repertoire telnet://<user>:<passwd>@<machine>:<port>/ telnet://F205-3/ connexion telnet
45 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Adresses IP et URL une instance de InetAddress contient les informations : adresse symbolique dune machine adresse IP "constructeurs" (en fait appel du DNS local) :
static InetAddress getByName(String host) static InetAddress[] getAllByName(String host) static InetAddress getLocalHost()
Introduction
Threads
Rseau
Outils
EJB
WS
Remarques : on ne peut pas "crer" une structure type adresse IP rcrit de telle manire que lgalit soit teste sur ladresse IP
equals()
Exemple :
import java.net.*; public class TestAdresse { public static void main(String[] args) { try { InetAddress localHost = InetAddress.getLocalHost(); System.out.println("Adresse de la machine : " + localHost.getHostAddress()); } catch (UnknownHostException e) {} } }
47 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
48 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
49 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.io.*; import java.net.Socket; public class Main { public static void main(String[] args) { Socket connexion = null; try { connexion = new Socket("www.univ-paris13.fr",80); Writer output = new OutputStreamWriter( connexion.getOutputStream(), "8859_1"); output.write("GET / HTTP 1.0\r\n\r\n"); output.flush(); connexion.shutdownOutput();
// fermeture partielle
BufferedReader input = new BufferedReader( new InputStreamReader(connexion.getInputStream(),"8859_1"), 1024); // flux en lecture StringBuffer sb = new StringBuffer(); int c; while ((c = input.read()) != -1) sb.append((char) c); System.out.println(sb); } catch (IOException e) {System.out.println(e);} finally { try {if (connexion != null) connexion.close();} catch (IOException e) {System.out.println(e);} } } }
50 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Ct serveur : la classe ServerSocket gre les coutes ServerSocket(int port) cre une coute sur le port (sans limite de taille de buffer) (avec limite la taille)
ServerSocket(int port, int taille, InetAddress adr) coute sur linterface IP adr Socket accept() void close() dbut dattente de clients n du serveur
51 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.net.*; import java.io.*; public class Main { private ServerSocket serverSocket; private Socket socket; public Main(int port) { try { serverSocket = new ServerSocket(port, 1);} // creation du serveur catch (IOException e) {} // erreur de cration } public static void main(String[] args) { int port; try {port = Integer.parseInt(args[0]);} catch (Exception e) {port = 0;} // donc valeur au hasard Main ct = new Main(port); ct.clientMgr(); } ... // cf page suivante
52 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
... public void clientMgr() { while (true) { // coute try { Socket socket = serverSocket.accept(); Thread inputThread = new InputThread(socket.getInputStream()); inputThread.start(); // thread pour lecture Thread outputThread = new OutputThread(socket.getOutputStream()); outputThread.start(): // thread pour criture try { inputThread.join(); outputThread.join();} catch (InterruptedException e) { } } catch (IOException e) {System.out.println(e);} finally { try { if (socket != null) socket.close();} catch (IOException e) {} } } } }
53 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
import java.io.*; import java.net.*; class InputThread extends Thread { InputStreamReader in; public InputThread(InputStream in) { this.in = new InputStreamReader(in); } public void run() { try { int i; while ((i = in.read()) != -1) { System.out.write(i); } } catch (SocketException e) {} //socket ferm donc erreur de lecture catch (IOException e) {} try { in.close(); } catch (IOException e) {} } }
54 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
import java.io.*; class OutputThread extends Thread { OutputStreamWriter out; public OutputThread(OutputStream out) { this.out = new OutputStreamWriter(out); } public void run() { String ligne; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { while (true) { ligne = in.readLine(); if (ligne.equals(".")) break; out.write(ligne + "\r\n"); out.flush(); } } catch (IOException e) {} try { out.close(); } catch (IOException e) {} } }
55 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
56 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
spcication du provider de lalgo de cryptage soit ligne de spcif. dans le chier java.security soit mthode addProvider(..) de la classe Security
cration de la "fabrique" de cryptage via la classe SSLSocketFactory mthode getDefault() existe cration de socket par la mthode dinstance createSocket(...) de la classe SSLSocketFactory
57 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Mthode :
1 2
gnrer les cls publiques et certicats (commande keytool) authentier les certicats (==> tiers) crer un SSLContext pour lalgo de cryptage crer un KeyManagerFactory pour le gestionnaire de cls crer un KeyStore pour la base de cls et certicats ... et linitialiser avec le chier de cls initialiser le KeyManagerFactory avec le rsultat de 6. initialiser le SSLContext avec le rsultat du 7. crer un SSLServerSocketFactory pour la gnration de serveurs crer un SSLServerSocket partir du rsultat de 9. crer une socket en acceptant les connexions sur le SSLServerSocket
58 / 258
3 4 5 6 7 8
9 10 11
Introduction
Threads
Rseau
Outils
EJB
WS
retourne la liste des mthodes de cryptage (une chane de caractres = une mthode)
public abstract void setEnabledCypherSuites(String[] c)
spcie les codes ( partir des codes c disponibles dans limplmentation) possibilit davoir un jeu de cls par session (par dfaut un jeu de cls est rutilis entre deux connexions)
59 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
60 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
CLIENT
% cp Fichier_Certif cacerts // fichier "client" des certificats // ou bien exportation uniquement des certificats avec keytool -export % java -Djavax.net.ssl.trustStore=cacerts \ -Djavax.net.debug=ssl:handshake:verbose \ Client localhost 20000 Client.java // cacerts : nom du fichier de certificat du client // -Dxxx : spcification dune valeur dattribut // dans lenvironnement de la machine virtuelle
61 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
public ClientHTTPS(String host) throws Exception { // socket scuris Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); System.setProperty("javax.net.ssl.trustStore","jssecacerts"); SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault (); try { sslSocket = (SSLSocket) factory.createSocket(host,portHTTPS); } catch (IOException e) {System.out.println(e);} } public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("Usage : java ClientHTTPS host"); return; } ClientHTTPS clientHTTPS = new ClientHTTPS(args[0]); clientHTTPS.test(); clientHTTPS.close(); } ...// cf page suivante 62 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
... public void test() { try { // envoi de donnes Writer output = new OutputStreamWriter(sslSocket.getOutputStream()); output.write("GET https://"+host+"/ HTTP 1.1\r\n\r\n"); output.flush(); // lecture de la rponse BufferedReader input = new BufferedReader( new InputStreamReader(sslSocket.getInputStream())); int c; while ((c=input.read())!=-1){System.out.write(c);} output.close(); input.close(); } catch (IOException e) {System.out.println(e);} } public void close() { try {sslSocket.close();} catch (IOException e) {System.out.println(e);} } }
63 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Introduction
Threads
Rseau
Outils
EJB
WS
... // 4) paramtrage de la fabrique de cryptage par la cl try { kmf.init(ks, passPhrase); } catch (KeyStoreException e4) { e4.printStackTrace(); } catch (NoSuchAlgorithmException e4) { e4.printStackTrace(); } catch (UnrecoverableKeyException e4) { e4.printStackTrace(); } // 5) spcification du contexte de gnration de SSLServerSocket try { context.init(kmf.getKeyManagers(), null, null); } catch (KeyManagementException e5) { e5.printStackTrace(); } // 6) cration de la fabrique de SSLServerSocket SSLServerSocketFactory factory = context.getServerSocketFactory (); // 7) cration dun SSLServerSocket try { serverSocket = (SSLServerSocket) factory.createServerSocket (this.port); System.out.println ("Cration Socket OK"); } catch (IOException e) { System.out.println ("Erreur ServerSocket : " + e); System.exit (0); } } ...
65 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Il y a aussi la possibilit de spcier des droits particuliers sur la connexion un serveur (ou la connexion dune machine vers un serveur) :
Permission p = new java.net.SocketPermission ("F205-2.ig-edu.univ-paris13.fr", "connect"); Permission p = new java.net.SocketPermission ("*.ig-ens.univ-paris13.fr:1000-3000","accept");
2 mthodes de spcication : un chier java.policy spciant ces droits (chier de conguration $JDKHOME/jre/lib/security/java.policy charg lors du lancement de la machine virtuelle Java) une classe rednissant la politique de scurit
66 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Connexions UDP entre machines intrt : rapide dfaut : absolument pas sr nutiliser que pour les connexions sans session et pour de "petits" paquets donnes gres par la classe DatagramPacket avec les mthodes receive() et send()
67 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple de serveur :
import java.net.*; import java.io.*; public abstract class ServerUDP extends Thread { private int sizeBuffer; protected DatagramSocket ds; public ServerUDP(int port, int sizeBuffer) throws SocketException { this.sizeBuffer = sizeBuffer; this.ds = new DatagramSocket(port); } public ServerUDP(int port) throws SocketException { this(port, 8192); } public void run() { byte[] buffer = new byte[sizeBuffer]; while (true) { DatagramPacket input = new DatagramPacket(buffer, buffer.length); try { ds.receive(input); this.manage(input); } catch (IOException e) {} } } public abstract void manage(DatagramPacket packet); }
68 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
import java.net.*; import java.io.*; public class EchoServerUDP extends ServerUDP { public final static int PORT = 5007; // echo = 7 public EchoServerUDP() throws SocketException {super(PORT);} public void manage(DatagramPacket packet) { try { System.out.println(new String(packet.getData())); DatagramPacket output = new DatagramPacket( packet.getData(), packet.getLength(), packet.getAddress(), packet.getPort()); ds.send(output); } catch (IOException e) {} } public static void main(String[] args) { try { EchoServerUDP server = new EchoServerUDP(); server.start(); } catch (SocketException e) {} }
69 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
70 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Connexions entre machines en multicast Dans le cas de communications partages par de nombeux utilisateurs (vido, newsgroups, ...), le mcanisme point point est fastidieux. Le mcanisme multipoint permet de remdier cela de la manire suivante : un paquet de donnes est envoy au groupe entier. Les routeurs du rseau Internet sont chargs de la distribution (autant que possible sans duplication inutile). chaque groupe dutilisateurs est rfrenc par une adresse IP spcique. le protocole UDP est utilis les paquets sont envoys sur une "zone gographique"
71 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Les mcanismes sont les mmes que pour les sockets avec datagrammes UDP. Il suft juste de "se joindre" au groupe (et de le quitter en n de session) :
MulticastSocket(int port)
envoie un paquet (le ttl prcise le nombre de routeurs que ce paquet pourra "traverser")
72 / 258
Introduction 41-73-104
Threads
Rseau
Outils
EJB
WS
URL
Classes URL et URLConnection Gestion de protocole
RMI et RMI-IIOP
RMI : Remote Method Invocation
73 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Classes URL et URLConnection : classe grant lobjet URL (i.e. les infos statiques lies cet URL)
URL
: classe grant les connexions sur une URL (i.e. la gestion du socket permettant la lecture de donnes)
URLConnection
74 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
(exception : MalformedURLException)
public URL(String url) // new URL("http://www.univ-paris13.fr/index.html"); // exception si le protocole nest pas gr par la machine virtuelle public URL( String protocole, // http String machine, // www.univ-paris13.fr String fichier) // index.html public URL( String protocole, String machine, int port, // 80 (par dfaut pour http) String fichier) public URL( URL base, String relative) public URL( String protocole, String machine, int port, String fichier, URLStreamHandler handler) // permet de spcifier le gestionnaire de protocoles utiliser
String
int
75 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Entres / Sorties :
URLConnection openConnection() ouvre une connexion sur lURL, retourne un socket sur cet URL (donc possibilit deffectuer entres et sorties) InputStream openStream() ouvre une connexion sur lURL, rpond lauthentication si ncessaire, instancie un InputStream pour rcuprer les donnes (lecture standard) Object getContent() rcupre les donnes dune URL, puis les sort dans un format (i.e. une instance dobjet) "normalement" dni par le protocole. getClass() sur lobjet permet de savoir quel type de donnes on a affaire (URLImageSource pour gif, MeteredStream pour applet, ...) (URL) getContent() == openConnection().getContent() (URL) openStream() == openConnection().getInputStream()
76 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Une fois la connexion tablie sur un URL (quelque soit son type), on peut : rcuprer les spcications de lurl congurer la connexion envoyer / recevoir des donnes
Spcications de lurl : String getContentType() int getContentLength() String getContentEncoding() type MIME (text/html, image/gif)
(null si pas dencodage, sinon x-gzip, ...) long getDate() getExpiration() getLastModified() getHeaderField(String header) ("content-type", ...)
77 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Conguration de la connexion pour gestion de cache, autorisation de mot de passe, spcif de len-tte envoy lors de requtes au serveur Rception / envoi de donnes
InputStream getInputStream() OutputStream getOutputStream()
Il existe des sous-classes spciques pour : http : HttpURLConnection, setRequestMethod(), ... jar : JarURLConnection, getJarEntry(), ... ...
78 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.net.*; import java.io.*; public class Mailer { public static void main(String[] args) { System.setProperty("mail.host", "smtp.orange.fr"); try { URL urlMail = new URL("mailto:cf@lipn.univ-paris13.fr"); URLConnection connection = urlMail.openConnection(); PrintStream p = new PrintStream(connection.getOutputStream()); p.println("Subject: test\r\n\r\n corps du mail"); // un message est constitu dun en-tte // spar dune ligne vide avant le corps du message p.close(); } catch (IOException e) {System.out.println(e);} }
%java Mailer ou %java -Dmail.host=smtp.orange.fr Mailer si System.setProperty non mis, o mail.host est une proprit permettant de prciser ladresse du serveur SMTP.
79 / 258
Threads
Rseau
Outils
EJB
WS
Gestion de protocoles et communication Il est possible de grer " la main" les protocoles lorsque ceux-ci ne sont pas ou incorrectement traits par la machine virtuelle. Implantation standard de la classe URL :
public final class URL implements java.io.Serializable { private String protocol; private String host; ... transient URLStreamHandler handler; // transient = pas de srialisation public URL(String protocol, String host, int port, String file, URLStreamHandler handler) { this.host = host; this.port = port; ... this.handler = getURLStreamHandler(protocol) } public URLConnection openConnection() throws java.io.IOException { return handler.openConnection(this); } ... // cf pages suivante
80 / 258
Threads
Rseau
Outils
EJB
WS
static URLStreamHandlerFactory factory; static URLStreamHandler getURLStreamHandler(String protocol){ // Use the factory (if any) if (factory != null) handler = factory.createURLStreamHandler(protocol); // Try java protocol handler if (handler == null) { ... packagePrefixList += "sun.net.www.protocol"; ... try { String clsName = packagePrefix+"."+protocol +".Handler"; Class cls = null; try { cls = Class.forName(clsName); } catch (ClassNotFoundException e) { ClassLoader cl = ClassLoader.getSystemClassLoader(); if (cl != null) { cls = cl.loadClass( } if (cls != null) { handler = (URLStreamHandler)cls.newInstance(); } } catch (Exception e) { ... } return handler; }
81 / 258
Threads
Rseau
Outils
EJB
WS
82 / 258
Threads
Rseau
Outils
EJB
WS
import java.net.*; import java.io.*; class GridFactory implements ContentHandlerFactory { public GridFactory() { } public ContentHandler createContentHandler(String mimeType) { if(mimeType.equals("text/cg")) { System.out.println("Requested mime type: "+mimeType); return new GridContentHandler(); } return new GridContentHandler(); } }
public class CharGrid { public int height; public int width; public char ch; public boolean values[][]; public CharGrid(int h,int w,char c,boolean vals[][]) { height = h; width = w; ch = c; values = vals; } }
83 / 258
Threads
Rseau
Outils
EJB
WS
import java.net.*; import java.io.*; public class GridContentHandler extends ContentHandler { public Object getContent(URLConnection urlc) throws IOException { DataInputStream in = new DataInputStream(urlc.getInputStream()); int height = (int) in.readByte() - 48; int width = (int) in.readByte() - 48; char ch = (char) in.readByte(); boolean values[][] = new boolean[height][width]; for(int i=0;i<height;++i) { for(int j=0;j<width;++j) { byte b = in.readByte(); if(b == 48) values[i][j] = false; else values[i][j] = true; } } in.close(); return new CharGrid(height,width,ch,values); } }
84 / 258
Threads
Rseau
Outils
EJB
WS
Fichier charGrid.cg :
55O1000101010001000101010001
Excution :
% java GetGridApp file://localhost/home/cf/.../charGrid.cg
85 / 258
Introduction 41-86-104
Threads
Rseau
Outils
EJB
WS
URL
Classes URL et URLConnection Gestion de protocole
RMI et RMI-IIOP
RMI : Remote Method Invocation
86 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
RMI : Principe dvelopp par Sun permettant dappeler des mthodes exposes sur une autre machine virtuelle Mcanisme propre Java Utilise la bibliothque java.rmi RMI-IIOP : IIOP : Internet Inter-Orb Protocol Compatibilit avec CORBA (donc interoprable avec dautres environnements dappels de fonctions ou de mthodes distance) Obligatoire avec lenvironnement EJB (Enterprise Java Beans) Utilise les bibliothques java.rmi et javax.rmi
87 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Principales diffrences : RMI : chargement de classes et activation dobjets chaud distance donc classes distinctes pour identier les objets utilisables distance :
RMI : java.rmi.server.RemoteObject RMI-IIOP : javax.rmi.PortableRemoteObject
88 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
3 machines virtuelles : A : va contenir le ou les objets dont dautres machines virtuelles utiliseront les mthodes B : machine virtuelle appelant les mthodes des objets exposs par A C : machine virtuelle jouant le rle de serveur en exposant les objets utilisables distance par des noms symboliques (comme un DNS)
89 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Principe : Lancement de C : serveur coutant sur le port 1099 les requtes de dclaration dobjets ou de recherche dobjets (la commande rmiregistry lance un tel serveur) Lancement de A :
cration des objets que A veut prsenter ouverture dun port en attente de requte vers les objets "publics" requte C pour rendre "publics" les objets (numro de port sur A, adresse IP de A, ...)
Lancement de B :
requte C pour rcuprer les modalits dutilisation de lobjet sur A excution de mthodes
90 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
La face cache : Ncessite la cration de classes spciales (donc des chiers) permettant de srialiser et dsrialiser les requtes et les structures des classes des objets exports, une interface permet de spcier la structure de la classe de lobjet export. Cette interface doit exister sur A et B. Ct exportateur A : un chier squelette (skeleton) Ct importateur B : un chier souche (stub)
Dans les versions initiales de java, 2 chiers distincts, maintenant un seul chier stub
Ce chier stub est gnr par la commande rmic sur A Le stub doit tre copi sur B (et gard sur A !).
91 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
92 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple (tape 3) : Compiler cette implantation et rcuprer un stub qui servira aux clients et un skeleton laisser sur le serveur
% % % % javac Display.java // ==> Display.class javac DisplayClass.java // ==> DisplayClass.class rmic DisplayClass // ==> DisplayClass_Stub.class et DisplayClass_Skel.class cp ... // copie de DisplayClass_Stub.class sur la machine cliente
94 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple (tape 4) : Ecrire un code DisplayPublisher.java permettant la publication sur le serveur RMI C (ce code peut faire partie du code "ordinaire" de A)
import java.rmi.*; import java.rmi.server.*; public class DisplayPublisher { public static void main (String[] args) throws Exception { Display display = new DisplayClass(); UnicastRemoteObject.exportObject(display); // cre le thread en attente dappel sur lobjet (ici display), // et associe un port TCP pour les connexions Naming.rebind("/UnDisplayDistant", display); // la classe Naming cree les liens entre URL et objet // URL :: rmi://host:port/nom // objet implante Remote // bind : le nom ne doit pas exister // rebind : pas de restriction // unbind : suppression du lien } }
95 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
96 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
97 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Remarques : La classe HelloFrame doit implanter linterface (elle est par ailleurs crite de manire totalement standard).
Serializable
Plusieurs appels distants peuvent avoir lieu en mme temps sur le mme objet (sur le serveur) : chaque excution distante de mthode est faite sur un thread. Il faut donc veiller respecter les principes de gestion de concurrence sur les variables de lobjet. Les paramtres passs en argument sont recopis de la machine cliente vers la machine serveur : les paramtres de type non primitif ne seront pas modis par lexcution distante.
98 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Le mcanisme RMI utilise implicitement le chargement de classes chaud, effectuable en gnral : java.lang.ClassLoader : classe abstraite gnrique getSystemClassLoader() : chargeur standard (i.e. local) Exemple :
public interface TestInterface { public int somme(int x, int y); }
public class Test implements TestInterface { public int somme(int x, int y){ return x+y; } }
public class TestLoadClass { public static void main(String[] args) throws Exception{ ClassLoader loader = ClassLoader.getSystemClassLoader(); // // Object main = loader.loadClass("Test").newInstance(); System.out.println(main.getClass()); TestInterface main = (TestInterface) loader.loadClass("Test").newInstance(); System.out.println(main.somme(3,4)); } } 99 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
scurit
java.net.URLClassLoader
rmi.server.RMIClassLoader
Introduction
Threads
Rseau
Outils
EJB
WS
Exemple sur 3 machines distinctes : 1 machine client 1 machine httphost sur laquelle tourne un serveur HTTP 1 machine codehost sur laquelle existe une machine virtuelle et un objet publi connu par httphost mais non public Lobjectif est que client excute un code tlcharg de httphost qui va lui-mme excuter une mthode dun objet de codehost.
101 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
public interface Hello extends java.rmi.Remote { public String hello(String s) throws java.rmi.RemoteException; }
102 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
103 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Il faut lancer rmiregistry sur les machines client et codehost. Puis lancer sur la machine codehost le programme SpecialClient (qui boucle en attendant des requtes de clients). Enn le programme GenericClient sur la machine client.
104 / 258
Introduction 105-105-145
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
105 / 258
Introduction 105-106-145
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
106 / 258
Introduction 105-107-145
Threads
Rseau
Outils
EJB
WS
La messagerie permet lenvoi asynchrone dinformations. Utilis en messagerie "ordinaire", comme en gestion asynchrone entre processus.
javax.mail.* est la bibliothque contenant les classes ncessaires (pas dans le JDK standard, mais dans J2EE, cf aussi http://developers.sun.com/downloads/).
Dnit une API utilisable de manire gnrique et une API pour les diffrents fournisseurs de protocoles-services. Les API des protocoles suivants sont donns en standard :
pour lenvoi de messages (protocole SMTP) pour la lecture (protocoles IMAP4 et POP3)
107 / 258
Introduction 105-108-145
Threads
Rseau
Outils
EJB
WS
Principe denvoi :
Session
permet lenvoi effectif dun message donn en argument (intgre aussi un mcanisme dcouteurs)
Transport
108 / 258
Introduction 105-109-145
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendMail { public static void main (String[] args) throws MessagingException { Properties props = System.getProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "upn.univ-paris13.fr"); // ou -Dmail.transport.protocol=smtp ... Session session = Session.getInstance(props); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("moi@univ-paris13.fr")); message.setRecipient( Message.RecipientType.TO, // ou CC ou BCC new InternetAddress("une.personne@univ-paris13.fr") ); message.setSubject("Test"); message.setText("ceci est le contenu du test !"); Transport.send(message); } }
109 / 258
Introduction 105-110-145
Threads
Rseau
Outils
EJB
WS
Comment rcuprer le serveur de mail de son environnement local (sous linux/unix) : quand son domaine dadressage mail est univ-paris13.fr,
% nslookup > set query=MX > univ-paris13.fr ... univ-paris13.fr mail exchanger = 100 upn.univ-paris13.fr.
110 / 258
Introduction 105-111-145
Threads
Rseau
Outils
EJB
WS
Principe de rception :
Session
Folder
111 / 258
Introduction 105-112-145
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.util.*; import javax.mail.*; public class ReadMail { public static void main (String[] args) throws Exception { Properties props = System.getProperties(); Session session = Session.getInstance(props, null); Store store = session.getStore("imap"); store.connect("imap.univ-paris13.fr","christophe.fouquere","monPassword"); Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); Message message = inbox.getMessage(1); // le 1er message message.writeTo(System.out); inbox.close(false); store.close(); } }
112 / 258
Introduction 105-113-145
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
113 / 258
Introduction 105-114-145
Threads
Rseau
Outils
EJB
WS
Les serveurs de noms permettent de commuter entre cl de rfrencement et proprits associes : Service de systme de chiers : ext3, NTFS, ... Service de noms de domaine : DNS Service dannuaires : NIS, LDAP, Active Directory, ... Un contexte est un ensemble de paires cl-valeur (bindings) : les cls sont organises en arborescence :
/usr/bin est un sous-contexte de /usr (ext3) univ-paris13.fr est un sous-contexte de fr (DNS) ou=structures,dc=univ-rennes1,dc=fr est un sous-contexte de dc=univ-rennes1,dc=fr (LDAP)
Introduction 105-115-145
Threads
Rseau
Outils
EJB
WS
Lenvironnement logiciel ncessaire est donn comme : une API javax.naming.* pour la programmation dont les mthodes appellent un SPI un SPI qui dpend du serveur externe (Service Provider Interface) linterface Context dnit la structure abstraite ncessaire Lobjet inital est dni par : InitialContext partir de :
un SPI donn comme valeur de la proprit
naming.factory.initial
une racine
Le choix de la SPI dpend du type du domaine de noms, il sagit dune classe qui sera charge chaud". com.sun.jndi.fscontext.RefFSContextFactory est la SPI donne avec Java pour les systmes de gestion de chiers.
115 / 258
Introduction 105-116-145
Threads
Rseau
Outils
EJB
WS
: cre un sous-contexte
116 / 258
Introduction 105-117-145
Threads
Rseau
Outils
EJB
WS
import java.util.*; import javax.naming.*; public class SGF_jndi { public static void main(String args[]) throws Exception { Properties props = new Properties(); props.put("java.naming.factory.initial", "com.sun.jndi.fscontext.RefFSContextFactory"); props.put("java.naming.provider.url", "file:/"); Context ctx = new javax.naming.InitialContext (System.getProperties()); NamingEnumeration ne = ctx.list("etc"); while (ne.hasMore()) System.err.println(ne.next()); } }
117 / 258
Introduction 105-118-145
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
118 / 258
Introduction 105-119-145
Threads
Rseau
Outils
EJB
WS
JDBC = Java DataBase Connectivity Utilis dans J2EE comme interface entre les Beans et les BD Possibilit dcrire des applications lutilisant explicitement (hors JavaBeans) Masqu dans J2EE Principe similaire aux cadres prcdents : API + SPI (cf http://java.sun.com/javase/technologies/ database/index.jsp)
119 / 258
Introduction 105-120-145
Threads
Rseau
Outils
EJB
WS
Problme majeur : linterface est base de chane de caractres, donc pas de vrication sur les structures des requtes, i.e. en terme de typage.
120 / 258
Introduction 105-121-145
Threads
Rseau
Outils
EJB
WS
import java.sql.*; public class SQLSelect { public static void main(String args[]) { String url = "jdbc:postgresql:maBD"; String query = "SELECT * FROM etudiant"; try { Class.forName("org.postgresql.Driver");} catch(java.lang.ClassNotFoundException e) {...} try { Connection con; con = DriverManager.getConnection(url, "cf","monPwd"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); int rowCount = 1; while (rs.next()) { System.out.println("Row " + rowCount + ": "); for (int i = 1; i <= numberOfColumns; i++) { System.out.print(rs.getString(i) + " " ); }; System.out.println(""); rowCount++; }; stmt.close(); con.close(); } catch(SQLException ex) {System.err.println(ex.getMessage());} } } 121 / 258
Introduction 105-122-145
Threads
Rseau
Outils
EJB
WS
Outils : messagerie, serveur de noms, connecteur BD, XML Messagerie Serveur de noms Connecteur BD Analyse XML
XML, DTD, ... SAX : Analyse de ux XML DOM : vue Java dun document XML
122 / 258
Threads
Rseau
Outils
EJB
WS
XML : eXtended Markup Language format texte structur, portable, extensible Driv de SGML Standards associs :
XSL : eXtensible Stylesheet Language XSLT : langage de transformation XSL Xlink, Xquery : langages de requtes sur documents XML Xpath, Xpointer : langages daccs aux parties
123 / 258
Threads
Rseau
Outils
EJB
WS
Exemple 1 :
<employee> <shift id= "counter" time="8-12"> <phone id = "1"> All phone information <number>3444333</number > </phone> </shift > <shift id="help_desk" time="1-5"> <phone id = "2"> All phone information <number>332333</number > </phone> </shift > ... <home-address> <street>3434 Norwalk street</street> <city>New York</city> <state>NY</state> </home-address> </employee>
124 / 258
Threads
Rseau
Outils
EJB
WS
Exemple 2 :
<?xml version="1.0" encoding="UTF8"?> <webapp version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/webapp_2_4.xsd"> <displayname>hello1</displayname> <servlet> <displayname>index</displayname> <servletname>index</servletname> <jspfile>/index.jsp</jspfile> </servlet> </webapp>
125 / 258
Threads
Rseau
Outils
EJB
WS
Espace de noms en XML (namespace) : un espace de noms est un ensemble didentiants (lments et attributs) smantique unique pour cet espace. On peut donc par exemple distinguer des attributs syntaxiquement identiques qui relvent de 2 smantiques distinctes. lespace de noms est dni par un URI il est dclarable comme valeur de lattribut xmlns
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
permet dindiquer que tout attribut commenant par xsi: appartiendra lespace de noms
http://www.w3.org/2001/XMLSchemainstance xmlns="http://www.w3.org/2001/XMLSchemainstance"
permet dindiquer que tout attribut sans prxe appartiendra lespace de noms
http://www.w3.org/2001/XMLSchemainstance
126 / 258
Threads
Rseau
Outils
EJB
WS
DTD : Document Type Denition Spcie la structure des noeuds dun document XML Exemples :
<!ELEMENT employee (shift+, homeaddress,hobbies*)> <!ATTLIST shift id CDATA #REQUIRED>
127 / 258
Threads
Rseau
Outils
EJB
WS
Diffrences DTD/XML Schema : DTD : pas de typage fort, 10 types de donnes prdnis XML Schema :
44 types de donnes prdnis Mme syntaxe que XML Orient objet Gestion despaces de noms
128 / 258
Threads
Rseau
Outils
EJB
WS
Exemple 2 :
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.books.org" xmlns=http://www.books.org> <xsd:element name="BookStore"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Book" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Title" minOccurs="1" maxOccurs="1"/> <xsd:element ref="Author" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> </xsd:schema>
129 / 258
Threads
Rseau
Outils
EJB
WS
JAXP est lAPI Java pour lanalyse XML, il inclut : SAX (Simple API for XML processing) : analyse par ux DOM (Document Object Model) : construction dun modle reprsentant la donne XML Ncessite javax.xml.parsers pour les structures basiques org.xml.sax pour les algorithmes basiques sous SAX (et utiliser en DOM) org.w3c.dom pour la structure de document XML
130 / 258
Threads
Rseau
Outils
EJB
WS
131 / 258
Threads
Rseau
Outils
EJB
WS
Principe : un objet reader effectue la lecture dun ux de donnes (chier, socket, ...) en constituant partir de codes lis lapplication des objets reprsentant le contenu XML au dbut/ la n du document, chaque dbut/n de noeuds (element) de larbre XML lu, lobjet-lecteur fait appel une mthode spcique dun gestionnaire de contenu. la mise en oeuvre consiste au minimum :
dnir un gestionnaire de contenu, i.e. les mthodes dcrivant les oprations effectuer pour la construction des objets selon les donnes XML (dbut/n dlment, ...) dnir un gestionnaire derreurs (pour traiter correctement les erreurs du ux XML par rapport ce qui est attendu) dnir un objet SAXParser encapsulant les objets prcdents et terminant la conguration de lanalyseur-lecteur.
132 / 258
Threads
Rseau
Outils
EJB
WS
Mise en oeuvre concrte : cration de lobjet fabrique danalyseurs-lecteurs comme instance de SAXParserFactory conguration de cet objet : gestion despace de noms, validation par une DTD ou un schma XML, ... cration dun analyseur-lecteur partir de la fabrique prcdente comme instance de SAXParser rcupration, partir de lobjet prcdent, dun lecteur
XMLReader
cration dun gestionnaire de contenu, dun gestionnaire derreurs, dun gestionnaire de schma spciques lapplication conguration de ce lecteur : gestionnaire de contenu, gestionnaire derreurs, gestionnaire de schmas lancement de lanalyse du ux XML
133 / 258
Threads
Rseau
Outils
EJB
WS
134 / 258
Threads
Rseau
Outils
EJB
WS
135 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
137 / 258
Threads
Rseau
Outils
EJB
WS
138 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
: nom sans lURI prxe : tableau des attributs prsents dans llment
attributes
140 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Principe : un objet reader effectue la lecture dun ux de donnes (chier, socket, ...) en constituant des objets en miroir du contenu XML la mise en oeuvre est assez similaire au cas SAX sans gestionnaire de contenu. une fois les objets construits, ils sont accessibles directement".
141 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Mise en oeuvre concrte : cration de lobjet fabrique danalyseurs-lecteurs comme instance de DocumentBuilderFactory conguration de cet objet : gestion despace de noms, validation par une DTD ou un schma XML, ... cration dun analyseur-lecteur partir de la fabrique prcdente comme instance de DocumentBuilder Pas de reader extraire cration dun gestionnaire derreurs, dun gestionnaire de schma spciques lapplication conguration du lecteur : gestionnaire derreurs, gestionnaire de schmas lancement de lanalyse du ux XML qui renvoie une instance de Document consultation des noeuds du document.
142 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
143 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
144 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Introduction 146-146-250
Threads
Rseau
Outils
EJB
WS
146 / 258
Introduction 146-147-250
Threads
Rseau
Outils
EJB
WS
147 / 258
Introduction 146-148-250
Threads
Rseau
Outils
EJB
WS
JEE / J2EE (Java Enterprise Bean) : Environnement permettant le dveloppement et le dploiement dapplications rparties multi-plateformes (mais en Java) .NET : Ensemble de produits et de technologies dans le mme esprit rparti mais avec une entre multi-langages (mais sous Windows) Objectif : intgrer dans un unique environnement une machine virtuelle permettant lexcution de programmes une facilit de distribution du code sur un parc de machines, avec possibilit de rpartition de charges un interfaage transparent avec des bases de donnes un interfaage avec des lments externes (sites web, services web)
148 / 258
Introduction 146-149-250
Threads
Rseau
Outils
EJB
WS
.NET :
est un framework pour des applications dentreprises" multi-langage de programmation, il intgre un langage-assembleur indpendant des plateformes dexcution (uniquement windows en fait) intgre des composants spciques pour les communications, le rparti, ... VisualStudio est un environnement de dveloppement spcique
149 / 258
Introduction 146-150-250
Threads
Rseau
Outils
EJB
WS
Client : navigateur
applet html-http
Client : programme
web service xml-http JNDI JAX-WS RMI/IIOP JTA JPA
Conteneur WEB
servlet, JSP
Conteneur EJB
Enterprise Java Beans JDBC
JavaMail
BD
150 / 258
Introduction 146-151-250
Threads
Rseau
Outils
EJB
WS
Chaque conteneur gre un ensemble de chiers (.java et .class) utilise des descripteurs de compilation et de dploiement (format XML) remplit un ensemble de fonctionnalits plus ou moins transparentes pour lutilisateur :
nommage et annuaire notication et envoi de messages cycle de vie stockage et archivage systme transactionnel contrle de scurit administration dobjets (pool, quilibrage de charges)
151 / 258
Introduction 146-152-250
Threads
Rseau
Outils
EJB
WS
Composants EJB :
Beans de session : objets lis une (session de) requtes de clients (p.e. panier) Beans entit : objets modlisant un objet de BD Beans message : objets grant les communications asynchrones
152 / 258
Introduction 146-153-250
Threads
Rseau
Outils
EJB
WS
Communication :
HTTP, TCP/IP, SSL (HTTPS) RMI/IIOP : applications distribues JMS et JavaMail : communication asynchrone (messagerie)
153 / 258
Introduction 146-154-250
Threads
Rseau
Outils
EJB
WS
Environnements : * Environnements de dveloppement (IDE) : Netbeans, Eclipse, JBuilder, ... * Environnements complets de dploiement : GlassFish (ex-JWSDP), .NET, WebObjects, BEA, Oracle Application Server, IBM Websphere, ... * Environnements partiels combinables (en partie) : conteneur web =
couteur http : Apache httpd, Grizzly gestionnaire jsp/servlet : (Jakarta Apache) Tomcat, Winstone gestionnaire web services : Metro, BEA WebLogic, Server HTTP IIS, ...
Introduction 146-155-250
Threads
Rseau
Outils
EJB
WS
155 / 258
Introduction 146-156-250
Threads
Rseau
Outils
EJB
WS
Servlet =
code Java (sous http) une classe servlet tend la classe HttpServlet (sous http) des mthodes (doGet ...) dnissent les ractions effectuer selon les requtes Http
dans les 2 cas (et surtout servlet), vrication de la syntaxe en sortie impossible !
156 / 258
Threads
Rseau
Outils
EJB
WS
Un chier JSP est au format XHTML et comprend des parties spciques excuter par le serveur dont le rsultat peut tre inject pour construire la (vraie) page html transmise au client.
157 / 258
Threads
Rseau
Outils
EJB
WS
le type est
include pour linclusion dun chier page pour dnir un paquetage ajouter pour le code excuter (import) ou prciser la sortie html (contentType, errorPage, isErrorPage, isThreadSafe). <%@ page import="java.util.*"%> taglib pour dnir lespace de noms utiliser
Code :
<% code_java_ordinaire %> ou <jsp:scriptlet> code_java_ordinaire </jsp:scriptlet>
pour un code excuter. Rien ne sera gnr sauf si ce qui est envoy la variable out <%= nom_de_variable %> ou
<jsp:expression> nom_de_variable </jsp:expression>
Threads
Rseau
Outils
EJB
WS
Actions :
jsp:include pour excuter le chier inclure jsp:forward pour rediriger vers une autre page
159 / 258
Threads
Rseau
Outils
EJB
WS
Exemple :
<%@page import="java.util.Date, java.text.*"%> <html> <body> Nous sommes le <%= DateFormat.getDateTimeInstance ( DateFormat.FULL, DateFormat.FULL).format(new Date()) %> </body> </html> dbut de code Java
160 / 258
Threads
Rseau
Outils
EJB
WS
Servlet : Une servlet est excute ct serveur elle doit tre capable de grer les requtes provenant de clients web la bibliothque de classes est dpendant du conteneur web (donc pas en standard dans JDK mais dans tomcat, glasssh, ...) : javax.servlet.*
161 / 258
Threads
Rseau
Outils
EJB
WS
Linterface Servlet xe la spcication, i.e. les mthodes implanter : doit tre appel lors dune demande du conteneur (aprs cration dune instance). La conguration est principalement le contexte, i.e. la liste des paramtres et leur valeur.
void init(ServletConfig sc) void service(ServletRequest req, ServletResponse res)
162 / 258
Threads
Rseau
Outils
EJB
WS
Requte / Rponse : : interface spciant laccs au ux dentre (getInputStream())et aux paramtres dune requte (getAttribute(String name))
ServletRequest
on peut spcier une classe par protocole (p.e. HttpServlet pour http), dpend du conteneur web.
163 / 258
Threads
Rseau
Outils
EJB
WS
Cas de HTTP :
javax.servlet.http.HttpServlet
la mthode service() est dnie pour analyser le ux dentre (qui doit tre une requte HTTP : get, post, ...), et en fonction de la requte concrte http appeler lune des mthodes doGet(), doPost(), ... les mthodes doXXX() peuvent tre rednies dans une sous-classe de HttpServlet selon les besoins de lapplication.
164 / 258
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); String title = "M2 Informatique"; out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<a href=\"http:\/\/www.univparis13.fr\">"); out.println("Université Paris 13</a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }
165 / 258
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.io.*; import java.text.*; import java.util.*; superclasse pour les servlets conformes au protocole Http import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWritercode pour une requte GET out = response.getWriter(); out.println("<html>"); out.println("<head>"); String title = "M2 Informatique"; out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<a href=\"http:\/\/www.univparis13.fr\">"); out.println("Université Paris 13</a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }
165 / 258
Threads
Rseau
Outils
EJB
WS
Exemple :
import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; contient les donnes envoyes par le client import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException criture du dbut de page html { response.setContentType("text/html"); PrintWriter out = response.getWriter(); contient la spcif pour lenvoi (dont le ux de sortie) out.println("<html>"); out.println("<head>"); String title = "M2 Informatique"; out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<a href=\"http:\/\/www.univparis13.fr\">"); out.println("Université Paris 13</a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }
165 / 258
Introduction 146-168-250
Threads
Rseau
Outils
EJB
WS
166 / 258
Threads
Rseau
Outils
EJB
WS
Enterprise Java Beans (EJB) ( ne pas confondre avec les Beans utiliss en Java Graphique) : un bean est un objet dune machine virtuelle encapsulant une partie de la logique mtier et interagissant avec dautres beans ou le monde extrieur" (clients, BD, ...) linteraction (i.e. lappel) entre beans est normalise, masque pour le programmeur car faisant partie des plate-formes de dploiement limplantation des interactions inter-beans doit permettre la gestion par pool desclaves (multi-threads) et distribution de charge (multi-VM, RMI) : chaque type-classe de bean est gr comme un pool de threads.
167 / 258
Threads
Rseau
Outils
EJB
WS
3 types de beans :
Beans session : interagissent avec des clients, pas de persistence de donnes entre session (voire entre appels) Beans entit : objets avec persistence de donnes, lien avec BD Beans orients message : objets grant les communications asynchrones
Le principe des beans entit est maintenant spci comme la Java Persistence API.
168 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Elments sur la structure sous-jacente (1) : (il sagit dune possibilit dimplantation dans un framework)
1 2
Chaque classe de bean est gre par un pool de threads Une activation (session, ...) est une suite de demandes de calcul sur un contexte particulier la dure de vie dun contexte est longue au regard des requtes et appels donc il est utile de sauvegarder temporairement chaque contexte (avec un identiant type cookie), i.e. avoir une BD ddie et des objets-coquilles du coup, il faut des objets grant les objets contenant le code mtier, les (r)initialisant, les endormant en sauvegardant le contexte, ... Donc : pour chaque classe dobjets(-coquille), une classe dobjets daccueil (dont le code est gnrique)
170 / 258
Threads
Rseau
Outils
EJB
WS
lensemble doit tre multi-VM, donc accessible sous RMI via JNDI (i.e. nom publicis), de mme pour lobjet-utilisateur Donc il faut 4 interfaces : pour un objet et son objet daccueil, en sparant ce qui est utilisable localement de ce qui est utilisable distance. Les contenus des interfaces sont a priori gnriques.
le dploiement doit tre spci de telle sorte que ce soit utilisable chaud. Donc 1 chier descripteur de dploiement (en XML) (en sus dun chier descripteur de compilation si ncessaire)
171 / 258
Threads
Rseau
Outils
EJB
WS
Exemple (1) :
public interface Hello extends javax.ejb.EJBObject { public String hello() throws java.rmi.RemoteException; }
public interface HelloHome extends javax.ejb.EJBHome { Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; }
public class HelloBean implements javax.ejb.SessionBean { private SessionContext ctx; public void ejbCreate() {...} public void ejbRemove() {...} public void ejbActivate() {...} public void ejbPassivate() {...} public void setSessionContext(javax.ejb.SessionContext) {this.ctx=ctx;} // contenu concret "mtier" public String hello() { return "Hello";} }
172 / 258
Threads
Rseau
Outils
EJB
WS
Introduction Servlet et JSP Beans Interface distante : utilisable par un client travers RMI.
Exemple (1) :
public interface Hello extends javax.ejb.EJBObject Interface { public String hello() throws java.rmi.RemoteException; } locale : utilisable par un client de la VM. public interface HelloLocal extends javax.ejb.EJBLocalObject { public String hello(); } Interface daccueil distante : public interface HelloHome extends javax.ejb.EJBHome cration dobjets-coquilles { Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; } travers RMI.
public interface HelloLocalHome extends javax.ejb.EJBLocalHome { HelloLocal create() throws javax.ejb.CreateException; } Interface daccueil locale : cration dobjets-coquilles sur la VM.
public class HelloBean implements javax.ejb.SessionBean { private SessionContext ctx; public void ejbCreate() {...} Code du bean de type session public void ejbRemove() {...} public void ejbActivate() {...} public void ejbPassivate() {...} public void setSessionContext(javax.ejb.SessionContext) {this.ctx=ctx;} // contenu concret "mtier" public String hello() { return "Hello";} }
172 / 258
Threads
Rseau
Outils
EJB
WS
Exemple (2) :
<!-- ejb-jar.xml (descripteur de deploiement) --> <!DOCTYPE ejb-jar ... ejb-jar.dtd> <ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>HelloHome</home> <remote>Hello</remote> <local-home>HelloLocalHome</local-home> <local>HelloLocal</local> <ejb-class>HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>
173 / 258
Threads
Rseau
Outils
EJB
WS
Exemple (3) :
// HelloClient.java (exemple de code client) import javax.naming.*; import javax.rmi.PortableRemoteObject; import java.util.Properties; public class HelloClient { public static void main(String[] args) throws Exception { // informations pour usage de JNDI Context ctx = new InitialContext(System.getProperties()); // rcupration de lobjet daccueil Object obj = ctx.lookup("HelloHome"); // transtypage spcifique HelloHome helloHome = (HelloHome) PortableRemoteObject.narrow (obj, HelloHome.class); // objet EJB servant dinterface avec le (vrai) bean Hello hello = helloHome.create(); // appel des mthodes "mtier" System.out.println(hello.hello()); // fin dusage: libration de lobjet EJB hello.remove(); } }
174 / 258
Threads
Rseau
Outils
EJB
WS
Serveur JNDI
0. contexte JNDI
Objet-client
5. rfrence dobjet-bean
3. demande dobjet-bean
Objet daccueil
6. code mtier 4. initialisation
Objet bean
175 / 258
Threads
Rseau
Outils
EJB
WS
176 / 258
Threads
Rseau
Outils
EJB
WS
// code du bean session import javax.ejb.Stateless; @Stateless // (mapped-name="nomPublic") public class HelloBean implements Hello { public String hello() { return ("Hello world !"); } }
// code dun objet-client de ce bean session import java.io.*; import javax.ejb.EJB; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { @EJB // (mapped-name="nomPublic") private Hello hello; public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println(hello.hello()); } } 177 / 258
Threads
Rseau
Outils
EJB
WS
Exemple de bean session stateless avec tags de prcompilation (2) : installation sous Netbeans,
1
3 4 5
slectionner Stateless slectionner les interfaces souhaites crire le code mtier dans la classe de bean session Les interfaces sont mises jour par dfaut chaque mthode mtier. Par dfaut, lobjet est publi sous le nom
monPaquetage.ClasseduBean
178 / 258
Threads
Rseau
Outils
EJB
WS
@Stateful public class CartBean implements CartRemote, CartLocal { String customerName; List<String> contents; public void initialize(String person) throws Exception { if (person == null) { throw new Exception("Null person not allowed."); } else { customerName = person; } contents = new ArrayList<String>(); } public void addBook(String title) { contents.add(title); } public void removeBook(String title) throws Exception { boolean result = contents.remove(title); if (result == false) { throw new Exception(title + " not in cart."); } } public List<String> getContents() { return contents; } @Remove public void remove() { contents = null; } } 179 / 258
Threads
Rseau
Outils
EJB
WS
public class CartClient { public static void main(String[] args) { try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/SimpleCart"); CartHome home = (CartHome) PortableRemoteObject.narrow (objref,CartHome.class); Cart shoppingCart = home.create("Duke DeEarl","123"); shoppingCart.addBook("The Martian Chronicles"); Vector bookList = new Vector(); bookList = shoppingCart.getContents(); Enumeration enumer = bookList.elements(); while (enumer.hasMoreElements()) { System.out.println((String) enumer.nextElement()); } shoppingCart.removeBook("Alice in Wonderland"); shoppingCart.remove(); } catch (BookException ex) {System.exit(0); } catch (Exception ex) { System.exit(1); } } } 180 / 258
Threads
Rseau
Outils
EJB
WS
Beans entit : vues dune base de donnes obligatoirement srialisables possibilit de gnrer la base partir de beans entit, ou linverse identication dun bean entit par une cl primaire le type de la cl peut tre une classe
181 / 258
Threads
Rseau
Outils
EJB
WS
(en EJB3) mcanisme JPA subsumant les principes prcdents Dans les 2 cas, la relation bean-BD se fait par un gestionnaire dentit EntityManager qui assure la synchronisation, et (cache) une unit de persistence.
182 / 258
Threads
Rseau
Outils
EJB
WS
les appels BD sont dnis vis vis dun langage spcique EJB Query Language ncessite de spcier les liens entre classes dans un chier de dploiement ou par des tags :
les variables des beans CMP dnissent les colonnes des tables un schma abstrait spcie les liens entre beans :
One-to-one : relation biunivoque entre instances de beans One-to-many, Many-to-one, Many-to-many : du mme genre
183 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
@Entity public class Customer implements Serializable { @Id private int id; private String name; @OneToMany(cascade=ALL, mappedBy="customer") private Collection<Order> orders = new ArrayList<Order>(); // get et set pour les 3 champs }
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="pu"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/__default</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
184 / 258
Introduction
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Bean entit CMP : le code du bean ne contient aucun appel explicite vers une BD donc la classe est indpendante du type de BD sous-jacent la synchronisation avec la BD est implicite
186 / 258
Threads
Rseau
Outils
EJB
WS
187 / 258
Threads
Rseau
Outils
EJB
WS
188 / 258
Threads
Rseau
Outils
EJB
WS
189 / 258
Threads
Rseau
Outils
EJB
WS
190 / 258
Threads
Rseau
Outils
EJB
WS
191 / 258
Threads
Rseau
Outils
EJB
WS
Bean entit BMP : la gestion vers la BD est laisse la charge du programmeur la structure globale est la mme avec des mthodes de type ejbXxx() nest utile que si la connexion avec la BD est complexe (multi-sources, gestion avec contrle spcique, ...) le code du client est le mme que dans le cas CMP les descripteurs de compilation et dploiement sont simplis
192 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Sur les annotations en Java : Une annotation est une mta-donne permettant lenvironnement de gnrer des chiers de conguration (pour le dploiement, la compilation nale) de gnrer des interfaces (en prcisant les mthodes y inclure), des classes subsidiaires, ... de lier des noms de mthodes ou de spcier des noms externes (base de donne, ...) de dterminer des informations annexes (documentation, tests,...)
194 / 258
Threads
Rseau
Outils
EJB
WS
Une annotation est inscrite dans le code java mme en commenant par le symbole @. Lenvironnement doit comprendre des programmes permettant dinterprter les annotations. Linterprtation des annotations peut avoir lieu sur le chier .java ou sur le chier .class si lannotation y est conserve (i.e. la mta-annotation @Retention est utilise dans le chier source). Les annotations sont disponibles depuis la version 5 de Java.
195 / 258
Threads
Rseau
Outils
EJB
WS
Une annotation se pose avant nimporte quel modieur (p.e. public) dune classe, dune mthode ... Ele peut tre combine en une squence dannotations Une annotation peut annote une autre annotation une annotation est pose dans un programme java :
... @MonAnnotation( unAttribut = 12345, unAutreAttribut = "une valeur", ) public static void maMethode(...) { ... } ...
ou
... @UneAutreAnnotation public class MaClasse(...) { ... } ...
ou
... @UneDerniereAnnotation("une valeur") public class MaClasse(...) { ... } ...
Threads
Rseau
Outils
EJB
WS
une annotation est dnie dans un programme Java comme un ensemble ventuellement vide dattributs :
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface MonAnnotation { int unAttribut(); String unAutreAttribut(); }
Pour lexemple prcdent, il faut que lannotation ait t conserve dans le chier .class, do lutilisation de lannotation Retention (cf plus loin)
197 / 258
Threads
Rseau
Outils
EJB
WS
Pour chaque type dannotation javac recherche dans son environnement (classpath) une classe dont le nom est celle du type dannotation. Il ajoute alors au code compil le contenu de lannotation (valeurs par dfaut, ...). Plus de 60 annotations en standard dont :
@Deprecated : (devant une mthode) indique que la mthode qui suit nest pas recommande (i.e. son usage gnrera un warning)
: (devant une mthode) indique que la mthode qui suit doit surcharger une mthode dune super-classe
@Override @SuppressWarnings(type) : supprime les warnings pour le type donn ("deprecation", "all",...)
198 / 258
Threads
Rseau
Outils
EJB
WS
199 / 258
Threads
Rseau
Outils
EJB
WS
Les mta-annotations sont en particulier utiles pour dnir des annotations. Par exemple : : mta-annotation qui conserve selon le type (RetentionPolicy.RUNTIME dans le code et aprs chargement dans la VM, RetentionPolicy.CODE dans le code seulement) lannotation utilise dans un programme.
@Retention(type)
: mta-annotation qui prcise sur quoi peut tre applique lannotation (ElementType.METHOD pour une mthode, ElementType.TYPE pour une classe, une interface, ...).
@Target(type)
200 / 258
Threads
Rseau
Outils
EJB
WS
public class Application { @Audit(true) public void methA(String s) { GestionAudit.gestion(this,"methA",String.class); // code de lapplication } public void methB() { GestionAudit.gestion(this,"methB"); // code de lapplication } } $javac *.java $java Test [Audit] appel de methA $
201 / 258
Threads
Rseau
Outils
EJB
WS
lannotation Audit sera conserve lexcution public class Application { @Audit(true) public void methA(String s) { GestionAudit.gestion(this,"methA",String.class); // code de lapplication } public void methB() { GestionAudit.gestion(this,"methB"); // code de lapplication } } $javac *.java $java Test [Audit] appel de methA $
201 / 258
Threads
Rseau
Outils
EJB
WS
public class Application { @Audit(true) public void methA(String s) { GestionAudit.gestion(this,"methA",String.class); // code de lapplication } appel lexcution, traitement public void methB() { selon la valeur de lannotation GestionAudit.gestion(this,"methB"); (cf slide suivant) // code de lapplication } } $javac *.java $java Test [Audit] appel de methA $
201 / 258
Threads
Rseau
Outils
EJB
WS
202 / 258
Threads
Rseau
Outils
EJB
WS
public class GestionAudit { public static void gestion(Object object, String methodName, Class... paramTypes) { try { Class paramTypesArray[] = new Class[paramTypes.length]; int i = 0; for (Class paramType : paramTypes) paramTypesArray[i++] = paramType; // Rcuprer la mthode appele. Method method = object.getClass().getMethod(methodName, paramTypesArray); // Sil ny a pas dannotation, autoriser lappel if( !method.isAnnotationPresent(Audit.class) ) return; utilisation de la rexivit dans Java // Rcuprer la donne de lannotation, sil faut auditer alors le faire Audit auditValue = method.getAnnotation(Audit.class); if( auditValue.value() ) audit("[Audit] appel de " + methodName); } catch (Exception e) { audit("[Audit exception] sur lappel de " + methodName); } } private static void audit(String msg) { System.err.println(msg); } }
202 / 258
Threads
Rseau
Outils
EJB
WS
202 / 258
Threads
Rseau
Outils
EJB
WS
Les annotations sont principalement gres en phase de compilation : En Java 1.5 : loutil apt (annotation processing tool) sert au traitement des annotations. Etant spar du compilateur, la gestion est complexe. En Java 6 : javac intgre le traitement des annotations par un double mcanisme :
une structure lie aux constructions du langage une structure lie larbre de syntaxe abstraite (ASP)
203 / 258
Threads
Rseau
Outils
EJB
WS
204 / 258
Threads
Rseau
Outils
EJB
WS
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Audit { // true: les accs cette mthode // sont crits dans un fichier daudit boolean value() default false; }
205 / 258
Threads
Rseau
Outils
EJB
WS
%javac -cp $CLASSPATH:/opt/jdk1.6.0_10/lib/tools.jar GestionAudit.java %javac -processor GestionAudit Application.java methA(java.lang.String) : Valeur de lannotation associee = true METHOD Method methA: null Body: { int i = 0; } methB(java.lang.String) : Valeur de lannotation associee = false METHOD Method methB: null Body: { }
206 / 258
Threads
Rseau
Outils
EJB
WS
206 / 258
Threads
Rseau
Outils
EJB
WS
%javac -cp $CLASSPATH:/opt/jdk1.6.0_10/lib/tools.jar GestionAudit.java %javac -processor GestionAudit Application.java methA(java.lang.String) : Valeur de lannotation associee = true METHOD le code associ lannotation Method methA: null Audit est excut Body: { int i = 0; } methB(java.lang.String) : Valeur de lannotation associee = false METHOD Method methB: null Body: { }
206 / 258
Threads
Rseau
Outils
EJB
WS
@SupportedAnnotationTypes(value= {"Audit"}) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class GestionAudit extends AbstractProcessor { private ProcessingEnvironment environment; @Override public void init(ProcessingEnvironment environment) { super.init(environment); this.environment = environment; } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ AuditVisitor auditVisitor=new AuditVisitor(environment); for (Element element : roundEnv.getElementsAnnotatedWith(Audit.class)){ System.out.println(element + " : "); System.out.println("Valeur de lannotation associe = " + element.getAnnotation(Audit.class).value()); System.out.println(element.getKind()); auditVisitor.visit(element,null); } return false; } }
207 / 258
Threads
Rseau
Outils
EJB
WS
@SupportedAnnotationTypes(value= {"Audit"}) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class GestionAudit extends AbstractProcessor { private ProcessingEnvironment environment; Spcication de la release de @Override public void init(ProcessingEnvironment environment) { Java ncessaire super.init(environment); this.environment = environment; } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ AuditVisitor auditVisitor=new AuditVisitor(environment); for (Element element : roundEnv.getElementsAnnotatedWith(Audit.class)){ System.out.println(element + " : "); System.out.println("Valeur de lannotation associe = " + element.getAnnotation(Audit.class).value()); System.out.println(element.getKind()); auditVisitor.visit(element,null); } return false; } }
207 / 258
Threads
Rseau
Outils
EJB
WS
@SupportedAnnotationTypes(value= {"Audit"}) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class GestionAudit extends AbstractProcessor { private ProcessingEnvironment environment; @Override public void init(ProcessingEnvironment environment) { super.init(environment); instanciation (p.e. par javac) this.environment = environment; avec lenvironnement de com} pilation @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ AuditVisitor auditVisitor=new AuditVisitor(environment); for (Element element : roundEnv.getElementsAnnotatedWith(Audit.class)){ System.out.println(element + " : "); System.out.println("Valeur de lannotation associe = " processing sur lenvironne+ element.getAnnotation(Audit.class).value()); ment courant pour les annoSystem.out.println(element.getKind()); tations en 1er argument, si auditVisitor.visit(element,null); return true alors annotations } non analyses par les procesreturn false; seurs suivants } }
207 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Dernier exemple : JAXB et traitement XML JAXB est une API permettant le traitement Java de/vers XML la commande xjc permet de gnrer des classes Java partir dun schma XML, et contenant des annotations pour le traitement XML (la commande utilise un Java Binding Compiler, xbj) la classe JAXBContext (de javax.xml.bind) intgre un analyseur/gnrateur XML qui fonctionne en utilisant les annotations des classes considres Oprations disponibles :
analyse (unmarshall) de documents XML en gnrant un objet Java (quivalent au principe DOM) validation de lobjet Java tant donn un schma XML gnration dun chier XML partir dun objet
209 / 258
Threads
Rseau
Outils
EJB
WS
M2PLS.xml
<?xml version="1.0" encoding="UTF-8"?> <formation intitule="M2PLS"> <responsable nom="Fouquere"/> <etudiant prenom="Jean" nom="Dupond"/><etudiant prenom="Sergei" nom="Sergeievitch"/> </formation> 210 / 258
Threads
Rseau
Outils
EJB
WS
M2PLS.xml
<?xml version="1.0" encoding="UTF-8"?> <formation intitule="M2PLS"> <responsable nom="Fouquere"/> <etudiant prenom="Jean" nom="Dupond"/><etudiant prenom="Sergei" nom="Sergeievitch"/> </formation> 210 / 258
Threads
Rseau
Outils
EJB
WS
M2PLS.xml
<?xml version="1.0" encoding="UTF-8"?> <formation intitule="M2PLS"> <responsable nom="Fouquere"/> <etudiant prenom="Jean" nom="Dupond"/><etudiant prenom="Sergei" nom="Sergeievitch"/> </formation> 210 / 258
Threads
Rseau
Outils
EJB
WS
M2PLS.xml
<?xml version="1.0" encoding="UTF-8"?> <formation intitule="M2PLS"> <responsable nom="Fouquere"/> <etudiant prenom="Jean" nom="Dupond"/><etudiant prenom="Sergei" nom="Sergeievitch"/> </formation> 210 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
212 / 258
Threads
Rseau
Outils
EJB
WS
213 / 258
Threads
Rseau
Outils
EJB
WS
Gestionnaire
dvnements
213 / 258
Threads
Rseau
Outils
EJB
WS
Retour sur les Beans entit ejb3 : un bean entit est une classe (abstraite ou concrte), i.e. un POJO (Plain Old Java Object) le code peut utiliser des annotations via celles dcrites dans javax.persistence.Entity dans ce cas, les descripteurs (lien avec BD, requtes, ...) peuvent tre gnrs automatiquement possibilit de dnir dans le code le type de gestion la gnration des tables peut tre automatique
214 / 258
Threads
Rseau
Outils
EJB
WS
Threads
Rseau
Outils
EJB
WS
Il est possible dassocier une hirarchie dentits une ou plusieurs tables : SINGLE_TABLE : une unique table, un discriminateur pour distinguer les sous-classes TABLE_PER_CLASS : une table par classe concrte JOINED : une table pour les champs communs, une table pour les champs propres aux sous-classes, oprations implicites de jointure gnres
@Entity @Table(name="FORMATION") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name="TYPE_FORMATION", discriminatorType=DiscriminatorType.STRING, length=10) public abstract class Formation implements Serializable { ... }
@Entity @DiscriminatorValue(value="alternance") public class Alternance extends Formation { @Column(name="ENTREPRISE") protected String entreprise; ... } 216 / 258
Threads
Rseau
Outils
EJB
WS
Les oprations avec la BD se font avec les lments suivants : pour les classes-entits grer :
lunit de persistence est dnie comme une entre dans un chier XML persistence.xml dclarant les proprits ncessaires : classes-entits gres par cette unit, fournisseur du service (i.e. ensemble des classes faisant la gestion concrte de persistence), nom symbolique de la BD le nom symbolique de la BD permet, via le serveur JNDI courant, de connatre lURL de la BD (donc le protocole, le port, le nom rel de la BD, ...)
217 / 258
Threads
Rseau
Outils
EJB
WS
218 / 258
Threads
Rseau
Outils
EJB
WS
Exemple :
// cas type CMP public class EtudiantClient { @PersistenceContext(unitName="EtudiantUP") private EntityManager em; public void create(Etudiant etudiant) { em.persist(etudiant); em.close(); } ... }
// cas type BMP public class EtudiantClient { @PersistenceUnit(unitName="EtudiantUP") private EntityManagerFactory emf; private EntityManager em = emf.createEntityManager(); public void create(Etudiant etudiant) { em.getTransaction().begin(); em.persist(etudiant); em.getTransaction().commit(); } ... }
219 / 258
Threads
Rseau
Outils
EJB
WS
Pour un environnement de type web + bean session + bean entit (p.e. sous netbeans) : on cre les beans entit on cre des facades pour ces beans entit, i.e. des beans session avec leur interface, intgrant des mthodes par dfaut (create(), find(), ...) (cf menu New -> Session Beans for Entity classes) on cre par exemple une servlet, ou une JSP, et on injecte le code permettant lappel dun bean session (cf menu Insert Code -> Call Enterprise Bean ... ou ajout de @EJB private EtudiantFacadeLocal monEtudiant)
220 / 258
Threads
Rseau
Outils
EJB
WS
Gestion de messages (beans messages et paquetage JMS) Objets session et entit : synchrones => le client attend Objets message :
asynchrones => le rcepteur peut tre en sommeil garantie de livraison (ack) uni ou multicast
221 / 258
Threads
Rseau
Outils
EJB
WS
Principe : un ou plusieurs clients (beans ou non) envoient des messages une queue un message-driven bean extrait de manire asynchrone les messages de la queue et les traite ou bien des lecteurs reoivent / vont chercher les messages
222 / 258
Threads
Rseau
Outils
EJB
WS
Au pralable tout dveloppement de ce type, il faut un serveur de gestion de messages intgr votre serveur dapplication : soit externe (windows message server, ...) soit interne au serveur dapplication (dans Sun Java Application Server, Glasssh, ...)
223 / 258
Threads
Rseau
Outils
EJB
WS
A noter qua priori une version tlcharge de Glasssh nincorpore pas un tel serveur. Il faut linclure via les plug-in pour Glasssh.
Sous Glasssh dans Netbeans, il doit exister un serveur JMS (dans les ressources serveurs) puis : crer une fabrique de connexions dont le type peut tre javax.jmsConnectionFactory, crer une queue dans les ressources de destination dont le type peut tre javax.JMS.Queue.
224 / 258
Threads
Rseau
Outils
EJB
WS
2 modes sont disponibles : mode point point (Queue) : dun client un consommateur mode publication/abonnement (Topic) : dun client un ensemble de consommateurs Un client envoie des messages une queue dune fabrique gestionnaire de messages (spcie par un nom JNDI). Le code dun client doit donc contenir : une instance de la classe ConnectionFactory cre par un appel au serveur JNDI direct ou par une annotation une instance de la classe Queue ou Topic cre par un appel au serveur JNDI direct ou par une annotation
225 / 258
Threads
Rseau
Outils
EJB
WS
// cas de cration dinstance par utilisation dannotations ... @Resource(mappedName="jms/ConnectionFactory") private static ConnectionFactory connectionFactory; @Resource(mappedName="jms/Queue") private static Queue queue; ...
226 / 258
Threads
Rseau
Outils
EJB
WS
Il ne reste plus au client qu crer la connexion, la session, le producteur de message, et denvoyer des messages : (un peu comme avec JavaMail)
... Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue); ... message = session.createTextMessage(); for (int i = 0; i < NUM_MSGS; i++) { message.setText("Message numero " + (i + 1)); System.out.println("Sending message: " + message.getText()); messageProducer.send(message); } ...
227 / 258
Threads
Rseau
Outils
EJB
WS
2 possibilits de rception de message : Un couteur de message est un Message-Driven Bean (MDB) qui implante MessageListener. Un message est reu et trait par la mthode spcique onMessage. Un consommateur de message est une instance de On peut alors recevoir des messages par appel synchrone.
MessageConsumer.
228 / 258
Threads
Rseau
Outils
EJB
WS
229 / 258
Threads
Rseau
Outils
EJB
WS
230 / 258
Introduction 251-251-291
Threads
Rseau
Outils
EJB
WS
231 / 258
Introduction 251-252-291
Threads
Rseau
Outils
EJB
WS
232 / 258
Introduction 251-253-291
Threads
Rseau
Outils
EJB
WS
Les Web Services : permettent de faire communiquer deux sous-systmes darchitectures semblables ou diffrentes de manire standard dans le but dchanger des services ou traitements applicatifs Deux modles de web services selon le protocole dchange : via CorbaRPC : appels de mthodes distance aprs dcouverte du service (modle SOAP-RMI) via http simple : utilisation directe dURI (modle REST) par GET/POST
233 / 258
Introduction 251-254-291
Threads
Rseau
Outils
EJB
WS
234 / 258
Introduction 251-255-291
Threads
Rseau
Outils
EJB
WS
par appel de mthode : le W3C a dni la pile de protocoles un service de transport : HTTP, Hypertext Transfer Protocol un systme de messages XML : SOAP, Simple Object Access Protocol une description des services : WSDL, Web Services Description Language un systme de dcouverte des services : UDDI, Universal Description Discovery and Integration
235 / 258
Introduction 251-256-291
Threads
Rseau
Outils
EJB
WS
UDDI est un annuaire qui permet de stocker des informations sur des services web. Objectif : fournir une architecture de Publication / Dcouverte / Lien de services web. Suppose des standards de description de services, i.e. catgorisation industrielle de services (cf NAICS, UN/SPSC, ...) Trs peu utilis depuis 2006, reste en intranet
236 / 258
Introduction 251-257-291
Threads
Rseau
Outils
EJB
WS
Il peut tre prsent en 3 parties : pages blanches : listent les entreprises ainsi que des informations associes ces dernires (Provider), pages jaunes : recensent les services web (Service) de chacune des entreprises avec le lien vers une implantation du service (Binding) sous le standard WSDL, pages vertes : fournissent des informations techniques prcises sur les services fournis (tModel).
237 / 258
Introduction 251-258-291
Threads
Rseau
Outils
EJB
WS
<businessEntity businessKey="..."> <name>Nom de lentreprise</name> ... <businessServices> <businessService businessKey="..." serviceKey="..."> <name>StockQuoteService</name> <description xml:lang="fr">...</description> <bindingTemplates> <bindingTemplate serviceKey="..." bindingKey="..."> <accessPoint URLType="http"> http://localhost/HelloWorld/Service1.asmx </accessPoint> <tModelInstanceDetails> <tModelInstanceInfo tModelKey="uuid:..."/> </tModelInstanceDetails> </bindingTemplate> </bindingTemplates> <categoryBag> <keyedReference tModelKey="UUID:..." keyName="Stock market trading services" keyValue="84121801"/> </categoryBag> ... </businessServices> ... </businessEntity>
238 / 258
Introduction 251-259-291
Threads
Rseau
Outils
EJB
WS
<tModel authorizedName="..." operator="..." tModelKey="..."> <name>StockQuote Service</name> <description xml:lang="en"> WSDL desc. of a standard stock quote service interface </description> <overviewDoc> <description xml:lang="en"> WSDL source document </description> <overviewURL> http://stockquote-definitions/stq.wsdl </overviewURL> </overviewDoc> <categoryBag> <keyedReference tModelKey="UUID:..." keyName="uddi-org:types" keyValue="wsdlSpec"/> </categoryBag> </tModel>
239 / 258
Introduction 251-260-291
Threads
Rseau
Outils
EJB
WS
Une requte sur un serveur UDDI est aussi un chier au format XML :
<find_tModel generic="1.0" xmlns="urn:uddi-org:api"> <categoryBag> <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4" keyName="uddi-org:types" keyValue="wsdlSpec"/> <keyedReference tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" keyName="Stock market trading services" keyValue="84121801"/> </categoryBag> </find_tModel>
240 / 258
Introduction 251-261-291
Threads
Rseau
Outils
EJB
WS
Une requte sur un serveur UDDI est aussi un chier au format XML : Nom de la requte
<find_tModel generic="1.0" xmlns="urn:uddi-org:api"> <categoryBag> <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4" keyName="uddi-org:types" Spcication du serkeyValue="wsdlSpec"/> vice recherch relativement une ontolo<keyedReferenceservices gie de tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" keyName="Stock market trading services" keyValue="84121801"/> </categoryBag> </find_tModel>
240 / 258
Introduction 251-262-291
Threads
Rseau
Outils
EJB
WS
WSDL, 2 niveaux de description dun ou plusieurs services dans un mme chier au format XML : Abstrait : description gnrique des services proposs Concret : implantation des services dcrits abstraitement
241 / 258
Introduction 251-263-291
Threads
Rseau
Outils
EJB
WS
Niveau concret :
Un binding implante un type de port en spciant les protocoles concrets utiliss pour chaque opration Un service prcise pour un binding ladresse utiliser
242 / 258
Introduction 251-264-291
Threads
Rseau
Outils
EJB
WS
243 / 258
Introduction 251-265-291
Threads
Rseau
Outils
EJB
WS
243 / 258
Introduction 251-266-291
Threads
Rseau
Outils
EJB
WS
243 / 258
Introduction 251-267-291
Threads
Rseau
Outils
EJB
WS
Exemple (2) :
... <types> <xsd:schema> <xsd:import namespace="http://WS/" schemaLocation="http ://localhost :8080/PizzaWSService/PizzaWS ?xsd=1" /> </xsd:schema> </types> <message name="findAll"> <part name="parameters" element="tns :findAll" /> </message> <!-- ... pour chacun des messages (i.e. requte de mthode) --> <portType name="PizzaWS"> <operation name="findAll"> <input wsam:Action="http ://WS/PizzaWS/findAllRequest" message="tns:findAll" /> <output wsam:Action="http ://WS/PizzaWS/findAllResponse" message="tns:findAllResponse" /> </operation> <!-- ... pour chacune des oprations --> </portType> ...
244 / 258
Introduction 251-268-291
Threads
Rseau
Outils
EJB
WS
244 / 258
Introduction 251-269-291
Threads
Rseau
Outils
EJB
WS
244 / 258
Introduction 251-270-291
Threads
Rseau
Outils
EJB
WS
Exemple (2) :
... <types> <xsd:schema> <xsd:import namespace="http://WS/" types des Spcication des schemaLocation="http ://localhost :8080/PizzaWSService/PizzaWS ?xsd=1" /> paramtres ncessaires pour </xsd:schema> chaque message (i.e. mle type (donn en XML) pour le </types> message ndAll thode) <message name="findAll"> <part name="parameters" element="tns :findAll" /> </message> <!-- ... pour chacun des messages (i.e. requte de mthode) --> <portType name="PizzaWS"> <operation name="findAll"> <input wsam:Action="http ://WS/PizzaWS/findAllRequest" message="tns:findAll" /> <output wsam:Action="http ://WS/PizzaWS/findAllResponse" message="tns:findAllResponse" /> </operation> <!-- ... pour chacune des oprations --> </portType> ...
244 / 258
Introduction 251-271-291
Threads
Rseau
Outils
EJB
WS
Exemple (2) :
... <types> <xsd:schema> <xsd:import namespace="http://WS/" schemaLocation="http ://localhost :8080/PizzaWSService/PizzaWS ?xsd=1" /> </xsd:schema> </types> <message name="findAll"> Lopration <part name="parameters" element="tns :findAll" /> ndAll consiste : Spcication des oprations </message> disponibles <!-- ... pour chacun des messages (i.e. requte de mthode) --> (1) envoyer une requte lURL mentionn, les arguments ont les types in<portType name="PizzaWS"> diqus dessous <operation name="findAll"> <input wsam:Action="http ://WS/PizzaWS/findAllRequest" message="tns:findAll" /> <output wsam:Action="http ://WS/PizzaWS/findAllResponse" message="tns:findAllResponse" /> </operation> <!-- ... pour chacune des oprations --> </portType> (2) recevoir une rponse via la requte mentionne, les arguments ont les types indiqus dessous
...
244 / 258
Introduction 251-272-291
Threads
Rseau
Outils
EJB
WS
Exemple (3) :
... <binding name="PizzaWSPortBinding" type="tns:PizzaWS"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="findAll"> <wsp :PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:operation soapAction="" /> <input> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </input> <output> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </output> </operation> <!-- ... binding pour chacun des oprations --> </binding> <service name="PizzaWSService"> <port name="PizzaWSPort" binding="tns:PizzaWSPortBinding"> <soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /> </port> </service> </definitions>
245 / 258
Introduction 251-273-291
Threads
Rseau
Outils
EJB
WS
245 / 258
Introduction 251-274-291
Threads
Rseau
Outils
EJB
WS
<binding name="PizzaWSPortBinding" type="tns:PizzaWS"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="findAll"> <wsp :PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:operation soapAction="" /> Politique utilise <input> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </input> Encodage des entres <output> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </output> Encodage des sorties </operation> <!-- ... binding pour chacun des oprations --> </binding> <service name="PizzaWSService"> <port name="PizzaWSPort" binding="tns:PizzaWSPortBinding"> <soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /> </port> </service> </definitions>
245 / 258
Introduction 251-275-291
Threads
Rseau
Outils
EJB
WS
Exemple (3) :
... <binding name="PizzaWSPortBinding" type="tns:PizzaWS"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="findAll"> <wsp :PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:operation soapAction="" /> <input> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </input> <output> <wsp:PolicyReference URI="#PizzaWSPortBinding_findAll_WSAT_Policy" /> <soap:body use="literal" /> </output> </operation> Spcication de limplanta<!-- ... binding des services des oprations service abstrait - service tion pour chacun lien --> </binding> concret <service name="PizzaWSService"> <port name="PizzaWSPort" binding="tns:PizzaWSPortBinding"> <soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /> </port> </service> </definitions> adresse du service
245 / 258
Introduction 251-276-291
Threads
Rseau
Outils
EJB
WS
Introduction 251-277-291
Threads
Rseau
Outils
EJB
WS
<xs:complexType name="findAllResponse"> <xs:sequence> <xs:element name="return" type="tns:stock" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> composition dun stock <xs:complexType name="stock"> <xs:sequence> <xs:element name="pizzaId" type="tns:pizza" minOccurs="0" /> <xs:element name="quantite" type="xs:int" minOccurs="0" /> <xs:element name="stockId" type="xs:int" minOccurs="0" /> </xs:sequence> </xs:complexType> <!-- ... de mme pour chaque type darguments --> </xs:schema> 246 / 258
Introduction 251-278-291
Threads
Rseau
Outils
EJB
WS
247 / 258
Introduction 251-279-291
Threads
Rseau
Outils
EJB
WS
REST : Representational State Transfer nest pas un protocole mais un paradigme. imagin par Roy Fielding (anne 2000), un des auteurs du protocole HTTP Pas uniquement limit aux changes machines / machines ! "Representational State Transfer is intended to evoke an image of how a well-designed Web application behaves : a network of web pages (a virtual statemachine), where the user progresses through an application by selecting links (state transitions), resulting in the next page (representing the next state of the application) being transferred to the user and rendered for their use."
248 / 258
Introduction 251-280-291
Threads
Rseau
Outils
EJB
WS
les URI ont un sens ! Chaque resource de lapplication est accessible via une URI unique Les oprations (cf principe CRUD : Create, Read, Update, Delete) sont uniformes entre les resources Aucune notion dtat dans une suite dactions (= pas de session utilisateur en HTTP)
249 / 258
Introduction 251-281-291
Threads
Rseau
Outils
EJB
WS
On peut imaginer une correspondence entre oprations HTTP et oprations CRUD : correspond quasiment une opration CRUD Read, toutefois GET permet un paramtrage plus n quun simple SELECT.
GET
correspond lopration CRUD Delete PUT correspond lopration CRUD Update, avec les diffrences suivantes :
DELETE PUT suppose une substitution complte de la ressource,
Update peut tre partiel. PUT peut permettre de crer une ressource (quand lURI est dni par le client)
est utilis pour une opration CRUD Create. POST peut aussi tre utilis pour une mise jour.
POST
250 / 258
Introduction 251-282-291
Threads
Rseau
Outils
EJB
WS
Dans un systme REST, les ressources sont manipules par change de "reprsentations" : une ressource (un achat par exemple) est reprsente par un document XML, une opration (par exemple une commande) est effectue par une requte HTTP (POST avec comme contenu un document XML) envoy un URI unique ltat de la communication est maintenue travers la reprsentation de la ressource
251 / 258
Introduction 251-283-291
Threads
Rseau
Outils
EJB
WS
REST :
http://gasell.org/users/ http://gasell.org/users/[id] (URI unique) http://gasell.org/findUser user = new Resource("http://gasell.org/users/001")
RPC :
getUser() addUser() removeUser() updateUser() findUser() example = new ExampleApp("gasell.org:1234") example.getUser()
252 / 258
Introduction 251-284-291
Threads
Rseau
Outils
EJB
WS
253 / 258
Introduction 251-285-291
Threads
Rseau
Outils
EJB
WS
Cl daccs
Nom de la ressource
253 / 258
Introduction 251-286-291
Threads
Rseau
Outils
EJB
WS
En rsum : les ressources sont identies par une URI les "mthodes" sont identies par une requte http : GET, POST, PUT, DELETE une "reprsentation" est dnie par des donnes et un tat transmis via XML
254 / 258
Introduction 251-287-291
Threads
Rseau
Outils
EJB
WS
Requte
GET /M2PLS/etudiant/2006276 HTTP/1.1 Host: www.univ-paris13.fr Accept: application/xml
Rponse
HTTP/1.1 200 OK Date: Mon, 30 Nov 2009 11:13:43 GMT Server: Apache/1.3.6 Content-Type: application/xml; charset=UTF-8 <?xml version="1.0"?> <etudiant xmlns="..."> <personal_data> ... </personal_data> ... </etudiant>
255 / 258
Introduction 251-288-291
Threads
Rseau
Outils
EJB
WS
Requte
GET /M2PLS/etudiant/2006276 HTTP/1.1 Host: www.univ-paris13.fr Accept: application/xml Ressource Mthode
Rponse
HTTP/1.1 200 OK Date: Mon, 30 Nov 2009 11:13:43 GMT Server: Apache/1.3.6 Content-Type: application/xml; charset=UTF-8 <?xml version="1.0"?> <etudiant xmlns="..."> <personal_data> ... </personal_data> Reprsentation ... </etudiant>
255 / 258
Introduction 251-289-291
Threads
Rseau
Outils
EJB
WS
JAXWS
: gestion de web services avec publication de services requte de services par web2.0 gestion des appels/rponses gestion des messages
JAXR
JWSDL JAXM
JAXRPC
256 / 258
Introduction 251-290-291
Threads
Rseau
Outils
EJB
WS
Cration du service web : (Cration dun projet "Web Application" ou "EJB Module") Cration dans le projet via "New Web Service" (donner un nom de package, e.g. org.up13.eid) ou partir dun bean session Ajouter des oprations (i.e. services) Modier chaque code (via "Source") Run => dploiement et publication du service Test possible via le projet de web service
257 / 258
Introduction 251-291-291
Threads
Rseau
Outils
EJB
WS
Cration dun client : Dnir un projet, ou un Web Application, ... Crer un chier par "Web Service Client" en prcisant le web service utiliser [cela charge via wsdl les oprations disponibles] Crer une servlet (ou un chier java, ou une jsp, ...) et faire glisser lopration souhaite dans le code source [cre une instance de service, puis de port, puis dappel dopration ct client] Modier le code selon les besoins
258 / 258