Anda di halaman 1dari 291

Introduction 1-1-7

Threads

Rseau

Outils

EJB

WS

Environnement et langages volus


Christophe Fouquer
Master Informatique 2me anne christophe.fouquere@univ-paris13.fr A208, Universit de Paris 13

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

Threads : architectures matre-esclave Processus lgers Exemples types

3 / 258

Introduction 1-4-7

Threads

Rseau

Outils

EJB

WS

Rseau : adressage et sockets Connexions rseau


Rappels sur les rseaux (IP, TCP et UDP, adressage) Manipulation dadresses : classe InetAddress Connexions TCP non scuriss entre machines (classe Socket) Connexions TCP scuriss entre machines (classe SSLServerSocket) Connexions UDP entre machines (classe DatagramSocket) Connexions entre machines (classe MulticastSocket)

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

Environnement J2EE et EJB : la base Introduction Servlet et JSP


JSP Servlet

Enterprise Java Beans


Gnralits Une (partie d) implantation Beans session Beans entit / JPA Un premier exemple de Beans entit sous ejb3 Beans entit CMP Beans entit BMP Sur les annotations en Java Beans entit ejb3 Beans message

6 / 258

Introduction 1-7-7

Threads

Rseau

Outils

EJB

WS

Web Services et J2EE Web Services : introduction WSDL et UDDI REST

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, ...)

Messagerie type XML


(p.e. SOAP, Simple Object Access Protocol)

Description de donnes
(p.e. XML, eXtended Markup Language, XHTML, ...)

14 / 258

Introduction 15-15-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

Threads : architectures matre-esclave Processus lgers Exemples types

15 / 258

Introduction 15-16-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

Threads : architectures matre-esclave Processus lgers Exemples types

16 / 258

Introduction 15-17-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

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

gr par le garbage collector

17 / 258

Introduction 15-18-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

Partage de mmoire entre threads : en phase dinitialisation :


certaines variables doivent tre en pot commun alors que dautres sont rserves au calcul du thread ==> volatile

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

Processus lgers Exemples types

Classes Thread et Runnable :


class T extends Thread { ... public void run() { ... } ... } ... Thread t = new T(...); t.start(); ... class T implements Runnable { ... public void run() { ... } ... } ... T tSpec = new T(...); Thread t = new Thread(tSpec); t.start(); ...

19 / 258

Introduction 15-20-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

instance de Thread = contrleur de processus lger. linitialisation : un unique thread lanant main() de la classe appele. classe Thread
static Thread currentThread()

retourne le thread courant (i.e. lobjet instance)


void setName(String s)

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

Processus lgers Exemples types

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

Processus lgers Exemples types

Priorit :
entre Thread.MIN_PRIORITY=1 et
Thread.MAX_PRIORITY=10

par dfaut Thread.NORM_PRIORITY=5 classe Thread


int getPriority() renvoie la priorit du Thread void setPriority(int priority) positionne la priorit

22 / 258

Introduction 15-23-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

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

Processus lgers Exemples types

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

Processus lgers Exemples types

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

Processus lgers Exemples types

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

Processus lgers Exemples types

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

Processus lgers Exemples types

Donnes locales un thread : classe ThreadLocal


set(Object o) get(Object o)

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

Processus lgers Exemples types

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

maximale de priorit du groupe

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

Processus lgers Exemples types

Threads : architectures matre-esclave Processus lgers Exemples types

30 / 258

Introduction 15-31-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

1. Callback aprs appel de thread (mthode par continuation)


// Esclave import java.io.*; import java.security.*; public class CbDigest implements Runnable { private File input; // calcul de signature sur fichier private CbDigestServer cbDigestServer; // objet demandeur du calcul public CbDigest (File input, CbDigestServer cb) { this.input = input; this.cbDigestServer = cb; // dclaration } public void run() { try { MessageDigest sha = MessageDigest.getInstance("SHA"); DigestInputStream din = new DigestInputStream( new FileInputStream(input), sha ); int b; while ((b = din.read()) != -1); din.close(); byte[] digest = sha.digest(); cbDigestServer.setDigest(digest); // continuation } catch(IOException e) {System.err.println(e);} catch(NoSuchAlgorithmException e) {System.err.println(e);} } 31 / 258

Introduction 15-32-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

// 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

Processus lgers Exemples types

... 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

Processus lgers Exemples types

2. Callback aprs appel de thread (couteurs)


// Esclave import java.util.*; import java.io.*; import java.security.*; public class CbDigest implements Runnable { private File input; private Vector digestList = new Vector(); // liste dabonns public CbDigest (File input) { this.input = input; } public synchronized void addListener(DigestListener dl) { digestList.add(dl); } public synchronized void removeListener(DigestListener dl){ digestList.remove(dl); } private synchronized void sendDigest(byte[] digest) { ListIterator iterator = digestList.listIterator(); while(iterator.hasNext()) { DigestListener dl = (DigestListener) iterator.next(); dl.setDigest(digest); } } public void run() { ... sendDigest(digest); // diffusion ... } 34 / 258

Introduction 15-35-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

// Interface Listener public interface DigestListener { public void setDigest(byte[] digest); }

// Serveur import java.io.*;

public class CbDigestServer implements DigestListener { ... public void setDigest(byte[] digest) { // mthode de rception ... } ... }

35 / 258

Introduction 15-36-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

3. Attente entre threads : join()


// Esclave public class CbDigest extends Thread { ... public byte[] getDigest() { ... } ... }

36 / 258

Introduction 15-37-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

// 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

Processus lgers Exemples types

4. Attente entre threads via ressources : wait() Remarques :


wait() wait() wait()

et notify() sont des mthodes de Object entrane une attente de leve du verrou

lintrieur dun synchronized Versions de wait() :


wait() wait(long millisec) wait(long millisec, int nanosec)

Versions de notify() :
notify() rveil dun thread notifyAll() rveil de tous les threads

38 / 258

Introduction 15-39-40

Threads

Rseau

Outils

EJB

WS

Processus lgers Exemples types

// 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

Processus lgers Exemples types

// 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

Connexions rseau URL RMI et RMI-IIOP

Rseau : adressage et sockets Connexions rseau


Rappels sur les rseaux (IP, TCP et UDP, adressage) Manipulation dadresses : classe InetAddress Connexions TCP non scuriss entre machines (classe Socket) Connexions TCP scuriss entre machines (classe SSLServerSocket) Connexions UDP entre machines (classe DatagramSocket) Connexions entre machines (classe MulticastSocket)

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

Connexions rseau URL RMI et RMI-IIOP

Rseau : adressage et sockets Connexions rseau


Rappels sur les rseaux (IP, TCP et UDP, adressage) Manipulation dadresses : classe InetAddress Connexions TCP non scuriss entre machines (classe Socket) Connexions TCP scuriss entre machines (classe SSLServerSocket) Connexions UDP entre machines (classe DatagramSocket) Connexions entre machines (classe MulticastSocket)

URL
Classes URL et URLConnection Gestion de protocole

RMI et RMI-IIOP
RMI : Remote Method Invocation

42 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-43-104 Rappels sur les rseaux (IP, TCP et UDP, adressage)

Connexions rseau URL RMI et RMI-IIOP

Rappels sur les rseaux IP : Internet Protocol


seul protocole de la couche rseau reconnu par Java (donc pas IPX et Appletalk) donnes transitant par datagrammes (en-tte + donnes) adressage IPv4 par 4 octets (IPv6 sur 16)

DNS : Domain Name System


traduction nom symbolique - adresse IP Ex. (cf. nslookup) : www.univ-paris13.fr 192.33.182.1

TCP : Transmission Control Protocol


reconstitution des paquets + ack

UDP : User Datagram Protocol


ni vrication de lordre, ni rexpdition

port : (0 < port < 65535)


association logique un service adresse IP + port Exemples (cf /etc/services) :
21 ftp 25 smtp 80 HTTP (web par dfaut) 1099 RMI registry

43 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-44-104 Rappels sur les rseaux (IP, TCP et UDP, adressage)

Connexions rseau URL RMI et RMI-IIOP

URI : Uniform resource Identier


adresse dune ressource schma :syntaxe_propre_au_schma en gnral : schma://autorit/chemin?requte o
autorit = adresse destinataire chemin = chemin "dans" cette adresse (en fait, rinterprt par lautorit) requte = donnes ou requte

URN : Uniform Resource Name


Exemple : urn:isbn:1234567890 gestion de donnes par domaine de noms, rcupration de la donne via un serveur

URL : Uniform Resource Locator


de la forme
protocole://login:passwd@autorit:port/chemin#section?requte

44 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-45-104 Rappels sur les rseaux (IP, TCP et UDP, adressage)

Connexions rseau URL RMI et RMI-IIOP

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

41-46-104 Manipulation dadresses : classe InetAddress

Connexions rseau URL RMI et RMI-IIOP

(exception gnre : UnknownHostException)

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()

1re info toutes

String getHostName() byte[] getAddress() String getHostAddress()


46 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-47-104 Manipulation dadresses : classe InetAddress

Connexions rseau URL RMI et RMI-IIOP

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

41-48-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

(exceptions : UnknownHostException, IOException, package java.net)

Connexions TCP non scuriss


Ct client : la classe Socket gre les connexions Socket(String host, int port) ouvre une connexion avec host + port si host na pas de serveur en coute sur le port alors retour avec une IOException Socket(InetAddress host, int port) Socket(String host, int port, InetAddress interface, int portLocal) permet de spcier la partie source (par dfaut le port source est le 1er libre)

48 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-49-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

InetAddress getInetAddress() int getPort() int getLocalPort() InetAddress getLocalAddress()

spcif. du serveur spcif. du port distant spcif. du port local

InputStream getInputStream() OutputStream getOutputStream() synchronized void close()

ux pour la lecture ux pour lcriture ferme le socket

49 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-50-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

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

41-51-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

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)

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

41-52-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

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

41-53-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

... 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) {} } } } }

//attente de fin R/W // interruption de thread

53 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-54-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

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

41-55-104 Connexions TCP non scuriss entre machines (classe Socket)

Connexions rseau URL RMI et RMI-IIOP

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

41-56-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

Connexions TCP scuriss


Packages : (dans le JDK standard partir de la version 1.4) javax.net.ssl classes abstraites : communication scurise javax.net sockets scuriss java.security.cert gestion de cls pour SSL com.sun.net.ssl algo de cryptage (==> provider) En fait intgre le cryptage dans lenvoi de donnes et non au niveau du ux de donnes. Le "cryptage" consiste spcier si il y a authentication (mthode RSA) si il y a cryptage des blocs (DES ou RC4) si il y a contrle de somme (i.e. signature) (MD5 ou SHA)

56 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-57-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

Grandes lignes de la mthode :


1

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

41-58-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-59-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

possibilit de prciser les protocoles de cryptage disponibles :


public abstract String[] getEnabledCypherSuites()

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

41-60-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

Exemples doprations effectuer :


SERVEUR
% keytool -genkey -keystore Fichier_Certif // gnration dun fichier de cl // (en fait dun certificat, dune cl prive et dune cl publique) % keytool -list -keystore Fichier_Certif // ne sert qu voir le contenu du fichier de cls % keytool -selfcert -keystore Fichier_Certif // auto-certifiction de la cl publique du serveur (dans Fichier_Certif) % java -Djavax.net.debug=ssl:handshake:verbose \ ServerMaitre 20000 certif // certif : mot de passe permettant dentrer dans le fichier des cls // version manuelle % java -Djavax.net.ssl.keyStore=cacerts \ -Djavax.net.ssl.keyStorePassword=certif \ -Djavax.net.debug=ssl:handshake:verbose \ ServerMaitreBis 20000 // version automatique

60 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-61-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-62-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

Exemple de client de Socket SSL :


import java.io.*; import java.security.*; import javax.net.ssl.*; public class ClientHTTPS { private final int portHTTPS = 443; private SSLSocket sslSocket; private String host; // port https par dfaut

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

41-63-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

... 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

41-64-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

Exemple de partie de code serveur avec Socket SSL :


... private SSLServerSocket serverSocket; private Socket socket; private int port; public ServerMaitre (int port, String password) { try {setPort(port);} catch (Exception e) { System.out.println("numro de port ngatif"); } // 1) spcif de la fabrique de cryptage KeyManagerFactory kmf=null; SSLContext context=null; try { context = SSLContext.getInstance("SSLv3"); kmf = KeyManagerFactory.getInstance("SunX509"); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); } // 2) spcif du gestionnaire de cls KeyStore ks = null; try { ks = KeyStore.getInstance("JKS"); } catch (KeyStoreException e2) { e2.printStackTrace(); } // 3) rcupration du certificat (et de la cl) char[] passPhrase = password.toCharArray(); try { ks.load(new FileInputStream("Fichier_Certif"), passPhrase); } catch (NoSuchAlgorithmException e3) { e3.printStackTrace(); } catch (CertificateException e3) { e3.printStackTrace(); } catch (FileNotFoundException e3) { e3.printStackTrace(); } catch (IOException e3) { e3.printStackTrace(); } ... // cf page suivante 64 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-65-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

... // 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

41-66-104 Connexions TCP scuriss entre machines (classe SSLServerSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-67-104 Connexions UDP entre machines (classe DatagramSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-68-104 Connexions UDP entre machines (classe DatagramSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-69-104 Connexions UDP entre machines (classe DatagramSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-70-104 Connexions UDP entre machines (classe DatagramSocket)

Connexions rseau URL RMI et RMI-IIOP

Exemple de rception de paquets (extrait de programme) :


import java.net.*; import java.io.*; public class ReceiverThread extends Thread { private DatagramSocket socket; private boolean quit = false; public ReceiverThread(DatagramSocket ds) throws SocketException { this.socket = ds; } public void halt() { this.quit = true; } public void run() { byte[] buffer = new byte[65507]; while (true) { if (quit) return; DatagramPacket input = new DatagramPacket(buffer, buffer.length); try { socket.receive(input); String s = new String(input.getData(), 0, input.getLength()); System.out.println(s); Thread.yield(); } catch (IOException e) {} } } }

70 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-71-104 Connexions entre machines (classe MulticastSocket)

Connexions rseau URL RMI et RMI-IIOP

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

41-72-104 Connexions entre machines (classe MulticastSocket)

Connexions rseau URL RMI et RMI-IIOP

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)

cre un socket multipoint

MulticastSocket joinGroup (InetAddress ia)

mthode permettant de joindre le socket au groupe rfrenc par lIP ia


MulticastSocket leaveGroup (InetAddress ia)

mthode permettant de se sparer du groupe


MulticastSocket receive(DatagramPacket dp)

reoit un paquet UDP


MulticastSocket send(DatagramPacket dp, byte ttl)

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

Connexions rseau URL RMI et RMI-IIOP

Rseau : adressage et sockets Connexions rseau


Rappels sur les rseaux (IP, TCP et UDP, adressage) Manipulation dadresses : classe InetAddress Connexions TCP non scuriss entre machines (classe Socket) Connexions TCP scuriss entre machines (classe SSLServerSocket) Connexions UDP entre machines (classe DatagramSocket) Connexions entre machines (classe MulticastSocket)

URL
Classes URL et URLConnection Gestion de protocole

RMI et RMI-IIOP
RMI : Remote Method Invocation

73 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-74-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

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

41-75-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

(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

getProtocol(), getHost(), getFile(), getPath(), getRef(), getQuery(), getUserInfo(), getAuthority() getPort()

int

75 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-76-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

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

41-77-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

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

41-78-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

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

41-79-104 Classes URL et URLConnection

Connexions rseau URL RMI et RMI-IIOP

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

Introduction 41-80-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

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

Introduction 41-81-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

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

Introduction 41-82-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

Exemple complet (4 pages) :


import java.net.*; import java.io.*; public class GetGridApp { public static void main(String args[]){ try{ GridFactory gridFactory = new GridFactory(); URLConnection.setContentHandlerFactory(gridFactory); if(args.length!=1) error("Usage: java GetGridApp URL"); URL url = new URL(args[0]); CharGrid cg = (CharGrid) url.getContent(); for(int i=0;i<cg.height;++i) { for(int j=0;j<cg.width;++j) { if(cg.values[i][j]) System.out.print(cg.ch); else System.out.print(" "); } System.out.println(); } }catch (MalformedURLException ex){ error("Bad URL"); }catch (IOException ex){ error("IOException occurred."); } } public static void error(String s){ System.out.println(s); System.exit(1); } }

82 / 258

Introduction 41-83-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

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

Introduction 41-84-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

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

Introduction 41-85-104 Gestion de protocole

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

Fichier charGrid.cg :
55O1000101010001000101010001

Excution :
% java GetGridApp file://localhost/home/cf/.../charGrid.cg

85 / 258

Introduction 41-86-104

Threads

Rseau

Outils

EJB

WS

Connexions rseau URL RMI et RMI-IIOP

Rseau : adressage et sockets Connexions rseau


Rappels sur les rseaux (IP, TCP et UDP, adressage) Manipulation dadresses : classe InetAddress Connexions TCP non scuriss entre machines (classe Socket) Connexions TCP scuriss entre machines (classe SSLServerSocket) Connexions UDP entre machines (classe DatagramSocket) Connexions entre machines (classe MulticastSocket)

URL
Classes URL et URLConnection Gestion de protocole

RMI et RMI-IIOP
RMI : Remote Method Invocation

86 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-87-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-88-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-89-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-90-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-91-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-92-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Exemple (tape 1) : Interface copier pour A et B : classe Display.java


import java.rmi.*; import java.io.*; public interface Display extends Remote{ //extension de linterface remote public void showDigest(File fileName) throws RemoteException; }

92 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-93-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Exemple (tape 2) : Implantation de linterface pour A : classe DisplayClass.java


import java.rmi.*; import java.io.*; import java.security.*; public class DisplayClass implements Display{ File input; byte[] digest; public void showDigest(File input) throws RemoteException{ try { this.input = input; MessageDigest sha = MessageDigest.getInstance("SHA"); DigestInputStream din = new DigestInputStream(new FileInputStream(input),sha); while ((din.read()) != -1); din.close(); digest = sha.digest(); System.out.println(this); } catch(IOException e) {System.err.println(e);} catch(NoSuchAlgorithmException e) {System.err.println(e);} } 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; } } 93 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-94-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-95-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-96-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Exemple (tape 5) : Exporter lobjet vers le serveur RMI


% rmiregistry & // Cration dun dmon serveur de noms si celui-ci nest pas dj lanc // par dfaut en attente sur le port 1099 // Autre possibilit : utiliser la classe LocateRegistry // qui permet de crer des serveurs de noms % javac DisplayPublisher.java % java DisplayPublisher

La dernire commande cre la machine virtuelle A, donc reste en excution.

96 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-97-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Exemple (tape 6) : Code DisplayClient.java faire tourner sur B


import java.rmi.*; import java.rmi.server.*; import java.io.*; public class DisplayClient { public static void main(String[] args) throws Exception{ File file = new File(args[0]); Display display = (Display) Naming.lookup("rmi://localhost/UnDisplayDistant"); display.showDigest(file); } }

97 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-98-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-99-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-100-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Sous-classes avec chargeur spcique :


security.SecureClassLoader

: chargeur avec test de

scurit
java.net.URLClassLoader

: chargeur de classes distantes : spcique RMI

rmi.server.RMIClassLoader

Exemple : (on suppose que Test.class se trouve dans le rpertoire /home/cf/TMP/URL/Bibli/)


import java.net.*; import java.util.*; public class TestLoadClass { public static void main(String[] args) throws Exception{ URL url = new URL("file:///home/cf/TMP/URL/Bibli/"); URLClassLoader loader = new URLClassLoader(new URL[] {url}); TestInterface main = (TestInterface) loader.loadClass("Test").newInstance(); System.out.println(main.somme(3,4)); } } 100 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-101-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

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

41-102-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Sur la machine client :


import java.rmi.server.*; public class GenericClient { public static void main (String[] args) { try { System.setProperty( "java.security.policy","maPolicy"); System.setSecurityManager(new SecurityManager()); Class c = RMIClassLoader.loadClass( "http://httphost:20000/", "SpecialClient"); Runnable client = (Runnable) c.newInstance(); client.run(); } catch (Exception e) {System.out.println(e); } } }

public interface Hello extends java.rmi.Remote { public String hello(String s) throws java.rmi.RemoteException; }

// fichier maPolicy grant { permission java.security.AllPermission; };

102 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-103-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Sur httphost : le chier Hello.java et


import java.rmi.*; import java.net.*; public class SpecialClient implements Runnable { public void run() { try { Remote r = Naming.lookup("//codehost/Hello"); System.out.println(( (Hello) r).hello(InetAddress.getLocalHost().getHostAddress())); } catch (Exception e) { System.out.println(e); } } }

103 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

41-104-104 RMI : Remote Method Invocation

Connexions rseau URL RMI et RMI-IIOP

Sur codehost : le chier Hello.java et


import java.util.*; import java.rmi.*; import java.rmi.server.*; import java.rmi.activation.*; public class ImpHello extends UnicastRemoteObject implements Hello { public ImpHello() throws RemoteException { super(10000); } public String hello(String s) { return s; } public static void main(String[] args) { try { System.setProperty( "java.rmi.server.codebase","http://httphost:20000/"); Remote r = new ImpHello(); Naming.rebind("/Hello",r); } catch (Exception e) { System.out.println(e); } } }

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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)

Base de certains webmails

107 / 258

Introduction 105-108-145

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Principe denvoi :
Session

dnit lenvironnement denvoi partir des proprits :


mail.transport.protocol : protocole pour lenvoi (p.e. "smtp") mail.smtp.host : machine relais pour le protocole denvoi choisi getInstance() cre une instance de session partir de proprits donnes en argument, et optionnellement dun objet permettant lauthentication MimeMessage pour la constitution de message au format Mime et incluant les infos de 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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

Principe de rception :
Session

dnit (aussi !) lenvironnement de rception partir de proprit :


mail.store.protocol : protocole pour la lecture (p.e. "imap") getInstance() cre une instance de session partir de proprits donnes en argument, et optionnellement dun objet permettant lauthentication Store

correspond une bote de rception correspond un rpertoire dans une bote

Folder

correspond un message dans un rpertoire de rception


Message

111 / 258

Introduction 105-112-145

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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)

le contexte permet les oprations suivantes :


lier une valeur une cl supprimer la liaison lister les liaisons
114 / 258

Introduction 105-115-145

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

Oprations standard : : liste le contexte racine ou celui donn en argument


list()

: renomme le contexte racine ou celui donn en argument


rename() createSubContext() lookup()

: cre un sous-contexte

: change de / recherche un contexte

116 / 258

Introduction 105-117-145

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-123-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-124-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-125-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-126-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-127-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-128-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-129-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-130-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-131-145 XML, DTD, ...

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

javax.xml.parsers inclut les classes :


SAXParser et sa fabrique SAXParserFactory DocumentBuilder et sa fabrique DocumentBuilderFactory

org.xml.sax inclut principalement les interfaces de gestion de donnes XML :


XMLReader pour les lecteurs DTDHandler pour la conformit aux DTD ...

131 / 258

Introduction 105-132-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-133-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

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

Introduction 105-134-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (1) : EBM.dtd


<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE EBM [ <!-- DTD basique pour la sauvegarde dEBM au format XML --> <!ELEMENT EBM (GraphicalData,ComposantPlus,ComposantsMoins)> <!ELEMENT GraphicalData (GraphicalSizeData,PointOrigine)> <!ELEMENT GraphicalSizeData EMPTY> <!ATTLIST GraphicalSizeData largeurMin CDATA #REQUIRED largeur CDATA #REQUIRED hauteur CDATA #REQUIRED > <!ELEMENT PointOrigine EMPTY> <!ATTLIST PointOrigine x CDATA #REQUIRED y CDATA #REQUIRED > <!ELEMENT ComposantPlus (GraphicalData,Ressources)> <!ELEMENT ComposantsMoins (ComposantMoins*)> <!ELEMENT ComposantMoins (GraphicalData,Ressources)> <!ELEMENT Ressources (Ressource*)> <!ELEMENT Ressource (GraphicalData,Etiquette)> <!ELEMENT Etiquette (GraphicalData)> <!ATTLIST Etiquette Valeur CDATA #REQUIRED> ]>

134 / 258

Introduction 105-135-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (2) : un ux de donne XML


<EBM> <GraphicalData> <GraphicalSizeData largeurMin="30" largeur="40" hauteur="25"> <PointOrigine x="83" y="123"/> </GraphicalData> <ComposantPlus> <GraphicalData> <GraphicalSizeData largeurMin="30" largeur="40" hauteur="25"/> <PointOrigine x="83" y="123"/> </GraphicalData> <Ressources> <Ressource> <GraphicalData> <GraphicalSizeData largeurMin="30" largeur="40" hauteur="25"/> <PointOrigine x="83" y="123"/> </GraphicalData> <Etiquette Valeur="a"> ... </Etiquette> </Ressource> </Ressources> </ComposantPlus> <ComposantsMoins> <ComposantMoins> ... </ComposantMoins> </ComposantsMoins> </EBM>

135 / 258

Introduction 105-136-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (3) : classe principale initialisant les objets et lanant lanalyse


import javax.xml.parsers.*; import org.xml.sax.*; import java.io.*; ... public class SAXEBMReader { ... public SAXEBMReader (String fileName, BM_graph bm_graph) throws IOException { ... // Cration de la fabrique danalyseurs-lecteurs SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); spf.setValidating(false); try { // cration dun analyseur SAXParser saxParser = spf.newSAXParser(); // on rcupre le lecteur XMLReader xmlReader = saxParser.getXMLReader(); // configuration du lecteur xmlReader.setContentHandler(new SAXEBMReaderProcess(getBM_graph())); xmlReader.setErrorHandler(new MyErrorHandler(System.err)); // analyse du flux de donnes XML xmlReader.parse(fileNale.toURL().toString()); } catch (SAXException saxe) { System.out.println("SAX : " + saxe); } catch (ParserConfigurationException pce) { System.out.println("conf : " + pce); } } ... } 136 / 258

Introduction 105-137-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (4) : Gestionnaire derreurs


private static class MyErrorHandler implements ErrorHandler { private PrintStream out; MyErrorHandler(PrintStream out) {this.out = System.out;} private String getParseExceptionInfo(SAXParseException spe) { String systemId = spe.getSystemId(); if (systemId == null) {systemId = "null";} String info = "URI=" + systemId + " Line=" + spe.getLineNumber() + ": " + spe.getMessage(); return info; } public void warning(SAXParseException spe) throws SAXException { out.println("Warning: " + getParseExceptionInfo(spe)); } public void error(SAXParseException spe) throws SAXException { String message = "Error: " + getParseExceptionInfo(spe); throw new SAXException(message); } public void fatalError(SAXParseException spe) throws SAXException { String message = "Fatal Error: " + getParseExceptionInfo(spe); throw new SAXException(message); } }

137 / 258

Introduction 105-138-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (5.1) : gestionnaire de contenu XML


import org.xml.sax.*; import org.xml.sax.helpers.*; import java.util.*; public class SAXEBMReaderProcess extends DefaultHandler { ... public SAXEBMReaderProcess (BM_graph bm_graph) { super(); setBM_graph(bm_graph); } // Oprations en dbut de document public void startDocument() throws SAXException { } // Oprations en fin de lecture de document public void endDocument() throws SAXException { } ...

138 / 258

Introduction 105-139-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (5.2) : gestionnaire de contenu XML


... // Oprations en dbut de lecture dlment public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { String key = localName; // oprations selon lattribut lu if (localName.equals("BM")) {}; if (localName.equals("GraphicalSizeData")) { graphicalData.setLargeurMin(Integer.decode( atts.getValue("largeurMin")).intValue()); }; ... } // Oprations en fin de lecture dlment public void endElement(String namespaceURI, String localName, String qName) throws SAXException { String key = localName; // oprations selon lattribut lu if (localName.equals("EBM")) { e.setGraphicalData(graphicalData); }; if (localName.equals("Ressource_Extremite")) { for (EBM_graph e : getBM_graph().getVectEBM()) { ComposantePlus_graph cPlus = e.getHypothese_graph(); }; ... } ... } 139 / 258

Introduction 105-140-145 SAX : Analyse de ux XML

Threads

Rseau

Outils

EJB

WS

Messagerie Serveur de noms Connecteur BD Analyse XML

Sur les arguments des mthodes startElement et endElement :


namespaceURI localName qName

: lURI de lespace de noms

: nom sans lURI prxe : tableau des attributs prsents dans llment

: nom avec lURI prxe

attributes

140 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

105-141-145 DOM : vue Java dun document XML

Messagerie Serveur de noms Connecteur BD Analyse XML

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

105-142-145 DOM : vue Java dun document XML

Messagerie Serveur de noms Connecteur BD Analyse XML

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

105-143-145 DOM : vue Java dun document XML

Messagerie Serveur de noms Connecteur BD Analyse XML

et Node sont deux interfaces (instancies dans le paquetage w3c)


Document

des attributs de Node permettent daccder aux lments et attributs.

143 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

105-144-145 DOM : vue Java dun document XML

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (1) : analyseur DOM


import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import org.w3c.dom.*; import java.io.*; ... public static void main(String[] args) throws Exception { String filename = args[0]; // Cration de la fabrique DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(false); dbf.setIgnoringComments(false); dbf.setIgnoringElementContentWhitespace(false); // Cration du lecteur DOM DocumentBuilder db = dbf.newDocumentBuilder(); // gestionnaire derreurs db.setErrorHandler(new MyErrorHandler()); // analyse du document XML Document doc = db.parse(new File(filename)); ... echo(doc); }

144 / 258

Introduction

Threads

Rseau

Outils

EJB

WS

105-145-145 DOM : vue Java dun document XML

Messagerie Serveur de noms Connecteur BD Analyse XML

Exemple (2) : utilisation du DOM


... private void echo(Node n) { int type = n.getNodeType(); switch (type) { case Node.ATTRIBUTE_NODE: out.print("ATTR:"); printlnCommon(n); break; case Node.CDATA_SECTION_NODE: out.print("CDATA:"); printlnCommon(n); break; case Node.COMMENT_NODE: out.print("COMM:"); printlnCommon(n); break; case Node.ELEMENT_NODE: out.print("ELEM:"); printlnCommon(n); NamedNodeMap atts = n.getAttributes(); indent += 2; for (int i = 0; i < atts.getLength(); i++) { Node att = atts.item(i); echo(att); } indent -= 2; break; } } ... 145 / 258

Introduction 146-146-250

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Environnement J2EE et EJB : la base Introduction Servlet et JSP


JSP Servlet

Enterprise Java Beans


Gnralits Une (partie d) implantation Beans session Beans entit / JPA Un premier exemple de Beans entit sous ejb3 Beans entit CMP Beans entit BMP Sur les annotations en Java Beans entit ejb3 Beans message

146 / 258

Introduction 146-147-250

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Environnement J2EE et EJB : la base Introduction Servlet et JSP


JSP Servlet

Enterprise Java Beans


Gnralits Une (partie d) implantation Beans session Beans entit / JPA Un premier exemple de Beans entit sous ejb3 Beans entit CMP Beans entit BMP Sur les annotations en Java Beans entit ejb3 Beans message

147 / 258

Introduction 146-148-250

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction Servlet et JSP Beans

Plus concrtement : JEE / J2EE :


est une spcication pour des applications dentreprises" bases sur Java intgre une vingtaine de spcications de composants (servlet, mail, bd, conteneur, ...) des implantations certies existent : Glasssh et Sun JEE SDK (Sun), Weblogic (Oracle), NetWeaver (SAP), WebSphere (IBM), JBoss, ...

.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

Introduction Servlet et JSP Beans

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

Introduction Servlet et JSP Beans

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

Introduction Servlet et JSP Beans

Technologies (1) : Composants web :


Servlets : code Java de gnration de pages HTML ou XML JSP : code compiler la demande en servlet

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

Introduction Servlet et JSP Beans

Technologies (2) : Services :


JNDI : Java Naming and Directory Interface (lien vers un LDAP, ...) JAX-WS : Java API for XML Web Services JTA : Java Transaction API (gestion des transactions distribues) JPA : Java Persistence API (gestion de la persistence de contenu de session hors BD) JDBC : Java Database Connectivity

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

Introduction Servlet et JSP Beans

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, ...

conteneur EJB = dpend de lenvironnement complet


154 / 258

Introduction 146-155-250

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Environnement J2EE et EJB : la base Introduction Servlet et JSP


JSP Servlet

Enterprise Java Beans


Gnralits Une (partie d) implantation Beans session Beans entit / JPA Un premier exemple de Beans entit sous ejb3 Beans entit CMP Beans entit BMP Sur les annotations en Java Beans entit ejb3 Beans message

155 / 258

Introduction 146-156-250

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Servlet versus JSP : JSP (Java Server Pages) =


code XHTML transform en code servlet les directives, scripts, actions sont de la forme <%type contenu%> ou
<jsp:type contenu> ... </jsp:type>

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

Introduction 146-157-250 JSP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-158-250 JSP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Directive : <%@ type ... %> ou <jsp:directive.type ... /> ou

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>

pour afcher le contenu de la variable


158 / 258

Introduction 146-159-250 JSP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Actions :
jsp:include pour excuter le chier inclure jsp:forward pour rediriger vers une autre page

dans les 2 cas, passage de paramtres possibles (pour la requte implicite) :


<jsp:forward page="continuation.jsp" > <jsp:param name="nom_attribut" value="valeur" /> </jsp:forward>

Il existe des balises supplmentaires, possibilit dajout de ses propres balises.

159 / 258

Introduction 146-160-250 JSP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

spcication den-tte (import)

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

Introduction 146-161-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-162-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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)

mthode principale devant grer les requtes clientes.


void destroy() doit tre appel par le conteneur lorsque les appels service() sont termins ou aprs un laps de temps.

162 / 258

Introduction 146-163-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Requte / Rponse : : interface spciant laccs au ux dentre (getInputStream())et aux paramtres dune requte (getAttribute(String name))
ServletRequest

: interface spciant le ux de sortie (setEncoding(), getOutputStream(), ...)


ServletResponse

on peut spcier une classe par protocole (p.e. HttpServlet pour http), dpend du conteneur web.

163 / 258

Introduction 146-164-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Cas de HTTP :
javax.servlet.http.HttpServlet

dnit un ensemble de mthodes ddies au protocole http.

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

Introduction 146-165-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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&eacute; Paris 13</a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }

165 / 258

Introduction 146-166-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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&eacute; Paris 13</a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }

165 / 258

Introduction 146-167-250 Servlet

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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&eacute; 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

Introduction Servlet et JSP Beans

Environnement J2EE et EJB : la base Introduction Servlet et JSP


JSP Servlet

Enterprise Java Beans


Gnralits Une (partie d) implantation Beans session Beans entit / JPA Un premier exemple de Beans entit sous ejb3 Beans entit CMP Beans entit BMP Sur les annotations en Java Beans entit ejb3 Beans message

166 / 258

Introduction 146-169-250 Gnralits

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-170-250 Gnralits

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-171-250 Gnralits

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemples de schmas dactivation : client HTML :


la requte arrive via le serveur http une servlet la servlet requiert un traitement par un bean session si ncessaire, le cookie permet didentier les donnes requises pour initialiser le bean session le rsultat du code mtier (dans le bean session) est utilis pour construire par la servlet la rponse le code de la servlet ne contient que la mise en forme des donnes

client programme (C ou autre) :


via Corba, un appel un bean session le bean session active un ou plusieurs beans entit chaque bean entit est une vue de base de donnes la maintenance de la BD est gre par les beans entit le calcul mtier est effectu par le bean session
169 / 258

Introduction 146-172-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-173-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Elments sur la structure sous-jacente (2) :


1

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

Introduction 146-174-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple (1) :
public interface Hello extends javax.ejb.EJBObject { public String hello() throws java.rmi.RemoteException; }

public interface HelloLocal extends javax.ejb.EJBLocalObject { public String hello(); }

public interface HelloHome extends javax.ejb.EJBHome { Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; }

public interface HelloLocalHome extends javax.ejb.EJBLocalHome { HelloLocal create() throws 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

Introduction 146-175-250 Une (partie d) implantation

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

Introduction 146-176-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-177-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-178-250 Une (partie d) implantation

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

1. nom symb. de lobjet recherch

Serveur JNDI

0. contexte JNDI

2. adresse objet accueil

Objet-client
5. rfrence dobjet-bean

3. demande dobjet-bean

Objet daccueil
6. code mtier 4. initialisation

Objet bean

175 / 258

Introduction 146-179-250 Beans session

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Beans session : dure de vie : celle de lappel 2 sous-types :


Stateless : aucune donne de session. Exemple : envoi de lheure Stateful : il existe des donnes de session, mcanisme de type cookie pour rinitialiser le contexte. Exemple : chariot dachat

176 / 258

Introduction 146-180-250 Beans session

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple de bean session stateless avec tags de prcompilation (1) :


// interface pour un usage de type RMI import javax.ejb.Remote; @Remote public interface HelloRemote { String hello(); } // interface pour un usage local import javax.ejb.Local; @Local public interface HelloLocal { String hello(); }

// 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

Introduction 146-181-250 Beans session

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple de bean session stateless avec tags de prcompilation (2) : installation sous Netbeans,
1

cration dun projet Java Enterprise Application :


New Project -> Java EE -> Enterprise Application

cration dun session bean :


New -> Session Bean

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

Introduction 146-182-250 Beans session

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple de bean session stateful avec tags de prcompilation (1) :


import import import import java.util.ArrayList; java.util.List; javax.ejb.Remove; javax.ejb.Stateful;

@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

Introduction 146-183-250 Beans session

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple de bean session stateful (2) :


// CartClient.java import java.util.*; import javax.naming.*; import tools.*;

import javax.rmi.PortableRemoteObject; import <interface>.*;

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

Introduction 146-184-250 Beans entit / JPA

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-185-250 Beans entit / JPA

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

(en EJB<3) 2 types de beans entit :


Beans BMP (bean managed persistence) : la gestion de la BD sous-jacente est laisse au programmeur Beans CMP (container managed persistence) : le conteneur dEJB gre le lien avec la BD

(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

Introduction 146-186-250 Beans entit / JPA

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

146-187-250 Un premier exemple de Beans entit sous ejb3

Introduction Servlet et JSP Beans

Bean entit ejb3 : premier exemple (1)


import import import import java.io.Serializable; javax.persistence.*; static javax.persistence.CascadeType.*; java.util.*;

@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

146-188-250 Un premier exemple de Beans entit sous ejb3

Introduction Servlet et JSP Beans

Bean entit ejb3 : premier exemple (2)


import javax.persistence.Persistence; import javax.persistence.Query; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import java.util.*; import entity.*; public class Client { private static EntityManagerFactory emf; private static EntityManager em; public static void main(String[] args) { // cration de la fabrique de gestionnaire dentits emf = Persistence.createEntityManagerFactory("pu"); // Entre de donnes em = emf.createEntityManager(); em.getTransaction().begin(); insert(); em.getTransaction().commit(); em.close(); // Extraction de donnes em = emf.createEntityManager(); testInsert(); em.close(); } private static void insert() { Customer customer = new Customer(); customer.setId(1); customer.setName("Pierre"); em.persist(customer); } private static void testInsert() { Customer c = findCustomer("Pierre"); System.out.println("id: " + c.getId() + "nom: " + c.getName()); } private static Customer findCustomer(String name) { Query q = em.createQuery("SELECT c FROM Customer c WHERE c.name = :name"); q.setParameter("name", name); return (Customer)q.getSingleResult(); } } 185 / 258

Introduction 146-189-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-190-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit CMP : exemple (1)


import java.util.*; import javax.ejb.*; import javax.naming.*; public abstract class CustomerBean implements EntityBean { private EntityContext context; //mthodes daccs public abstract String getID(); //primary key public abstract void setID(String id); public abstract String getName(); public abstract void setName(String name); public abstract Collection getSubscriptions(); public abstract void setSubscriptions (Collection subscriptions); //mthodes mtier public ArrayList getSubscriptionList() { ArrayList list = new ArrayList(); Iterator c = getSubscriptions().iterator(); while (c.hasNext()) {list.add((LocalSubscription)c.next());} return list; } public void addSubscription (String subscriptionKey) { try { Context ic = new InitialContext(); LocalSubscriptionHome home =(LocalSubscriptionHome) ic.lookup("java:comp/env/ejb/SubscriptionRef"); LocalSubscription subscription = home.findByPrimaryKey(subscriptionKey); getSubscriptions().add(subscription); } catch (Exception ex) { ... } } ...

187 / 258

Introduction 146-191-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit CMP : exemple (1 suite)


... // mthodes de paramtrage du lien avec la BD public String ejbCreate (String id,String name) throws CreateException { setID(id); setName(name); return id; } public void ejbPostCreate (String id,String n ame) throws CreateException {} public void setEntityContext(EntityContext ctx) {context = ctx;} public void unsetEntityContext() {context = null;} public void ejbRemove() {} public void ejbLoad() {} public void ejbStore() {} public void ejbPassivate() {} public void ejbActivate() {} }

188 / 258

Introduction 146-192-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit CMP : exemple (2)


<ejb-jar ...> <display-name>Ejb1</display-name> <enterprise-beans> <entity> <ejb-name>CustomerBean</ejb-name> <local-home>LocalCustomerHome</local-home> <local>LocalCustomer</local> <ejb-class>CustomerBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>false</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>Customer</abstract-schema-name> <cmp-field> <field-name>iD</field-name> </cmp-field> <cmp-field> <field-name>name</field-name> </cmp-field> <primkey-field>iD</primkey-field> <ejb-local-ref> <ejb-ref-name>ejb/SubscriptionRef</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <local-home>LocalSubscriptionHome</local-home> <local>LocalSubscription</local> <ejb-link>SubscriptionBean</ejb-link> </ejb-local-ref> ...

189 / 258

Introduction 146-193-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit CMP : exemple (2 suite)


... <query> <query-method> <method-name>findByLastName</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> SELECT DISTINCT OBJECT(c) FROM Customer c WHERE c.lastName= ?1 </ejb-ql> </query> </entity> <assembly-descriptor> ... mthodes accessibles dun client ... </assembly-descriptor> </ejb-jar>

190 / 258

Introduction 146-194-250 Beans entit CMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit CMP : exemple (3, extrait de code client)


... try { InitialContext ic = new InitialContext(); Object o = ic.lookup("java:comp/env/CustomerBeanRef"); LocalCustomerHome home = (LocalCustomerHome) o; Collection customers = new ArrayList(); if ("customerID".equals(criteria)) { try { LocalCustomer customer = home.findByPrimaryKey(text); customers.add(customer); } catch (ObjectNotFoundException ex) {} } else if ("lastName".equals(criteria)) { customers = home.findByLastName(text); } else if ("firstName".equals(criteria)) { customers = home.findByFirstName(text); } else {} ...

191 / 258

Introduction 146-195-250 Beans entit BMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-196-250 Beans entit BMP

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit BMP : exemple (partie dun code serveur)


... public String ejbCreate(String widgetId, int quantity) throws CreateException { try { insertRow(widgetId, quantity); } catch (Exception ex) { ... } this.widgetId = widgetId; this.quantity = quantity; return widgetId; } private void insertRow(String widgetId, int quantity) throws SQLException { Connection con = null; PreparedStatement prepStmt = null; try { con = dataSource.getConnection(); String insertStatement = "insert into storagebin values ( ? , ? )"; prepStmt = con.prepareStatement(insertStatement); prepStmt.setString(1, widgetId); prepStmt.setInt(2, quantity); prepStmt.executeUpdate(); prepStmt.close(); con.close(); } catch (Exception e) {} finally { if (prepStmt != null) { try {prepStmt.close();} catch (Exception e){}} if (con != null) {try {con.close();} catch (Exception e){} } }} public void ejbRemove() { try { deleteRow(widgetId); } catch (Exception ex) { ... } } ... 193 / 258

Introduction 146-197-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-198-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-199-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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(...) { ... } ...

(si lannotation na quun attribut de nom String value())


196 / 258

Introduction 146-200-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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(); }

une annotation est utilise par un programme :


import java.lang.reflect.*; public class CodeMonAnnotation { public static void main(String[] args) throws Exception { for (Method m : Class.forName(args[0]).getMethods()) { if (m.isAnnotationPresent(MonAnnotation.class)) { ... // code effectuer } } } }

Pour lexemple prcdent, il faut que lannotation ait t conserve dans le chier .class, do lutilisation de lannotation Retention (cf plus loin)
197 / 258

Introduction 146-201-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-202-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : annotation standard sur un code java


import java.io.*; public class Test { // @SuppressWarnings("fallthrough") public static void main(String args[]) { PrintStream out = System.out; int i = args.length; switch (i) { // manque des breaks case 0: println("0"); default: println("Default"); } } // @Override public String toZtring () { return super.toString(); } }

Sans suppression des commentaires :


$ javac Test.java $ javac -Xlint Test.java Test.java:7: warning: [fallthrough] possible fall-through into case default: System.out.println("Default"); ^ 1 warning $

Avec @Override dcomment :


$ javac Test.java Test.java:10: method does not override or implement a method from a supertype @Override ^ 1 error $

Avec @SuppressWarnings dcomment :


$ javac -Xlint Test.java $

199 / 258

Introduction 146-203-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-204-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (1)


import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Audit { boolean value() default false; } public class Test { public static void main(String args[]) { Application app = new Application(); app.methA("a1"); app.methB(); } }

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

Introduction 146-205-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (1)


import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Audit { boolean value() default false; } public class Test { public static void main(String args[]) { Application app = new Application(); app.methA("a1"); app.methB(); } }

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

Introduction 146-206-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (1)


import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Audit { boolean value() default false; } dclaration de lannotation public class Test { public static void main(String args[]) { Application app = new Application(); app.methA("a1"); app.methB(); } }

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

Introduction 146-207-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (2)


import java.lang.reflect.*; 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; // 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

Introduction 146-208-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (2)


import java.lang.reflect.*;

nombre variable darguments (varargs, Java 5)

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

Introduction 146-209-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement manuel lexcution (2)


import java.lang.reflect.*; 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; test de prsence de lannotation associe au code de la // Rcuprer la mthode appele. mthode (rtention de la dMethod method = object.getClass().getMethod(methodName, paramTypesArray); claration dans le code source) // Sil ny a pas dannotation, autoriser lappel if( !method.isAnnotationPresent(Audit.class) ) return; // 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); } test de sa valeur }

202 / 258

Introduction 146-210-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-211-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

En Java 6, double mcanisme,


(javax.lang.model.element) linterface Element et ses sous-interfaces caractrisent un constructeur du langage (paquet, type, classe, mthode). Permet de connatre les sous- et sur-lments constructeurs. Ne permet pas a priori de connatre le contenu oprationnel. (p.e. com.sun.source.tree) linterface Tree et ses sous-interfaces caractrisent lASP de Java vu par le compilateur. Permet de connatre les sous-et sur-lments constructeurs, structures du langage (boucle, ...), et daccder au bloc du chier source associ. Dans les 2 cas, possibilit dutiliser le pattern visitor (mthode accept(v) o v est un visiteur (implantation de ElementVisitor ou TreeVisitor) implantant des mthodes visitXXX()

204 / 258

Introduction 146-212-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (1)


public class Test { public static void main(String args[]) { Application app = new Application(); app.methA("a1"); app.methB("b"); app.methC(); app.methA("a2"); } } public class Application { @Audit(true) public void methA(String s) { int i = 0; // code de lapplication } @Audit(false) public void methB(String s) { // code de lapplication } @Deprecated public void methC() { // code de lapplication } }

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

Introduction 146-213-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (2)


%javac Application.java %javac Test.java Note: Test.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details.

%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

Introduction 146-214-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

annotations Audit et Deprecated gardes dans le code

Exemple : Traitement via le compilateur (2)


%javac Application.java %javac Test.java Note: Test.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. le code associ lannotation Deprecated gnre un warning %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

Introduction 146-215-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (2)


%javac Application.java %javac Test.java jar contenant les classes Note: Test.java uses or overrides a deprecated API. le preprocessing permettant Note: Recompile with -Xlint:deprecation for (analyse dASP, ...) details.

%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

Introduction 146-216-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (3)


import import import import java.util.*; javax.annotation.processing.*; javax.lang.model.*; javax.lang.model.element.*;

@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

Introduction 146-217-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (3)


import import import import java.util.*; Liste des annotations gres javax.annotation.processing.*; par cette classe-processeur javax.lang.model.*; javax.lang.model.element.*;

@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

Introduction 146-218-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (3)


import import import import java.util.*; javax.annotation.processing.*; javax.lang.model.*; classe-processeur par dfaut javax.lang.model.element.*;

@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

Introduction 146-219-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (4)


import javax.lang.model.*; import javax.lang.model.util.*; import javax.lang.model.element.*; import javax.annotation.processing.*; import com.sun.source.tree.MethodTree; import com.sun.source.util.Trees; public class AuditVisitor implements ElementVisitor<Void, Void> { private ProcessingEnvironment environment; private Trees trees; public AuditVisitor(ProcessingEnvironment environment) { this.environment=environment; this.trees = Trees.instance(environment); } @Override public Void visit(Element e) { return visit(e,null); } @Override public Void visit(Element e,Void p) { switch(e.getKind()) { case METHOD: visitMethod(e,trees); break; default: visitUnknown(e, p); } return null; } private void visitMethod(Element methodElement,Trees p) { System.out.println("Method "+methodElement.getSimpleName()+": " +environment.getElementUtils().getDocComment(methodElement)); MethodTree methodTree = (MethodTree) p.getTree(methodElement); System.out.println("Body: "+methodTree.getBody()); } @Override public Void visitUnknown(Element element,Void p) {return null;} ... } 208 / 258

Introduction 146-220-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (4)


Type de retour de la mthode Classe parcourant lAST import javax.lang.model.*; import javax.lang.model.util.*; visit import javax.lang.model.element.*; import javax.annotation.processing.*; import com.sun.source.tree.MethodTree; import com.sun.source.util.Trees; public class AuditVisitor implements ElementVisitor<Void, Void> { private ProcessingEnvironment environment; private Trees trees; Type public AuditVisitor(ProcessingEnvironment environment) { de largument de la mthode visit this.environment=environment; this.trees = Trees.instance(environment); } @Override public Void visit(Element e) { return visit(e,null); } @Override public Void visit(Element e,Void p) { switch(e.getKind()) { case METHOD: visitMethod(e,trees); break; default: visitUnknown(e, p); } return null; } private void visitMethod(Element methodElement,Trees p) { System.out.println("Method "+methodElement.getSimpleName()+": " +environment.getElementUtils().getDocComment(methodElement)); MethodTree methodTree = (MethodTree) p.getTree(methodElement); System.out.println("Body: "+methodTree.getBody()); } @Override public Void visitUnknown(Element element,Void p) {return null;} ... } 208 / 258

Introduction 146-221-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Traitement via le compilateur (4)


import javax.lang.model.*; import javax.lang.model.util.*; import javax.lang.model.element.*; import javax.annotation.processing.*; import com.sun.source.tree.MethodTree; import com.sun.source.util.Trees; public class AuditVisitor implements ElementVisitor<Void, Void> { private ProcessingEnvironment environment; private Trees trees; public AuditVisitor(ProcessingEnvironment environment) { mthode standard de visite this.environment=environment; dun lment this.trees = Trees.instance(environment); } @Override public Void visit(Element e) { return visit(e,null); } @Override public Void visit(Element e,Void p) { switch(e.getKind()) { case METHOD: visitMethod(e,trees); break; default: visitUnknown(e, p); } return null; } private void visitMethod(Element methodElement,Trees p) { System.out.println("Method "+methodElement.getSimpleName()+": " +environment.getElementUtils().getDocComment(methodElement)); MethodTree methodTree = (MethodTree) p.getTree(methodElement); System.out.println("Body: "+methodTree.getBody()); } Objet noeud de lAST (ici m@Override public Void visitUnknown(Element element,Void p) {return null;} thode) permettant laccs au ... corps, au nom, aux para} mtres, ... 208 / 258

Introduction 146-222-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-223-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (1)


formation.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="formation" type="typeFormation"/> <xsd:complexType name="typeFormation"> <xsd:attribute name="intitule" type="xsd:string" use="required"/> <xsd:sequence> <xsd:element ref="responsable" /> <xsd:element ref="etudiant"/> </xsd:sequence> </xsd:complexType> <xsd:element name="etudiant" type="typeEtudiant"/> <xsd:complexType name="typeEtudiant"> <xsd:attribute name="prenom" type="xsd:string" use="required"/> <xsd:attribute name="nom" type="xsd:string" use="required"/> </xsd:complexType> <xsd:element name="responsable" type="typeResponsable"/> <xsd:complexType name="typeResponsable"> <xsd:attribute name="nom" type="xsd:string"/> </xsd:complexType> </xsd:schema>

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

Introduction 146-224-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (1)


formation.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="formation" type="typeFormation"/> <xsd:complexType name="typeFormation"> <xsd:attribute name="intitule" type="xsd:string" use="required"/> <xsd:sequence> <xsd:element ref="responsable" /> <xsd:element ref="etudiant"/> </xsd:sequence> </xsd:complexType> <xsd:element name="etudiant" type="typeEtudiant"/> <xsd:complexType name="typeEtudiant"> un lment XML <xsd:attribute name="prenom" type="xsd:string" use="required"/> <xsd:attribute name="nom" type="xsd:string" use="required"/> </xsd:complexType> <xsd:element name="responsable" type="typeResponsable"/> <xsd:complexType name="typeResponsable"> <xsd:attribute name="nom" type="xsd:string"/> </xsd:complexType> </xsd:schema>

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

Introduction 146-225-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (1)


formation.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="formation" type="typeFormation"/> <xsd:complexType name="typeFormation"> <xsd:attribute name="intitule" type="xsd:string" use="required"/> <xsd:sequence> <xsd:element ref="responsable" /> <xsd:element ref="etudiant"/> </xsd:sequence> une formation : </xsd:complexType> <xsd:element name="etudiant" type="typeEtudiant"/> <xsd:complexType name="typeEtudiant"> <xsd:attribute name="prenom" type="xsd:string" use="required"/> a un intitul (attribut <xsd:attribute name="nom" type="xsd:string" use="required"/> obligatoire) </xsd:complexType> <xsd:element name="responsable" type="typeResponsable"/> <xsd:complexType name="typeResponsable"> <xsd:attribute name="nom" type="xsd:string"/> </xsd:complexType> </xsd:schema>

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

Introduction 146-226-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (1)


formation.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="formation" type="typeFormation"/> <xsd:complexType name="typeFormation"> <xsd:attribute name="intitule" type="xsd:string" use="required"/> <xsd:sequence> <xsd:element ref="responsable" /> <xsd:element ref="etudiant"/> </xsd:sequence> une formation : </xsd:complexType> <xsd:element name="etudiant" type="typeEtudiant"/> <xsd:complexType name="typeEtudiant"> <xsd:attribute name="prenom" type="xsd:string" use="required"/> <xsd:attribute name="nom" inclut un respon- use="required"/> type="xsd:string" inclut des tudiants </xsd:complexType> sable <xsd:element name="responsable" type="typeResponsable"/> <xsd:complexType name="typeResponsable"> <xsd:attribute name="nom" type="xsd:string"/> </xsd:complexType> </xsd:schema>

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

Introduction 146-227-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (2)


%xjc formation.xsd -p "up13.formation" -d . // dans up13/formation/, javac *.java %javac -cp .:$CLASSPATH *.java import java.io.*; import javax.xml.bind.*; import up13.formation.*; public class Test { public static void main(String args[]) { try { JAXBContext jaxbContext = JAXBContext.newInstance ("up13.formation"); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // pour effectuer une validation XML unmarshaller.setEventHandler(new FormationValidationEventHandler()); JAXBElement<TypeFormation> uneFormationJAXB = (JAXBElement<TypeFormation>) unmarshaller.unmarshal(new File("M2PLS.xml")); TypeFormation uneFormation = uneFormationJAXB.getValue(); System.out.println("Intitul : " + uneFormation.getIntitule()); TypeResponsable leResponsable = uneFormation.getResponsable(); System.out.println("Responsable : " + leResponsable.getNom()); // cration de donnes TypeFormation uneAutreFormation = new TypeFormation(); uneAutreFormation.setIntitule("M2EID"); // Gnration XML JAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()). createFormation(uneAutreFormation); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal( uneAFJAXB, System.out ); } catch (JAXBException e) {System.err.println(e);} } } 211 / 258

Introduction 146-228-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (2)


%xjc formation.xsd -p "up13.formation" -d . // dans up13/formation/, javac *.java %javac -cp .:$CLASSPATH *.java pour ce schma dans ce paquetage mis dans ce rpercre XML (.xsd) (-p) toire (-d) import java.io.*; import javax.xml.bind.*; import up13.formation.*; public class Test { public static void main(String args[]) { un chier ObjectFactory.java try { (intermdiaire objets JAXB JAXBContext jaxbContext = JAXBContext.newInstance ("up13.formation"); donnes)Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); et// pour effectuer une validation XML un chier-classe par type dcrit dans le schma (cf p.e. unmarshaller.setEventHandler(new FormationValidationEventHandler()); slide suivant) JAXBElement<TypeFormation> uneFormationJAXB = (JAXBElement<TypeFormation>) unmarshaller.unmarshal(new File("M2PLS.xml")); TypeFormation uneFormation = uneFormationJAXB.getValue(); System.out.println("Intitul : " + uneFormation.getIntitule()); TypeResponsable leResponsable = uneFormation.getResponsable(); System.out.println("Responsable : " + leResponsable.getNom()); // cration de donnes TypeFormation uneAutreFormation = new TypeFormation(); uneAutreFormation.setIntitule("M2EID"); // Gnration XML JAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()). createFormation(uneAutreFormation); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal( uneAFJAXB, System.out ); } catch (JAXBException e) {System.err.println(e);} } } 211 / 258

Introduction 146-229-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (2)


%xjc formation.xsd -p "up13.formation" -d . // dans up13/formation/, javac *.java %javac -cp .:$CLASSPATH *.java Objet contexte perimport java.io.*; import javax.xml.bind.*; import up13.formation.*; mettant la cration public class Test { de : public static void main(String args[]) { - un objet analyseur try { de documents XML JAXBContext jaxbContext = JAXBContext.newInstance ("up13.formation"); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // pour effectuer une validation XML unmarshaller.setEventHandler(new FormationValidationEventHandler()); JAXBElement<TypeFormation> uneFormationJAXB = (JAXBElement<TypeFormation>) unmarshaller.unmarshal(new File("M2PLS.xml")); TypeFormation uneFormation = uneFormationJAXB.getValue(); System.out.println("Intitul : "document XML analyse dun + uneFormation.getIntitule()); TypeResponsable leResponsable = uneFormation.getResponsable(); et constitution din objet System.out.println("Responsable : " + leResponsable.getNom()); JAXB (vue) dans la VM // cration de donnes TypeFormation uneAutreFormation = new TypeFormation(); uneAutreFormation.setIntitule("M2EID"); // Gnration XML JAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()). createFormation(uneAutreFormation); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal( uneAFJAXB, System.out ); } catch (JAXBException e) {System.err.println(e);} } } 211 / 258

Introduction 146-230-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (2)


%xjc formation.xsd -p "up13.formation" -d . // dans up13/formation/, javac *.java %javac -cp .:$CLASSPATH *.java Objet contexte perimport java.io.*; import javax.xml.bind.*; import up13.formation.*; mettant la cration public class Test { de : public static void main(String args[]) { try { JAXBContext jaxbContext = JAXBContext.newInstance ("up13.formation"); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // pour effectuer une validation XML unmarshaller.setEventHandler(new FormationValidationEventHandler()); JAXBElement<TypeFormation> uneFormationJAXB = (JAXBElement<TypeFormation>) unmarshaller.unmarshal(new File("M2PLS.xml")); TypeFormation uneFormation = uneFormationJAXB.getValue(); System.out.println("Intitul : " + uneFormation.getIntitule()); cration dun objet JAXB TypeResponsable leResponsable = uneFormation.getResponsable(); partir dun type du System.out.println("Responsable : " + leResponsable.getNom()); schma XML - un objet gnrateur de documents // cration de donnes envoi dun objet JAXB XML TypeFormation uneAutreFormation = new TypeFormation(); vers un ux de sortie uneAutreFormation.setIntitule("M2EID"); // Gnration XML JAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()). createFormation(uneAutreFormation); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal( uneAFJAXB, System.out ); } catch (JAXBException e) {System.err.println(e);} } } 211 / 258

Introduction 146-231-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (3)


package up13.formation; import javax.xml.bind.annotation.XmlAccessType; ... @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "typeFormation", propOrder = { "responsable", "etudiant" }) public class TypeFormation { @XmlElement(required = true) protected TypeResponsable responsable; @XmlElement(required = true) protected List<TypeEtudiant> etudiant; @XmlAttribute(required = true) protected String intitule; /** * Gets the value of the responsable property. */ public TypeResponsable getResponsable() { return responsable; } ...

212 / 258

Introduction 146-232-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation denseignement (4)


import javax.xml.bind.*; public class FormationValidationEventHandler implements ValidationEventHandler{ public boolean handleEvent(ValidationEvent ve) { if (ve.getSeverity()==ValidationEvent.FATAL_ERROR || ve .getSeverity()==ValidationEvent.ERROR){ ValidationEventLocator locator = ve.getLocator(); // System.out.println("Document de dfinition de formation invalide : " + locator.getURL()); System.out.println("Erreur : " + ve.getMessage()); System.out.println("Colonne " + locator.getColumnNumber() + ", ligne " + locator.getLineNumber()); } return true; } }

213 / 258

Introduction 146-233-250 Sur les annotations en Java

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple : Donnes de formation(cas denseignement (4) pour lanalyseur XML


derreurs, ...) import javax.xml.bind.*; public class FormationValidationEventHandler implements ValidationEventHandler{ public boolean handleEvent(ValidationEvent ve) { if (ve.getSeverity()==ValidationEvent.FATAL_ERROR || ve .getSeverity()==ValidationEvent.ERROR){ ValidationEventLocator locator = ve.getLocator(); // System.out.println("Document de dfinition de formation invalide : " + locator.getURL()); System.out.println("Erreur : " + ve.getMessage()); System.out.println("Colonne " + locator.getColumnNumber() + ", ligne " + locator.getLineNumber()); } return true; } }

Gestionnaire

dvnements

213 / 258

Introduction 146-234-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-235-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Bean entit ejb3 : exemple


import java.io.Serializable; import java.util.Collection; import javax.persistence.*; @Entity @NamedQuery(name="findFormation", query="select o from formation o") @Table(name="FORMATION") @SecondaryTable(name="ETUDIANT") public class Formation implements Serializable { @Id // ce qui suit = cl primaire @Column(nullable=false) protected Long id; @Column(name="NOM") protected String nom; @Embedded @Column(name="NIVEAU") protected Niveau niveau; @OneToMany(mappedBy="formation") protected Collection<Etudiant> etudiants; ... public Collection<Etudiant> getEtudiants() { return etudiants; } public Etudiant addEtudiant(Etudiant etudiant) { getEtudiants().add(etudiant); etudiant.setFormation(this); return etudiant; } } @Embeddable public class Niveau implements Serializable { protected String cycle; protected String annee; public String getAnnee() { return annee; } ... } 215 / 258

Introduction 146-236-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-237-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-238-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

pour les codes utilisant ces classes-entits :


un EntityManager permet deffectuer les demandes de lecture/criture/synchronisation pour/sur des entits cet EntityManager peut tre gestion automatique (ex CMP) ou gestion manuelle (ex BMP) (manuel = cration des requtes, appel explicite de la BD, ...) cet EntityManager est paramtr par une unit de persistence (via un contexte de persistence si gestion automatique).

218 / 258

Introduction 146-239-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-240-250 Beans entit ejb3

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-241-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-242-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-243-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-244-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-245-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-246-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple dinstance de ConnectionFactory :


// cas de cration dinstance par appel direct au serveur JNDI ... try { jndiContext = new InitialContext(); } catch (NamingException e) { ... } try { connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/ConnectionFactory"); queue = (Queue) jndiContext.lookup("jms/Queue"); } catch (Exception e) { ... }

// 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

Introduction 146-247-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-248-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

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

Introduction 146-249-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple dcouteur de message :


@MessageDriven(mappedName="jms/Queue") public class SimpleMessageBean implements MessageListener { @Resource private MessageDrivenContext mdc; public void onMessage(Message inMessage) { TextMessage msg = null; try { if (inMessage instanceof TextMessage) { msg = (TextMessage) inMessage; logger.info("MESSAGE BEAN: Message recu : " + msg.getText()); } else { logger.warning("Message dun type non espere : " + inMessage.getClass().getName()); } } catch (JMSException e) { e.printStackTrace(); mdc.setRollbackOnly(); } catch (Throwable te) { te.printStackTrace(); } } }

229 / 258

Introduction 146-250-250 Beans message

Threads

Rseau

Outils

EJB

WS

Introduction Servlet et JSP Beans

Exemple de consommateur de message :


... Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(queue); ... connection.start(); Message m = consumer.receive(); ...

230 / 258

Introduction 251-251-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Web Services et J2EE Web Services : introduction WSDL et UDDI REST

231 / 258

Introduction 251-252-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Web Services et J2EE Web Services : introduction WSDL et UDDI REST

232 / 258

Introduction 251-253-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

Web Services et J2EE Web Services : introduction WSDL et UDDI REST

234 / 258

Introduction 251-255-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

<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

Introduction WSDL et UDDI REST

<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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

WSDL Niveau abstrait :


Un type de port ( offre de service) est dni par un ensemble doprations Chaque opration fait rfrence un ou plusieurs messages (i.e. occurrence dun appel ou dune rponse) Un message est dni par un nom, un ensemble de couples attribut-valeur typs

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

Introduction WSDL et UDDI REST

Exemple (1) : Un chier WSDL


<?xml version=1.0 encoding=UTF-8?> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-...-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://WS/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://WS/" name="PizzaWSService"> <wsp :Policy xmlns:wsat="http://schemas.xmlsoap.org/ws/2004/10/wsat" wsu :Id="PizzaWSPortBinding_remove_WSAT_Policy"> <wsp :ExactlyOne> <wsp :All> <wsat :ATAlwaysCapability /> <wsat:ATAssertion xmlns:ns1="http://schemas.xmlsoap.org/ws/2002/12/policy" wsp:Optional="true" ns1:Optional="true" /> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> <!-- ... pour chacune des oprations --> ...

243 / 258

Introduction 251-265-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Exemple (1) Spcication des espaces de : Un chier WSDL


noms ncessaires (charge<?xml version=1.0 encoding=UTF-8?> ment pour lanalyse de ce chier) <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-...-utility-1.0.xsd" Politiques dutilisation pour xmlns:wsp="http://www.w3.org/ns/ws-policy" une opration (encryptage ou xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" non, horodatage, ...) xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://WS/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://WS/" name="PizzaWSService"> <wsp :Policy xmlns:wsat="http://schemas.xmlsoap.org/ws/2004/10/wsat" wsu :Id="PizzaWSPortBinding_remove_WSAT_Policy"> <wsp :ExactlyOne> <wsp :All> <wsat :ATAlwaysCapability /> <wsat:ATAssertion xmlns:ns1="http://schemas.xmlsoap.org/ws/2002/12/policy" wsp:Optional="true" ns1:Optional="true" /> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> <!-- ... pour chacune des oprations --> ...

243 / 258

Introduction 251-266-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Exemple (1) : Un chier WSDL


<?xml version=1.0 encoding=UTF-8?> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-...-utility-1.0.xsd" Politiques dutilisation pour xmlns:wsp="http://www.w3.org/ns/ws-policy" une opration (encryptage ou xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" non, horodatage, ...) xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://WS/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://WS/" nom didentiant de la poliname="PizzaWSService"> tique le client choisit une politique parmi ce qui suit <wsp :Policy xmlns:wsat="http://schemas.xmlsoap.org/ws/2004/10/wsat" wsu :Id="PizzaWSPortBinding_remove_WSAT_Policy"> <wsp :ExactlyOne> le client doit satisfaire tous <wsp :All> les critres dans ce qui suit <wsat :ATAlwaysCapability /> <wsat:ATAssertion xmlns:ns1="http://schemas.xmlsoap.org/ws/2002/12/policy" wsp:Optional="true" ns1:Optional="true" /> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> indique quune transaction atomique <!-- ... pour chacune des oprations --> dbute/nit avec une requte sauf si le ... client fournit un contexte transactionnel

243 / 258

Introduction 251-267-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST Dnition des types de don-

Exemple (2) :nes utilises dans les requtes/rponses


... <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. m</types> thode) <message name="findAll"> <part name="parameters" element="tns :findAll" /> Spcication des oprations </message> disponibles <!-- ... 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-269-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST Dnition des types de don-

Exemple (2) :nes utilises dans les requtes/rponses


... <types> URL du schma XSD dnis<xsd:schema> sant les types (cf Exemple (4)) <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-270-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

Exemple (3) : Spcication de limplantation des oprations


... <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 --> tion pour chacun </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-274-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Exemple (3) : Spcication de limplantation des oprations


...

Protocole de transport utilis

<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

Introduction WSDL et UDDI REST

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 WSDL et UDDI REST

Exemple (4) : Schma XML des types de donnes pour un service


<?xml version=1.0 encoding=UTF-8?> <xs:schema xmlns:tns="http://WS/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://WS/"> <xs:element name="findAll" type="tns:findAll" /> <!-- ... de mme pour chaque lment de service --> <xs:complexType name="findAll"> <xs:sequence /> </xs:complexType> <xs:complexType name="findAllResponse"> <xs:sequence> <xs:element name="return" type="tns:stock" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <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-277-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Exemple (4) : Schma XML des types de donnes pour un service


<?xml version=1.0 encoding=UTF-8?> <xs:schema xmlns:tns="http://WS/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://WS/"> le type ndAll na pas de <xs:element name="findAll" type="tns:findAll" /> contenu <!-- ... de mme pour chaque lment de service --> <xs:complexType name="findAll"> <xs:sequence /> </xs:complexType> le type ndAllResponse a un contenu stock

<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

Introduction WSDL et UDDI REST

Web Services et J2EE Web Services : introduction WSDL et UDDI REST

247 / 258

Introduction 251-279-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

Une URI correspond une ressource :


http://www.univ-paris13.fr/M2PLS/etudiant/2006276

253 / 258

Introduction 251-285-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

Cl daccs

Une URI correspond une ressource :


http://www.univ-paris13.fr/M2PLS/etudiant/2006276

Nom de la ressource

253 / 258

Introduction 251-286-291

Threads

Rseau

Outils

EJB

WS

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

Cas de J2EE JAXRS : gestion RESTful

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

Introduction WSDL et UDDI REST

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

Introduction WSDL et UDDI REST

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

Anda mungkin juga menyukai