java pour les nulls

346
 PPOOGL Florent de Dinechin Java pour les nuls (et les physiciens)

Upload: halatra

Post on 22-Jul-2015

110 views

Category:

Documents


0 download

TRANSCRIPT

PPOOGLFlorent de Dinechin

Java pour les nuls (et les physiciens)

Java en 30 minutes

1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

1

Introduction1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

2

La premi`re fois que vous mettez votre main dans le java e

3

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class

3

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e

3

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle.

3

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle. Si on faisait une applet, cest pas une mthode main quil e faudrait.

3

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle. Si on faisait une applet, cest pas une mthode main quil e faudrait. Et voici le code source : class Hello { // pas dattributs ni de mthodes, sauf e // la mthode main, statique. e // cela veut dire quoi, statique, dja ? e public static void main(String[] args) { System.out.println("Hello, java ?"); } }3

Grands principes1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

4

Les trucs reposants Une classe, un chier

5

Les trucs reposants Une classe, un chier

Pas de chiers .h

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea Les chemins pour la compilation, pour ldition de liens et pour e lexcution sont les mmes. e e

5

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre epar javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u eSi cela se trouve, cest mme mieux que Caml e

Edition de lien dynamiqueLorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea Les chemins pour la compilation, pour ldition de liens et pour e lexcution sont les mmes. e e Performance : des acc`s disques (et mme rseau) cachs au e e e e milieu de votre programme5

Applet et application applet (en franais appliquette ou programmouillette) : c destin ` tourner dans une fentre de navigateur chez des ea e gens quon ne connait mme pas e drive dune classe qui en principe prot`ge la machine hte e e o (sandbox)pas dcriture ni de lecture du disque local e par contre acc`s en lecture ` tous les chiers du Ternet par e a leur url

6

Applet et application

application (en franais application) c pas les restriction prcdentes e e un navigateur na pas plus le droit de la lancer quun autre excutable e

6

Applet et application applet (en franais appliquette ou programmouillette) : c destin ` tourner dans une fentre de navigateur chez des ea e gens quon ne connait mme pas e drive dune classe qui en principe prot`ge la machine hte e e o (sandbox)pas dcriture ni de lecture du disque local e par contre acc`s en lecture ` tous les chiers du Ternet par e a leur url

application (en franais application) c pas les restriction prcdentes e e un navigateur na pas plus le droit de la lancer quun autre excutable e Applications et appliquettes partagent le gros de la biblioth`que e standard, notamment lawt (abstract windowing toolkit).6

Au fait

JavaScript na rien ` voir avec Java ` part la syntaxe supercielle : a a cest un langage interprt, plein de trous de scurit, pas OO pour ee e e un sou, et quon laissera volontiers aux authentiques kakous.

7

Javadoc

Un outil qui prend du code bien document, et construit une e doc html toute jolie Les commentaires pour Javadoc sont entre /** ... */ Un commentaire de ce type par mthode, attribut, classe, etc. e Ligne de commande : javadoc Toto.java Les docs de rfrence des classes standard du langage sont ee construites comme cela

8

Javadoc

Un outil qui prend du code bien document, et construit une e doc html toute jolie Les commentaires pour Javadoc sont entre /** ... */ Un commentaire de ce type par mthode, attribut, classe, etc. e Ligne de commande : javadoc Toto.java Les docs de rfrence des classes standard du langage sont ee construites comme cela Exemple de commentaire de lan dernier : /** * classe Cartes */ public class Cartes extends Remote ...8

Pour en nir avec lorganisation1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

9

Paquetages

10

Paquetages Un paquetage cest comme un module en Caml.

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ;

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ; En labsence dune telle ligne, la classe fait partie du paquetage par dfaut, constitu de e elensemble des classes dans le rpertoire courant e lensemble des classes accessibles par la variable CLASSPATH

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ; En labsence dune telle ligne, la classe fait partie du paquetage par dfaut, constitu de e elensemble des classes dans le rpertoire courant e lensemble des classes accessibles par la variable CLASSPATH

On peut ranger un paquetage dans une archive zip, qui sappellera dailleurs jar, mais il faut lire le manuel.10

Paquetages et nommages Le nom complet dune classe est paquetage.Classe

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membrela fonction sinus : java.lang.Math.sin(x)

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membrela fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e ecom.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membrela fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e ecom.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

Si on a la emme de taper tout cela tout le temps dans Toto.java, on peut importer une fois pour toutes, au dbut e de ce chier,une classe : import java.lang.Math ; ou bien toutes les classes dun paquetage : import java.lang.* ;

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membrela fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e ecom.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

Si on a la emme de taper tout cela tout le temps dans Toto.java, on peut importer une fois pour toutes, au dbut e de ce chier,une classe : import java.lang.Math ; ou bien toutes les classes dun paquetage : import java.lang.* ;

On nest pas dispens de taper Classe.membre ou e objet.membre... Exemple Math.sin(x).11

Quelques conventions

Tout le monde appelle ses classes avec une majuscule. Du coup les chiers aussi. Les membres de la plupart des programmeurs sont minuscules. Vous faites bien ce que vous voudrez.

12

Porte des classes, porte des identicateurs e e

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre epublic : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre epublic : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

Dans un paquetage, une classe peut-tre epublic : tout le monde le voit mme en dehors du paquetage e rien du tout : visible dans le paquetage seulement

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre epublic : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

Dans un paquetage, une classe peut-tre epublic : tout le monde le voit mme en dehors du paquetage e rien du tout : visible dans le paquetage seulement

Vous trouverez plein dexemples sur le Ternet.13

Types de base et objets1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

14

Les faciles Entiers signs de direntes tailles : byte (8 bits), short e e (16), int (32), long (64) Nombres en virgule ottante : float et double boolean qui vaut true ou false char est un caract`re Unicode (sur 16 bits !) e Tous ces types ont une valeur initiale spcie par le langage, e e mais javac fait des warning si on ne les initialise pas.class HelloHello { public static void main(String[] args) { int i; for(i=0; i () / + - =. Dans la (), on a * ^ par odre de lecture, lordre dexcution est aussi *^.

23 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

table de prcdence(de la plus haute la plus basse). Les oprateurs de mme niveau depuis la gauche.. ++ * + > > != () ! % >>> =

op=

24 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

lassignationLassignation assigne lexpression de droite, lexpression de gauche (une variable). oprateur binaire qui modifie son oprande gauche.j=2; // expression dassignation dun litral i=j*3; // expression dassignation dune expression i=j*3(j=2); // expression valide combinant les deux

Cette dernire expression a pour rsultat i=6! effets de bord: ~, ++ , -dans une mme expression rend confus la lecture. dcomposer les expressions un seul oprateur avec effet de bord.

25 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

expression numrique

les oprateurs unaires++ --

actionngation incrmentation de 1 dcrmentation de 1

exemplei=-j; i++; i--;

++ et -- peuvent prfixer ou postfixer la variable.++i; // est quivalent i++;

26 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

expression numrique ...les oprateurs binaire action+ += -= * *= / /= % %= modulo addition

exemplei=j+k i+=2; // i=i+2 i=j-k; i-=j; // i=i-j x=2*y x*=x; // x=x*x i=j/k; x/=10; // x=x/10 i=j%k; i%=2; // i=i%2

soustraction

multiplication

division (tronque si les arguments sont entiers)

la division par 0 et le modulo par 0 gnre une exception lexcution. Les oprations dont la reprsentation dpasse le maximun du type de lentier dbordent dans les entiers ngatifs. Pour les flottant, les oprations mme smantique. ++ et -- on ajoute 1.0. Le % modulo appliqu au flottant prend le sens de la division dans les entiers. la division par 0 et le modulo par 0 gnre la valeur inf. Les oprations dont la reprsentation dpasse le maximun du type gnre la valeur inf. Les dbordements vers linfinement petit gnre 0.

27 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Le programme TestNumberclass TestNumber{ public static void main (String args[]) { int i=1000, j=1000; float x=1, y=1; for (int k=0; k = == !=

actionplus petit que plus grand que plus petit ou gal que plus grand ou gal que gal diffrent de

exemplex100; j=a; i==20; c!=z;

ATTENTION relation dordre sur les flottants, x==y peut tre vrai yx soit forcement vrai. loprateur == confondu avec =

29 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiquesoprandes boolennes. Les quatres oprateurs de base sont: ! la ngation, & le ET, | le OU ^ le OU exclusif.

Table de vrit des oprateurs logiquesp v v f f q v f v f !p f f v v p&q v f f f p|q v v v f p^q f v v f

30 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiques ...forme assigne (sauf pour la ngation) donc:p&=(i=10); // est quivalent p=p&(i ( y/i);// y/i nest pas valu si i gale 0

JAVA possde aussi une expression ternaire de la forme:p?e1:e2;

Si p est vrai alors lexpression e1 est value sinon e2 est value. lassignation tant une expression, il est possible de lutiliser comme une instruction if.if (p) e1; else e2; // est quivalent p?e1:e2;

31 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiques ...les oprateurs logiques! & | ^ && || != &= |= ?:

action

exemple

ngation ET OU OU exclusif ET valu OU valu ngation assigne ET assign OU assign Si alors sinon

!p; p & (ik; // decaler i vers la droite de k bits avec son signe i>k; // decaler i vers la droite de k bits sans signe

version assigne. les action oprateurs de manipulati on binaire> >>> = >>>= dcalage gauche dcalage droite sign dcalage droite non sign dcalage gauche assign dcalage droite sign assign dcalage droite non sign assign

exemple

i4; i>>>2; k=n; k>>>=n;

34 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Equivalence ...opration de manipulation binaire les oprations arithmtiques sur les entiers. Pour i entier, on a: ~iest quivalent (i-1)-1 i>>kest quivalent i/2k si i>0 i>kest quivalent i/2k si i>0 i>>>kest quivalent (i true.

Test dgalit (simple) comparaison des variables dinstance (complexe) calcul sur les variables dinstanceclass Fraction { private int numerateur, denominateur; public boolean equals(Fraction f) { return (this.numerateur * f.denominateur = this.denominateur * f.numerateur); }

G. Falquet, Th. Estier CUI Universit de Genve

13 / 24

Structures de donnes complexesTableaux : dans le langagePoint[] monPolygone = new Point[12];

Tuples / Records / Struct : classe avec variables dinstanceclass Adresse { int no; String rue, ville, npostal;}

Ensembles/Listes/Piles/Files : classes de lenvironnementVector participants = new Vector(); participants.addElement(joeCool); s = participants.size();

Fonctions/Dictionnaires : classes de lenvironnementHashTable localisation = new HashTable(); localisation.put(cnTower, toronto); localisation.get(tourEiffel);

Itrateurs:Enumeration e = localisation.keys(); while (e.hasMoreElements()) { k = e.nextElement(); ... }

G. Falquet, Th. Estier CUI Universit de Genve

14 / 24

Egalit profonde et de surfaceclass ListeRect { private Reactangle[] lesRectangles; private int nbRectangles;

Egalit de surface sia.lesRectangles[0] == b.lesRectangles[0] et a.lesRectangles[1] == b.lesRectangles[1] et etc.

Egalit profonde (ou rcursive)a.lesRectangles[0].equals (b.lesRectangles[0]) et a.lesRectangles[1].equals (b.lesRectangles[1]) et etc.

Proprits maintenir Symtrique: a.equals(b) et b.equals(a) doivent toujours donner le mme rsultat; Rexive: a.equals(a) doit toujour donner true; Transitive: si a.equals(b) et b.equals(c) donnent true alors a.equals(c) doit aussi donner true.

G. Falquet, Th. Estier CUI Universit de Genve

15 / 24

La copie dobjetsMme genre de questions que lgalit copie de surfacefor (i=0; i entier; rectangle.largeur() --> entier; rectangle.hauter() --> entier; rectangle.bas() --> entier; rectangle.droite() --> entier.

2 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Smantique: quationsDterminent des quivalences entre expressions: rect(X, Y, L, H).gauche() X rect(X, Y, L, H).haut() Y rect(X, Y, L, H).largeur() L rect(X, Y, L, H).hauteur() L R.translation(DX, DY).gauche() R.gauche() + DX R.translation(DX, DY).haut() R.haut(R) + DY R.translation(DX, DY).largeur() R.largeur() R.translation(DX, DY).hauteur() R.hauteur() R.agrandissement(DL, DH).hauteur() R.hauteur()+DH R.agrandissement(DL, DH).largeur() R.largeur()+DL R.agrandissement(DL, DH).gauche() R.gauche() R.agrandissement(DL, DH).haut() R.haut() R.bas() R.haut()-R.hauteur() R.droite() R.gauche()+R.largeur()

3 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Spcication dune classe Quelles sont les mthodes ? Que font-elles exactement ?

Description textuelle informelle facile lire

Description formelle plusieurs techniques existent PRE conditions POST conditions invariants (de structure)

4 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Prconditions/** * Change la largeur d'un rectangle * * PRECONTION: l > 0 */ public void defLargeur(int l) { ... } /** * Dplace un rectangle horizontalement et verticalement * * PRECONDITION: this.gauche() + dh > 0 * et this.haut() + dv > 0 */ public void deplace(int dh, int dv) {...}

Conditions exprime l'aide des mthodes publiques gauche() et haut() et non sur les variables prives gauche et haut. On peut la tester depuis l'extrieur de la classe Rectangle. On peut la comprendre sans entrer dans la reprsentation interne da la classe.

5 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Les post conditionsDit ce qu'est devenu l'objet aprs l'excution de la mthode et quel est le rsultat produit./** * fournit la surface d'un rectangle * * PRECONDITION: aucune * * POSTCONDITION: resultat = this.hauteur() * this.largeur() */ public int surface() { ... }

Ne dit pas comment le calcul est fait mais ce quil doit produire;

6 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Post cond. avec modications de lobjet/** * Change la largeur d'un rectangle * PRECONTION: l > 0 * POSTCONDITION: this_post.largeur() = l * le nouveua rectangle a une largeur l */ public void defLargeur(int l) { ... } /** * Dplace un rectangle horizontalement et verticalement * * PRECONDITION: this.gauche() + dh > 0 * et this.haut() + dv > 0 * * POSTCONDITION: this_post.gauche() = * this_pre.gauche() + dh * et this_post.haut() = * this_pre.haut() + dv */ public void deplace(int dh, int dv) { ...}

On ne dit que ce qui change (hypothse du frame) Lexpression ne contient que des mthodes visibles

7 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Le langage Java - SyntaxeCLASSES, INSTANCE,MTHODES, ... CLASSE EN JAVA, PAS PAS UTILISER DES CLASSES: C O=NEW C() UTILISER LES MTHODES: O.M() UNE CLASSE AVEC PLUSIEURS CONSTRUCTEURS LA SURCHARGE DES MTHODES VARIABLES DE CLASSE VARIABLES DINSTANCE LES MTHODES DE LA CLASSE EXEMPLE AVEC STATIC ET SI LON PARLAIT DHRITAGE CLASSE ET MTHODES ABSTRAITES LHRITAGE MULTIPLE VS INTERFACE. REGROUPER DES CLASSES DANS UN PACKAGE TYPER UN OBJET (CASTING) COPIER DES OBJETS COMPARER DES OBJETS

1 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Une introduction aux objetsil nous faut examiner ce quest un objet.

2 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

une vision animiste!une vision animiste Dfinition de classe: Une classe est archtype qui conditionne tous les comportements Dfinition dobjet: Un objet est une instance dune et une seule classe. Un individu qui possde tous les comportements de la classe dont il est driv. Dfinition de mthode: Une mthode dfinit laction lmentaire que lon peut effectuer sur un objet. Lensemble des mthodes dfinissent le comportement de la classe. Dfinition de message: Un message est loccurrence de la demande dexcution dune mthode un objet.

3 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

classes, instance,mthodes, ...

classe Rectangle largeur, hauteur, surface() perimetre() diagonale() doubler()

classe Disque diametre surface() perimetre() rayon() doubler() d1

r1

r2

d2

4 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe en JAVA, pas pasdclarer une classeclass Rectangle extends Object{ ... }

variables dinstances. largeur et hauteurclass Rectangle extends Object{ public double largeur, hauteur; ... }

mthodes de Rectangleclass Rectangle extends Object{ ... public double perimetre() { return 2*(largeur+hauteur); } public double surface() {return largeur*hauteur;} public double diagonale() { return Math.sqrt(largeur*largeur+hauteur*hauteur); } public void doubler() {largeur*=2; hauteur*=2;} }

5 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe en JAVA, pas pasle constructeur (dit comment crer une instance) class Rectangle extends Object{ ... public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } ... }

Le code complet de la classe Rectangleclass Rectangle extends Object{ public double largeur, hauteur; public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public double perimetre() {return 2*(largeur+hauteur);} public double surface() {return largeur*hauteur;} public double diagonale() { return Math.sqrt(largeur*largeur+hauteur*hauteur);} public void doubler() {largeur*=2; hauteur*=2;} }

6 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe Disqueclass Disque extends Object{ public double diametre; private static final double pi=3.14159; public Disque(double initD){ diametre=initD; } public double perimetre() {return pi*diametre;} public double surface() {return (pi*diametre*diametre)/4;} public double rayon() {return diametre/2;} public void doubler() {diametre*=2;} }

7 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Utiliser des classes: C o=new C()La dclaration dune instance dclarer le type de la variable (sa classe) utiliser un constructeur (la variable) dclaration de typeDisque d1,d2;

par un mot cl new qui indique lon va cre une instance (cration des variables de linstance)d1=new Disque(2); d2=new Disque(4);

contractes en une seule instructionRectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4);

8 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Utiliser les mthodes: o.m()instance.mthode(paramtres, ...) Pour obtenir la diagonale de r1r1.diagonale()

crire un petit programme qui utilise les classes Rectangle et Disque. noms commencant par une majuscule sont rservs aux identifiants des classes

9 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk1class TestRectDisk1{ public static void main (String args[]) { Rectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4); System.out.println("diagonale de r1: "+r1.diagonale()); System.out.println("primtre de r2: "+r2.perimetre()); r2.doubler(); System.out.println("primtre de r2: "+r2.perimetre()); Disque d1,d2; d1=new Disque(2); d2=new Disque(4); System.out.println("rayon de d1: "+d1.rayon()); System.out.println("primtre de d2: "+d2.perimetre()); d2.doubler(); System.out.println("primtre de d2: "+d2.perimetre()); } } diagonale de primtre de primtre de rayon de d1: primtre de primtre de r1: r2: r2: 1 d2: d2: 4.47214 14 28 12.5664 25.1327

10 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Une classe avec plusieurs constructeursoffrir plusieurs constructeurs, pour une mme classe travailler dans plusieurs formes de reprsentation crer un nouveau constructeur qui doit se distinguer par le nombre et/ou le type des paramtres. un constructeur la classe Rectangle coin suprieur gauche (csgx,csgy) coin infrieur droite (cidx,cidy)class Rectangle extends Object{ ... public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public Rectangle(double csgx, double csgy, double cidx, double cidy){ largeur=Math.abs(csgx-cidx); hauteur=Math.abs(csgy-cidy); } ... }

11 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk2choisir comment dclarer les instances de Rectangle:class TestRectDisk2{ public static void main (String args[]) { Rectangle r1=new Rectangle(1,1,3,5); Rectangle r2=new Rectangle(3,4); ... }

12 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

La surcharge des mthodes offrir plusieurs mthodes effectuant une action similaire sans devoir leurs donner des noms diffrents doit se distinguer par le nombre et/ou le type des paramtres. ajouter une mthode doubler() la classe Rectangleclass Rectangle extends Object{ ... public void doubler() { largeur*=2; hauteur*=2;} public void doubler(boolean l, boolean h) { if (l) largeur*=2; if (h) hauteur*=2; } ... }

choisir comment doubler les instances de Rectangleclass TestRectDisk2{ public static void main (String args[]) { r2.doubler(); r2.doubler(false,true); ... }

13 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Surchargesurcharge des identificateurs de mthodes Le compilateur dcide de la bonne mthode en examinant les types paramtres leur nombre la hirarchie. autre exemple de surcharge:r2.doubler(); d2.doubler();

class B {} class SB {} extends B{ void f(B x, SB y){ } void f(SB x, B y){ } } class X{ SB s; f(s,s); ??? f(s,(B)s); ??? }

14 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Variables de classela classe peut possder des variables propres permet de conditionner le comportement de lensemble de ses instances dclares statiques (static). initialises au chargement de la classe. classe disque, la constante pi est dclare static. accessibles lintrieur de la classe sans tre prfixes lextrieur de la classe en tant prfixe par lobjet.

15 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Variables dinstanceLinstruction suivante imprimera les dimensions de r2:System.out.println("dimension:"+r2.largeur+ "/"+r2.hauteur); r2.hauteur=45;

Il est possible de cacher les variables dinstance pour viter quon les modifie de lextrieur avec deux modificateurs: private et protected

16 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les mthodes de la classeLes mthodes de la classe permette de travailler sur la classe ajouter une mthode modifierEchelle() static. prfixant par le nom de la classe. initialisations complexes des variables de la classe associ un bloc dinstruction excut au chargement de la classe. static { instruction; ...}class Rectangle extends Object{ public static double echelle=1.0; public double largeur, hauteur; ...

17 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Exemple avec staticpublic static void modifierEchelle(double e){ echelle=e; } static { //initialisation complex echelle=0.5; } } class TestRectDisk3{ public static void main (String args[]) { Rectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4); System.out.println("dim. r2:"+r2.largeur+"/ "+r2.hauteur); Rectangle.modifierEchelle(4); System.out.println("echelle "+Rectangle.echelle); } }

Rsultat de lexcution de TestRectDisk3:dim. r2: 3/4 echelle 4

18 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Et si lon parlait dhritagela relation dhritage qui existe entre classes. conserver certain acquis dune autre classe faire une classe Carre, sans lhritage, redfinir, les mthodes perimetre(), surface(), diagonale(), ... Alors quun carr cest presquun rectangle. classe Carre tend le comportement de Rectangle hrite de lui aussi ces variables dinstance et de ces mthodes. un constructeur pour la classe Carre, demande tre construit par la classe Rectangle dsignateur super qui permet de faire rfrence la classe dont un objet hrite. mthode cote() la classe Carre. dsignateur this qui permet de faire rfrence lobjet qui la mthode est adresse

19 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk4dans notre cas un carr particulier qui hrite du comportement dun rectangle et donc qui possde aussi des variables dinstance largeur et hauteur.class Carre extends Rectangle{ public Carre(double initC){ super(initC,initC); } public double cote() {return this.hauteur;} } class TestRectDisk4{ public static void main (String args[]) { Carre c1=new Carre(4); System.out.println("dim. c1: "+c1.largeur+"/ "+c1.hauteur); System.out.println("surf. c1: "+c1.surface()); System.out.println("cot de c1 "+c1.cote()); } }

Rsultat de lexcution de TestRectDisk4:dim. c1: 4/4 surf. c1: 16 cot de c1 4

20 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

de la surface au volumetendre le comportement des rectangles celui des paralllpipdes. une variable dinstance pour mmoriser la profondeur le constructeur les mthodes propres cette classe.class Parallelepipede extends Rectangle{ public double profondeur; public Parallelepipede(double x, double y, double z){ super(x,y); profondeur=z; } public double volume(){return surface()*profondeur;} } class TestRectDisk5{ public static void main (String args[]) { Parallelepipede p1=new Parallelepipede(2,3,4); System.out.println("prof. p1:"+p1.profondeur); System.out.println("surf. p1:"+p1.surface()); System.out.println("vol. p1:"+p1.volume()); } }

Rsultat de lexcution de TestRectDisk4:prof. p1:4 surf. p1:6

21 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Hritagelarbre des liens dhritage.

Object

Rectangle

Disque

lang.Math

Carre

Parallelepipede

toutes les classes ont pour origines la classe Object. Les classes ne peuvent tendre quune seule classe donc une hirarchie stricte.

22 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe et mthodes abstraitesmthodes en commun entre les classes constante servir de modle pour ses sous-classes les mthodes sont aussi abstraites, seule est donn la dfinition de la classe son implmentation doit tre dfinie dans la sous-classe. Une classe abstraite ne peut pas avoir dinstance Le modifier abstract pour spcifier que la classe ou la mthode est abstraite.

23 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

classe abstraite GeometriePlaneavec les deux mthodes abstraites perimetre() surface() une constante pi. Les classes Rectangle et Disque tendent cette nouvelle classe et donne une implmentation pour les mthodes abstraites (en plus de leurs propres mthodes )abstract public public public } class GeometriePlane{ static final double pi=3.14159; abstract double perimetre(); abstract double surface();

24 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

tendre la classe abstraiteclass Rectangle extends GeometriePlane{ ... public double perimetre() { return 2*(largeur+hauteur); } public double surface(){ return largeur*hauteur; } ... } class Disque extends Object{ ... public double perimetre() { return GeometriePlane.pi*diametre; } public double surface() { return (GeometriePlane.pi*diametre*diametre)/4; } }

en regardant la structure, nous savons que toutes les sous-classes dune classe abstraite implmente ses mthodes. Si:class Triangle extends GeometriePlane{...}

nous savons que des mthodes primtre() et surface() sont disponibles sur les instances de triangles. permet donc de bien structurer le dvellopement.

25 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

lhritage multiple vs interface.lhritage simple; un objet ne peut tre considrer que dune seule manire. considrer un objet comme appartenant deux classes simultanment. pas directement possible en Java, un autre concept interface. un ensemble de mthodes (seulement la dfinition) et de constantes. Une classe implmente une interface (ou plusieurs) elle sengage alors donner une implmentation pour toutes les mthodes dfinies dans linterface. En retour, on peut considrer des instances de cette classe comme des instances de cette interface (bien quil ny a pas de cration proprement parler) Les interfaces peuvent: implmenter des interfaces constituent une autre hirarchie (fort). permet de briser lappartenance une seule classe.

26 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

interface Geometrie , ...interface Geometrie{ public static final double pi=3.14159; } interface Courbe extends Geometrie{ public double longueur(); public void doubler(); } interface Surface extends Geometrie{ public double surface(); }

Gomtrie

Object Courbe Surface Rectangle Disque

27 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

les classes implmentent des interfaces.class Rectangle extends Object implements Courbe, Surface{ public double largeur, hauteur; public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public double longueur(){2*(largeur+hauteur);} public void doubler() {largeur*=2; hauteur*=2;} public double surface(){return largeur*hauteur;} public double diagonale(){ return Math.sqrt(largeur*largeur+hauteur*hauteur);} } class Disque extends Object implements Courbe, Surface{ public double diametre; public Disque(double initD){ diametre=initD; } public double longueur() {return Geometrie.pi*diametre;} public void doubler() {diametre*=2;} public double surface(){ return (Geometrie.pi*diametre*diametre)/4;} public double rayon() {return diametre/2;} }

28 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

On parle de polymorphismerectangles et disques comme des courbes ou des surfaces.class TestRectDisk7{ public static void main (String args[]) { Courbe c[]=new Courbe[10]; Surface s[]=new Surface[10]; Rectangle r[]=new Rectangle[5]; Disque d[]=new Disque[5]; // crer des rectangles for (int i=0;i", Label.RIGHT)); } public void paint(Graphics g) { g.drawString("Texte dessine", 100, 150); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Effet

Les paramtres dalignement sont des variables de classe constantes : Label.CENTER, Label.LEFT, Label.RIGHT.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les boutonsimport java.applet.*; import java.awt.*; import java.awt.event.*; public class Composant extends Applet implements ActionListener { String commande = "Normal"; Button bn, bg, bi; Font fgras, fnormal, fitalic, fdef; public void init() { add(bn = new Button ("Normal")); add(bg = new Button("Gras")); add(bi = new Button("Italique")); bn.addActionListener(this); bg.addActionListener(this); bi.addActionListener(this); fgras = new Font("Helvetica",Font.BOLD,40); fnormal = new Font("Helvetica", Font.PLAIN,40); fitalic = new Font("Helvetica", Font.ITALIC,40); fdef = new Font("Helvetica", Font.PLAIN,12); }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

(suite)public void actionPerformed(ActionEvent e) { commande = e.getActionCommand(); repaint(); } public void paint(Graphics g) { if (commande.equals("Normal")) g.setFont(fnormal); if (commande.equals("Gras")) g.setFont(fgras); if (commande.equals("Italique"))g.setFont(fitalic); g.drawString("Exemple", 20, 80); g.setFont(fdef); }

}

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les listes de choiximport java.applet.*; import java.awt.*; import java.awt.event.*; public class Composant extends Applet implements ItemListener List parfum; public void init() { parfum = new List(5,true); parfum.add("Vanille"); parfum.add("Chocolat"); parfum.add("Fraise"); parfum.add("Pistache"); parfum.add("Noisette"); parfum.add("Citron"); parfum.add("Orange"); parfum.add("Abricot"); parfum.setMultipleMode(true); add(new Label("Parfums de la glace")); add(parfum); parfum.select(3); // prselectionne Pistache parfum.addItemListener(this); // l'applet coute le menu } public void itemStateChanged(ItemEvent e) { repaint(); } M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

{

suitepublic void paint(Graphics g) { int[] parfumNos = parfum.getSelectedIndexes(); String message = "Code glace: "; for (int i=0; i connatre le langage connatre l'API JDK 1.0 : 117 classes et 40 interfaces JDK 1.1 : 272 classes, 87 interfaces JDK 1.2 : 1525 classes et interfaces (env. 10 000 mthodes)

L'API est strictement le mme sur toutes les plateformes: interface graphique, accs aux fichiers et au rseau, gestion des processus, etc. Des API de second niveau sont en cours de dfinition: p.ex. API pour bases de donnes relationnelles. Il existe des paquets destins des tches particulires, non standardiss (p.ex. Collections, Finance, Dessin 3D, etc.) Le dveloppeur doit constituer sa bote outils

1997 - G. Falquet, Th. Estier - Universit de Genve

1

Environnement Java: les diffrents paquets (JDK 1.0.2)java.lang (21 classes, 2 interfaces) java.io (23, 3) java.util (10, 2) java.net (11, 3) java.awt (42, 2) java.awt.image (9, 3) java.awt.peer (0, 22) java.applet (1, 3) Total: 117 classes, 40 interfaces

1997 - G. Falquet, Th. Estier - Universit de Genve

2

Evolution de lenvironnement: les diffrents packages (JDK 1.1)java.applet (1, 3) java.awt (51, 7) + java.awt.datatransfer (3, 2) + java.awt.event (19, 11) java.awt.image (11, 3) + java.beans (15, 6) java.io (44, 8) java.lang (24, 2) + java.lang.reflect (5, 1) + java.math (2) java.net (14, 3) + java.rmi (2, 3) + java.rmi.dgc (2, 1) + java.rmi.registry (1, 2) + java.rmi.server (10, 7) java.security (12, 5) + java.security.acl (0, 5) + java.security.interfaces (0, 5) + java.sql (6, 8) + java.text (17, 1) java.util (19, 3) java.util.zip (14, 1) Total: 272 classes, 87 interfaces

1997 - G. Falquet, Th. Estier - Universit de Genve

3

JDK 1.2 (Java 2)java.applet (1, 3) java.awt (64, 14) + java.awt.color (5, 0) java.awt.datatransfer (4, 3) + java.awt.dnd (4, 15) java.awt.event (19, 11) + java.awt.font (15, 2) + java.awt.geom(30, 1) + java.awt.im (3, 1) java.awt.image (11, 3) + java.awt.image.renderable + java.awt.print package java.beans (15, 6) + java.beans.beancontext java.io (44, 8) java.lang (24, 2) + java.lang.ref java.lang.reflect (5, 1) java.math (2) java.net (14, 3) java.rmi (2, 3) + java.rmi.activation java.rmi.dgc (2, 1) java.rmi.registry (1, 2) java.rmi.server (10, 7) java.security (12, 5) java.security.acl (0, 5) + java.security.cert java.security.interfaces (0, 5) + java.security.spec java.sql (6, 8) java.text (17, 1) java.util (19, 3) + java.util.jar java.util.zip (14, 1) 1997 - G. Falquet, Th. Estier - Universit de Genve 4

Packages essentiels

Package java.applet java.awt java.beans java.io

Description crer une applet et la faire communiquer dans son contexte dexcution crer des interfaces avec lutilisateur pour peindre et afficher des images pour le dveloppement de composants logiciels JavaBeans gestion des entres/sorties travers des canaux de donnes, srialisation et systmes de gestion de fichiers classes fondamentales pour le langage fonctions habituelles (sin, cos, ), oprations en entier et dcimal dune prcision arbitraire gestion du rseau et communications invocation distance des mthodes (Remote Method Invocation) scurit connexion aux bases de donnes) manipulation des textes, des dates, des nombres et des messages dune manire indpendante des langues

java.lang java.math

java.net java.rmi java.security java.sql java.text

1997 - G. Falquet, Th. Estier - Universit de Genve

5

Package java.util

Description structures de donnes des utilitaires pour la manipulation des dates, un modle dvnement, etc.

javax.acces- Dfinit un contrat entre les composants sibility interface-utilisateur et des technologies dassistance lutilisateur (loupe, vocaliseur, ) javax.swing composants lgers (entirement crits en Java, pour la gestion des interfaces, indpendants de la plate-forme. org.omg.C ORBA correspondance entre lAPI CORBA de lOMG et le langage de programmation Java.

1997 - G. Falquet, Th. Estier - Universit de Genve

6

Matriser l'environnement Approche par thmes: comment crer une applette ? comment dessiner, crire ? comment animer une applette ? comment interagir avec la souris, le clavier ? comment grer une fentre et son contenu ? comment grer des fichiers ? comment communiquer sur un rseau ? Approche par concepts quels sont les concepts sous-jacents ? quelles sont leurs relations comment interagissent-ils Outils de butinage tous les paquets sont dcrits sous forme hypertexte documentation interactive

1997 - G. Falquet, Th. Estier - Universit de Genve

7

Classe java.awt.Rectanglepublic class java.awt.Rectangle extends java.lang.Object { // Fields public int height; public int width; public int x; public int y;

On considre des rectangles dont les cts sont // aux axes x et y et dont les coordonnes et dimensions sont entires// Constructors public Rectangle(); public Rectangle(Dimension d); public Rectangle(int width, int height); public Rectangle(int x, int y, int width, int height); public Rectangle(Point p); public Rectangle(Point p, Dimension d);

La dfinition d'un rectangle peut utiliser les notions de Point et de Dimension. On trouvera dans la documentation l'effet exact de chaque constructeur

1997 - G. Falquet, Th. Estier - Universit de Genve

8

Rectangle (suite)// Methods

On peut changer la taille d'une rectangle de diffrentes manirespublic public public public public void void void void void resize(int width, int height); add(int newx, int newy); add(Point pt); add(Rectangle r); grow(int h, int v);

le dplacerpublic void move(int x, int y); public void translate(int dx, int dy);

changer sa forme = dplacer et changer sa taillepublic void reshape(int x, int y, int width, int height);

Il y a une notion d'tre l'intrieurpublic boolean inside(int x, int y);

Il y a des notions de comparaison, d'intersection et d'union de 2 rectanglespublic public public public boolean equals(Object obj); Rectangle intersection(Rectangle r); boolean intersects(Rectangle r); Rectangle union(Rectangle r);

Un rect. peut tre vide (?)public boolean isEmpty();

et comme tout objet:public int hashCode(); public String toString();

1997 - G. Falquet, Th. Estier - Universit de Genve

9

Classe Rectangle - conceptsCe quil faut retenir: On considre des rectangles dont les cts sont // aux axes x et y et dont les coordonnes et dimensions sont entires La dfinition d'un rectangle peut utiliser les notions de Point et de Dimension. On peut changer la taille d'une rectangle de diffrentes manires, on peut aussi le dplacer. Un point peut tre l'intrieur dun rectangle On peut comparer deux rectangles, tester sils sintersectent, calculer leur intersection et leur union Un rectangle peut tre vide Ce quil ne faut pas retenir: Les noms et paramtres de chaque mthode, on les retrouvera toujours dans la documentation interactive.

1997 - G. Falquet, Th. Estier - Universit de Genve

10

librairie java.net

Package java.net

Classes class ContentHandler class DatagramPacket class DatagramSocket class InetAddress nal class ServerSocket nal class Socket class SocketImpl nal class URL abstract class URLConnection class URLEncoder class URLStreamHandler

Interfaces Interface ContentHandlerFactory Interface SocketImplFactory Interface URLStreamHandlerFactory

Exceptions class MalformedURLException class ProtocolException class SocketException class UnknownHostException class UnknownServiceException

A. Le Grand

Universit de Genve

1

librairie java.net

Identier le contenu dun URLimport java.io.IOException; import java.net.*; public class ContenuURL { public static void afficheInfos(URLConnection u) {// affiche l'URL et les infos s'y rattachant System.out.println(u.getURL().toExternalForm() + ":"); System.out.println("Contenu :"+ u.getContentType()); System.out.println("Longueur :"+ u.getContentLength()); } static public void main(String[] args) throws MalformedURLException, IOException {if (args.length==0) return; URL url=new URL(args[0]); URLConnection connection=url.openConnection(); afficheInfos(connection); } }

exemple dexcution >java affURL http://cuiwww.unige.ch/db-research/Research/ http://cuiwww.unige.ch/db-research/Research/: Contenu :text/html Longueur :3495

A. Le Grand

Universit de Genve

2

librairie java.net

vrier des URLimport java.io.*; import java.net.*; public class VerifieURL { public static void verifie(URLConnection u) throws IOException {if (!u.getContentType().equals("text/html")) {System.out.println( "seuls les text/html sont verifies."); System.exit(0);}; DataInputStream dis =new DataInputStream(u.getInputStream()); String s=dis.readLine(); String motif1=""; String ref; int i,j; while (s!=null) {i=s.indexOf(motif1); if (i!=-1) {j=s.indexOf(motif2); ref=s.substring(i+motif1.length()+1,j-1); try {ValiditeURLConnexion.test(ref);} catch (IOException e) {System.out.println("Wrong URL : "+ref);} } s=dis.readLine();} dis.close(); }

A. Le Grand

Universit de Genve

3

librairie java.net

vrier des URL(suite) public static void main(String args[]) throws MalformedURLException, IOException {if (args.length!=1) {System.out.println("Usage : java verifieURL "); System.exit(0);} URLConnection c=null; try {URL url =new URL(args[0]); ValiditeURLConnexion.test(url); c= url.openConnection();} catch (IOException e) {System.out.println("Wrong URL : "+args[0]); System.exit(0);} verifie(c); } } classe ValiditeURLConnexion import java.io.*; import java.net.*; public class ValiditeURLConnexion { public static void test(URL url) throws IOException {URLConnection c=url.openConnection(); DataInputStream dis =new DataInputStream(c.getInputStream()); dis.close(); } public static void test(String s) throws MalformedURLException,IOException {test(new URL(s)); } }

A. Le Grand

Universit de Genve

4

librairie java.net

un exemple client-serveur

processus serveur

cration processus connexion

demande de connexion

message MESSAGE

application client

machine hte processus sexcutant sur la machine du client

processus connexion

application client

in out

socket

socket

canalLecture canalEcriture

>java Client cuisuna Connexion : cuisuna/129.194.12.27 port : 45678 ?toto !TOTO ?lulu !LULU ?FIN Connexion terminee

A. Le Grand

Universit de Genve

5

librairie java.net

Serveurimport java.io.*; import java.net.*; public class Serveur extends Thread { protected static final int PORT=45678; protected ServerSocket ecoute; public Serveur () { try {ecoute=new ServerSocket(PORT);} catch (IOException e) {System.err.println(e.getMessage()); System.exit(1);} System.out.println( "Serveur en ecoute sur le port:"+PORT); this.start(); } public void run() {try {while (true) {Socket client=ecoute.accept(); Connexion c= new Connexion(client);}} catch (IOException e) {System.err.println(e.getMessage()); System.exit(1);} } public static void main(String[] args) {new Serveur();} }

A. Le Grand

Universit de Genve

6

librairie java.net

Services du serveurimport java.io.*; import java.net.*; class Connexion extends Thread{ protected Socket client; protected DataInputStream in; protected PrintStream out; public Connexion(Socket client_soc) {client=client_soc; try {in =new DataInputStream(client.getInputStream()); out =new PrintStream(client.getOutputStream());} catch (IOException e) {try {client.close();} catch (IOException e1) {} System.err.println(e.getMessage()); return;} this.start(); } public void run() { String ligne; try {while(true) {ligne=in.readLine(); if (ligne.toUpperCase().compareTo("FIN")==0) break; out.println(ligne.toUpperCase());} } catch (IOException e) {System.out.println("connexion:"+e.toString());} finally {try {client.close();} catch (IOException e){};} } }A. Le Grand

Universit de Genve

7

librairie java.net

client du serveurimport java.io.*; import java.net.*; public class Client { protected static final int PORT=45678; public static void main(String[] args) {Socket s=null; if (args.length!=1) {System.err.println("Usage: java Client "); System.exit(1);} try {s=new Socket(args[0],PORT); DataInputStream canalLecture = new DataInputStream(s.getInputStream()); DataInputStream console=new DataInputStream(System.in); PrintStream canalEcriture= new PrintStream(s.getOutputStream()); System.out.println("Connexion etablie: "+ s.getInetAddress()+" port: "+s.getPort()); String ligne; while (true) {System.out.print("?");System.out.flush(); ligne=console.readLine(); canalEcriture.println(ligne); ligne=canalLecture.readLine(); if (ligne==null) {System.out.println("Connexion terminee");break;} System.out.println("!"+ ligne); } // while } // try catch (IOException e) {System.err.println(e);} finally {try {if (s!=null) s.close();} catch (IOException e2){}} } // main } // classA. Le Grand

Universit de Genve

8

librairie java.net

processus de la tl-discussion.Un serveur en attente de connexions : attend une demande cre une connexion et linsre dans la liste

Une connexion pour chaque client : attend un message de son client demande un accs la liste des connexions an de leur envoyer le message pour quelles le transmettent leur client correspondant. en n de connexion, avertit le processus nettoyeur charg de la retirer de la liste des connexions.

Le processus nettoyeur : se rveille priodiquement ou est rveill par une connexion. testee lactivit dune connexion.

Lapplication client : saisit des messages de lutilisateur, les envoie la connexion afche des messages provenant dautres clients. lcoute et la rception sont donc asynchrones.

Le processus couteur : afche tous les messages quil reoit de la connexion.

A. Le Grand

Universit de Genve

9

librairie java.net

tl-discussion : le serveurimport java.io.*; import java.net.*; import java.util.*; // pour utiliser la classe Vector public class Serveur2 extends Thread { protected static final int PORT=45678; protected ServerSocket ecoute; protected Vector connexions; protected Nettoyeur nettoyeur; public Serveur2 () {try {ecoute=new ServerSocket(PORT);} catch (IOException e) {System.err.println(e.getMessage());System.exit(1);} System.out.println("Serveur en ecoute sur le port:"+PORT); connexions=new Vector(); nettoyeur=new Nettoyeur(this); this.start(); } public void run() {try {while (true) {// attente dune demande Socket client=ecoute.accept(); System.out.println("Demande de connexion..."); Connexion2 c= new Connexion2(client,nettoyeur,this); synchronized (connexions) {connexions.addElement(c);} }} catch (IOException e) {System.err.println(e.getMessage());System.exit(1);} } // run public static void main(String[] args) {new Serveur2(); }}A. Le Grand

Universit de Genve

10

librairie java.net

tl-discussion: la connexionimport java.util.*; class Connexion2 extends Thread{ protected Socket client; protected Serveur2 serveur; protected DataInputStream in; protected PrintStream out; protected Nettoyeur nettoyeur; public Connexion2(Socket client_soc, Nettoyeur n, Serveur2 s) {client=client_soc; nettoyeur=n; serveur=s; try {in =new DataInputStream(client.getInputStream()); out =new PrintStream(client.getOutputStream());} catch (IOException e) {try {client.close();} catch (IOException e1){}; System.err.println(e.getMessage()); return;} this.start(); } // constructeur ....

A. Le Grand

Universit de Genve

11

librairie java.net

tl-discussion: la connexion (suite du listing)public void run() {String ligne; Connexion2 c; try {while(true) {ligne=in.readLine(); synchronized(serveur.connexions) {for (int i=0;i=0;i--) {Connexion2 c= (Connexion2) serveur.connexions.elementAt(i); if (!c.isAlive()) {serveur.connexions.removeElementAt(i); System.out.println("Fin de connexion: OK");} } // for } // synchro } // while } }

A. Le Grand

Universit de Genve

13

librairie java.net

tl-discussion : AppliClientimport java.io.*; import java.net.*; import java.awt.*; public class AppliClient extends Frame{ public static final int PORT=45678; Socket s; PrintStream canalEcriture; TextField entree; TextArea visu; Button envoi,stop; Panel boutons; String Nom;

public boolean action(Event e,Object obj) {if ((e.target==entree) || (e.target==envoi)) {canalEcriture.println(Nom+">"+entree.getText()); entree.setText(""); //efface le texte return true; } if (e.target==stop) {canalEcriture.println(Nom+">FIN"); System.exit(0);} return false; } // action public static void main(String[] args) { Frame f= new AppliClient(args[0]); }

A. Le Grand

Universit de Genve

14

librairie java.net

tl-discussion : AppliClient (suite du listing)public AppliClient(String n) {super("client"+ " "+n); try {Nom=n; // demande de connexion sur le serveur // le socket est renvoye lorsquelle est etablie s=new Socket("mycpu.bigco.ch",PORT); canalEcriture=new PrintStream(s.getOutputStream()); // construction de l'interface graphique entree=new TextField(); visu=new TextArea(); visu.setEditable(false); this.setLayout(new BorderLayout()); this.add("North",visu); this.add("Center",entree); boutons=new Panel(); envoi=new Button("envoi"); stop =new Button("stop"); boutons.add(envoi); boutons.add(stop); this.add("South",boutons); this.pack(); this.show(); visu.setText("Connexion: "+ s.getInetAddress()+ " port: "+s.getPort()); Ecouteur ecoute=new Ecouteur(s,visu); } catch (IOException e) {visu.setText(e.toString());} } //init } //classA. Le Grand

Universit de Genve

15

librairie java.net

tl-discussion : lcouteurimport java.io.*; import java.net.*; import java.awt.*; class Ecouteur extends Thread{ DataInputStream entree; TextArea visu; public Ecouteur(Socket s,TextArea out) { entree= new DataInputStream(s.getInputStream()); visu=out; this.start(); } public void run() { String ligne; try {while (true) {ligne=entree.readLine(); if (ligne==null) break; visu.appendText("\n"+ligne); }} catch (IOException e) {visu.setText(e.toString());} finally {visu.setText("connexion interrompue par le serveur");} } }

A. Le Grand

Universit de Genve

16

Java et les bases de donnesMichel Bonjour http://cuiwww.unige.ch/~bonjour

CENTRE UNIVERSITAIRE DINFORMATIQUE

UNIVERSITE DE GENEVE

Java et les bases de donnes

Plan Introduction JDBC: API SQL pour Java - JDBC, Java, ODBC, SQL - Architecture, interfaces, exemples Java et le client-serveur - Architecture classique - Architecture revisite: Java ct client, Java ct serveur Persistence dobjets Java - Principes - Exemple de produit: JRBM. Bonjour, CUI-Universit de Genve 2

Java et les bases de donnes

Java et les BD: Quel intrt ? Idem que pour les applications Internet (1) - Portabilit, distribution, accs au rseau, GUI Evolution: statique/dynamique (2) - Problmes: transactions, pr-traitements, etc. Le client-serveur revisit (3) - Client n, code mobile Bases de donnes 2 WWWM. Bonjour, CUI-Universit de Genve

3 1 Javasource: J. Guyot3

Java et les bases de donnes

JDBC: Introduction Quoi ? - API Java pour interagir avec des BD relationnelles * excuter des requtes SQL * rcuprer les rsultats - Tentative de standardiser laccs aux BD (futur: ODMG) - Spcication base sur X/Open SQL CLI (comme ODBC) Pourquoi ? - Rponse de SUN la pression des dveloppeurs - Java est idal pour les applications BD - Alternative aux solutions propritairesM. Bonjour, CUI-Universit de Genve 4

Java et les bases de donnes

JDBC et ... Java: JDBC cest du Java ! - Interfaces, classes, multi-threading - Applets, applications, utilise le Security Manager ODBC: JDBC est au-dessus de ODBC - Arguments pour ODBC: * existe, implant, fonctionne * accept, diffus - Arguments contre ODBC * trs li au langage C (void *, pointeurs) * compliqu, bas sur des paramtres locauxM. Bonjour, CUI-Universit de Genve 5

Java et les bases de donnes

JDBC et SQL Support de SQL-2 Entry Level - SQL dynamique, principaux types SQL - Transactions, curseurs simples - Mta-donnes Mcanismes dextension - Syntaxe inspire dODBC: { mot-cl ... paramtres ... - Fonctions ODBC de conversion, mathmatiques, etc. Long terme - Support de SQL-2 complet}

M. Bonjour, CUI-Universit de Genve

6

Java et les bases de donnes

Architecture de JDBCApplication Java JDBC API JDBC Manager JDBC Driver API JDBC-Net Driver Driver X JDBC-ODBC Bridge Driver ODBC protocole ouvert protocole X protocole Y

JavaSoft Inc.M. Bonjour, CUI-Universit de Genve 7

Java et les bases de donnes

Interfaces de JDBC (1)

JavaSoft Inc.

M. Bonjour, CUI-Universit de Genve

8

Java et les bases de donnes

Interfaces de JDBC (2) DriverManager - Gre la liste des Drivers chargs - Cre les connexions TCP (Connection) - Mappe des URLs vers des connexions Connection Canal de communication TCP vers une BD Format dURL: jdbc:odbc:cuibd.unige.ch:9876/mabd Proprits de la Connection: username, password Cre les Statements (requtes SQL) Gre les transactions (au sens de SQL)9

M. Bonjour, CUI-Universit de Genve

Java et les bases de donnes

Interfaces de JDBC (3) Statement - Gre les requtes SQL simples - Sous-types: * PreparedStatement: requtes paramtres (IN) * CallableStatement: procdures stockes (OUT) - Passage de paramtres: * mthodes set... * accs par lindex - Cre les ResultSet

M. Bonjour, CUI-Universit de Genve

10

Java et les bases de donnes

Interfaces de JDBC (4) ResultSet - Gre laccs aux tuples dun rsultat (SELECT) - Accs aux colonnes: par nom, par index - Conversions de types entre SQL et Java - Possibilit dutiliser un stream pour rcuprer les donnes brutes (bytes, ASCII, Unicode) - Gre des curseurs simples

M. Bonjour, CUI-Universit de Genve

11

Java et les bases de donnes

Exemple de SELECTjava.sql.Statement st = conn.createStatement(); ResultSet r=st.executeQuery(SELECT nom, age FROM T1); while (r.next()) { // imprime les lments du tuple String s = r.getString(nom); int i = r.getInt (age); // ou bien r.getInt (2) System.out.println (nom: + s + age: + i); }

M. Bonjour, CUI-Universit de Genve

12

Java et les bases de donnes

Exemple de UPDATEjava.sql.PreparedStatement ps = conn.createStatement(UPDATE T1 SET cat=? WHERE age=?); ps.setString(1, Ado); for (int i = 14; i < 19; i++) { ps.setInt (2, i); int nbTuples = ps.executeUpdate(); System.out.println (age: + i + nb: + nbTuples); }

M. Bonjour, CUI-Universit de Genve

13

Java et les bases de donnes

Client-serveur: Architecture classiqueclient pais GUI xy Net xy serveur Serveur xy

Net xy code xy

TCP/IP

TCP/IP

xy: Oracle, Sybase, etc.

M. Bonjour, CUI-Universit de Genve

14

Java et les bases de donnes

Limites du client-serveur classique Ct client: - GUI: moche, non-standard, runtime - Net: protocole ferm, mais: scurit, performances - Epaisseur: installation, conguration cble - Dveloppement: langage client, peu portable Ct serveur - Net: protocole ferm, mais: rpartition, homognit - Dveloppement: langage serveur, pas portable

M. Bonjour, CUI-Universit de Genve

15

Java et les bases de donnes

Client-serveur: Architecture avec Javaclient n Browser Java VM serveur Serveur xy

Request Broker code Java

TCP/IP

TCP/IP

xy: Oracle, Sybase, etc.

M. Bonjour, CUI-Universit de Genve

16

Java et les bases de donnes

Avantages du client-serveur avec Java Ct client: - Browser: interface uniforme, bookmarks, plug-ins - Java VM: scurit - Finesse: TOUT se tlcharge, pas de cong locale - Dveloppement: Java, HTML (gare JavaScript !) Ct serveur - Request Broker: centralise les appels aux services - Dveloppement: Java * local: code excut par le serveur * mobile: code stock dans la BD et envoy au clientM. Bonjour, CUI-Universit de Genve 17

Java et les bases de donnes

Persistence dobjets Java: Principes Stocker des objets Java dans un SGBD - Performance, scurit, concurrence, etc. Dveloppement - Cration des classes Java - Gnration +/- automatique: * Java: mthodes (binding) * SGBD: tables Diffrence de paradigme: OO vs Relationnel - Java: classes, types simples1, rfrences, arrays - Relationnel: tables, types simples2, jointuresM. Bonjour, CUI-Universit de Genve 18

Java et les bases de donnes

JRB: Java Relational BindingO2 Technology, Oct. 1996

Stockage dobjets Java dans un SGBD relationnel API + outils Code Java - Voit un systme persistant - Fait appel lAPI JRB Runtime - Gre un cache dobjets Communication avec le SGBD - Interface compatible JDBCM. Bonjour, CUI-Universit de Genve 19

Java et les bases de donnes

Etapes du dveloppement Programmation + conguration - Ecriture des classes Java, compilation - Choix des classes/variables stocker Importation des classes - Gnration de mthodes Java (access, update) - Cration de la BD (tables, cls, index) Mise jour du code source - Inclusion des mthodes gnres - Ecriture des mthodes daccs profond Compilation, etc.M. Bonjour, CUI-Universit de Genve 20

Java et les bases de donnes

Cycle de dveloppementCar.class config O2 Technology

jrb_import

Car.importwrite read

ajouter

Car.java

JRB runtime cacheupdate access

javac

Appl... Java

Car.class

M. Bonjour, CUI-Universit de Genve

21

Java et les bases de donnes

Gestion des objets Cration dun objet - Mthode new() habituelle Ecriture dun objet - Invocation de update() ou de VOTRE deepUdate() Lecture dun objet Invocation de access() ou de VOTRE deepAccess() A partir de lextension de la classe (~ curseur SQL) A laide dun prdicat de recherche En suivant un lien depuis un autre objet stock

M. Bonjour, CUI-Universit de Genve

22

Java et les bases de donnes

Exemple de cration/criturePerson john = new Person("John", 36); Person mary = new Person("Mary", 32); Person bob = new Person ("Bob", 6); john.spouse = mary; // references mary.spouse = john; john.children[0] = bob; // 1 child mary.children[0] = bob; Database database = new Database(Database.SYBASE,"java_store", "mb","mb_password"); database.connect(); // open a connection to the database server database.open("base1"); // open the database base1 Transaction transaction = new Transaction(); transaction.begin() ; // start a new transaction john.update(); // indicates to the system that these objects must be written in mary.update(); // the database at commit time bob.update(); transaction.commit(); // commit the transaction database.close(); // close the database database.disconnect();

M. Bonjour, CUI-Universit de Genve

23

Java et les bases de donnes

Exemple daccsDatabase database = new Database(Databse.SYBASE, "java_store", "mb", "mb_password"); database.connect(); // open a connection to the database server database.open("base1"); // find John in the database Person john = (Person) Extent.all("Person").where("name = 'John'").element(); Person mary = (Person) john.spouse.access(); // load his spouse in memory Transaction transaction = new Transaction(); transaction.begin() ; // start a new transaction Person bob = (Person) Database.access(john.children,0); // load the 1st child in memory bob.age = 7; // change his age bob.update(); // mark it to be written to the database at commit time transaction.commit(); // commit the transaction database.close(); // close the database database.disconnect();

M. Bonjour, CUI-Universit de Genve

24

Java et les bases de donnes

Conclusion Avantages - Optimisation: utilisation des possibilits du SGBD - Transparence: choix des classes stocker, appel lAPI - Notion de transaction Inconvnients, limites - Processus batch - Ecriture des mthodes deep...() - Support limit de lvolution des classes (ajout variable) Avenir - Stockage dans O2, support de lvolutionM. Bonjour, CUI-Universit de Genve 25

Java et les bases de donnes: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in JavaMichel Bonjour http://cuiwww.unige.ch/~bonjour

Java et les bases de donnes

Plan JDBC: API bas niveau pour laccs aux BD (SQL) Introduction JDBC et : Java, ODBC, SQL Interfaces, exemples Types de drivers JDBC, architectures

SQLJ: code SQL embarqu dans Java Introduction Dveloppement en SQLJ Concepts, exemples Traduction SQLJ - JDBC2

M. Bonjour, 1997

Java et les bases de donnes

JDBC: Introduction Quoi ? - API Java pour interagir avec des BD relationnelles * excuter des requtes SQL (statiques ou dynamiques) * rcuprer les rsultats - Tentative de standardiser laccs aux BD (futur: ODMG) - Spcication base sur X/Open SQL CLI (comme ODBC) Pourquoi ? - Rponse de SUN la pression des dveloppeurs - Java est idal pour les applications BD - Alternative aux solutions propritairesM. Bonjour, 1997 3

Java et les bases de donnes

JDBC et ... Java: JDBC cest du Java ! - Interfaces, classes, multi-threading - Applets, applications, utilise le Security Manager ODBC: JDBC est au-dessus de ODBC - Arguments pour ODBC: * existe, implant, fonctionne * accept, diffus - Arguments contre ODBC * trs li au langage C (void *, pointeurs) * compliqu, bas sur des paramtres locauxM. Bonjour, 1997 4

Java et les bases de donnes

JDBC et SQL Support de SQL-2 Entry Level - SQL dynamique, principaux types SQL - Transactions, curseurs simples - Mta-donnes (accs au dictionnaire de la BD) Mcanismes dextension - Syntaxe inspire dODBC: { mot-cl ... paramtres ... - Fonctions ODBC de conversion, mathmatiques, etc. Long terme - Support de SQL-2 complet}

M. Bonjour, 1997

5

Java et les bases de donnes

Architecture de JDBCCode Java JDBC API JDBC Manager JDBC Driver API Driver X Driver Y JDBC-ODBC Bridge Driver ODBC protocole X protocole Y protocole Z : core Java : JavaSoft (gratuit) : vendeur SGBD BD XM. Bonjour, 1997

BD Y

BD Z

JavaSoft Inc.6

Java et les bases de donnes

Interfaces de JDBC (1)

JavaSoft Inc.

M. Bonjour, 1997

7

Java et les bases de donnes

Interfaces de JDBC (2) DriverManager - Gre la liste des Drivers chargs - Cre les connexions TCP (Connection) - Mappe des URLs vers des connexions Connection Canal de communication TCP vers une BD Format dURL: jdbc:odbc:cuibd.unige.ch:9876/mabd Proprits de la Connection: username, password Cre les Statements (requtes SQL) Gre les transactions (au sens de SQL)8

M. Bonjour, 1997

Java et les bases de donnes

Interfaces de JDBC (3) Statement - Gre les requtes SQL simples - Sous-types: * PreparedStatement: requtes paramtres (IN) * CallableStatement: procdures stockes (OUT) - Passage de paramtres: * mthodes set... * accs par lindex - Cre les ResultSet

M. Bonjour, 1997

9

Java et les bases de donnes

Interfaces de JDBC (4) ResultSet Gre laccs aux tuples dun rsultat (SELECT) Accs aux colonnes: par nom, par index Conversions de types entre SQL et Java Possibilit dutiliser un stream pour rcuprer les donnes brutes (bytes, ASCII, Unicode) - Gre des curseurs simples

M. Bonjour, 1997

10

Java et les bases de donnes

Exemple de SELECTConnection conn = DriverManager.getConnection ("jdbc:oracle:thin:@host:port:sid","user","passwd"); java.sql.Statement st = conn.createStatement(); ResultSet r=st.executeQuery(SELECT nom, age FROM T1); while (r.next()) { // imprime les lments du tuple String lenom = r.getString(nom); int lage = r.getInt (age); // ou bien r.getInt (2) System.out.println (nom: + lenom + age: + lage); }

M. Bonjour, 1997

11

Java et les bases de donnes

Exemple de UPDATEafcher le nb de personnes ayant 14,15..18 ans et modier leur catgorie (Ado)

java.sql.PreparedStatement ps = conn.createStatement(UPDATE T1 SET cat=? WHERE age=?); ps.setString(1, Ado); for (int i = 14; i < 19; i++) { ps.setInt (2, i); int nbTuples = ps.executeUpdate(); System.out.println (age: + i + nb: + nbTuples); }

M. Bonjour, 1997

12

Java et les bases de donnes

Driver JDBC Type 1JDBC-ODBC BridgeJava binaire binaire JDBC-ODBC Bridge Driver ODBC BD X Code client BD X

Client pais - ODBC + Driver ODBC du SGBD - Librairies client du SGBD Application Java, mais pas applet - Fichiers de cong de ODBC - Binaire non portable Utilisation - Test, 1re implantation de JDBC - Middle-tier (Accs pls. BD)13

protocole BD X

BD XM. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 2Native-API Partly-Java DriverJava binaire Driver JDBC BD X Code client BD X

Client pais - Driver traduit les appels JDBC en appels lAPI du SGBD - Librairies client du SGBD Avantage - Protocole BD X optimis Utilisation - Applications Java 2-tier - Middle-tier (Accs efcace)14

protocole BD X

BD X

M. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 3Net Protocol All-Java DriverDriver Java protocole M

Client n - Driver traduit les appels JDBC en appels au middleware Applets ou applications Java - Driver charg avec le code Java Utilisation - Ncessite un middle-tier (accs BD) - Solution tout Java pour architecture 3-tierBD Y15

protocole M

Serveur MAPI X API Y

BD XM. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 4Native Protocol All-Java DriverJava Driver JDBC BD X

Client n - Driver traduit les appels JDBC en appels lAPI du SGBD - Driver cre des sockets pour muler le protocole BD X light Avantage / Dsavantage - Tout Java = portable - Tout Java = charger Driver (~300K)

sockets Java protocole BD X light

BD X

Utilisation - Applets en architecture 2-tier16

M. Bonjour, 1997

Java et les bases de donnes

Applet et Driver Type 4: exempleClient HTTP Browser Web Applet Java Driver JDBC Thin Oracle TCP/IP, SQL*Net OracleHTML Java

Serveur Serveur Web

Source: M.P. Mesaros, Oracle

M. Bonjour, 1997

17

Java et les bases de donnes

JDBC: avantages - dsavantages Avantages Fait partie de core Java API complet pour SQL dynamique Nombreuses fonctions de conversions Support des types BLOB: streams Java Multiples drivers: congurations 2-tier, 3-tier, etc.

Dsavantages - Pas de vrication de type vis vis de la BD - Ecriture fastidieuse, code peu lisible - Rsultats ne sont pas des objets JavaM. Bonjour, 1997 18

Java et les bases de donnes

SQLJ: Introduction SQL embarqu dans Java (embedded SQL) Proposition de norme par IBM, Oracle, Sybase, Tandem Principe - Clauses #sql dans le code source Java - Etape de pr-compilation avec accs au schma de la BD * vrication, optimisation du SQL * gnration de classes Java (connexions, rsultats) * gnration du code JDBC dtaill Pr-processeur est crit en Java Complmentaire JDBCM. Bonjour, 1997 19

Java et les bases de donnes

Dveloppement en SQLJCode source Java + SQLJ.sqlj

Code source Java + JDBC Pr-compilateur SQLJ.java

Compilateur Java

Executable Java BD.class

M. Bonjour, 1997

20

Java et les bases de donnes

Buts de SQLJ Faciliter laccs aux BDs depuis Java - SQL statique (requtes formes avant lexcution) - Code simpli, plus concis Vrier le code SQL avant lexcution - Syntaxe des ordres SQL - Compatibilit des types Java et SQL - Conformit avec le schma de la BD (option) Crer du code mobile: excution sur chaque tier Supporter la composition (rsultats sont des objets)

M. Bonjour, 1997

21

Java et les bases de donnes

Principaux concepts de SQLJ Clauses SQLJ: expressions SQL#sql { UPDATE EMP SET SAL = 9999 WHERE DEPT = :d } ;

Variables htes: variables Java utilises dans des clausesString d = "ventes" ;

Connection Context: paramtres de connexion une BD (ex: utilisateur, session, transaction)int maxi; #sql context bdParis ; #sql [bdparis] (SELECT MAX(SAL) INTO :maxi FROM EMP);

Itrateurs: encapsulation des rsultats de requtes

M. Bonjour, 1997

22

Java et les bases de donnes

Itrateurs en SQLJtransformer les rsultats de requtes en objets Java A chaque format de rsultat on associe un itrateur#sql iterator NomSalaire (String nom, int salaire);

A chaque requte on associe une instance ditrateurNomSalaire salventes; // salaires du dpt. ventes #sql salventes = { SELECT ENAME, SAL FROM EMP WHERE ... };

Une fois la requte excute, on accde aux mthodes de cet objet itrateurwhile (salventes.next()) { System.out.println("Nom: " + salventes.nom() + "Salaire: " + salventes.salaire()); }

M. Bonjour, 1997

23

Java et les bases de donnes

Traduction SQLJ-JDBC Clauses SQLJ: traduites en JDBC - Accs aux variables htes - Conversion entre types SQL et Java Connection Context: traduites en Connections JDBC Itrateurs: traduits en classes Java - Gnration des mthodes daccs aux colonnes - Gnration de la mthode next() - Code Java dinstanciation de litrateur Vrications de types

M. Bonjour, 1997

24

Java et les bases de donnes

Avantages de SQLJ Clauses de haut niveau, code lisible SQLJ cest du Java: portabilit, etc. Qualit du code: gnration correcte, optimisation Vrications avant lexcution (y compris avec la BD) Rsultats (itrateurs) sont des objets, ils peuvent tre changs entre composants Java

M. Bonjour, 1997

25

Java et les bases de donnes

SQLJ: prsent et futur Promoteurs leaders du march Proposition de norme soumise ANSI / ISO Implmentation de rfrence disponible (cf. Oracle) Langage daccs aux BD depuis chaque tier - Ct client: gnration depuis IDE - Ct serveur: procdures stockes compiles pour la BD ex: futur langage natif dOracle (comme PL/SQL) Versions visual de SQLJ dans les futurs IDE

M. Bonjour, 1997

26