e services

291
Introduction Threads Réseau Outils EJB WS 1-1-7 Environnement et langages évolués Christophe Fouqueré Master Informatique 2ème année [email protected] A208, Université de Paris 13 1 / 258

Upload: lawise-aresof-tarik

Post on 05-Jul-2015

182 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: E Services

Introduction Threads Réseau Outils EJB WS

1-1-7

Environnement et langages évolués

Christophe Fouqueré

Master Informatique 2ème année

[email protected], Université de Paris 13

1 / 258

Page 2: E Services

Introduction Threads Réseau Outils EJB WS

1-2-7

Bibliographie (très) partielle :

Java La synthèse, Des concepts objet auxarchitectures Web, Clavel et alii, Dunod Informatiques,2000Programmation réseau avec Java, E. Rusty Harold,O’Reilly, 2001XHTML, I. Graham, Eyrolles, 2001EJB fondamental, Ed Roman, S. Ambler, T. Jewel,Eyrolles, 2002et bien sûr http://java.sun.comitem en particulierhttp://java.sun.com/javase/6/docs/api/

2 / 258

Page 3: E Services

Introduction Threads Réseau Outils EJB WS

1-3-7

1 Introduction

2 Threads : architectures maître-esclaveProcessus légersExemples types

3 / 258

Page 4: E Services

Introduction Threads Réseau Outils EJB WS

1-4-7

3 Réseau : adressage et socketsConnexions réseau

Rappels sur les réseaux (IP, TCP et UDP, adressage)Manipulation d’adresses : classe InetAddressConnexions TCP non sécurisés entre machines (classe Socket)Connexions TCP sécurisés entre machines (classeSSLServerSocket)Connexions UDP entre machines (classe DatagramSocket)Connexions entre machines (classe MulticastSocket)

URLClasses URL et URLConnectionGestion de protocole

RMI et RMI-IIOPRMI : Remote Method Invocation

4 / 258

Page 5: E Services

Introduction Threads Réseau Outils EJB WS

1-5-7

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

5 / 258

Page 6: E Services

Introduction Threads Réseau Outils EJB WS

1-6-7

5 Environnement J2EE et EJB : la baseIntroductionServlet et JSP

JSPServlet

Enterprise Java BeansGénéralitésUne (partie d’) implantationBeans sessionBeans entité / JPAUn premier exemple de Beans entité sous ejb3Beans entité CMPBeans entité BMPSur les annotations en JavaBeans entité ejb3Beans message

6 / 258

Page 7: E Services

Introduction Threads Réseau Outils EJB WS

1-7-7

6 Web Services et J2EEWeb Services : introductionWSDL et UDDIREST

7 / 258

Page 8: E Services

Introduction Threads Réseau Outils EJB WS

8-8-14

1 Introduction

8 / 258

Page 9: E Services

Introduction Threads Réseau Outils EJB WS

8-9-14

Objectifs du cours :Usage d’environnements de développements (Eclipse,Netbeans) : apprentissage en TPCompréhension des pratiques logicielles enenvironnement ouvert (des sockets aux encapsulationsbeans)Cas des sites web et services web : mécanismessous-jacents et mise en oeuvre pratiqueQuestions liées à la sécurité (typage, ...)

9 / 258

Page 10: E Services

Introduction Threads Réseau Outils EJB WS

8-10-14

De plus en plus, le développement de logiciels estmodulaire dans sa conception, sa forme, sa mise enexploitation. Le déploiement des services web en estexemplaire.Un service web est une technologie d’informatiquedistribuée qui offre interaction et collaboration entre"agents" (clients, vendeurs, logiciels) en donnant unsentiment d’ubiquité."Web Services are loosely coupled softwarecomponents delivered over Internet-standardtechnologies."

10 / 258

Page 11: E Services

Introduction Threads Réseau Outils EJB WS

8-11-14

1969 : Arpanet1979 : Internet1974-1982 : TCP1991 : Web1989-1996 : standard CORBA (Common Object RequestBroker Architecture) de l’OMG (Object ManagementGroup)1990-1996 : modèle COM (Component Object Model) puisDCOM puis ActiveX de Microsoft1994 : Java1997 : 1er "web service", plateforme Jini de Sun1998- : Développement d’un ensemble de protocoles parstandardisation (W3C, OMG, groupes de constructeurs)2000- : Protocoles Web2.0, BPEL, ...

11 / 258

Page 12: E Services

Introduction Threads Réseau Outils EJB WS

8-12-14

Solutions à des problèmes clés (utilisant en partie lesmécanismes comme CORBA, DCOM, RPC) :

Interoperabilité : XML utilisé comme un standard decodage et transfert d’informations.Transfert sur internet via pare-feu : CORBA n’utilise pasde port standard ! Les services Web utilisent HTTP commele protocole de transport (plus précisément le port 80 ousa version sécurisée 8080)

12 / 258

Page 13: E Services

Introduction Threads Réseau Outils EJB WS

8-13-14

Pour comprendre les technologies nécessaires à la mise enoeuvre d’un logiciel ouvert, comme un Service Web, il fautcomprendre l’interaction de base : ils suivent le modèlepublication - recherche - lien :

un fournisseur de service (service provider) publie unService Web sur un registre (registry).le client questionne le serveur de registre pour le choix duservicele client télécharge la description de service et effectue laliaison pour utiliser ce service.

13 / 258

Page 14: E Services

Introduction Threads Réseau Outils EJB WS

8-14-14

Interopérabilité des transferts de données par l’utilisation de 4protocoles (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 données(p.e. XML, eXtended Markup Language, XHTML, ...)

14 / 258

Page 15: E Services

Introduction Threads Réseau Outils EJB WS

15-15-40 Processus légers Exemples types

2 Threads : architectures maître-esclaveProcessus légersExemples types

15 / 258

Page 16: E Services

Introduction Threads Réseau Outils EJB WS

15-16-40 Processus légers Exemples types

2 Threads : architectures maître-esclaveProcessus légersExemples types

16 / 258

Page 17: E Services

Introduction Threads Réseau Outils EJB WS

15-17-40 Processus légers Exemples types

Package : java.lang.Threaddistribution (locale) des calculs à effectuer :1 tâche effectuée par une unité de calcul avec

autonomie mémoire totale ==> processuspartage de la mémoire ==> thread

Exécution d’un processus léger :

création ==> thread()

phase d’initialisation ==> start()

phase de calcul ==> run()

phase d’arrêt ==> interrupt() (ou stop() redéfini)

destruction ==> géré par le garbage collector

17 / 258

Page 18: E Services

Introduction Threads Réseau Outils EJB WS

15-18-40 Processus légers Exemples types

Partage de mémoire entre threads :

en phase d’initialisation :certaines variables doivent être en pot commun alors qued’autres sont réservées au calcul du thread

==> volatile

en phase de calcul :des calculs peuvent nécessiter la terminaison d’autrescalculs, ou l’attente de données ou d’une date

==> interrupt() / join() / sleep()

des calculs peuvent porter sur la même zone de données(problème de lecture/écriture partagée)

==> synchronized

18 / 258

Page 19: E Services

Introduction Threads Réseau Outils EJB WS

15-19-40 Processus légers 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

Page 20: E Services

Introduction Threads Réseau Outils EJB WS

15-20-40 Processus légers Exemples types

instance de Thread = contrôleur de processus léger.à l’initialisation : un unique thread lançant main() de laclasse appelée.classe Thread

static Thread currentThread()

retourne le thread courant (i.e. l’objet instance)void setName(String s)

permet de donner un nom au Thread (utilisé par toString)(par défaut Thread-i et Thread-0 pour le main)

c’est l’appel à start() qui crée vraiment un processusléger.un appel à run() direct exécute run() sans créer denouveau processus.

20 / 258

Page 21: E Services

Introduction Threads Réseau Outils EJB WS

15-21-40 Processus légers Exemples types

class T implements Runnable{public void run() {

for (int i = 0; i<5; i++) {System.out.println("Processus léger T" + i);try { Thread.sleep(500);} // 500 msec = 1/2 scatch (InterruptedException e) {

System.out.println("Interruption");} }System.out.println("Processus léger 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 léger main" + i);Thread.sleep(500);

}System.out.println("Processus léger main terminé");

} }

21 / 258

Page 22: E Services

Introduction Threads Réseau Outils EJB WS

15-22-40 Processus légers Exemples types

Priorité :

entre Thread.MIN_PRIORITY=1 etThread.MAX_PRIORITY=10

par défaut Thread.NORM_PRIORITY=5classe Thread

int getPriority() renvoie la priorité du Threadvoid setPriority(int priority) positionne lapriorité

22 / 258

Page 23: E Services

Introduction Threads Réseau Outils EJB WS

15-23-40 Processus légers Exemples types

Protection via un objet (au plus un thread exécutant). Achaque objet est associé un descripteur contenant desinformations sur cet objet. La synchronisation passe par lemécanisme suivant :

une information particulière (un drapeau) indique si l’objetest en cours d’utilisation synchronisée.l’exécution d’une instruction (ou d’un groupe, ou d’uneméthode) peut être conditionnée par ce drapeau

...public void maMéthode(C a, ...) {

...synchronized(o) { // flag sur o

... o.f(...) ...}...

}...

23 / 258

Page 24: E Services

Introduction Threads Réseau Outils EJB WS

15-24-40 Processus légers Exemples types

on peut prendre this comme objet de synchronisation(c’est implicitement ce qui est fait lors d’unesynchronisation sur méthode)les méthodes sont synchronisables sauf :

les méthodes d’interfaceles constructeurs

la spécification de synchronisation n’est pas héritablela synchronisation de champs statiques est possible surles objets-classes correspondants(... synchronized(C.class) ...)

24 / 258

Page 25: E Services

Introduction Threads Réseau Outils EJB WS

15-25-40 Processus légers 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

Page 26: E Services

Introduction Threads Réseau Outils EJB WS

15-26-40 Processus légers Exemples types

Gestion mémoire locale / partagée

chaque instance (de Runnable) a ses propres variablestous les threads lancés sur la même instance partagentces variablesle modifieur volatile force la synchronisation desvariables partagées entre threads

26 / 258

Page 27: E Services

Introduction Threads Réseau Outils EJB WS

15-27-40 Processus légers 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 l’exécution :0 1 TestRunnable@119298d10 TestRunnable@119298dTestRunnable@f726172 TestRunnable@119298d2 TestRunnable@119298d11 TestRunnable@f72617

27 / 258

Page 28: E Services

Introduction Threads Réseau Outils EJB WS

15-28-40 Processus légers Exemples types

Données 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

Page 29: E Services

Introduction Threads Réseau Outils EJB WS

15-29-40 Processus légers Exemples types

Groupe de threads

classe ThreadGroup (par défaut à la création du thread, legroupe est celui du créateur) :

ThreadGroup ThreadGroup(String s) crée unthreadgroup de nom s

void setMaxPriority(int priority) fixe la valeurmaximale de priorité du groupe

classe Thread :

ThreadGroup getThreadGroup() renvoie le threadgroupdu thread

Thread Thread(ThreadGroup g, ImplRun r, String s)

crée un nouveau thread dans le groupe g avec le Runnabler (ImplRun doit implanter Runnable) et le nom s

29 / 258

Page 30: E Services

Introduction Threads Réseau Outils EJB WS

15-30-40 Processus légers Exemples types

2 Threads : architectures maître-esclaveProcessus légersExemples types

30 / 258

Page 31: E Services

Introduction Threads Réseau Outils EJB WS

15-31-40 Processus légers Exemples types

1. Callback après appel de thread (méthode parcontinuation)// Esclaveimport java.io.*; import java.security.*;

public class CbDigest implements Runnable {private File input; // calcul de signature sur fichierprivate CbDigestServer cbDigestServer; // objet demandeur du calcul

public CbDigest (File input, CbDigestServer cb) {this.input = input;this.cbDigestServer = cb; // déclaration

}

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

Page 32: E Services

Introduction Threads Réseau Outils EJB WS

15-32-40 Processus légers Exemples types

// Serveurimport 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 = continuationThread t = new Thread(cb); // appel du threadt.start();

}

void setDigest(byte[] digest) { // méthode de receptionthis.digest = digest;System.out.println(this);

}... // cf page suivante

32 / 258

Page 33: E Services

Introduction Threads Réseau Outils EJB WS

15-33-40 Processus légers 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

Page 34: E Services

Introduction Threads Réseau Outils EJB WS

15-34-40 Processus légers Exemples types

2. Callback après 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 d’abonnés

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

Page 35: E Services

Introduction Threads Réseau Outils EJB WS

15-35-40 Processus légers 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) { // méthode de réception

...}...

}

35 / 258

Page 36: E Services

Introduction Threads Réseau Outils EJB WS

15-36-40 Processus légers Exemples types

3. Attente entre threads : join()// Esclavepublic class CbDigest extends Thread {

...public byte[] getDigest() {

...}...

}

36 / 258

Page 37: E Services

Introduction Threads Réseau Outils EJB WS

15-37-40 Processus légers 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 terminebyte[] digest = cbDigestTab[i].getDigest();String fileName = cbDigestTab[i].getFileName();System.out.print(fileName + ": ");...

} } } }

37 / 258

Page 38: E Services

Introduction Threads Réseau Outils EJB WS

15-38-40 Processus légers Exemples types

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

wait() et notify() sont des méthodes de Objectwait() entraîne une attente de levée du verrouwait() à l’intérieur d’un synchronized

Versions de wait() :wait()

wait(long millisec)

wait(long millisec, int nanosec)

Versions de notify() :notify() réveil d’un threadnotifyAll() réveil de tous les threads

38 / 258

Page 39: E Services

Introduction Threads Réseau Outils EJB WS

15-39-40 Processus légers 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

Page 40: E Services

Introduction Threads Réseau Outils EJB WS

15-40-40 Processus légers 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 d’attenteThread t = new Thread(cb); // appel du threadt.start();try {

wait();}catch (InterruptedException e) { // thread interrompu avant la fin}System.out.println(this); // la signature est maintenant connue

}}

...}

40 / 258

Page 41: E Services

Introduction Threads Réseau Outils EJB WS

41-41-104 Connexions réseau URL RMI et RMI-IIOP

3 Réseau : adressage et socketsConnexions réseau

Rappels sur les réseaux (IP, TCP et UDP, adressage)Manipulation d’adresses : classe InetAddressConnexions TCP non sécurisés entre machines (classe Socket)Connexions TCP sécurisés entre machines (classeSSLServerSocket)Connexions UDP entre machines (classe DatagramSocket)Connexions entre machines (classe MulticastSocket)

URLClasses URL et URLConnectionGestion de protocole

RMI et RMI-IIOPRMI : Remote Method Invocation

41 / 258

Page 42: E Services

Introduction Threads Réseau Outils EJB WS

41-42-104 Connexions réseau URL RMI et RMI-IIOP

3 Réseau : adressage et socketsConnexions réseau

Rappels sur les réseaux (IP, TCP et UDP, adressage)Manipulation d’adresses : classe InetAddressConnexions TCP non sécurisés entre machines (classe Socket)Connexions TCP sécurisés entre machines (classeSSLServerSocket)Connexions UDP entre machines (classe DatagramSocket)Connexions entre machines (classe MulticastSocket)

URLClasses URL et URLConnectionGestion de protocole

RMI et RMI-IIOPRMI : Remote Method Invocation

42 / 258

Page 43: E Services

Introduction Threads Réseau Outils EJB WS

41-43-104 Connexions réseau URL RMI et RMI-IIOPRappels sur les réseaux (IP, TCP et UDP, adressage)

Rappels sur les réseauxIP : Internet Protocol

seul protocole de la couche réseau reconnu par Java (doncpas IPX et Appletalk)données transitant par datagrammes (en-tête + données)adressage IPv4 par 4 octets (IPv6 sur 16)

DNS : Domain Name Systemtraduction nom symbolique - adresse IPEx. (cf. nslookup) : www.univ-paris13.fr 192.33.182.1

TCP : Transmission Control Protocolreconstitution des paquets + ack

UDP : User Datagram Protocolni vérification de l’ordre, ni réexpédition

port : (0 < port < 65535)association logique à un service ‘adresse IP + port’Exemples (cf /etc/services) :

21 ftp25 smtp80 HTTP (web par défaut)1099 RMI registry 43 / 258

Page 44: E Services

Introduction Threads Réseau Outils EJB WS

41-44-104 Connexions réseau URL RMI et RMI-IIOPRappels sur les réseaux (IP, TCP et UDP, adressage)

URI : Uniform resource Identifieradresse d’une ressourceschéma :syntaxe_propre_au_schémaen général : schéma://autorité/chemin?requête où

autorité = adresse destinatairechemin = chemin "dans" cette adresse (en fait, réinterprétépar l’autorité)requête = données ou requête

URN : Uniform Resource NameExemple : urn:isbn:1234567890gestion de données par domaine de noms,récupération de la donnée via un serveur

URL : Uniform Resource Locatorde la forme

protocole://login:passwd@autorité:port/chemin#section?requête

44 / 258

Page 45: E Services

Introduction Threads Réseau Outils EJB WS

41-45-104 Connexions réseau URL RMI et RMI-IIOPRappels sur les réseaux (IP, TCP et UDP, adressage)

file://<host>/<path> fichier sur disque localfile:///etc/services

<host> par défaut machine localeftp://<user>:<pwd>@<machine>:<port>/chemin;type=<typecode>

ftp://ftp.univ-mrs.fr/f.txt fichier distant (transfert)<user> par défaut anonymous<pwd> par défaut adresse électronique<port> par défaut 21<typecode> :

d lister un répertoirea transfert ASCIIi transfert binaire

http://<machine>:<port>/<path>?<requete>http://www.univ-paris13.fr (par défaut complété à index.html)

mailto:<adressee-mail> envoi de courriersmailto:[email protected]

imap://<user>:<passwd>@<host>/<chemin> serveur de messagerieimap://login@adresseMachine/repertoire

pop3://login@adresseMachine/repertoire

telnet://<user>:<passwd>@<machine>:<port>/telnet://F205-3/ connexion telnet

45 / 258

Page 46: E Services

Introduction Threads Réseau Outils EJB WS

41-46-104 Connexions réseau URL RMI et RMI-IIOPManipulation d’adresses : classe InetAddress

(exception générée : UnknownHostException)

Adresses IP et URLune instance de InetAddress contient les informations :

adresse symbolique d’une machineadresse IP

"constructeurs" (en fait appel du DNS local) :static InetAddress getByName(String host) 1reinfostatic InetAddress[] getAllByName(String host) toutesstatic InetAddress getLocalHost()

String getHostName()

byte[] getAddress()

String getHostAddress()

46 / 258

Page 47: E Services

Introduction Threads Réseau Outils EJB WS

41-47-104 Connexions réseau URL RMI et RMI-IIOPManipulation d’adresses : classe InetAddress

Remarques :on ne peut pas "créer" une structure type adresse IPequals() réécrit de telle manière que l’égalité soit testéesur l’adresse IP

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

Page 48: E Services

Introduction Threads Réseau Outils EJB WS

41-48-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

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

Connexions TCP non sécurisés

Côté client : la classe Socket gère les connexions

Socket(String host, int port)

ouvre une connexion avec host + portsi host n’a pas de serveur en écoute sur le portalors retour avec une IOException

Socket(InetAddress host, int port)

Socket(String host, int port,

InetAddress interface, int portLocal)

permet de spécifier la partie source (par défaut le port source estle 1erlibre)

48 / 258

Page 49: E Services

Introduction Threads Réseau Outils EJB WS

41-49-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

InetAddress getInetAddress() spécif. du serveur

int getPort() spécif. du port distant

int getLocalPort() spécif. du port local

InetAddress getLocalAddress()

InputStream getInputStream() flux pour la lecture

OutputStream getOutputStream() flux pour l’écriture

synchronized void close() ferme le socket

49 / 258

Page 50: E Services

Introduction Threads Réseau Outils EJB WS

41-50-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

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

Page 51: E Services

Introduction Threads Réseau Outils EJB WS

41-51-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

Côté serveur : la classe ServerSocket gère les écoutes

ServerSocket(int port) crée une écoute sur le port(sans limite de taille de buffer)

ServerSocket(int port, int taille) (avec limite la taille)

ServerSocket(int port, int taille, InetAddress adr)écoute sur l’interface IP adr

Socket accept() début d’attente de clients

void close() fin du serveur

51 / 258

Page 52: E Services

Introduction Threads Réseau Outils EJB WS

41-52-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

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 serveurcatch (IOException e) {} // erreur de création

}

public static void main(String[] args) {int port;try {port = Integer.parseInt(args[0]);}catch (Exception e) {port = 0;} // donc valeur au hasardMain ct = new Main(port);ct.clientMgr();

}... // cf page suivante

52 / 258

Page 53: E Services

Introduction Threads Réseau Outils EJB WS

41-53-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

...public void clientMgr() {

while (true) { // écoutetry { 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();} //attente de fin R/W

catch (InterruptedException e) { } // interruption de thread}catch (IOException e) {System.out.println(e);}finally {

try { if (socket != null) socket.close();}catch (IOException e) {}

}}

}}

53 / 258

Page 54: E Services

Introduction Threads Réseau Outils EJB WS

41-54-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

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 lecturecatch (IOException e) {}try { in.close(); }catch (IOException e) {}

}}

54 / 258

Page 55: E Services

Introduction Threads Réseau Outils EJB WS

41-55-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP non sécurisés entre machines (classe Socket)

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

Page 56: E Services

Introduction Threads Réseau Outils EJB WS

41-56-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Connexions TCP sécurisésPackages : (dans le JDK standard à partir de la version 1.4)

javax.net.ssl classes abstraites : communication sécurisée

javax.net sockets sécurisés

java.security.cert gestion de clés pour SSL

com.sun.net.ssl algo de cryptage (==> provider)

En fait intègre le cryptage dans l’envoi de données et non au niveau du fluxde données.Le "cryptage" consiste à spécifier

si il y a authentification (méthode RSA)

si il y a cryptage des blocs (DES ou RC4)

si il y a contrôle de somme (i.e. signature) (MD5 ou SHA)

56 / 258

Page 57: E Services

Introduction Threads Réseau Outils EJB WS

41-57-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Grandes lignes de la méthode :

1 spécification du provider de l’algo de cryptage

soit ligne de spécif. dans le fichier java.securitysoit méthode addProvider(..) de la classe Security

2 création de la "fabrique" de cryptage via la classe SSLSocketFactoryméthode getDefault() existe

3 création de socket par la méthode d’instance createSocket(...) dela classe SSLSocketFactory

57 / 258

Page 58: E Services

Introduction Threads Réseau Outils EJB WS

41-58-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Méthode :1 générer les clés publiques et certificats (commande keytool)2 authentifier les certificats (==> tiers)

3 créer un SSLContext pour l’algo de cryptage4 créer un KeyManagerFactory pour le gestionnaire de clés5 créer un KeyStore pour la base de clés et certificats6 ... et l’initialiser avec le fichier de clés7 initialiser le KeyManagerFactory avec le résultat de 6.8 initialiser le SSLContext avec le résultat du 7.

9 créer un SSLServerSocketFactory pour la génération de serveurs10 créer un SSLServerSocket à partir du résultat de 9.11 créer une socket en acceptant les connexions sur le

SSLServerSocket

58 / 258

Page 59: E Services

Introduction Threads Réseau Outils EJB WS

41-59-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

possibilité de préciser les protocoles de cryptage disponibles :public abstract String[] getEnabledCypherSuites()

retourne la liste des méthodes de cryptage (une chaîne decaractères = une méthode)

public abstract void setEnabledCypherSuites(String[] c)

spécifie les codes (à partir des codes c disponibles dansl’implémentation)

possibilité d’avoir un jeu de clés par session(par défaut un jeu de clés est réutilisé entre deux connexions)

59 / 258

Page 60: E Services

Introduction Threads Réseau Outils EJB WS

41-60-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Exemples d’opérations à effectuer :SERVEUR

% keytool -genkey -keystore Fichier_Certif// génération d’un fichier de clé// (en fait d’un certificat, d’une clé privée et d’une clé publique)

% keytool -list -keystore Fichier_Certif// ne sert qu’à voir le contenu du fichier de clés

% 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 d’entrer dans le fichier des clés// 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

Page 61: E Services

Introduction Threads Réseau Outils EJB WS

41-61-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

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 : spécification d’une valeur d’attribut// dans l’environnement de la machine virtuelle

61 / 258

Page 62: E Services

Introduction Threads Réseau Outils EJB WS

41-62-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Exemple de client de Socket SSL :

import java.io.*;import java.security.*;import javax.net.ssl.*;

public class ClientHTTPS {

private final int portHTTPS = 443; // port https par défautprivate SSLSocket sslSocket;private String host;

public ClientHTTPS(String host) throws Exception { // socket sécurisé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

Page 63: E Services

Introduction Threads Réseau Outils EJB WS

41-63-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

...public void test() {

try { // envoi de donnéesWriter output = new OutputStreamWriter(sslSocket.getOutputStream());output.write("GET https://"+host+"/ HTTP 1.1\r\n\r\n");output.flush();

// lecture de la réponseBufferedReader 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

Page 64: E Services

Introduction Threads Réseau Outils EJB WS

41-64-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

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("numéro de port négatif"); }

// 1) spécif de la fabrique de cryptageKeyManagerFactory kmf=null;SSLContext context=null;try {

context = SSLContext.getInstance("SSLv3");kmf = KeyManagerFactory.getInstance("SunX509");

} catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); }// 2) spécif du gestionnaire de clés

KeyStore ks = null;try {

ks = KeyStore.getInstance("JKS");} catch (KeyStoreException e2) { e2.printStackTrace(); }

// 3) récupération 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

Page 65: E Services

Introduction Threads Réseau Outils EJB WS

41-65-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

...// 4) paramétrage 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) spécification du contexte de génération de SSLServerSockettry {

context.init(kmf.getKeyManagers(), null, null);} catch (KeyManagementException e5) { e5.printStackTrace();}

// 6) création de la fabrique de SSLServerSocketSSLServerSocketFactory factory = context.getServerSocketFactory ();

// 7) création d’un SSLServerSockettry {

serverSocket = (SSLServerSocket) factory.createServerSocket (this.port);System.out.println ("Création Socket OK");

}catch (IOException e) {

System.out.println ("Erreur ServerSocket : " + e);System.exit (0);

}}

...

65 / 258

Page 66: E Services

Introduction Threads Réseau Outils EJB WS

41-66-104 Connexions réseau URL RMI et RMI-IIOPConnexions TCP sécurisés entre machines (classe SSLServerSocket)

Il y a aussi la possibilité de spécifier des droits particuliers surla connexion à un serveur (ou la connexion d’une machine versun 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 méthodes de spécification :un fichier java.policy spécifiant ces droits (fichier deconfiguration $JDKHOME/jre/lib/security/java.policy

chargé lors du lancement de la machine virtuelle Java)une classe redéfinissant la politique de sécurité

66 / 258

Page 67: E Services

Introduction Threads Réseau Outils EJB WS

41-67-104 Connexions réseau URL RMI et RMI-IIOPConnexions UDP entre machines (classe DatagramSocket)

Connexions UDP entre machines

intérêt : rapidedéfaut : absolument pas sûrà n’utiliser que pour les connexions sans session et pourde "petits" paquetsdonnées gérées par la classe DatagramPacket avec lesméthodes receive() et send()

67 / 258

Page 68: E Services

Introduction Threads Réseau Outils EJB WS

41-68-104 Connexions réseau URL RMI et RMI-IIOPConnexions UDP entre machines (classe DatagramSocket)

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

Page 69: E Services

Introduction Threads Réseau Outils EJB WS

41-69-104 Connexions réseau URL RMI et RMI-IIOPConnexions UDP entre machines (classe DatagramSocket)

import java.net.*; import java.io.*;

public class EchoServerUDP extends ServerUDP {public final static int PORT = 5007; // echo = 7public 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

Page 70: E Services

Introduction Threads Réseau Outils EJB WS

41-70-104 Connexions réseau URL RMI et RMI-IIOPConnexions UDP entre machines (classe DatagramSocket)

Exemple de réception 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

Page 71: E Services

Introduction Threads Réseau Outils EJB WS

41-71-104 Connexions réseau URL RMI et RMI-IIOPConnexions entre machines (classe MulticastSocket)

Connexions entre machines en multicastDans le cas de communications partagées par de nombeuxutilisateurs (vidéo, newsgroups, ...), le mécanisme point à pointest fastidieux. Le mécanisme multipoint permet de remédier àcela de la manière suivante :

un paquet de données est envoyé au groupe entier. Lesrouteurs du réseau Internet sont chargés de la distribution(autant que possible sans duplication inutile).chaque groupe d’utilisateurs est référencé par une adresseIP spécifique.le protocole UDP est utiliséles paquets sont envoyés sur une "zone géographique"

71 / 258

Page 72: E Services

Introduction Threads Réseau Outils EJB WS

41-72-104 Connexions réseau URL RMI et RMI-IIOPConnexions entre machines (classe MulticastSocket)

Les mécanismes sont les mêmes que pour les sockets avecdatagrammes UDP. Il suffit juste de "se joindre" au groupe (etde le quitter en fin de session) :

MulticastSocket(int port) crée un socket multipointMulticastSocket joinGroup (InetAddress ia)

méthode permettant de joindre le socket au grouperéférencé par l’IP ia

MulticastSocket leaveGroup (InetAddress ia)

méthode permettant de se séparer du groupeMulticastSocket receive(DatagramPacket dp)

reçoit un paquet UDPMulticastSocket send(DatagramPacket dp, byte ttl)

envoie un paquet (le ttl précise le nombre de routeurs quece paquet pourra "traverser")

72 / 258

Page 73: E Services

Introduction Threads Réseau Outils EJB WS

41-73-104 Connexions réseau URL RMI et RMI-IIOP

3 Réseau : adressage et socketsConnexions réseau

Rappels sur les réseaux (IP, TCP et UDP, adressage)Manipulation d’adresses : classe InetAddressConnexions TCP non sécurisés entre machines (classe Socket)Connexions TCP sécurisés entre machines (classeSSLServerSocket)Connexions UDP entre machines (classe DatagramSocket)Connexions entre machines (classe MulticastSocket)

URLClasses URL et URLConnectionGestion de protocole

RMI et RMI-IIOPRMI : Remote Method Invocation

73 / 258

Page 74: E Services

Introduction Threads Réseau Outils EJB WS

41-74-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

Classes URL et URLConnection

URL : classe gérant l’objet URL (i.e. les infos statiques liéesà cet URL)URLConnection : classe gérant les connexions sur une URL(i.e. la gestion du socket permettant la lecture de données)

74 / 258

Page 75: E Services

Introduction Threads Réseau Outils EJB WS

41-75-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

(exception : MalformedURLException)public URL(String url)

// new URL("http://www.univ-paris13.fr/index.html");// exception si le protocole n’est pas géré par la machine virtuelle

public URL( String protocole, // httpString machine, // www.univ-paris13.frString fichier) // index.html

public URL( String protocole,String machine,int port, // 80 (par défaut pour http)String fichier)

public URL( URL base,String relative)

public URL( String protocole,String machine,int port,String fichier,URLStreamHandler handler)

// permet de spécifier le gestionnaire de protocoles à utiliser

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

int getPort()

75 / 258

Page 76: E Services

Introduction Threads Réseau Outils EJB WS

41-76-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

Entrées / Sorties :URLConnection openConnection()

ouvre une connexion sur l’URL,retourne un socket sur cet URL(donc possibilité d’effectuer entrées et sorties)

InputStream openStream()ouvre une connexion sur l’URL,répond à l’authentification si nécessaire,instancie un InputStream pour récupérer les données(lecture standard)

Object getContent()récupère les données d’une URL,puis les sort dans un format (i.e. une instance d’objet)"normalement" défini par le protocole.getClass() sur l’objet permet de savoir à queltype de données on a affaire(URLImageSource pour gif, MeteredStream pour applet, ...)

(URL) getContent() == openConnection().getContent()(URL) openStream() == openConnection().getInputStream()

76 / 258

Page 77: E Services

Introduction Threads Réseau Outils EJB WS

41-77-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

Une fois la connexion établie sur un URL (quelque soit sontype), on peut :

récupérer les spécifications de l’urlconfigurer la connexionenvoyer / recevoir des données

Spécifications de l’url :String getContentType() type MIME (text/html, image/gif)int getContentLength()String getContentEncoding()

(null si pas d’encodage, sinon x-gzip, ...)long getDate()getExpiration()getLastModified()getHeaderField(String header) ("content-type", ...)

77 / 258

Page 78: E Services

Introduction Threads Réseau Outils EJB WS

41-78-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

Configuration de la connexion pourgestion de cache,autorisation de mot de passe,spécif de l’en-tête envoyé lors de requêtes au serveur

Réception / envoi de donnéesInputStream getInputStream()

OutputStream getOutputStream()

Il existe des sous-classes spécifiques pour :http : HttpURLConnection, setRequestMethod(), ...jar : JarURLConnection, getJarEntry(), ......

78 / 258

Page 79: E Services

Introduction Threads Réseau Outils EJB WS

41-79-104 Connexions réseau URL RMI et RMI-IIOPClasses URL et URLConnection

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:[email protected]");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é d’un en-tête// séparé d’une ligne vide avant le corps du message

p.close();} catch (IOException e) {System.out.println(e);}

} }

%java Mailerou%java -Dmail.host=smtp.orange.fr Mailer

si System.setProperty non mis, où mail.host est une propriétépermettant de préciser l’adresse du serveur SMTP.

79 / 258

Page 80: E Services

Introduction Threads Réseau Outils EJB WS

41-80-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

Gestion de protocoles et communicationIl est possible de gérer "à la main" les protocoles lorsqueceux-ci ne sont pas ou incorrectement traités par la machinevirtuelle.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 sérialisationpublic 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

Page 81: E Services

Introduction Threads Réseau Outils EJB WS

41-81-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

static URLStreamHandlerFactory factory;

static URLStreamHandler getURLStreamHandler(String protocol){

// Use the factory (if any)if (factory != null)

handler = factory.createURLStreamHandler(protocol);// Try java protocol handlerif (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

Page 82: E Services

Introduction Threads Réseau Outils EJB WS

41-82-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

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

Page 83: E Services

Introduction Threads Réseau Outils EJB WS

41-83-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

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

Page 84: E Services

Introduction Threads Réseau Outils EJB WS

41-84-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

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

Page 85: E Services

Introduction Threads Réseau Outils EJB WS

41-85-104 Connexions réseau URL RMI et RMI-IIOPGestion de protocole

Fichier charGrid.cg :55O1000101010001000101010001

Exécution :% java GetGridApp file://localhost/home/cf/.../charGrid.cg

85 / 258

Page 86: E Services

Introduction Threads Réseau Outils EJB WS

41-86-104 Connexions réseau URL RMI et RMI-IIOP

3 Réseau : adressage et socketsConnexions réseau

Rappels sur les réseaux (IP, TCP et UDP, adressage)Manipulation d’adresses : classe InetAddressConnexions TCP non sécurisés entre machines (classe Socket)Connexions TCP sécurisés entre machines (classeSSLServerSocket)Connexions UDP entre machines (classe DatagramSocket)Connexions entre machines (classe MulticastSocket)

URLClasses URL et URLConnectionGestion de protocole

RMI et RMI-IIOPRMI : Remote Method Invocation

86 / 258

Page 87: E Services

Introduction Threads Réseau Outils EJB WS

41-87-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

RMI :Principe développé par Sun permettant d’appeler desméthodes exposées sur une autre machine virtuelleMécanisme propre à JavaUtilise la bibliothèque java.rmi

RMI-IIOP :IIOP : Internet Inter-Orb ProtocolCompatibilité avec CORBA (donc interopérable avecd’autres environnements d’appels de fonctions ou deméthodes à distance)Obligatoire avec l’environnement EJB (Enterprise JavaBeans)Utilise les bibliothèques java.rmi et javax.rmi

87 / 258

Page 88: E Services

Introduction Threads Réseau Outils EJB WS

41-88-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Principales différences :RMI : chargement de classes et activation d’objets à chaudà distancedonc classes distinctes pour identifier les objets utilisablesà distance :

RMI : java.rmi.server.RemoteObjectRMI-IIOP : javax.rmi.PortableRemoteObject

88 / 258

Page 89: E Services

Introduction Threads Réseau Outils EJB WS

41-89-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

3 machines virtuelles :A : va contenir le ou les objets dont d’autres machinesvirtuelles utiliseront les méthodesB : machine virtuelle appelant les méthodes des objetsexposés par AC : machine virtuelle jouant le rôle de serveur en exposantles objets utilisables à distance par des noms symboliques(comme un DNS)

89 / 258

Page 90: E Services

Introduction Threads Réseau Outils EJB WS

41-90-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Principe :Lancement de C : serveur écoutant sur le port 1099 lesrequêtes de déclaration d’objets ou de recherche d’objets(la commande rmiregistry lance un tel serveur)Lancement de A :

création des objets que A veut présenterouverture d’un port en attente de requête vers les objets"publics"requête à C pour rendre "publics" les objets (numéro deport sur A, adresse IP de A, ...)

Lancement de B :requête à C pour récupérer les modalités d’utilisation del’objet sur Aexécution de méthodes

90 / 258

Page 91: E Services

Introduction Threads Réseau Outils EJB WS

41-91-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

La face cachée : Nécessite la création de classes spéciales(donc des fichiers) permettant de sérialiser et désérialiser lesrequêtes et les structures des classes des objets exportés,

une interface permet de spécifier la structure de la classede l’objet exporté. Cette interface doit exister sur A et B.Côté exportateur A : un fichier squelette (skeleton)Côté importateur B : un fichier souche (stub)Dans les versions initiales de java, 2 fichiers distincts, maintenant unseul fichier stub

Ce fichier stub est généré par la commande rmic sur ALe stub doit être copié sur B (et gardé sur A !).

91 / 258

Page 92: E Services

Introduction Threads Réseau Outils EJB WS

41-92-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

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 l’interface remotepublic void showDigest(File fileName) throws RemoteException;

}

92 / 258

Page 93: E Services

Introduction Threads Réseau Outils EJB WS

41-93-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple (étape 2) :Implantation de l’interface 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

Page 94: E Services

Introduction Threads Réseau Outils EJB WS

41-94-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple (étape 3) :Compiler cette implantation et récupérer un stub qui servira auxclients 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

Page 95: E Services

Introduction Threads Réseau Outils EJB WS

41-95-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple (étape 4) :Ecrire un code DisplayPublisher.java permettant lapublication sur le serveur RMI C (ce code peut faire partie ducode "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);

// crée le thread en attente d’appel sur l’objet (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

Page 96: E Services

Introduction Threads Réseau Outils EJB WS

41-96-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple (étape 5) :Exporter l’objet vers le serveur RMI% rmiregistry &

// Création d’un démon serveur de noms si celui-ci n’est pas déjà lancé// par défaut en attente sur le port 1099// Autre possibilité : utiliser la classe LocateRegistry// qui permet de créer des serveurs de noms

% javac DisplayPublisher.java% java DisplayPublisher

La dernière commande crée la machine virtuelle A, donc resteen exécution.

96 / 258

Page 97: E Services

Introduction Threads Réseau Outils EJB WS

41-97-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple (étape 6) :Code DisplayClient.java à faire tourner sur Bimport 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

Page 98: E Services

Introduction Threads Réseau Outils EJB WS

41-98-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Remarques :La classe HelloFrame doit implanter l’interfaceSerializable (elle est par ailleurs écrite de manièretotalement standard).Plusieurs appels distants peuvent avoir lieu en mêmetemps sur le même objet (sur le serveur) : chaqueexécution distante de méthode est faite sur un thread. Ilfaut donc veiller à respecter les principes de gestion deconcurrence sur les variables de l’objet.Les paramètres passés en argument sont recopiés de lamachine cliente vers la machine serveur : les paramètresde type non primitif ne seront pas modifiés par l’exécutiondistante.

98 / 258

Page 99: E Services

Introduction Threads Réseau Outils EJB WS

41-99-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Le mécanisme RMI utilise implicitement le chargement declasses à chaud, effectuable en général :

java.lang.ClassLoader : classe abstraite génériquegetSystemClassLoader() : 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

Page 100: E Services

Introduction Threads Réseau Outils EJB WS

41-100-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Sous-classes avec chargeur spécifique :security.SecureClassLoader : chargeur avec test desécuritéjava.net.URLClassLoader : chargeur de classes distantesrmi.server.RMIClassLoader : spécifique à RMI

Exemple : (on suppose que Test.class se trouve dans lerépertoire /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

Page 101: E Services

Introduction Threads Réseau Outils EJB WS

41-101-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Exemple sur 3 machines distinctes :1 machine client1 machine httphost sur laquelle tourne un serveur HTTP1 machine codehost sur laquelle existe une machinevirtuelle et un objet publié connu par httphost mais nonpublic

L’objectif est que client exécute un code téléchargé dehttphost qui va lui-même exécuter une méthode d’un objet decodehost.

101 / 258

Page 102: E Services

Introduction Threads Réseau Outils EJB WS

41-102-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

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 maPolicygrant {

permission java.security.AllPermission;};

102 / 258

Page 103: E Services

Introduction Threads Réseau Outils EJB WS

41-103-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Sur httphost : le fichier Hello.java etimport 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

Page 104: E Services

Introduction Threads Réseau Outils EJB WS

41-104-104 Connexions réseau URL RMI et RMI-IIOPRMI : Remote Method Invocation

Sur codehost : le fichier Hello.java etimport 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 programmeSpecialClient (qui boucle en attendant des requêtes declients).Enfin le programme GenericClient sur la machine client.

104 / 258

Page 105: E Services

Introduction Threads Réseau Outils EJB WS

105-105-145 Messagerie Serveur de noms Connecteur BD Analyse XML

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

105 / 258

Page 106: E Services

Introduction Threads Réseau Outils EJB WS

105-106-145 Messagerie Serveur de noms Connecteur BD Analyse XML

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

106 / 258

Page 107: E Services

Introduction Threads Réseau Outils EJB WS

105-107-145 Messagerie Serveur de noms Connecteur BD Analyse XML

La messagerie permet l’envoi asynchrone d’informations.Utilisé en messagerie "ordinaire", comme en gestionasynchrone entre processus.

javax.mail.* est la bibliothèque contenant les classesnécessaires (pas dans le JDK standard, mais dans J2EE, cf aussihttp://developers.sun.com/downloads/).Définit une API utilisable de manière générique et une APIpour les différents fournisseurs de protocoles-services.Les API des protocoles suivants sont donnés en standard :

pour l’envoi de messages (protocole SMTP)pour la lecture (protocoles IMAP4 et POP3)

Base de certains webmails

107 / 258

Page 108: E Services

Introduction Threads Réseau Outils EJB WS

105-108-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Principe d’envoi :Session

définit l’environnement d’envoi à partir des propriétés :mail.transport.protocol : protocole pour l’envoi (p.e."smtp")mail.smtp.host : machine relais pour le protocole d’envoichoisi

getInstance() crée une instance de session à partir depropriétés données en argument, et optionnellement d’unobjet permettant l’authentification

MimeMessage pour la constitution de message au formatMime et incluant les infos de sessionTransport permet l’envoi effectif d’un message donné enargument (intègre aussi un mécanisme d’écouteurs)

108 / 258

Page 109: E Services

Introduction Threads Réseau Outils EJB WS

105-109-145 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("[email protected]"));message.setRecipient(

Message.RecipientType.TO, // ou CC ou BCCnew InternetAddress("[email protected]")

);message.setSubject("Test");message.setText("ceci est le contenu du test !");

Transport.send(message);}

}

109 / 258

Page 110: E Services

Introduction Threads Réseau Outils EJB WS

105-110-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Comment récupérer le serveur de mail de son environnementlocal (sous linux/unix) :quand son domaine d’adressage mail est univ-paris13.fr,% nslookup> set query=MX> univ-paris13.fr...univ-paris13.fr mail exchanger = 100 upn.univ-paris13.fr.

110 / 258

Page 111: E Services

Introduction Threads Réseau Outils EJB WS

105-111-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Principe de réception :Session

définit (aussi !) l’environnement de réception à partir depropriété :

mail.store.protocol : protocole pour la lecture (p.e."imap")

getInstance() crée une instance de session à partir depropriétés données en argument, et optionnellement d’unobjet permettant l’authentification

Store correspond à une boîte de réceptionFolder correspond à un répertoire dans une boîteMessage correspond à un message dans un répertoire deréception

111 / 258

Page 112: E Services

Introduction Threads Réseau Outils EJB WS

105-112-145 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 messagemessage.writeTo(System.out);

inbox.close(false);store.close();

}}

112 / 258

Page 113: E Services

Introduction Threads Réseau Outils EJB WS

105-113-145 Messagerie Serveur de noms Connecteur BD Analyse XML

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

113 / 258

Page 114: E Services

Introduction Threads Réseau Outils EJB WS

105-114-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Les serveurs de noms permettent de commuter entre clé deréférencement et propriétés associées :

Service de système de fichiers : ext3, NTFS, ...Service de noms de domaine : DNSService d’annuaires : NIS, LDAP, Active Directory, ...

Un contexte est un ensemble de paires clé-valeur (bindings) :les clés sont organisées 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 unsous-contexte de dc=univ-rennes1,dc=fr (LDAP)

le contexte permet les opérations suivantes :lier une valeur à une clésupprimer la liaisonlister les liaisons

114 / 258

Page 115: E Services

Introduction Threads Réseau Outils EJB WS

105-115-145 Messagerie Serveur de noms Connecteur BD Analyse XML

L’environnement logiciel nécessaire est donné comme :une API javax.naming.* pour la programmation dont lesméthodes appellent un SPIun SPI qui dépend du serveur externe (Service ProviderInterface)l’interface Context définit la structure abstraite nécessaire

L’objet inital est défini par :InitialContext à partir de :

un SPI donné comme valeur de la propriéténaming.factory.initial

une racine

Le choix de la SPI dépend du type du domaine de noms, ils’agit d’une classe qui sera chargée “à chaud".

com.sun.jndi.fscontext.RefFSContextFactory est la SPIdonnée avec Java pour les systèmes de gestion defichiers.

115 / 258

Page 116: E Services

Introduction Threads Réseau Outils EJB WS

105-116-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Opérations standard :list() : liste le contexte racine ou celui donné enargumentrename() : renomme le contexte racine ou celui donné enargumentcreateSubContext() : crée un sous-contextelookup() : change de / recherche un contexte

116 / 258

Page 117: E Services

Introduction Threads Réseau Outils EJB WS

105-117-145 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

Page 118: E Services

Introduction Threads Réseau Outils EJB WS

105-118-145 Messagerie Serveur de noms Connecteur BD Analyse XML

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

118 / 258

Page 119: E Services

Introduction Threads Réseau Outils EJB WS

105-119-145 Messagerie Serveur de noms Connecteur BD Analyse XML

JDBC = Java DataBase ConnectivityUtilisé dans J2EE comme interface entre les Beans et lesBDPossibilité d’écrire des applications l’utilisant explicitement(hors JavaBeans)Masqué dans J2EEPrincipe similaire aux cadres précédents : API + SPI (cfhttp://java.sun.com/javase/technologies/database/index.jsp)

119 / 258

Page 120: E Services

Introduction Threads Réseau Outils EJB WS

105-120-145 Messagerie Serveur de noms Connecteur BD Analyse XML

Problème majeur : l’interface est à base de chaîne decaractères, donc pas de vérification sur les structures desrequêtes, i.e. en terme de typage.

120 / 258

Page 121: E Services

Introduction Threads Réseau Outils EJB WS

105-121-145 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

Page 122: E Services

Introduction Threads Réseau Outils EJB WS

105-122-145 Messagerie Serveur de noms Connecteur BD Analyse XML

4 Outils : messagerie, serveur de noms, connecteur BD, XMLMessagerieServeur de nomsConnecteur BDAnalyse XML

XML, DTD, ...SAX : Analyse de flux XMLDOM : vue Java d’un document XML

122 / 258

Page 123: E Services

Introduction Threads Réseau Outils EJB WS

105-123-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

XML : eXtended Markup Languageformat ’texte’ structuré, portable, extensibleDérivé de SGMLStandards associés :

XSL : eXtensible Stylesheet LanguageXSLT : langage de transformation XSLXlink, Xquery : langages de requêtes sur documents XMLXpath, Xpointer : langages d’accès aux parties

123 / 258

Page 124: E Services

Introduction Threads Réseau Outils EJB WS

105-124-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

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

Page 125: E Services

Introduction Threads Réseau Outils EJB WS

105-125-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

Exemple 2 :<?xml version="1.0" encoding="UTF8"?>

<webappversion="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

Page 126: E Services

Introduction Threads Réseau Outils EJB WS

105-126-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

Espace de noms en XML (namespace) :un espace de noms est un ensemble d’identifiants(éléments et attributs) à sémantique unique pour cetespace. On peut donc par exemple distinguer des attributssyntaxiquement identiques qui relèvent de 2 sémantiquesdistinctes.l’espace de noms est défini par un URIil est déclarable comme valeur de l’attribut xmlnsxmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"

permet d’indiquer que tout attribut commençant par xsi:appartiendra à l’espace de nomshttp://www.w3.org/2001/XMLSchemainstance

xmlns="http://www.w3.org/2001/XMLSchemainstance"

permet d’indiquer que tout attribut sans préfixeappartiendra à l’espace de nomshttp://www.w3.org/2001/XMLSchemainstance

126 / 258

Page 127: E Services

Introduction Threads Réseau Outils EJB WS

105-127-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

DTD : Document Type DefinitionSpécifie la structure des noeuds d’un document XMLExemples :

<!ELEMENT employee (shift+, homeaddress,hobbies*)>

<!ATTLIST shift id CDATA #REQUIRED>

127 / 258

Page 128: E Services

Introduction Threads Réseau Outils EJB WS

105-128-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

Différences DTD/XML Schema :DTD : pas de typage fort, 10 types de données prédéfinisXML Schema :

44 types de données prédéfinisMême syntaxe que XMLOrienté objetGestion d’espaces de noms

128 / 258

Page 129: E Services

Introduction Threads Réseau Outils EJB WS

105-129-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

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

Page 130: E Services

Introduction Threads Réseau Outils EJB WS

105-130-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

JAXP est l’API Java pour l’analyse XML, il inclut :SAX (Simple API for XML processing) : analyse par fluxDOM (Document Object Model) : construction d’un modèlereprésentant la donnée XML

Nécessitejavax.xml.parsers pour les structures basiquesorg.xml.sax pour les algorithmes basiques sous SAX(et à utiliser en DOM)org.w3c.dom pour la structure de document XML

130 / 258

Page 131: E Services

Introduction Threads Réseau Outils EJB WS

105-131-145 Messagerie Serveur de noms Connecteur BD Analyse XMLXML, DTD, ...

javax.xml.parsers inclut les classes :SAXParser et sa fabrique SAXParserFactoryDocumentBuilder et sa fabriqueDocumentBuilderFactory

org.xml.sax inclut principalement les interfaces degestion de données XML :

XMLReader pour les lecteursDTDHandler pour la conformité aux DTD...

131 / 258

Page 132: E Services

Introduction Threads Réseau Outils EJB WS

105-132-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Principe :un objet reader effectue la lecture d’un flux de données(fichier, socket, ...) en constituant à partir de codes liés àl’application des objets représentant le contenu XMLau début/à la fin du document, à chaque début/fin denoeuds (element) de l’arbre XML lu, l’objet-lecteur faitappel à une méthode spécifique d’un gestionnaire decontenu.la mise en oeuvre consiste au minimum à :

définir un gestionnaire de contenu, i.e. les méthodesdécrivant les opérations à effectuer pour la construction desobjets selon les données XML (début/fin d’élément, ...)définir un gestionnaire d’erreurs (pour traiter correctementles erreurs du flux XML par rapport à ce qui est attendu)définir un objet SAXParser encapsulant les objetsprécédents et terminant la configuration del’analyseur-lecteur.

132 / 258

Page 133: E Services

Introduction Threads Réseau Outils EJB WS

105-133-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Mise en oeuvre concrète :création de l’objet fabrique d’analyseurs-lecteurs commeinstance de SAXParserFactory

configuration de cet objet : gestion d’espace de noms,validation par une DTD ou un schéma XML, ...création d’un analyseur-lecteur à partir de la fabriqueprécédente comme instance de SAXParser

récupération, à partir de l’objet précédent, d’un lecteurXMLReader

création d’un gestionnaire de contenu, d’un gestionnaired’erreurs, d’un gestionnaire de schéma spécifiques àl’applicationconfiguration de ce lecteur : gestionnaire de contenu,gestionnaire d’erreurs, gestionnaire de schémaslancement de l’analyse du flux XML

133 / 258

Page 134: E Services

Introduction Threads Réseau Outils EJB WS

105-134-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (1) : EBM.dtd<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE EBM [

<!-- DTD basique pour la sauvegarde d’EBM au format XML -->

<!ELEMENT EBM (GraphicalData,ComposantPlus,ComposantsMoins)><!ELEMENT GraphicalData (GraphicalSizeData,PointOrigine)><!ELEMENT GraphicalSizeData EMPTY><!ATTLIST GraphicalSizeData

largeurMin CDATA #REQUIREDlargeur CDATA #REQUIREDhauteur CDATA #REQUIRED

><!ELEMENT PointOrigine EMPTY>

<!ATTLIST PointOriginex CDATA #REQUIREDy 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

Page 135: E Services

Introduction Threads Réseau Outils EJB WS

105-135-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (2) : un flux de donnée 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

Page 136: E Services

Introduction Threads Réseau Outils EJB WS

105-136-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (3) : classe principale initialisant les objets et lançantl’analyseimport javax.xml.parsers.*; import org.xml.sax.*;import java.io.*; ...

public class SAXEBMReader {...

public SAXEBMReader (String fileName, BM_graph bm_graph) throws IOException {...

// Création de la fabrique d’analyseurs-lecteursSAXParserFactory spf = SAXParserFactory.newInstance();spf.setNamespaceAware(true); spf.setValidating(false);

try {// création d’un analyseur

SAXParser saxParser = spf.newSAXParser();// on récupère 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 données XMLxmlReader.parse(fileNale.toURL().toString());

} catch (SAXException saxe) { System.out.println("SAX : " + saxe);} catch (ParserConfigurationException pce) { System.out.println("conf : " + pce);}

}...}

136 / 258

Page 137: E Services

Introduction Threads Réseau Outils EJB WS

105-137-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (4) : Gestionnaire d’erreursprivate 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

Page 138: E Services

Introduction Threads Réseau Outils EJB WS

105-138-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (5.1) : gestionnaire de contenu XMLimport 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);

}

// Opérations en début de documentpublic void startDocument() throws SAXException {}

// Opérations en fin de lecture de documentpublic void endDocument() throws SAXException {}

...

138 / 258

Page 139: E Services

Introduction Threads Réseau Outils EJB WS

105-139-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Exemple (5.2) : gestionnaire de contenu XML...

// Opérations en début de lecture d’élémentpublic void startElement(String namespaceURI, String localName,

String qName, Attributes atts) throws SAXException {String key = localName;

// opérations selon l’attribut luif (localName.equals("BM")) {};if (localName.equals("GraphicalSizeData")) {

graphicalData.setLargeurMin(Integer.decode(atts.getValue("largeurMin")).intValue());

};...

}

// Opérations en fin de lecture d’élémentpublic void endElement(String namespaceURI, String localName,

String qName) throws SAXException {String key = localName;

// opérations selon l’attribut luif (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

Page 140: E Services

Introduction Threads Réseau Outils EJB WS

105-140-145 Messagerie Serveur de noms Connecteur BD Analyse XMLSAX : Analyse de flux XML

Sur les arguments des méthodes startElement et endElement :namespaceURI : l’URI de l’espace de nomslocalName : nom sans l’URI préfixeqName : nom avec l’URI préfixeattributes : tableau des attributs présents dans l’élément

140 / 258

Page 141: E Services

Introduction Threads Réseau Outils EJB WS

105-141-145 Messagerie Serveur de noms Connecteur BD Analyse XMLDOM : vue Java d’un document XML

Principe :un objet reader effectue la lecture d’un flux de données(fichier, socket, ...) en constituant des objets en miroir ducontenu XMLla mise en oeuvre est assez similaire au cas SAX sansgestionnaire de contenu.une fois les objets construits, ils sont accessibles“directement".

141 / 258

Page 142: E Services

Introduction Threads Réseau Outils EJB WS

105-142-145 Messagerie Serveur de noms Connecteur BD Analyse XMLDOM : vue Java d’un document XML

Mise en oeuvre concrète :création de l’objet fabrique d’analyseurs-lecteurs commeinstance de DocumentBuilderFactory

configuration de cet objet : gestion d’espace de noms,validation par une DTD ou un schéma XML, ...création d’un analyseur-lecteur à partir de la fabriqueprécédente comme instance de DocumentBuilder

Pas de reader à extrairecréation d’un gestionnaire d’erreurs, d’un gestionnaire deschéma spécifiques à l’applicationconfiguration du lecteur : gestionnaire d’erreurs,gestionnaire de schémaslancement de l’analyse du flux XML qui renvoie uneinstance de Document

consultation des noeuds du document.142 / 258

Page 143: E Services

Introduction Threads Réseau Outils EJB WS

105-143-145 Messagerie Serveur de noms Connecteur BD Analyse XMLDOM : vue Java d’un document XML

Document et Node sont deux interfaces (instanciées dans lepaquetage w3c)des attributs de Node permettent d’accéder aux éléments etattributs.

143 / 258

Page 144: E Services

Introduction Threads Réseau Outils EJB WS

105-144-145 Messagerie Serveur de noms Connecteur BD Analyse XMLDOM : vue Java d’un document XML

Exemple (1) : analyseur DOMimport 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];

// Création de la fabriqueDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);dbf.setValidating(false);dbf.setIgnoringComments(false);dbf.setIgnoringElementContentWhitespace(false);

// Création du lecteur DOMDocumentBuilder db = dbf.newDocumentBuilder();

// gestionnaire d’erreursdb.setErrorHandler(new MyErrorHandler());

// analyse du document XMLDocument doc = db.parse(new File(filename));

... echo(doc);}

144 / 258

Page 145: E Services

Introduction Threads Réseau Outils EJB WS

105-145-145 Messagerie Serveur de noms Connecteur BD Analyse XMLDOM : vue Java d’un document 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

Page 146: E Services

Introduction Threads Réseau Outils EJB WS

146-146-250 Introduction Servlet et JSP Beans

5 Environnement J2EE et EJB : la baseIntroductionServlet et JSP

JSPServlet

Enterprise Java BeansGénéralitésUne (partie d’) implantationBeans sessionBeans entité / JPAUn premier exemple de Beans entité sous ejb3Beans entité CMPBeans entité BMPSur les annotations en JavaBeans entité ejb3Beans message

146 / 258

Page 147: E Services

Introduction Threads Réseau Outils EJB WS

146-147-250 Introduction Servlet et JSP Beans

5 Environnement J2EE et EJB : la baseIntroductionServlet et JSP

JSPServlet

Enterprise Java BeansGénéralitésUne (partie d’) implantationBeans sessionBeans entité / JPAUn premier exemple de Beans entité sous ejb3Beans entité CMPBeans entité BMPSur les annotations en JavaBeans entité ejb3Beans message

147 / 258

Page 148: E Services

Introduction Threads Réseau Outils EJB WS

146-148-250 Introduction Servlet et JSP Beans

JEE / J2EE (Java Enterprise Bean) : Environnementpermettant le développement et le déploiementd’applications réparties multi-plateformes (mais en Java).NET : Ensemble de produits et de technologies dans lemême esprit réparti mais avec une entrée multi-langages(mais sous Windows)

Objectif : intégrer dans un unique environnementune machine virtuelle permettant l’exécution deprogrammesune facilité de distribution du code sur un parc demachines, avec possibilité de répartition de chargesun interfaçage transparent avec des bases de donnéesun interfaçage avec des éléments externes (sites web,services web)

148 / 258

Page 149: E Services

Introduction Threads Réseau Outils EJB WS

146-149-250 Introduction Servlet et JSP Beans

Plus concrètement :JEE / J2EE :

est une spécification pour des applications “d’entreprises"basées sur Javaintègre une vingtaine de spécifications de composants(servlet, mail, bd, conteneur, ...)des implantations certifiées existent : Glassfish et Sun JEESDK (Sun), Weblogic (Oracle), NetWeaver (SAP),WebSphere (IBM), JBoss, ...

.NET :est un framework pour des applications “d’entreprises"multi-langage de programmation, il intègre unlangage-assembleur indépendant des plateformesd’exécution (uniquement windows en fait)intègre des composants spécifiques pour lescommunications, le réparti, ...VisualStudio est un environnement de développementspécifique

149 / 258

Page 150: E Services

Introduction Threads Réseau Outils EJB WS

146-150-250 Introduction Servlet et JSP Beans

BD

Client : navigateurapplet

Client : programmeweb service

Conteneur WEBservlet, JSP

Conteneur EJBEnterprise Java Beans

• JNDI

• JAX-WS

• JTA

• JPA

• JavaMail

html-http xml-http

RMI/IIOP

JDBC

150 / 258

Page 151: E Services

Introduction Threads Réseau Outils EJB WS

146-151-250 Introduction Servlet et JSP Beans

Chaque conteneurgère un ensemble de fichiers (.java et .class)utilise des descripteurs de compilation et de déploiement(format XML)remplit un ensemble de fonctionnalités plus ou moinstransparentes pour l’utilisateur :

nommage et annuairenotification et envoi de messagescycle de viestockage et archivagesystème transactionnelcontrôle de sécuritéadministration d’objets (pool, équilibrage de charges)

151 / 258

Page 152: E Services

Introduction Threads Réseau Outils EJB WS

146-152-250 Introduction Servlet et JSP Beans

Technologies (1) :Composants web :

Servlets : code Java de génération de pages HTML ou XMLJSP : code à compiler à la demande en servlet

Composants EJB :Beans de session : objets liés à une (session de) requêtesde clients (p.e. panier)Beans entité : objets modélisant un objet de BDBeans message : objets gérant les communicationsasynchrones

152 / 258

Page 153: E Services

Introduction Threads Réseau Outils EJB WS

146-153-250 Introduction Servlet et JSP Beans

Technologies (2) :Services :

JNDI : Java Naming and Directory Interface (lien vers unLDAP, ...)JAX-WS : Java API for XML Web ServicesJTA : Java Transaction API (gestion des transactionsdistribuées)JPA : Java Persistence API (gestion de la persistence decontenu de session hors BD)JDBC : Java Database Connectivity

Communication :HTTP, TCP/IP, SSL (HTTPS)RMI/IIOP : applications distribuéesJMS et JavaMail : communication asynchrone (messagerie)

153 / 258

Page 154: E Services

Introduction Threads Réseau Outils EJB WS

146-154-250 Introduction Servlet et JSP Beans

Environnements :

* Environnements de développement (IDE) : Netbeans, Eclipse,JBuilder, ...

* Environnements complets de déploiement : GlassFish(ex-JWSDP), .NET, WebObjects, BEA, Oracle ApplicationServer, IBM Websphere, ...

* Environnements partiels combinables (en partie) :conteneur web =

écouteur http : Apache httpd, Grizzlygestionnaire jsp/servlet : (Jakarta Apache) Tomcat,Winstonegestionnaire web services : Metro, BEA WebLogic, ServerHTTP IIS, ...

conteneur EJB = dépend de l’environnement complet154 / 258

Page 155: E Services

Introduction Threads Réseau Outils EJB WS

146-155-250 Introduction Servlet et JSP Beans

5 Environnement J2EE et EJB : la baseIntroductionServlet et JSP

JSPServlet

Enterprise Java BeansGénéralitésUne (partie d’) implantationBeans sessionBeans entité / JPAUn premier exemple de Beans entité sous ejb3Beans entité CMPBeans entité BMPSur les annotations en JavaBeans entité ejb3Beans message

155 / 258

Page 156: E Services

Introduction Threads Réseau Outils EJB WS

146-156-250 Introduction Servlet et JSP Beans

Servlet versus JSP :

JSP (Java Server Pages) =code XHTMLtransformé en code servletles 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 méthodes (doGet ...) définissent lesréactions à effectuer selon les requêtes Http

dans les 2 cas (et surtout servlet), vérification de lasyntaxe en sortie impossible !

156 / 258

Page 157: E Services

Introduction Threads Réseau Outils EJB WS

146-157-250 Introduction Servlet et JSP BeansJSP

Un fichier JSP est au format XHTML et comprend des partiesspécifiques à exécuter par le serveur dont le résultat peut êtreinjecté pour construire la (vraie) page html transmise au client.

157 / 258

Page 158: E Services

Introduction Threads Réseau Outils EJB WS

146-158-250 Introduction Servlet et JSP BeansJSP

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

include pour l’inclusion d’un fichierpage pour définir un paquetage à ajouter pour le code àexécuter (import) ou préciser la sortie html (contentType,errorPage, isErrorPage, isThreadSafe).<%@ page import="java.util.*"%>taglib pour définir l’espace de noms à utiliser

Code :<% code_java_ordinaire %> ou<jsp:scriptlet> code_java_ordinaire </jsp:scriptlet>

pour un code à exécuter. Rien ne sera généré sauf si ce quiest envoyé à la variable out

<%= nom_de_variable %> ou<jsp:expression> nom_de_variable </jsp:expression>

pour afficher le contenu de la variable

158 / 258

Page 159: E Services

Introduction Threads Réseau Outils EJB WS

146-159-250 Introduction Servlet et JSP BeansJSP

Actions :jsp:include pour exécuter le fichier à inclurejsp:forward pour rediriger vers une autre pagedans les 2 cas, passage de paramètres possibles (pour larequête implicite) :

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

Il existe des balises supplémentaires, possibilité d’ajout de sespropres balises.

159 / 258

Page 160: E Services

Introduction Threads Réseau Outils EJB WS

146-160-250 Introduction Servlet et JSP BeansJSP

Exemple :<%@page import="java.util.Date, java.text.*"%><html>

<body>Nous sommes le <%=

DateFormat.getDateTimeInstance (DateFormat.FULL,DateFormat.FULL).format(new Date())

%></body>

</html>

spécification d’en-tête (import)

début de code Java

160 / 258

Page 161: E Services

Introduction Threads Réseau Outils EJB WS

146-161-250 Introduction Servlet et JSP BeansServlet

Servlet :Une servlet est exécutée côté serveurelle doit être capable de gérer les requêtes provenant declients webla bibliothèque de classes est dépendant du conteneurweb (donc pas en standard dans JDK mais dans tomcat,glassfish, ...) : javax.servlet.*

161 / 258

Page 162: E Services

Introduction Threads Réseau Outils EJB WS

146-162-250 Introduction Servlet et JSP BeansServlet

L’interface Servlet fixe la spécification, i.e. les méthodes àimplanter :

void init(ServletConfig sc) doit être appelé lors d’unedemande du conteneur (après création d’une instance). Laconfiguration est principalement le contexte, i.e. la liste desparamètres et leur valeur.

void service(ServletRequest req, ServletResponse res)

méthode principale devant gérer les requêtes clientes.void destroy() doit être appelé par le conteneur lorsqueles appels service() sont terminés ou après un laps detemps.

162 / 258

Page 163: E Services

Introduction Threads Réseau Outils EJB WS

146-163-250 Introduction Servlet et JSP BeansServlet

Requête / Réponse :ServletRequest : interface spécifiant l’accès au fluxd’entrée (getInputStream())et aux paramètres d’unerequête (getAttribute(String name))ServletResponse : interface spécifiant le flux de sortie(setEncoding(), getOutputStream(), ...)on peut spécifier une classe par protocole (p.e.HttpServlet pour http), dépend du conteneur web.

163 / 258

Page 164: E Services

Introduction Threads Réseau Outils EJB WS

146-164-250 Introduction Servlet et JSP BeansServlet

Cas de HTTP :javax.servlet.http.HttpServlet définit un ensemble deméthodes dédiées au protocole http.la méthode service() est définie pour analyser le fluxd’entrée (qui doit être une requête HTTP : get, post, ...), eten fonction de la requête concrète http appeler l’une desméthodes doGet(), doPost(), ...les méthodes doXXX() peuvent être redéfinies dans unesous-classe de HttpServlet selon les besoins del’application.

164 / 258

Page 165: E Services

Introduction Threads Réseau Outils EJB WS

146-165-250 Introduction Servlet et JSP BeansServlet

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

Page 166: E Services

Introduction Threads Réseau Outils EJB WS

146-166-250 Introduction Servlet et JSP BeansServlet

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

}

superclasse pour les servlets conformes au protocole Http

code pour une requête GET

165 / 258

Page 167: E Services

Introduction Threads Réseau Outils EJB WS

146-167-250 Introduction Servlet et JSP BeansServlet

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

}

contient les données envoyées par le client

contient la spécif pour l’envoi (dont le flux de sortie)

écriture du début de page html

165 / 258

Page 168: E Services

Introduction Threads Réseau Outils EJB WS

146-168-250 Introduction Servlet et JSP Beans

5 Environnement J2EE et EJB : la baseIntroductionServlet et JSP

JSPServlet

Enterprise Java BeansGénéralitésUne (partie d’) implantationBeans sessionBeans entité / JPAUn premier exemple de Beans entité sous ejb3Beans entité CMPBeans entité BMPSur les annotations en JavaBeans entité ejb3Beans message

166 / 258

Page 169: E Services

Introduction Threads Réseau Outils EJB WS

146-169-250 Introduction Servlet et JSP BeansGénéralités

Enterprise Java Beans (EJB) (à ne pas confondre avec lesBeans utilisés en Java Graphique) :

un bean est un objet d’une machine virtuelle encapsulantune partie de la logique métier et interagissant avecd’autres beans ou “le monde extérieur" (clients, BD, ...)l’interaction (i.e. l’appel) entre beans est normalisée,masquée pour le programmeur car faisant partie desplate-formes de déploiementl’implantation des interactions inter-beans doit permettre lagestion par pool d’esclaves (multi-threads) et distributionde charge (multi-VM, RMI) : chaque type-classe de beanest géré comme un pool de threads.

167 / 258

Page 170: E Services

Introduction Threads Réseau Outils EJB WS

146-170-250 Introduction Servlet et JSP BeansGénéralités

3 types de beans :Beans session : interagissent avec des clients, pas depersistence de données entre session (voire entre appels)Beans entité : objets avec persistence de données, lienavec BDBeans orientés message : objets gérant lescommunications asynchrones

Le principe des beans entité est maintenant spécifié comme laJava Persistence API.

168 / 258

Page 171: E Services

Introduction Threads Réseau Outils EJB WS

146-171-250 Introduction Servlet et JSP BeansGénéralités

Exemples de schémas d’activation :client HTML :

la requête arrive via le serveur http à une servletla servlet requiert un traitement par un bean sessionsi nécessaire, le cookie permet d’identifier les donnéesrequises pour initialiser le bean sessionle résultat du code métier (dans le bean session) est utilisépour construire par la servlet la réponsele code de la servlet ne contient que la mise en forme desdonnées

client programme (C ou autre) :via Corba, un appel à un bean sessionle bean session active un ou plusieurs beans entitéchaque bean entité est une vue de base de donnéesla maintenance de la BD est gérée par les beans entitéle calcul métier est effectué par le bean session

169 / 258

Page 172: E Services

Introduction Threads Réseau Outils EJB WS

146-172-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

Eléments sur la structure sous-jacente (1) : (il s’agit d’unepossibilité d’implantation dans un framework)

1 Chaque classe de bean est gérée par un pool de threads2 Une activation (session, ...) est une suite de demandes de

calcul sur un contexte particulier3 la “durée de vie” d’un contexte est longue au regard des

requêtes et appels

donc il est utile de sauvegarder temporairement chaquecontexte (avec un identifiant type cookie), i.e. avoir une BDdédiée et des objets-coquillesdu coup, il faut des objets gérant les objets contenant lecode métier, les (ré)initialisant, les endormant ensauvegardant le contexte, ...Donc : pour chaque classe d’objets(-coquille), une classed’objets d’accueil (dont le code est générique)

170 / 258

Page 173: E Services

Introduction Threads Réseau Outils EJB WS

146-173-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

Eléments sur la structure sous-jacente (2) :1 l’ensemble doit être multi-VM, donc accessible sous RMI

via JNDI (i.e. nom publicisé), de même pourl’objet-utilisateur

Donc il faut 4 interfaces : pour un objet et son objetd’accueil, en séparant ce qui est utilisable localement dece qui est utilisable à distance. Les contenus desinterfaces sont a priori génériques.

1 le déploiement doit être spécifié de telle sorte que ce soitutilisable à chaud.

Donc 1 fichier descripteur de déploiement (en XML) (ensus d’un fichier descripteur de compilation si nécessaire)

171 / 258

Page 174: E Services

Introduction Threads Réseau Outils EJB WS

146-174-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

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 "métier"public String hello() { return "Hello";}

}

172 / 258

Page 175: E Services

Introduction Threads Réseau Outils EJB WS

146-175-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

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 "métier"public String hello() { return "Hello";}

}

Interface distante : utilisablepar un client à travers RMI.

Interface locale : utilisable parun client de la VM.

Interface d’accueil distante :“création” d’objets-coquillesà travers RMI.

Interface d’accueil locale :“création” d’objets-coquillessur la VM.

Code du bean de type session

172 / 258

Page 176: E Services

Introduction Threads Réseau Outils EJB WS

146-176-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

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

Page 177: E Services

Introduction Threads Réseau Outils EJB WS

146-177-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

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 JNDIContext ctx = new InitialContext(System.getProperties());

// récupération de l’objet d’accueilObject obj = ctx.lookup("HelloHome");

// transtypage spécifiqueHelloHome helloHome = (HelloHome)

PortableRemoteObject.narrow (obj, HelloHome.class);

// objet EJB servant d’interface avec le (vrai) beanHello hello = helloHome.create();

// appel des méthodes "métier"System.out.println(hello.hello());

// fin d’usage: libération de l’objet EJBhello.remove();

}}

174 / 258

Page 178: E Services

Introduction Threads Réseau Outils EJB WS

146-178-250 Introduction Servlet et JSP BeansUne (partie d’) implantation

Objet-client

Serveur JNDI

Objet bean

Objet d’accueil

0. contexteJNDI

1. nom symb. del’objet recherché

3. demanded’objet-bean

6. codemétier

5. référenced’objet-bean

4. initialisation

2. adresse objetaccueil

175 / 258

Page 179: E Services

Introduction Threads Réseau Outils EJB WS

146-179-250 Introduction Servlet et JSP BeansBeans session

Beans session :durée de vie : celle de l’appel2 sous-types :

Stateless : aucune donnée de session. Exemple : envoi del’heureStateful : il existe des données de session, mécanisme detype cookie pour réinitialiser le contexte. Exemple : chariotd’achat

176 / 258

Page 180: E Services

Introduction Threads Réseau Outils EJB WS

146-180-250 Introduction Servlet et JSP BeansBeans session

Exemple de bean session stateless avec tags de précompilation (1) :

// interface pour un usage de type RMIimport javax.ejb.Remote;@Remotepublic interface HelloRemote {

String hello();}

// interface pour un usage localimport javax.ejb.Local;@Localpublic interface HelloLocal {

String hello();}

// code du bean sessionimport javax.ejb.Stateless;@Stateless // (mapped-name="nomPublic")public class HelloBean implements Hello {

public String hello() { return ("Hello world !"); }}

// code d’un objet-client de ce bean sessionimport 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

Page 181: E Services

Introduction Threads Réseau Outils EJB WS

146-181-250 Introduction Servlet et JSP BeansBeans session

Exemple de bean session stateless avec tags de précompilation (2) :installation sous Netbeans,

1 création d’un projet Java Enterprise Application :New Project -> Java EE -> Enterprise Application

2 création d’un session bean :New -> Session Bean

3 sélectionner Stateless4 sélectionner les interfaces souhaitées5 écrire le code métier dans la classe de bean session

Les interfaces sont mises à jour par défaut à chaqueméthode métier.Par défaut, l’objet est publié sous le nommonPaquetage.ClasseduBean

178 / 258

Page 182: E Services

Introduction Threads Réseau Outils EJB WS

146-182-250 Introduction Servlet et JSP BeansBeans session

Exemple de bean session stateful avec tags de précompilation (1) :import java.util.ArrayList;import java.util.List;import javax.ejb.Remove;import javax.ejb.Stateful;

@Statefulpublic 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; }

@Removepublic void remove() { contents = null; }

}

179 / 258

Page 183: E Services

Introduction Threads Réseau Outils EJB WS

146-183-250 Introduction Servlet et JSP BeansBeans session

Exemple de bean session stateful (2) :

// CartClient.javaimport java.util.*;import javax.naming.*; import javax.rmi.PortableRemoteObject;import tools.*; 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

Page 184: E Services

Introduction Threads Réseau Outils EJB WS

146-184-250 Introduction Servlet et JSP BeansBeans entité / JPA

Beans entité :vues d’une base de donnéesobligatoirement sérialisablespossibilité de générer la base à partir de beans entité, oul’inverseidentification d’un bean entité par une clé primairele type de la clé peut être une classe

181 / 258

Page 185: E Services

Introduction Threads Réseau Outils EJB WS

146-185-250 Introduction Servlet et JSP BeansBeans entité / JPA

(en EJB<3) 2 types de beans entité :Beans BMP (bean managed persistence) : la gestion de laBD sous-jacente est laissée au programmeurBeans CMP (container managed persistence) : leconteneur d’EJB gère le lien avec la BD

(en EJB3) mécanisme JPA subsumant les principesprécédents

Dans les 2 cas, la relation bean-BD se fait par un gestionnaired’entité EntityManager qui assure la synchronisation, et(cachée) une unité de persistence.

182 / 258

Page 186: E Services

Introduction Threads Réseau Outils EJB WS

146-186-250 Introduction Servlet et JSP BeansBeans entité / JPA

les appels BD sont définis vis à vis d’un langage spécifiqueEJB Query Languagenécessite de spécifier les liens entre classes dans unfichier de déploiement ou par des tags :

les variables des beans CMP définissent les colonnes destablesun schéma abstrait spécifie les liens entre beans :

One-to-one : relation biunivoque entre instances de beansOne-to-many, Many-to-one, Many-to-many : du mêmegenre

183 / 258

Page 187: E Services

Introduction Threads Réseau Outils EJB WS

146-187-250 Introduction Servlet et JSP BeansUn premier exemple de Beans entité sous ejb3

Bean entité ejb3 : premier exemple (1)import java.io.Serializable;import javax.persistence.*;import static javax.persistence.CascadeType.*;import java.util.*;

@Entitypublic class Customer implements Serializable {

@Idprivate 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

Page 188: E Services

Introduction Threads Réseau Outils EJB WS

146-188-250 Introduction Servlet et JSP BeansUn premier exemple de Beans entité sous ejb3

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

// création de la fabrique de gestionnaire d’entitésemf = Persistence.createEntityManagerFactory("pu");

// Entrée de donnéesem = emf.createEntityManager();em.getTransaction().begin(); insert(); em.getTransaction().commit();em.close();

// Extraction de donnéesem = 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

Page 189: E Services

Introduction Threads Réseau Outils EJB WS

146-189-250 Introduction Servlet et JSP BeansBeans entité CMP

Bean entité CMP :le code du bean ne contient aucun appel explicite vers uneBDdonc la classe est indépendante du type de BDsous-jacentla synchronisation avec la BD est implicite

186 / 258

Page 190: E Services

Introduction Threads Réseau Outils EJB WS

146-190-250 Introduction Servlet et JSP BeansBeans entité CMP

Bean entité CMP : exemple (1)import java.util.*; import javax.ejb.*; import javax.naming.*;

public abstract class CustomerBean implements EntityBean {private EntityContext context;

//méthodes d’accèspublic abstract String getID(); //primary keypublic 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);

//méthodes métierpublic 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

Page 191: E Services

Introduction Threads Réseau Outils EJB WS

146-191-250 Introduction Servlet et JSP BeansBeans entité CMP

Bean entité CMP : exemple (1 suite)...// méthodes de paramétrage 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

Page 192: E Services

Introduction Threads Réseau Outils EJB WS

146-192-250 Introduction Servlet et JSP BeansBeans entité CMP

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

Page 193: E Services

Introduction Threads Réseau Outils EJB WS

146-193-250 Introduction Servlet et JSP BeansBeans entité CMP

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>

... méthodes accessibles d’un client ...</assembly-descriptor>

</ejb-jar>

190 / 258

Page 194: E Services

Introduction Threads Réseau Outils EJB WS

146-194-250 Introduction Servlet et JSP BeansBeans entité CMP

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

Page 195: E Services

Introduction Threads Réseau Outils EJB WS

146-195-250 Introduction Servlet et JSP BeansBeans entité BMP

Bean entité BMP :la gestion vers la BD est laissée à la charge duprogrammeurla structure globale est la même avec des méthodes detype ejbXxx()

n’est utile que si la connexion avec la BD est complexe(multi-sources, gestion avec contrôle spécifique, ...)le code du client est le même que dans le cas CMPles descripteurs de compilation et déploiement sontsimplifiés

192 / 258

Page 196: E Services

Introduction Threads Réseau Outils EJB WS

146-196-250 Introduction Servlet et JSP BeansBeans entité BMP

Bean entité BMP : exemple (partie d’un 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

Page 197: E Services

Introduction Threads Réseau Outils EJB WS

146-197-250 Introduction Servlet et JSP BeansSur les annotations en Java

Sur les annotations en Java :

Une annotation est une méta-donnée permettant àl’“environnement”

de générer des fichiers de configuration (pour ledéploiement, la compilation finale)de générer des interfaces (en précisant les méthodes à yinclure), des classes subsidiaires, ...de lier des noms de méthodes ou de spécifier des nomsexternes (base de donnée, ...)de déterminer des informations annexes (documentation,tests,...)

194 / 258

Page 198: E Services

Introduction Threads Réseau Outils EJB WS

146-198-250 Introduction Servlet et JSP BeansSur les annotations en Java

Une annotation est inscrite dans le code java même encommençant par le symbole @.L’environnement doit comprendre des programmespermettant d’interpréter les annotations.L’interprétation des annotations peut avoir lieu sur le fichier.java ou sur le fichier .class si l’annotation y estconservée (i.e. la méta-annotation @Retention est utiliséedans le fichier source).Les annotations sont disponibles depuis la version 5 deJava.

195 / 258

Page 199: E Services

Introduction Threads Réseau Outils EJB WS

146-199-250 Introduction Servlet et JSP BeansSur les annotations en Java

Une annotation se pose avant n’importe quel modifieur(p.e. public) d’une classe, d’une méthode ...Ele peut être combinée en une séquence d’annotationsUne annotation peut annotée une autre annotationune annotation est posée dans un programme java :

...@MonAnnotation(

unAttribut = 12345,unAutreAttribut = "une valeur",

)public static void maMethode(...) { ... }...

ou...@UneAutreAnnotationpublic class MaClasse(...)

{ ... }...

ou...@UneDerniereAnnotation("une valeur")public class MaClasse(...)

{ ... }...

(si l’annotation n’a qu’un attribut denom String value())

196 / 258

Page 200: E Services

Introduction Threads Réseau Outils EJB WS

146-200-250 Introduction Servlet et JSP BeansSur les annotations en Java

une annotation est définie dans un programme Javacomme un ensemble éventuellement vide d’attributs :

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)public @interface MonAnnotation {

int unAttribut();String unAutreAttribut();

}

une annotation est utilisée 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 l’exemple précédent, il faut que l’annotation ait étéconservée dans le fichier .class, d’où l’utilisation del’annotation Retention (cf plus loin)

197 / 258

Page 201: E Services

Introduction Threads Réseau Outils EJB WS

146-201-250 Introduction Servlet et JSP BeansSur les annotations en Java

Pour chaque type d’annotation javac recherche dans sonenvironnement (classpath) une classe dont le nom est celle dutype d’annotation. Il ajoute alors au code compilé le contenu del’annotation (valeurs par défaut, ...).Plus de 60 annotations en standard dont :

@Deprecated : (devant une méthode) indique que laméthode qui suit n’est pas recommandée (i.e. son usagegénèrera un warning)@Override : (devant une méthode) indique que la méthodequi suit doit surcharger une méthode d’une super-classe@SuppressWarnings(type) : supprime les warnings pour letype donné ("deprecation", "all",...)

198 / 258

Page 202: E Services

Introduction Threads Réseau Outils EJB WS

146-202-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : annotation standard sur un code javaimport 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");

}}// @Overridepublic String toZtring () {return super.toString();

}}

Sans suppression des commentaires :

$ javac Test.java$ javac -Xlint Test.javaTest.java:7: warning: [fallthrough]

possible fall-through into casedefault: System.out.println("Default");^

1 warning$

Avec @Override décommenté :

$ javac Test.javaTest.java:10: method does not override

or implement a method from a supertype@Override^

1 error$

Avec @SuppressWarnings décom-menté :

$ javac -Xlint Test.java$

199 / 258

Page 203: E Services

Introduction Threads Réseau Outils EJB WS

146-203-250 Introduction Servlet et JSP BeansSur les annotations en Java

Les méta-annotations sont en particulier utiles pour définir desannotations. Par exemple :

@Retention(type) : méta-annotation qui conserve selon letype (RetentionPolicy.RUNTIME dans le code et aprèschargement dans la VM, RetentionPolicy.CODE dans lecode seulement) l’annotation utilisée dans un programme.@Target(type) : méta-annotation qui précise sur quoi peutêtre appliquée l’annotation (ElementType.METHOD pour uneméthode, ElementType.TYPE pour une classe, uneinterface, ...).

200 / 258

Page 204: E Services

Introduction Threads Réseau Outils EJB WS

146-204-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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 l’application

}

public void methB() {GestionAudit.gestion(this,"methB");// code de l’application

}}

$javac *.java$java Test[Audit] appel de methA$

201 / 258

Page 205: E Services

Introduction Threads Réseau Outils EJB WS

146-205-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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 l’application

}

public void methB() {GestionAudit.gestion(this,"methB");// code de l’application

}}

$javac *.java$java Test[Audit] appel de methA$

l’annotation Audit seraconservée à l’exécution

201 / 258

Page 206: E Services

Introduction Threads Réseau Outils EJB WS

146-206-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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 l’application

}

public void methB() {GestionAudit.gestion(this,"methB");// code de l’application

}}

$javac *.java$java Test[Audit] appel de methA$

déclaration de l’annotation

appel à l’exécution, traitementselon la valeur de l’annotation(cf slide suivant)

201 / 258

Page 207: E Services

Introduction Threads Réseau Outils EJB WS

146-207-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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;

// Récupérer la méthode appelée.Method method = object.getClass().getMethod(methodName, paramTypesArray);

// S’il n’y a pas d’annotation, autoriser l’appelif( !method.isAnnotationPresent(Audit.class) ) return;

// Récupérer la donnée de l’annotation, s’il faut auditer alors le faireAudit auditValue = method.getAnnotation(Audit.class);if( auditValue.value() ) audit("[Audit] appel de " + methodName);

} catch (Exception e) { audit("[Audit exception] sur l’appel de " + methodName);}

}private static void audit(String msg) { System.err.println(msg); }

}

202 / 258

Page 208: E Services

Introduction Threads Réseau Outils EJB WS

146-208-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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;

// Récupérer la méthode appelée.Method method = object.getClass().getMethod(methodName, paramTypesArray);

// S’il n’y a pas d’annotation, autoriser l’appelif( !method.isAnnotationPresent(Audit.class) ) return;

// Récupérer la donnée de l’annotation, s’il faut auditer alors le faireAudit auditValue = method.getAnnotation(Audit.class);if( auditValue.value() ) audit("[Audit] appel de " + methodName);

} catch (Exception e) { audit("[Audit exception] sur l’appel de " + methodName);}

}private static void audit(String msg) { System.err.println(msg); }

}

nombre variable d’arguments(varargs, Java 5)

utilisation de la réflexivitédans Java

202 / 258

Page 209: E Services

Introduction Threads Réseau Outils EJB WS

146-209-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement manuel à l’exécution (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;

// Récupérer la méthode appelée.Method method = object.getClass().getMethod(methodName, paramTypesArray);

// S’il n’y a pas d’annotation, autoriser l’appelif( !method.isAnnotationPresent(Audit.class) ) return;

// Récupérer la donnée de l’annotation, s’il faut auditer alors le faireAudit auditValue = method.getAnnotation(Audit.class);if( auditValue.value() ) audit("[Audit] appel de " + methodName);

} catch (Exception e) { audit("[Audit exception] sur l’appel de " + methodName);}

}private static void audit(String msg) { System.err.println(msg); }

}

test de présence de l’annota-tion associée au code de laméthode (rétention de la dé-claration dans le code source)

test de sa valeur

202 / 258

Page 210: E Services

Introduction Threads Réseau Outils EJB WS

146-210-250 Introduction Servlet et JSP BeansSur les annotations en Java

Les annotations sont principalement gérées en phase decompilation :

En Java 1.5 : l’outil apt (annotation processing tool) sert autraitement des annotations. Etant séparé du compilateur, lagestion est complexe.En Java 6 : javac intègre le traitement des annotations parun double mécanisme :

une structure liée aux constructions du langageune structure liée à l’arbre de syntaxe abstraite (ASP)

203 / 258

Page 211: E Services

Introduction Threads Réseau Outils EJB WS

146-211-250 Introduction Servlet et JSP BeansSur les annotations en Java

En Java 6, double mécanisme,(javax.lang.model.element) l’interface Element et sessous-interfaces caractérisent un constructeur du langage(paquet, type, classe, méthode). Permet de connaître lessous- et sur-éléments constructeurs. Ne permet pas a prioride connaître le contenu opérationnel.(p.e. com.sun.source.tree) l’interface Tree et sessous-interfaces caractérisent l’ASP de Java vu par lecompilateur. Permet de connaître les sous-et sur-élémentsconstructeurs, structures du langage (boucle, ...), etd’accéder au bloc du fichier source associé.Dans les 2 cas, possibilité d’utiliser le pattern visitor(méthode accept(v) où v est un visiteur (implantation deElementVisitor ou TreeVisitor) implantant desméthodes visitXXX()

204 / 258

Page 212: E Services

Introduction Threads Réseau Outils EJB WS

146-212-250 Introduction Servlet et JSP BeansSur les annotations en Java

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");

}}

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Audit {

// true: les accès à cette méthode// sont écrits dans un fichier d’auditboolean value() default false;

}

public class Application {@Audit(true)public void methA(String s) {

int i = 0;// code de l’application

}

@Audit(false)public void methB(String s) {

// code de l’application}

@Deprecatedpublic void methC() {

// code de l’application}

}

205 / 258

Page 213: E Services

Introduction Threads Réseau Outils EJB WS

146-213-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (2)%javac Application.java%javac Test.javaNote: 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.javamethA(java.lang.String) :Valeur de l’annotation associee = trueMETHODMethod methA: nullBody: {

int i = 0;}methB(java.lang.String) :Valeur de l’annotation associee = falseMETHODMethod methB: nullBody: {}

206 / 258

Page 214: E Services

Introduction Threads Réseau Outils EJB WS

146-214-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (2)%javac Application.java%javac Test.javaNote: 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.javamethA(java.lang.String) :Valeur de l’annotation associee = trueMETHODMethod methA: nullBody: {

int i = 0;}methB(java.lang.String) :Valeur de l’annotation associee = falseMETHODMethod methB: nullBody: {}

annotations Audit et Depreca-ted gardées dans le code

le code associé à l’annotationDeprecated génère un war-ning

206 / 258

Page 215: E Services

Introduction Threads Réseau Outils EJB WS

146-215-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (2)%javac Application.java%javac Test.javaNote: 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.javamethA(java.lang.String) :Valeur de l’annotation associee = trueMETHODMethod methA: nullBody: {

int i = 0;}methB(java.lang.String) :Valeur de l’annotation associee = falseMETHODMethod methB: nullBody: {}

jar contenant les classespermettant le preprocessing(analyse d’ASP, ...)

le code associé à l’annotationAudit est exécuté

206 / 258

Page 216: E Services

Introduction Threads Réseau Outils EJB WS

146-216-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (3)import java.util.*;import javax.annotation.processing.*;import javax.lang.model.*;import 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 l’annotation associée = "

+ element.getAnnotation(Audit.class).value());System.out.println(element.getKind());auditVisitor.visit(element,null);

}return false;

}}

207 / 258

Page 217: E Services

Introduction Threads Réseau Outils EJB WS

146-217-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (3)import java.util.*;import javax.annotation.processing.*;import javax.lang.model.*;import 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 l’annotation associée = "

+ element.getAnnotation(Audit.class).value());System.out.println(element.getKind());auditVisitor.visit(element,null);

}return false;

}}

Liste des annotations géréespar cette classe-processeur

Spécification de la release deJava nécessaire

207 / 258

Page 218: E Services

Introduction Threads Réseau Outils EJB WS

146-218-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Traitement via le compilateur (3)import java.util.*;import javax.annotation.processing.*;import javax.lang.model.*;import 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 l’annotation associée = "

+ element.getAnnotation(Audit.class).value());System.out.println(element.getKind());auditVisitor.visit(element,null);

}return false;

}}

classe-processeur par défaut

instanciation (p.e. par javac)avec l’environnement de com-pilation

processing sur l’environne-ment courant pour les anno-tations en 1er argument, sireturn true alors annotationsnon analysées par les proces-seurs suivants

207 / 258

Page 219: E Services

Introduction Threads Réseau Outils EJB WS

146-219-250 Introduction Servlet et JSP BeansSur les annotations en Java

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

Page 220: E Services

Introduction Threads Réseau Outils EJB WS

146-220-250 Introduction Servlet et JSP BeansSur les annotations en Java

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

...}

Classe parcourant l’AST Type de retour de la méthodevisit

Type de l’argument de la mé-thode visit

208 / 258

Page 221: E Services

Introduction Threads Réseau Outils EJB WS

146-221-250 Introduction Servlet et JSP BeansSur les annotations en Java

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

...}

méthode standard de visited’un élément

Objet noeud de l’AST (ici mé-thode) permettant l’accès aucorps, au nom, aux para-mètres, ...

208 / 258

Page 222: E Services

Introduction Threads Réseau Outils EJB WS

146-222-250 Introduction Servlet et JSP BeansSur les annotations en Java

Dernier exemple : JAXB et traitement XML

JAXB est une API permettant le traitement Java de/versXMLla commande xjc permet de générer des classes Java àpartir d’un schéma XML, et contenant des annotationspour le traitement XML (la commande utilise un JavaBinding Compiler, xbj)la classe JAXBContext (de javax.xml.bind) intègre unanalyseur/générateur XML qui fonctionne en utilisant lesannotations des classes considéréesOpérations disponibles :

analyse (unmarshall) de documents XML en générant unobjet Java (équivalent au principe DOM)validation de l’objet Java étant donné un schéma XMLgénération d’un fichier XML à partir d’un objet

209 / 258

Page 223: E Services

Introduction Threads Réseau Outils EJB WS

146-223-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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

Page 224: E Services

Introduction Threads Réseau Outils EJB WS

146-224-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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>

un élément XML

210 / 258

Page 225: E Services

Introduction Threads Réseau Outils EJB WS

146-225-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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>

une formation :

a un intitulé (attributobligatoire)

210 / 258

Page 226: E Services

Introduction Threads Réseau Outils EJB WS

146-226-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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>

une formation :

inclut un respon-sable

inclut des étudiants

210 / 258

Page 227: E Services

Introduction Threads Réseau Outils EJB WS

146-227-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 XMLunmarshaller.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());

// création de donnéesTypeFormation uneAutreFormation = new TypeFormation();uneAutreFormation.setIntitule("M2EID");

// Génération XMLJAXBElement<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

Page 228: E Services

Introduction Threads Réseau Outils EJB WS

146-228-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 XMLunmarshaller.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());

// création de donnéesTypeFormation uneAutreFormation = new TypeFormation();uneAutreFormation.setIntitule("M2EID");

// Génération XMLJAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()).

createFormation(uneAutreFormation);Marshaller marshaller = jaxbContext.createMarshaller();marshaller.marshal( uneAFJAXB, System.out );

} catch (JAXBException e) {System.err.println(e);}} }

créedans ce paquetage(-p)

mis dans ce réper-toire (-d)

pour ce schémaXML (.xsd)

un fichier ObjectFactory.java(intermédiaire objets JAXB -données)et un fichier-classe par typedécrit dans le schéma (cf p.e.slide suivant)

211 / 258

Page 229: E Services

Introduction Threads Réseau Outils EJB WS

146-229-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 XMLunmarshaller.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());

// création de donnéesTypeFormation uneAutreFormation = new TypeFormation();uneAutreFormation.setIntitule("M2EID");

// Génération XMLJAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()).

createFormation(uneAutreFormation);Marshaller marshaller = jaxbContext.createMarshaller();marshaller.marshal( uneAFJAXB, System.out );

} catch (JAXBException e) {System.err.println(e);}} }

Objet contexte per-mettant la créationde :

- un objet analyseurde documents XML

analyse d’un document XMLet constitution d’in objetJAXB (vue) dans la VM

211 / 258

Page 230: E Services

Introduction Threads Réseau Outils EJB WS

146-230-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 XMLunmarshaller.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());

// création de donnéesTypeFormation uneAutreFormation = new TypeFormation();uneAutreFormation.setIntitule("M2EID");

// Génération XMLJAXBElement<TypeFormation> uneAFJAXB = (new up13.formation.ObjectFactory()).

createFormation(uneAutreFormation);Marshaller marshaller = jaxbContext.createMarshaller();marshaller.marshal( uneAFJAXB, System.out );

} catch (JAXBException e) {System.err.println(e);}} }

Objet contexte per-mettant la créationde :

- un objet généra-teur de documentsXML

création d’un objet JAXBà partir d’un type duschéma XML

envoi d’un objet JAXBvers un flux de sortie

211 / 258

Page 231: E Services

Introduction Threads Réseau Outils EJB WS

146-231-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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

Page 232: E Services

Introduction Threads Réseau Outils EJB WS

146-232-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 définition de formation invalide : "

+ locator.getURL());System.out.println("Erreur : " + ve.getMessage());System.out.println("Colonne " +

locator.getColumnNumber() +", ligne "+ locator.getLineNumber());

}return true;

}}

213 / 258

Page 233: E Services

Introduction Threads Réseau Outils EJB WS

146-233-250 Introduction Servlet et JSP BeansSur les annotations en Java

Exemple : Données de formation d’enseignement (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 définition de formation invalide : "

+ locator.getURL());System.out.println("Erreur : " + ve.getMessage());System.out.println("Colonne " +

locator.getColumnNumber() +", ligne "+ locator.getLineNumber());

}return true;

}}

Gestionnaire d’événementspour l’analyseur XML (casd’erreurs, ...)

213 / 258

Page 234: E Services

Introduction Threads Réseau Outils EJB WS

146-234-250 Introduction Servlet et JSP BeansBeans entité ejb3

Retour sur les Beans entité ejb3 :un bean entité est une classe (abstraite ou concrète), i.e.un POJO (Plain Old Java Object)le code peut utiliser des annotations via celles décritesdans javax.persistence.Entity

dans ce cas, les descripteurs (lien avec BD, requêtes, ...)peuvent être générés automatiquementpossibilité de définir dans le code le type de gestionla génération des tables peut être automatique

214 / 258

Page 235: E Services

Introduction Threads Réseau Outils EJB WS

146-235-250 Introduction Servlet et JSP BeansBeans entité ejb3

Bean entité ejb3 : exempleimport 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;

} }

@Embeddablepublic class Niveau implements Serializable {

protected String cycle;protected String annee;public String getAnnee() { return annee; }...

}

215 / 258

Page 236: E Services

Introduction Threads Réseau Outils EJB WS

146-236-250 Introduction Servlet et JSP BeansBeans entité ejb3

Il est possible d’associer une hiérarchie d’entités à une ouplusieurs tables :

SINGLE_TABLE : une unique table, un discriminateur pourdistinguer les sous-classesTABLE_PER_CLASS : une table par classe concrèteJOINED : une table pour les champs communs, une tablepour les champs propres aux sous-classes, opérationsimplicites de jointure générées

@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

Page 237: E Services

Introduction Threads Réseau Outils EJB WS

146-237-250 Introduction Servlet et JSP BeansBeans entité ejb3

Les opérations avec la BD se font avec les éléments suivants :pour les classes-entités à gérer :

l’unité de persistence est définie comme une entrée dansun fichier XML persistence.xml déclarant les propriétésnécessaires : classes-entités gérées par cette unité,fournisseur du service (i.e. ensemble des classes faisant lagestion concrète de persistence), nom symbolique “de laBD”le nom symbolique “de la BD” permet, via le serveur JNDIcourant, de connaître l’URL de la BD (donc le protocole, leport, le nom réel de la BD, ...)

217 / 258

Page 238: E Services

Introduction Threads Réseau Outils EJB WS

146-238-250 Introduction Servlet et JSP BeansBeans entité ejb3

pour les codes utilisant ces classes-entités :un EntityManager permet d’effectuer les demandes delecture/écriture/synchronisation pour/sur des entitéscet EntityManager peut être à gestion automatique (exCMP) ou à gestion manuelle (ex BMP) (manuel = créationdes requêtes, appel explicite de la BD, ...)cet EntityManager est paramétré par une unité depersistence (via un contexte de persistence si gestionautomatique).

218 / 258

Page 239: E Services

Introduction Threads Réseau Outils EJB WS

146-239-250 Introduction Servlet et JSP BeansBeans entité ejb3

Exemple :// cas type CMPpublic class EtudiantClient {

@PersistenceContext(unitName="EtudiantUP")private EntityManager em;

public void create(Etudiant etudiant) {em.persist(etudiant);em.close();

}...

}

// cas type BMPpublic 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

Page 240: E Services

Introduction Threads Réseau Outils EJB WS

146-240-250 Introduction Servlet et JSP BeansBeans entité ejb3

Pour un environnement de type web + bean session + beanentité (p.e. sous netbeans) :

on crée les beans entitéon crée des facades pour ces beans entité, i.e. des beanssession avec leur interface, intégrant des méthodes pardéfaut (create(), find(), ...) (cf menuNew -> Session Beans for Entity classes)on crée par exemple une servlet, ou une JSP, et on injectele code permettant l’appel d’un bean session (cf menuInsert Code -> Call Enterprise Bean ... ou ajout de@EJB private EtudiantFacadeLocal monEtudiant)

220 / 258

Page 241: E Services

Introduction Threads Réseau Outils EJB WS

146-241-250 Introduction Servlet et JSP BeansBeans message

Gestion de messages (beans messages et paquetage JMS)

Objets session et entité : synchrones => le client attendObjets message :

asynchrones => le récepteur peut être en sommeilgarantie de livraison (ack)uni ou multicast

221 / 258

Page 242: E Services

Introduction Threads Réseau Outils EJB WS

146-242-250 Introduction Servlet et JSP BeansBeans message

Principe :un ou plusieurs clients (beans ou non) envoient desmessages à une queueun message-driven bean extrait de manière asynchroneles messages de la queue et les traiteou bien des lecteurs reçoivent / vont chercher lesmessages

222 / 258

Page 243: E Services

Introduction Threads Réseau Outils EJB WS

146-243-250 Introduction Servlet et JSP BeansBeans message

Au préalable à tout développement de ce type, il faut unserveur de gestion de messages intégré à votre serveurd’application :

soit externe (windows message server, ...)soit interne au serveur d’application (dans Sun JavaApplication Server, Glassfish, ...)

223 / 258

Page 244: E Services

Introduction Threads Réseau Outils EJB WS

146-244-250 Introduction Servlet et JSP BeansBeans message

A noter qu’a priori une version téléchargée de Glassfishn’incorpore pas un tel serveur. Il faut l’inclure via les plug-inpour Glassfish.

Sous Glassfish dans Netbeans, il doit exister un serveur JMS(dans les ressources serveurs) puis :

créer une fabrique de connexions dont le type peut êtrejavax.jmsConnectionFactory,créer une queue dans les ressources de destination dontle type peut être javax.JMS.Queue.

224 / 258

Page 245: E Services

Introduction Threads Réseau Outils EJB WS

146-245-250 Introduction Servlet et JSP BeansBeans message

2 modes sont disponibles :mode point à point (Queue) : d’un client à un consommateurmode publication/abonnement (Topic) : d’un client à unensemble de consommateurs

Un client envoie des messages à une queue d’une fabriquegestionnaire de messages (spécifiée par un nom JNDI).Le code d’un client doit donc contenir :

une instance de la classe ConnectionFactory créée par unappel au serveur JNDI direct ou par une annotationune instance de la classe Queue ou Topic créée par unappel au serveur JNDI direct ou par une annotation

225 / 258

Page 246: E Services

Introduction Threads Réseau Outils EJB WS

146-246-250 Introduction Servlet et JSP BeansBeans message

Exemple d’instance de ConnectionFactory :// cas de création d’instance 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 création d’instance par utilisation d’annotations...@Resource(mappedName="jms/ConnectionFactory")private static ConnectionFactory connectionFactory;

@Resource(mappedName="jms/Queue")private static Queue queue;...

226 / 258

Page 247: E Services

Introduction Threads Réseau Outils EJB WS

146-247-250 Introduction Servlet et JSP BeansBeans message

Il ne reste plus au client qu’à créer la connexion, la session, leproducteur de message, et d’envoyer des messages : (un peucomme 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

Page 248: E Services

Introduction Threads Réseau Outils EJB WS

146-248-250 Introduction Servlet et JSP BeansBeans message

2 possibilités de réception de message :Un écouteur de message est un Message-Driven Bean(MDB) qui implante MessageListener. Un message estreçu et traité par la méthode spécifique onMessage.Un consommateur de message est une instance deMessageConsumer. On peut alors recevoir des messagespar appel synchrone.

228 / 258

Page 249: E Services

Introduction Threads Réseau Outils EJB WS

146-249-250 Introduction Servlet et JSP BeansBeans message

Exemple d’écouteur de message :@MessageDriven(mappedName="jms/Queue")public class SimpleMessageBean implements MessageListener {

@Resourceprivate 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 d’un type non espere : " +inMessage.getClass().getName());

}} catch (JMSException e) {

e.printStackTrace();mdc.setRollbackOnly();

} catch (Throwable te) {te.printStackTrace();

}}}

229 / 258

Page 250: E Services

Introduction Threads Réseau Outils EJB WS

146-250-250 Introduction Servlet et JSP BeansBeans message

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

Page 251: E Services

Introduction Threads Réseau Outils EJB WS

251-251-291 Introduction WSDL et UDDI REST

6 Web Services et J2EEWeb Services : introductionWSDL et UDDIREST

231 / 258

Page 252: E Services

Introduction Threads Réseau Outils EJB WS

251-252-291 Introduction WSDL et UDDI REST

6 Web Services et J2EEWeb Services : introductionWSDL et UDDIREST

232 / 258

Page 253: E Services

Introduction Threads Réseau Outils EJB WS

251-253-291 Introduction WSDL et UDDI REST

Les Web Services :

permettent de faire communiquer deux sous-systèmesd’architectures semblables ou différentes de manièrestandarddans le but d’échanger des services ou traitementsapplicatifs

Deux modèles de web services selon le protocole d’échange :via CorbaRPC : appels de méthodes à distance aprèsdécouverte du service (modèle SOAP-RMI)via http simple : utilisation directe d’URI (modèle REST)par GET/POST

233 / 258

Page 254: E Services

Introduction Threads Réseau Outils EJB WS

251-254-291 Introduction WSDL et UDDI REST

6 Web Services et J2EEWeb Services : introductionWSDL et UDDIREST

234 / 258

Page 255: E Services

Introduction Threads Réseau Outils EJB WS

251-255-291 Introduction WSDL et UDDI REST

par appel de méthode : le W3C a défini la pile de protocolesun service de transport :

HTTP, Hypertext Transfer Protocolun système de messages XML :

SOAP, Simple Object Access Protocolune description des services :

WSDL, Web Services Description Languageun système de découverte des services :

UDDI, Universal Description Discovery and Integration

235 / 258

Page 256: E Services

Introduction Threads Réseau Outils EJB WS

251-256-291 Introduction WSDL et UDDI REST

UDDI est un annuaire qui permet de stocker des informationssur des services web.

Objectif : fournir une architecture de Publication /Découverte / Lien de services web.Suppose des standards de description de services, i.e.catégorisation industrielle de services (cf NAICS,UN/SPSC, ...)

Très peu utilisé depuis 2006, reste en intranet

236 / 258

Page 257: E Services

Introduction Threads Réseau Outils EJB WS

251-257-291 Introduction WSDL et UDDI REST

Il peut être présenté en 3 parties :pages blanches : listent les entreprises ainsi que desinformations associées à ces dernières (Provider),pages jaunes : recensent les services web (Service) dechacune des entreprises avec le lien vers une implantationdu service (Binding) sous le standard WSDL,pages vertes : fournissent des informations techniquesprécises sur les services fournis (tModel).

237 / 258

Page 258: E Services

Introduction Threads Réseau Outils EJB WS

251-258-291 Introduction WSDL et UDDI REST

<businessEntity businessKey="..."><name>Nom de l’entreprise</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

Page 259: E Services

Introduction Threads Réseau Outils EJB WS

251-259-291 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

Page 260: E Services

Introduction Threads Réseau Outils EJB WS

251-260-291 Introduction WSDL et UDDI REST

Une requête sur un serveur UDDI est aussi un fichier au formatXML :

<find_tModel generic="1.0" xmlns="urn:uddi-org:api"><categoryBag>

<keyedReferencetModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"keyName="uddi-org:types"keyValue="wsdlSpec"/>

<keyedReferencetModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384"keyName="Stock market trading services"keyValue="84121801"/>

</categoryBag></find_tModel>

240 / 258

Page 261: E Services

Introduction Threads Réseau Outils EJB WS

251-261-291 Introduction WSDL et UDDI REST

Une requête sur un serveur UDDI est aussi un fichier au formatXML :

<find_tModel generic="1.0" xmlns="urn:uddi-org:api"><categoryBag>

<keyedReferencetModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"keyName="uddi-org:types"keyValue="wsdlSpec"/>

<keyedReferencetModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384"keyName="Stock market trading services"keyValue="84121801"/>

</categoryBag></find_tModel>

Nom de la requête

Spécification du ser-vice recherché relati-vement à une ontolo-gie de services

240 / 258

Page 262: E Services

Introduction Threads Réseau Outils EJB WS

251-262-291 Introduction WSDL et UDDI REST

WSDL, 2 niveaux de description d’un ou plusieurs servicesdans un même fichier au format XML :

Abstrait : description générique des services proposésConcret : implantation des services décrits abstraitement

241 / 258

Page 263: E Services

Introduction Threads Réseau Outils EJB WS

251-263-291 Introduction WSDL et UDDI REST

WSDL

Niveau abstrait :Un type de port ( offre de service) est défini par unensemble d’opérationsChaque opération fait référence à un ou plusieursmessages (i.e. occurrence d’un appel ou d’une réponse)Un message est défini par un nom, un ensemble decouples attribut-valeur typés

Niveau concret :Un binding implante un type de port en spécifiant lesprotocoles concrets utilisés pour chaque opérationUn service précise pour un binding l’adresse à utiliser

242 / 258

Page 264: E Services

Introduction Threads Réseau Outils EJB WS

251-264-291 Introduction WSDL et UDDI REST

Exemple (1) : Un fichier WSDL<?xml version=’1.0’ encoding=’UTF-8’?>

<definitionsxmlns: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 :Policyxmlns: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 opérations -->

...

243 / 258

Page 265: E Services

Introduction Threads Réseau Outils EJB WS

251-265-291 Introduction WSDL et UDDI REST

Exemple (1) : Un fichier WSDL<?xml version=’1.0’ encoding=’UTF-8’?>

<definitionsxmlns: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 :Policyxmlns: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 opérations -->

...

Spécification des espaces denoms nécessaires (charge-ment pour l’analyse de ce fi-chier)

Politiques d’utilisation pourune opération (encryptage ounon, horodatage, ...)

243 / 258

Page 266: E Services

Introduction Threads Réseau Outils EJB WS

251-266-291 Introduction WSDL et UDDI REST

Exemple (1) : Un fichier WSDL<?xml version=’1.0’ encoding=’UTF-8’?>

<definitionsxmlns: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 :Policyxmlns: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 opérations -->

...

Politiques d’utilisation pourune opération (encryptage ounon, horodatage, ...)

nom d’identifiant de la poli-tique le client choisit une politique

parmi ce qui suit

le client doit satisfaire à tousles critères dans ce qui suit

indique qu’une transaction atomiquedébute/finit avec une requête sauf si leclient fournit un contexte transactionnel

243 / 258

Page 267: E Services

Introduction Threads Réseau Outils EJB WS

251-267-291 Introduction WSDL et UDDI REST

Exemple (2) :...

<types><xsd:schema>

<xsd:importnamespace="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. requête de méthode) -->

<portType name="PizzaWS"><operation name="findAll">

<inputwsam:Action="http ://WS/PizzaWS/findAllRequest"message="tns:findAll" />

<outputwsam:Action="http ://WS/PizzaWS/findAllResponse"message="tns:findAllResponse" />

</operation><!-- ... pour chacune des opérations --></portType>

...

244 / 258

Page 268: E Services

Introduction Threads Réseau Outils EJB WS

251-268-291 Introduction WSDL et UDDI REST

Exemple (2) :...

<types><xsd:schema>

<xsd:importnamespace="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. requête de méthode) -->

<portType name="PizzaWS"><operation name="findAll">

<inputwsam:Action="http ://WS/PizzaWS/findAllRequest"message="tns:findAll" />

<outputwsam:Action="http ://WS/PizzaWS/findAllResponse"message="tns:findAllResponse" />

</operation><!-- ... pour chacune des opérations --></portType>

...

Définition des types de don-nées utilisées dans les requê-tes/réponses

Spécification des types desparamètres nécessaires pourchaque message (i.e. mé-thode)

Spécification des opérationsdisponibles

244 / 258

Page 269: E Services

Introduction Threads Réseau Outils EJB WS

251-269-291 Introduction WSDL et UDDI REST

Exemple (2) :...

<types><xsd:schema>

<xsd:importnamespace="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. requête de méthode) -->

<portType name="PizzaWS"><operation name="findAll">

<inputwsam:Action="http ://WS/PizzaWS/findAllRequest"message="tns:findAll" />

<outputwsam:Action="http ://WS/PizzaWS/findAllResponse"message="tns:findAllResponse" />

</operation><!-- ... pour chacune des opérations --></portType>

...

Définition des types de don-nées utilisées dans les requê-tes/réponses

URL du schéma XSD définis-sant les types (cf Exemple (4))

244 / 258

Page 270: E Services

Introduction Threads Réseau Outils EJB WS

251-270-291 Introduction WSDL et UDDI REST

Exemple (2) :...

<types><xsd:schema>

<xsd:importnamespace="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. requête de méthode) -->

<portType name="PizzaWS"><operation name="findAll">

<inputwsam:Action="http ://WS/PizzaWS/findAllRequest"message="tns:findAll" />

<outputwsam:Action="http ://WS/PizzaWS/findAllResponse"message="tns:findAllResponse" />

</operation><!-- ... pour chacune des opérations --></portType>

...

Spécification des types desparamètres nécessaires pourchaque message (i.e. mé-thode)

le type (donné en XML) pour lemessage findAll

244 / 258

Page 271: E Services

Introduction Threads Réseau Outils EJB WS

251-271-291 Introduction WSDL et UDDI REST

Exemple (2) :...

<types><xsd:schema>

<xsd:importnamespace="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. requête de méthode) -->

<portType name="PizzaWS"><operation name="findAll">

<inputwsam:Action="http ://WS/PizzaWS/findAllRequest"message="tns:findAll" />

<outputwsam:Action="http ://WS/PizzaWS/findAllResponse"message="tns:findAllResponse" />

</operation><!-- ... pour chacune des opérations --></portType>

...

Spécification des opérationsdisponibles

L’opération findAll consiste à :

(1) envoyer une requête à l’URL men-tionné, les arguments ont les types in-diqués dessous

(2) recevoir une réponse via la re-quête mentionnée, les arguments ontles types indiqués dessous

244 / 258

Page 272: E Services

Introduction Threads Réseau Outils EJB WS

251-272-291 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 opérations -->

</binding>

<service name="PizzaWSService"><port name="PizzaWSPort" binding="tns:PizzaWSPortBinding">

<soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /></port>

</service></definitions>

245 / 258

Page 273: E Services

Introduction Threads Réseau Outils EJB WS

251-273-291 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 opérations -->

</binding>

<service name="PizzaWSService"><port name="PizzaWSPort" binding="tns:PizzaWSPortBinding">

<soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /></port>

</service></definitions>

Spécification de l’implanta-tion des opérations

Spécification de l’implanta-tion des services

245 / 258

Page 274: E Services

Introduction Threads Réseau Outils EJB WS

251-274-291 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 opérations -->

</binding>

<service name="PizzaWSService"><port name="PizzaWSPort" binding="tns:PizzaWSPortBinding">

<soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /></port>

</service></definitions>

Spécification de l’implanta-tion des opérations Protocole de transport utilisé

Politique utilisée

Encodage des entrées

Encodage des sorties

245 / 258

Page 275: E Services

Introduction Threads Réseau Outils EJB WS

251-275-291 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 opérations -->

</binding>

<service name="PizzaWSService"><port name="PizzaWSPort" binding="tns:PizzaWSPortBinding">

<soap:address location="http://localhost:8080/PizzaWSService/PizzaWS" /></port>

</service></definitions>

Spécification de l’implanta-tion des services lien service abstrait - service

concret

adresse du service

245 / 258

Page 276: E Services

Introduction Threads Réseau Outils EJB WS

251-276-291 Introduction WSDL et UDDI REST

Exemple (4) : Schéma XML des types de données pour unservice<?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 même pour chaque élément 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 même pour chaque type d’arguments -->

</xs:schema>

246 / 258

Page 277: E Services

Introduction Threads Réseau Outils EJB WS

251-277-291 Introduction WSDL et UDDI REST

Exemple (4) : Schéma XML des types de données pour unservice<?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 même pour chaque élément 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 même pour chaque type d’arguments -->

</xs:schema>

le type findAll n’a pas decontenu

le type findAllResponse a uncontenu stock

composition d’un stock

246 / 258

Page 278: E Services

Introduction Threads Réseau Outils EJB WS

251-278-291 Introduction WSDL et UDDI REST

6 Web Services et J2EEWeb Services : introductionWSDL et UDDIREST

247 / 258

Page 279: E Services

Introduction Threads Réseau Outils EJB WS

251-279-291 Introduction WSDL et UDDI REST

REST : Representational State Transfer n’est pas un protocolemais un paradigme.

imaginé par Roy Fielding (année 2000), un des auteurs duprotocole HTTPPas uniquement limité aux échanges machines /machines !

"Representational State Transfer is intended to evoke an imageof how a well-designed Web application behaves : a network ofweb pages (a virtual statemachine), where the user progressesthrough an application by selecting links (state transitions),resulting in the next page (representing the next state of theapplication) being transferred to the user and rendered for theiruse."

248 / 258

Page 280: E Services

Introduction Threads Réseau Outils EJB WS

251-280-291 Introduction WSDL et UDDI REST

les URI ont un sens !Chaque resource de l’application est accessible via uneURI uniqueLes opérations (cf principe CRUD : Create, Read, Update,Delete) sont uniformes entre les resourcesAucune notion d’état dans une suite d’actions (= pas desession utilisateur en HTTP)

249 / 258

Page 281: E Services

Introduction Threads Réseau Outils EJB WS

251-281-291 Introduction WSDL et UDDI REST

On peut imaginer une correspondence entre opérations HTTPet opérations CRUD :

GET correspond quasiment à une opération CRUD Read,toutefois GET permet un paramétrage plus fin qu’un simpleSELECT.DELETE correspond à l’opération CRUD DeletePUT correspond à l’opération CRUD Update, avec lesdifférences suivantes :

PUT suppose une substitution complète de la ressource,Update peut être partiel.PUT peut permettre de créer une ressource (quand l’URI estdéfini par le client)

POST est utilisé pour une opération CRUD Create. POSTpeut aussi être utilisé pour une mise à jour.

250 / 258

Page 282: E Services

Introduction Threads Réseau Outils EJB WS

251-282-291 Introduction WSDL et UDDI REST

Dans un système REST, les ressources sont manipulées paréchange de "représentations" :

une ressource (un achat par exemple) est représentée parun document XML,une opération (par exemple une commande) est effectuéepar une requête HTTP (POST avec comme contenu undocument XML) envoyé à un URI uniquel’état de la communication est maintenue à travers lareprésentation de la ressource

251 / 258

Page 283: E Services

Introduction Threads Réseau Outils EJB WS

251-283-291 Introduction WSDL et UDDI REST

REST :http://gasell.org/users/http://gasell.org/users/[id] (URI unique)http://gasell.org/findUseruser = new Resource("http://gasell.org/users/001")

RPC :getUser()addUser()removeUser()updateUser()findUser()example = new ExampleApp("gasell.org:1234")example.getUser()

252 / 258

Page 284: E Services

Introduction Threads Réseau Outils EJB WS

251-284-291 Introduction WSDL et UDDI REST

Une URI correspond à une ressource :

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

253 / 258

Page 285: E Services

Introduction Threads Réseau Outils EJB WS

251-285-291 Introduction WSDL et UDDI REST

Une URI correspond à une ressource :

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

Nom de la ressource

Clé d’accès

253 / 258

Page 286: E Services

Introduction Threads Réseau Outils EJB WS

251-286-291 Introduction WSDL et UDDI REST

En résumé :les ressources sont identifiées par une URIles "méthodes" sont identifiées par une requête http : GET,POST, PUT, DELETEune "représentation" est définie par des données et un étattransmis via XML

254 / 258

Page 287: E Services

Introduction Threads Réseau Outils EJB WS

251-287-291 Introduction WSDL et UDDI REST

RequêteGET /M2PLS/etudiant/2006276 HTTP/1.1Host: www.univ-paris13.frAccept: application/xml

RéponseHTTP/1.1 200 OKDate: Mon, 30 Nov 2009 11:13:43 GMTServer: Apache/1.3.6Content-Type: application/xml; charset=UTF-8<?xml version="1.0"?><etudiant xmlns="...">

<personal_data>...

</personal_data>...

</etudiant>

255 / 258

Page 288: E Services

Introduction Threads Réseau Outils EJB WS

251-288-291 Introduction WSDL et UDDI REST

RequêteGET /M2PLS/etudiant/2006276 HTTP/1.1Host: www.univ-paris13.frAccept: application/xml

RéponseHTTP/1.1 200 OKDate: Mon, 30 Nov 2009 11:13:43 GMTServer: Apache/1.3.6Content-Type: application/xml; charset=UTF-8<?xml version="1.0"?><etudiant xmlns="...">

<personal_data>...

</personal_data>...

</etudiant>

Méthode Ressource

Représentation

255 / 258

Page 289: E Services

Introduction Threads Réseau Outils EJB WS

251-289-291 Introduction WSDL et UDDI REST

Cas de J2EEJAXRS : gestion RESTful

JAXWS : gestion de web services avecJAXR publication de servicesJWSDL requête de services par web2.0JAXM gestion des messagesJAXRPC gestion des appels/réponses

256 / 258

Page 290: E Services

Introduction Threads Réseau Outils EJB WS

251-290-291 Introduction WSDL et UDDI REST

Création du service web :(Création d’un projet "Web Application" ou "EJB Module")Création dans le projet via "New Web Service" (donner unnom de package, e.g. org.up13.eid) ou à partir d’un beansessionAjouter des opérations (i.e. services)Modifier chaque code (via "Source")Run => déploiement et publication du serviceTest possible via le projet de web service

257 / 258

Page 291: E Services

Introduction Threads Réseau Outils EJB WS

251-291-291 Introduction WSDL et UDDI REST

Création d’un client :Définir un projet, ou un Web Application, ...Créer un fichier par "Web Service Client" en précisant leweb service à utiliser [cela charge via wsdl les opérationsdisponibles]Créer une servlet (ou un fichier java, ou une jsp, ...) et faireglisser l’opération souhaitée dans le code source [crée uneinstance de service, puis de port, puis d’appel d’opérationcôté client]Modifier le code selon les besoins

258 / 258