LelangageJava CoursElec5–EPUusers.polytech.unice.fr/~vg/ressources/Java.pdf · LelangageJava...

56
Le langage Java Cours Elec5 – EPU Granet Vincent 12 octobre 2016 0-0 Bibliography V. Granet U.N.S.A. Le langage Java 1 Part 1: Bibliography ef´ erences [1] Vincent Granet and Jean-Pierre Regourd. Aide-M´ emoire de Java. Dunod, 2 edition, 2008. [2] Bertrand Meyer. Conception et Programmation orient´ ees objet. Eyrolles, 2000. [3] Walter Savitch. Java, an Introduction to Computer Science and Programming. Prentice-Hall, 1999. [4] H.M. Deitel and P.J. Deitel. Java. How to program. Prentice-Hall, 1998. [5] J. Skansholm. Java From the Beginning. Addison Wesley, 2000. [6] R. Lafore. Data Structures and Algorithms in Java. Wait Group Press, 1998. [7] Vincent Granet. Algorithmique et programmation en Java. Dunod, 2 edition, 2004. [8] Web Java. voir http://java.sun.com. V. Granet U.N.S.A. Le langage Java 2 Introduction V. Granet U.N.S.A. Le langage Java 3

Transcript of LelangageJava CoursElec5–EPUusers.polytech.unice.fr/~vg/ressources/Java.pdf · LelangageJava...

Le langage Java

Cours Elec5 – EPU

Granet Vincent

12 octobre 2016

0-0

Bibliography

V. Granet U.N.S.A. Le langage Java 1

Part 1: Bibliography

References

[1] Vincent Granet and Jean-Pierre Regourd.

Aide-Memoire de Java. Dunod, 2 edition,

2008.

[2] Bertrand Meyer. Conception et

Programmation orientees objet. Eyrolles, 2000.

[3] Walter Savitch. Java, an Introduction to

Computer Science and Programming.

Prentice-Hall, 1999.

[4] H.M. Deitel and P.J. Deitel. Java. How to

program. Prentice-Hall, 1998.

[5] J. Skansholm. Java From the Beginning.

Addison Wesley, 2000.

[6] R. Lafore. Data Structures and Algorithms in

Java. Wait Group Press, 1998.

[7] Vincent Granet. Algorithmique et

programmation en Java. Dunod, 2 edition,

2004.

[8] Web Java. voir http://java.sun.com.

V. Granet U.N.S.A. Le langage Java 2

Introduction

V. Granet U.N.S.A. Le langage Java 3

Part 2: Introduction

Langage a objets vs langage procedural

— criteres de justesse et fiabilite

— structuration autour des actions

programmation descendante par

raffinements successifs

— structuration autour des objets

perinite des objets par rapport aux actions

objet = attributs + methodes— programme = collection d’objets

dynamiques qui sont en interaction

— envoie de messages

— extensibilite, compatibilite, reutilisabilite

V. Granet U.N.S.A. Le langage Java 4

Part 2: Introduction

Historique

— 1991, J. Gosling et Sun. Langage pour

programmer des processeurs embarques

dans des appareils electromenagers

— Origine du nom : Oak puis Java (kawa)

— 1994, Java utilise pour ecrire un navigateur

Web (futur HotJava)

— Netscape inclut un interprete Java dans

son navigateur

— 2000, Java 2 (J2SE - J2EE)

— Java langage de programmation a usage

general + application pour le Web (applet

= little application)

— Java embarque : PDA, telephones mobiles

— 2009 Oracle rachete Sun

— 2011, Java 7

— 2014, Java 8 - λ-fonctions

V. Granet U.N.S.A. Le langage Java 5

Part 2: Introduction

Avantages

— langage a objets

— syntaxe simple

— notation issue de C

— portabilite

— API tres vaste

— javadoc

— interfaces graphiques (awt, Swing)

— environnement jdk gratuit

V. Granet U.N.S.A. Le langage Java 6

Part 2: Introduction

Inconvenients

— produit industriel

— temps d’execution - Interpretation (mais

JIT)

— API tres (trop ?) vaste, difficile a maıtriser

— constructions archaıques issues de C

— temps reel

V. Granet U.N.S.A. Le langage Java 7

Part 2: Introduction

Premieres applications

/* ma premiere application Java */

c l a s s HelloWorld {

pub l i c s t a t i c void main(String [] args) {

System.out.println("Hello World!");

}

} // fin classe HelloWorld

/* ma premiere applet Java */

import java.awt.Graphics ;

import java.applet.Applet;

pub l i c c l a s s HelloWorldApplet extends Applet {

pub l i c void paint(Graphics g) {

g.drawString("Hello World!", 5, 25);

}

} // fin classe HelloWorldApplet

V. Granet U.N.S.A. Le langage Java 8

Part 2: Introduction

Compter les caracteres

/** La classe Wc ecrit le nombre de caracteres

* lus sur l’entree standard

*/

import java.io.*;

pub l i c c l a s s Wc {

pub l i c s t a t i c void main (String [] args)

throws IOException

{

i n t nbc = 0; // compteur de caracteres

whi le (System.in.read () != -1)

nbc++;

// fin de fichier de l’entree standard

System.out.println(nbc);

}

} // fin classe Wc

V. Granet U.N.S.A. Le langage Java 9

Part 2: Introduction

Principe de compilation

— interpretation

bytecode

source

(.java)

Java

Java

compilateur Javafichier

bytecode

(.class)

interprète

Java

Java

Java

— la variable CLASSPATH

— Production code a la volee (JIT)

V. Granet U.N.S.A. Le langage Java 10

Part 2: Introduction

Comment compiler et executer ?

$ javac HelloWorld.java

$ java HelloWorld

Hello World!

$ javac HelloWorldApplet.java

$ appletviewer HelloWorldApplet.html

<applet

code="HelloWorldApplet.class" width=400 height=150>

</applet>

V. Granet U.N.S.A. Le langage Java 11

Part 2: Introduction

La documentation

— javadoc

— produit une documentation en html

— traite les commentaires /** */

— reconnaıt des macros :

— @author

— @version

— @param

— @return

— @see

— ...

$ javadoc Wc.java

$ firefox index.html

V. Granet U.N.S.A. Le langage Java 12

Les types elementaires

V. Granet U.N.S.A. Le langage Java 13

Part 3: Les types elementaires

Les nombres

— Arithmetique classique

— byte (8 bits)

— short (16 bits)

— int (32 bits)

— long (64 bits)

123 0 98 067 0xAeF1

Byte.MIN VALUE Byte.MAX VALUE

Short.MIN VALUE Short.MAX VALUE

Integer.MIN VALUE Integer.MAX VALUE

Long.MIN VALUE Long.MAX VALUE

— float (32 bits)

— double (64 bits)

123.12 0. .12 98. 3.5e-7 1.5e2

Float.MIN VALUE Float.MAX VALUE

Double.MIN VALUE Double.MAX VALUE

V. Granet U.N.S.A. Le langage Java 14

Part 3: Les types elementaires

Les booleens

— boolean

— false et true

— operateurs :

! la negation

| la disjonction

^ la disjonction exclusive

& la conjection

|| la disjonction conditionnelle

&& la conjection conditionnelle

i f (i<n && t[i]) {

....

V. Granet U.N.S.A. Le langage Java 15

Part 3: Les types elementaires

Les caracteres

— char

— jeu de caracteres Unicode sur 16 bits

— www.unicode.org

— constantes denotees en apostrophes (e.g.

’a’, ’4’, ’ ’, etc.)

— caracteres speciaux :

\b \f \n \r \t \\ \’

— valeur hexadecimale : \uxxxx (e.g. \u0041)

— int nbEleves;

— double ∆;

V. Granet U.N.S.A. Le langage Java 16

Part 3: Les types elementaires

Les conteneurs

— Les valeurs des types elementaires ne sont

pas des objets (au sens de la

programmation objet)

Byte Short Integer Long

Float Double

Boolean

Character

— mais conversions implicites (jdk1.5)

Integer i = 5;

char c = new Character(’z’);

V. Granet U.N.S.A. Le langage Java 17

Les enonces

V. Granet U.N.S.A. Le langage Java 18

Part 4: Les enonces

Les enonces conditionnels

— meme semantique que C

— if

— switch

V. Granet U.N.S.A. Le langage Java 19

Part 4: Les enonces

pub l i c s t a t i c void main (String [] args) throws IOEx

{

f i n a l double ε = 0.0001; // precision du calcul

double a = StdInput .readDouble(),

b = StdInput .readDouble(),

c = StdInput .readlnDouble(),

r1 , r2, i1 , i2, ∆;

// a6=0, b et c coefficients reels de

// l’equation du second degre, axˆ2 + bx + c

∆ = (b*b)-4*a*c;

i f (∆>=0) { // calcul des racines reelles

i f (b>0) r1 = -(b+Math.sqrt(∆))/(2*a);

e l s e r1 = (Math.sqrt(∆)-b)/(2*a);

// r1 est la racine la plus grande en valeur absolue

r2 = Math.abs(r1) < ε ? 0 : c/(a*r1);

i1 = i2 = 0;

// (x-r1)(x-r2)=0

}

e l s e { // calcul des racines complexes

r1 = r2 = -b/(2*a);

i1 = Math.sqrt(-∆)/(2*a); i2 = -i1;

}

// (x-(r1+i×i1)) (x-(r2+i×i2)) = 0

// ecrire les racines solutions sur la sortie standard

System.out.println("r1= (" + r1 + "," + i1 + ")");

System.out.println("r2= (" + r2 + "," + i2 + ")");

}

V. Granet U.N.S.A. Le langage Java 20

Part 4: Les enonces

Les enonces iteratifs

— meme semantique que C

— while

— do-while

— for

pub l i c s t a t i c long factorielle( long n)

// Antecedent: n > 0

// Consequent: factorielle=n!

{

long i = 0, fact = 1;

// Invariant : fact=i!

whi le (i<n) {

// fact * (i+1) = i!*(i+1) et i<n

i++;

// fact*i = i!

fact*=i;

// fact = i!

}

// i=n et fact = i! = n!

return fact;

}

V. Granet U.N.S.A. Le langage Java 21

Les objets

V. Granet U.N.S.A. Le langage Java 22

Part 5: Les objets

Objets et Classes

— application = collection d’objets

dynamiques en interaction

— objet = fournisseur de services

utilises par des clients

— programmation par contrat. B.

Meyer.

— classe = moule a objets

— une classe n’est pas un objet (en

Java)

— un objet est une instance d’une

classe

— attributs et methodes

c l a s s Rectangle {

double largeur , longueur ;

}

V. Granet U.N.S.A. Le langage Java 23

Part 5: Les objets

Creation des objets

Rectangle r;

r = new Rectangle();

ou

Rectangle r = new Rectangle();

largeur

longueur 0.0

0.0

r

référence

objet de type Rectangle

V. Granet U.N.S.A. Le langage Java 24

Part 5: Les objets

References

La variable r est une reference a l’objet, et non pas

l’objet lui-meme.

Pb de l’affectation, de la comparaison et du

passage de parametre.

Rectangle q = r;

largeur

longueur 0.0

0.0

r

référence

q

référence

V. Granet U.N.S.A. Le langage Java 25

Part 5: Les objets

Les constructeurs

— pour initialiser l’objet construit

— du nom de la classe

— constructeur par defaut (e.g. Rectangle())

— valeur initiale 0 (0.0, \u0000, false , null)

// construit un Rectangle de largeur l et de longueur L

Rectangle(double l, double L) {

largeur = l; longueur = L;

}

Le constructeur par defaut est perdu ! Il faut le

redefinir.

// construit un Rectangle de largeur et de longueur egales a 0

Rectangle() {

largeur = longueur = 0.0;

}

V. Granet U.N.S.A. Le langage Java 26

Part 5: Les objets

Destruction des objets

— automatique en Java

— a la charge du support d’execution

— va dans le sens de la securite

V. Granet U.N.S.A. Le langage Java 27

Part 5: Les objets

Les methodes

— procedures et fonctions

— objet = automate a etats

— une procedure modifie l’etat

— une fonction renvoie une description de

l’etat

— modele pas toujours possible

c l a s s Rectangle {

double largeur , longueur ;

// modifie la largeur du Rectangle courant

void changerLargeur(double l) {

largeur = l;

}

// renvoie le perimetre du Rectangle courant

double perimetre() {

return 2 * (largeur + longueur );

}

}

V. Granet U.N.S.A. Le langage Java 28

Part 5: Les objets

Acces aux attributs et aux methodes

— notation pointee

r.largeur;

r.perimetre();

— attributs publics

— attributs prives

c l a s s Rectangle {

pr iva t e double largeur , longueur ;

// modifie la largeur du Rectangle courant

pub l i c void changerLargeur(double l) {

largeur = l;

}

// renvoie le perimetre du Rectangle courant

pub l i c double perimetre() {

return 2 * (largeur + longueur );

}

}

V. Granet U.N.S.A. Le langage Java 29

Part 5: Les objets

Methodes et attributs statiques

s t a t i c i n t partage ;

s t a t i c void uneMethode() { ... }

— Existent independamment de la creation

des objets

— Accessibles avec le nom de la classe

System.out des attributs

Math.PI

Math.exp(13.4) des methodes

Math.sin(3.14)

StdInput.readInt()

main

Les methodes statiques remettent en cause le

modele objet !

V. Granet U.N.S.A. Le langage Java 30

Part 5: Les objets

Paquetages(1/2)

— Paquetage = ensemble de classes d’une

meme thematique (java.awt, java.lang,

java.math, ...)

java

applet awt io lang

javax org

package monpaquetage;

package mon.paquetage;

package java.io;

— le paquetage est un repertoire du systeme

de fichiers

— par defaut une classe appartient au

repertoire courant

— CLASSPATH

V. Granet U.N.S.A. Le langage Java 31

Part 5: Les objets

Paquetages(2/2)

Notation qualifiee :

java.util.Random r = new java.util.Random ();

mais

import java.util.Random;

Random r = new Random ();

Exemples

import paquetage.classe;

import paquetage.*;

import java.awt.Canvas;

import java.io.*;

V. Granet U.N.S.A. Le langage Java 32

Part 5: Les objets

Portees

— les classes

defaut le paquetage

public partout

— les attributs et les methodes

defaut le paquetage

public partout

private la classe

protected classe

sous-classes

paquetage

V. Granet U.N.S.A. Le langage Java 33

Les chaınes de caracteres

V. Granet U.N.S.A. Le langage Java 34

Part 6: Les chaınes de caracteres

Les chaınes de caracteres(1/3)

— Les chaınes de caracteres sont des objets

— String et StringBuilder

String s = "Hello";

est equivalent a

String s = new String("Hello");

— la position du 1er caractere est a 0

— operateur de concatenation +

— attribut length longueur du chaıne

V. Granet U.N.S.A. Le langage Java 35

Part 6: Les chaınes de caracteres

String prenom = "Pierre",

nom = "Martin";

System.out.println(prenom + " " + nom);

System.out.println(prenom.length );

V. Granet U.N.S.A. Le langage Java 36

Part 6: Les chaınes de caracteres

Les chaınes de caracteres (2/3)

— La concatenation peut provoquer une

conversion implicite

System.out.println (5 + "2");

— pour un objet : appel implicite a la

methode toString.

pub l i c String toString () {

return "Rectangle (" + largeur + ","

+ longueur + ")";

}

V. Granet U.N.S.A. Le langage Java 37

Part 6: Les chaınes de caracteres

Les chaınes de caracteres (3/3)

char charAt(int index)

int indexOf(int ch)

int indexOf(int ch, int index)

int indexOf(String str)

int indexOf(String str, int index)

String substring(int beginIndex)

String toLowerCase()

String toUpperCase()

int compareTo(String s)

boolean equals(String s)

i n t pos = 0; // position du modele dans le texte

whi le ((pos = texte.indexOf(modele , pos)) != -1)

System.out.println(pos++);

V. Granet U.N.S.A. Le langage Java 38

Les tableaux

V. Granet U.N.S.A. Le langage Java 39

Part 7: Les tableaux

Tableaux a une dimension (1/4)

— les tableaux sont des objets (mais pas

d’heritage)

— declaration :

i n t [] t; // t est un tableau d’entiers

La declaration d’un tableau NE cree PAS ses com-

posants

i n t [] t1 = new in t [ 10 ]; // 10 entiers

Complexe []t2 = new Complexe [5]; // 5 references

— composants de t[0] a t[max-1]

— initialisation a 0, false , ’\u0000’ou null

V. Granet U.N.S.A. Le langage Java 40

Part 7: Les tableaux

double [] t3 = { 3.4, 2.0, -34 }; // 3 reels doubles

t1 = new in t [] { 1, 2, 3 }; // 3 entiers

V. Granet U.N.S.A. Le langage Java 41

Part 7: Les tableaux

Tableaux a 1 dimension (2/4)

— la taille du tableau est fixee a sa creation

— l’attribut length retourne le nb de

composants

— length ne peut pas etre modifie

Les variables de type tableau sont des references.

Les operateurs = et == n’operent pas sur les compo-

sants !

t1 = t2 affectation de references

t1 == t2 comparaison de references

idem pour le passage de parametres tableaux

t = ( i n t []) t1.clone();

System.out.println(Arrays.equals(t,t1));

V. Granet U.N.S.A. Le langage Java 42

Part 7: Les tableaux

Tableaux a 1 dimension (3/4)

pub l i c c l a s s Table {

pr iva t e i n t [] tab;

// le generateur de nombres alearoires

pr iva t e Random rand = new Random ();

pub l i c Table( i n t n)

// Role: initialise le tableau tab de facon aleatoire

{

i f (n<=0) {

System.err.println("taille <= 0");

System.exit (1);

}

tab = new in t [ n ];

f o r ( i n t i = 0; i < tab.length; i++)

// les elements tab[0]..tab[i-1] sont

// initialises de facon aleatoire

tab[i] = rand.nextInt ();

}

} // fin classe Table

V. Granet U.N.S.A. Le langage Java 43

Part 7: Les tableaux

Tableaux a 1 dimension (4/4)

/* Trie une table par selection ordinaire */

pub l i c void selectionOrdinaire () {

f o r ( i n t i = 0; i < tab.length - 1 ; i++) {

// le tableau tab[0..i-1] est trie, et ces elements

// sont inferieurs a ceux de tab[i..tab.length-1]

i n t min = i;

// chercher la place du min dans tab[i..tab.length-1]

f o r ( i n t j = i+1; j < tab.length ; j++)

i f (tab[j] < tab[min]) min = j;

// echanger le ieme et l’element min

echanger (min ,i);

}

}

pr iva t e void echanger ( i n t i, i n t j) {

// echange les valeurs de tab[i] et tab[j]

i n t temp = tab[i];

tab[i] = tab[j];

tab[j] = temp;

}

V. Granet U.N.S.A. Le langage Java 44

Part 7: Les tableaux

Parametres de l’application

— tableau de chaınes de caracteres

— parametre de la fonction main

/**

* Cette application ecrit sur la sortie standard

* ses parametres passes lors de son execution

*/

c l a s s Echo {

pub l i c s t a t i c void main(String [] args) {

f o r ( i n t i = 0; i < (args.length -1); i++)

System.out.print(args[i] + " ");

// ecrire le dernier parametre et le passage a la ligne

System.out.println(args[args.length -1]);

}

}

V. Granet U.N.S.A. Le langage Java 45

Part 7: Les tableaux

Tableaux a plusieurs dimensions (1/3)

— comme en C tableaux de tableaux

— memes remarques qu’a une dimension

double [][] matriceD = new double[m][n];

Complexe [][][] matriceC = new Complexe [m][n][t];

— le nombre de composants des dimensions

peut etre different

double [][] matriceD = new double[m][];

matriceD [0] = new double [5];

matriceD [1] = new double [10];

...

V. Granet U.N.S.A. Le langage Java 46

Part 7: Les tableaux

Tableaux a plusieurs dimensions (2/3)

c l a s s Matrice {

// Invariant : this est une matrice £(lignes,colonnes)£

pr iva t e double [][] m;

pub l i c f i n a l i n t nblgs , nbcols;

// le generateur de nombres alearoires

pr iva t e Random rand = new Random ();

pub l i c Matrice( i n t l, i n t c)

// Role: creer une matrice (l,c)

{ // verifier que l et c sont > 0

...

m = new in t [ l ][ c ];

nblgs = l; nbcols = c;

...

}

} // fin classe Matrice

V. Granet U.N.S.A. Le langage Java 47

Part 7: Les tableaux

Tableaux a plusieurs dimensions (3/3)

pub l i c Matrice produit(Matrice m) {

// Antecedent : this(n,k) et m(k,p) sont

// des matrices initialisees

// Consequent : renvoie une matrice (n,p)

// produit de this par m

Matrice c =

new Matrice( t h i s .nblgs ,m.nbcols);

f o r ( i n t i = 0; i < c.nblgs; i++)

f o r ( i n t j = 0; j < c.nbcols; j++) {

// ∀ x ∈ 0..i − 1, ∀ y ∈ 0..j − 1,

// c x, y =∑

k = 1ˆpthis xkm ky

double somme=0;

f o r ( i n t k = 0; k < t h i s .nbcols; k++)

somme += t h i s .m[i][k]*m.m[k][j];

c.m[i][j] = somme;

}

return c;

}

V. Granet U.N.S.A. Le langage Java 48

Heritage

V. Granet U.N.S.A. Le langage Java 49

Part 8: Heritage

Introduction

— propriete fondamentale des langages a

objets

— outil de la reutilisabilite

— bibliotheques de classes extensibles

V. Granet U.N.S.A. Le langage Java 50

Part 8: Heritage

Classe heritieres (1/2)

pub l i c c l a s s Carre {

// Invariant de classe : cote £>£ 0

pr iva t e double cote ;

pub l i c Carre(double c)

{

cote = c;

}

pub l i c double perimetre()

// Role: retourne le perimetre du carre

{

return 4*cote ;

}

pub l i c double surface ()

// Role: retourne la surface du carre

{

return cote * cote ;

}

} // fin classe Carre

V. Granet U.N.S.A. Le langage Java 51

Part 8: Heritage

Classe heritieres (2/2)

— un carre est un rectangle particulier

— reutilisation de la classe Rectangle

pub l i c c l a s s Carre extends Rectangle {

// Invariant de classe : largeur == longueur > 0

pub l i c Carre(double c) {

super (c,c);

}

pub l i c void changerCote(double cote ) {

// Role: met a jour le cote

super .changerLargeur(cote );

super .changerLongueur(cote );

}

}

— protected

— super et super()

— la classe Object

— le graphe d’heritage

— heritage = specialisation et extension

V. Granet U.N.S.A. Le langage Java 52

Part 8: Heritage

Heritage ou client

— relation est-un

— relation a-un

— mais ...

pub l i c c l a s s Rectangle {

Point origine;

...

}

ou

pub l i c c l a s s Rectangle extends Point {

....

}

V. Granet U.N.S.A. Le langage Java 53

Part 8: Heritage

Redefinition des methodes (1/2)

— les classes heritieres peuvent redefinir des

methodes

— elles doivent posseder la meme signature

(sinon surcharge)

— les classes Rectangle et Carre definissent

les methodes suivantes :

// Dans la classe Rectangle

pub l i c String toString ()

{

return "rectangle de largeur " + largeur

+ " et de longueur " + longueur ;

}

// Dans la classe Carre

pub l i c String toString ()

{

return "carre de cote egal a" + largeur;

}

V. Granet U.N.S.A. Le langage Java 54

Part 8: Heritage

Redefinition des methodes (2/2)

Rectangle r = new Rectangle(2,4);

Carre c = new Carre (6);

System.out.println(r); // r.toString()

System.out.println(c); // c.toString()

rectangle de largeur 2 et de longueur 4

carre de cote egal a 6

V. Granet U.N.S.A. Le langage Java 55

Part 8: Heritage

Recherche d’un attribut ou d’une methode

— chaque fois que l’on desire acceder a un

attribut ou une methode d’une occurrence

d’objet d’une classe C, il devra etre defini

soit dans la classe C, soit dans l’un de ses

ancetres.

— si l’attribut ou la methode n’est pas

trouve, c’est une erreur

— s’il y a eu des redefinitions, sa premiere

apparition en remontant le graphe

d’heritage sera choisie.

V. Granet U.N.S.A. Le langage Java 56

Part 8: Heritage

Polymorphisme (1/2)

— langages polymorphiques et non

polymorphiques (langage type et non type)

— polymorphisme dans les langages de classes

est controle par l’heritage

Rectangle r;

Carre c = new Carre (3);

r = c; // valide : un carre est rectangle

c = r; // erreur de compilation !

// un rectangle n’est pas (forcement) un carre

— Cast : c = (Carre) r ; si on est sur que r

est un Carre

— Exemple une classe Forme pour representer

les formes geometriques quelconques

V. Granet U.N.S.A. Le langage Java 57

Part 8: Heritage

Polymorphisme (2/2)

Forme

Ellipse Rectangle

Cercle Carré

Forme [] tf = new Formes [10];

V. Granet U.N.S.A. Le langage Java 58

Part 8: Heritage

Liaison dynamique

tf[0] = new Rectangle(3 ,10);

tf[1] = new Cercle (7);

...

tf[0] = tf[1]; // tf[0] designe un cercle ?

...

System.out.println(tf[0]); // toString() de Cercle ?

— lorsque qu’il y a des redefinitions de

methodes, c’est a l’execution que l’on

connaıt la methode a appliquer.

— elle est determinee a partir de la forme

dynamique de l’objet sur lequel elle

s’applique.

— Interet :

— localisation

— evite le pb du switch

V. Granet U.N.S.A. Le langage Java 59

Part 8: Heritage

Classes et methodes abstraites

— Une methode abstraite n’est definie que

par sa signature

— Introduite par le mot-cle abstract

— Une classe peut etre declaree abstraite,

— elle decrit des caracteristiques mais pas un

fonctionnement

pub l i c ab s t r a c t c l a s s Forme {

pub l i c ab s t r a c t i n t perimetre();

pub l i c ab s t r a c t i n t surface ();

}

Une classe abstraite ne peut etre instanciee !

V. Granet U.N.S.A. Le langage Java 60

Part 8: Heritage

Heritage simple vs multiple

— en Java l’heritage est simple

— evite les pb complexes de recherche des

noms de l’heritage multiple

Cercle Carré

CercledansCarré

— les interfaces permettent un heritage

multiple simplifie

V. Granet U.N.S.A. Le langage Java 61

Part 8: Heritage

Interfaces (1/2)

— pour une forme simplifiee de l’heritage

multiple

— pour la genericite

— ce sont des classes dont toutes les

methodes sont implicitement abstraites

— elles ne possedent pas d’attribut, a

l’exception de constantes

— ne peuvent pas etre instanciees

pub l i c i n t e r f a c e MonInterface {

s t a t i c f i n a l i n t uneConstate = 10;

ab s t ra c t pub l i c void uneMethode( i n t x);

}

V. Granet U.N.S.A. Le langage Java 62

Part 8: Heritage

Interfaces (2/2)

— une classe peut se comporter comme une

ou plusieurs interfaces

— Elle doit implanter (implements) le ou les

interfaces

— elle et ses descendants s’engagent a definir

le corps des methodes de l’interface

c l a s s MaClasse implements MonInterface {

pub l i c void uneMethode( i n t x) {

....

}

}

— Serializable

— Cloneable

— Runnable

— ActionListener

— ...

V. Granet U.N.S.A. Le langage Java 63

Part 8: Heritage

Interfaces et Polymorphisme

les interfaces permettent un polymorphisme

independant de la hierarchie d’heritage

une variable de type interface I peut designer

n’importe quel objet de toute classe qui implante

cette interface.

c l a s s C1 implements I {

...

}

c l a s s C2 implements I {

...

}

c l a s s C3 implements I {

...

}

V. Granet U.N.S.A. Le langage Java 64

Part 8: Heritage

I [] table = new I[10];

table[0] = new C1();

table[1] = new C2();

table[2] = new C3();

V. Granet U.N.S.A. Le langage Java 65

Part 8: Heritage

Interfaces et genericite(1/2)

— appliquer un traitement des objets quel

que soit leur type

— jusqu’a la version 1.4.2 de Java, la

genericite est limitee et a mettre en œuvre

avec des interfaces

— version 1.5 : notion du langage a part

entiere

On veut ecrire une methode de tri qui puisse trier

un tableau d’objets quelconques ⇒ on doit

pouvoir les comparer

pub l i c s t a t i c void tri( EltComparable [] t) {

... t[i].infOuEgal(t[j]) ...

}

i n t e r f a c e EltComparable {

pub l i c boolean infOuEgal(EltComparable o);

}

V. Granet U.N.S.A. Le langage Java 66

Part 8: Heritage

Interfaces et genericite(2/2)

c l a s s CarreComparable extends Carre

implements EltComparable {

pub l i c boolean infOuEgal(EltComparable o) {

return t h i s .surface () <=

(( CarreComparable) o).surface ();

}

}

c l a s s PersonneComparable extends Personne

implements EltComparable {

pub l i c boolean infOuEgal(EltComparable o) {

return t h i s .taille() <=

(( PersonneComparable ) o).taille ();

}

}

V. Granet U.N.S.A. Le langage Java 67

Part 8: Heritage

// trier des carres

CarreComparable [] t1 = {

new CarreComparable (3), ...,

new CarreComparable (12), ...

};

C.tri(t1);

// trier des personnes

PersonneComparable [] t2 = {

new PersonneComparable (1.73) , ...,

new PersonneComparable (1.90) ,

};

C.tri(t2);

V. Granet U.N.S.A. Le langage Java 68

Les exceptions

V. Granet U.N.S.A. Le langage Java 69

Part 9: Les exceptions

Le probleme

Un evenement qui indique une situation anormale

pouvant provoquer un dysfonctionnement du

programme :

— pb materiel (E/S, memoire, ...)

— pb logiciel (division par zero, non respect

des invariants, ...)

tantque B f a i r e

...

s i erreur a l o r s

traiter erreur

f i n s i

...

fintant

— le code ≪ normal ≫ et le traitement des

erreurs melanges

— code de retour (souvent un entier) pauvre

en information

— un mecanisme elabore : les exceptions

V. Granet U.N.S.A. Le langage Java 70

Part 9: Les exceptions

Traitement

Une exception survient au cours de l’execution

d’une action :

— reexecution de l’action en changeant les

conditions initiales d’execution ;

— transmission de l’exception a

l’environnement

E1

E2

E3

E4 exception

V. Granet U.N.S.A. Le langage Java 71

Part 9: Les exceptions

Exceptions en Java

— Les exceptions sont des objets

— situation anormale ⇒ emission d’une

exception

— java.lang.Exception → java.lang.Throwable

........

Error

Object

Throwable

Exception

IOExceptionRuntimeException

........ArithmeticException

— toutes les exceptions (sauf

RuntimeException) doivent etre

explicitement capturees ou deleguees

V. Granet U.N.S.A. Le langage Java 72

Part 9: Les exceptions

Capture d’une exception (1/2)

— clauses try-catch

try {

// code ≪ normal ≫

...

o.m(); // la methode m peut provoquer une exception

...

}

catch (UneException e) {

// code de traitement de l’exception designee par e

...

}

— clause finally

f i n a l l y {

// code execute quoiqu’il arrive

}

V. Granet U.N.S.A. Le langage Java 73

Part 9: Les exceptions

Capture d’une exception (2/2)

try {

i n t x = StdInput .readlnInt();

....

}

catch (IOException e) {

System.err.println(e);

System.exit (1);

}

pub l i c s t a t i c i n t lirelnInt() {

try {

return StdInput .readlnInt();

}

catch (IOException e) {

System.err.println (e);

System.out.println ("reessayer :");

return lirelnInt();

}

}

V. Granet U.N.S.A. Le langage Java 74

Part 9: Les exceptions

Delegation d’une exception

— une methode n’est pas tenue de capturer

une exception

— elle peut deleguer la capture a son

environnement

— elle le signale avec la clause throws dans

son en-tete

— sauf pour les exceptions de type

RuntimeException

pub l i c void maMethode() throws IOException {

i n t x = StdInput .readlnInt();

....

}

V. Granet U.N.S.A. Le langage Java 75

Part 9: Les exceptions

Creer ses propres exceptions

pub l i c c l a s s MonException extends Exception {

i n t code;

pub l i c MonException() {

super ();

}

pub l i c MonException(String msg) {

super (msg);

}

pub l i c MonException(String msg , i n t c) {

super (msg);

code = c; // c 6= 0

}

pub l i c String toString () {

return getMessage() + " " + code;

}

}

V. Granet U.N.S.A. Le langage Java 76

Part 9: Les exceptions

Emettre une exception

— throw (sans s)

pub l i c void uneMethode() {

i f (...) {

throw new ArithmeticException ();

}

...

}

pub l i c void maMethode() throws MonException {

i f (...) {

throw new MonException("une erreur", 3);

}

...

}

— la clause throws est obligatoire dans

l’en-tete de la methode qui leve une

exception (sauf RuntimeException)

V. Granet U.N.S.A. Le langage Java 77

Les entrees/sorties

V. Granet U.N.S.A. Le langage Java 78

Part 10: Les entrees/sorties

Flots d’octets et de caracteres

— flots sequentiels unidirectionnels

— flots a acces direct

— octets et caracteres Unicode

— quatre classes de base :

lecture ecriture

flots d’octets InputStream OutputStream

flots de caracteres Reader Writer

— paquetage java.io

V. Granet U.N.S.A. Le langage Java 79

Part 10: Les entrees/sorties

Fichiers d’octets

Declaration :

FileInputStream is = new FileInputStream("entree");

FileOutputStream os = new FileOutputStream ("sortie");

— methodes de base :

— int read()

— void write(int)

— void close()

V. Granet U.N.S.A. Le langage Java 80

Part 10: Les entrees/sorties

Exemple : recopie d’un fichier

pub l i c void copie (String in, String out)

throws IOException

{

FileInputStream is = new FileInputStream(in);

FileOutputStream os = new FileOutputStream (out);

i n t c;

whi le ((c = is.read ()) != -1)

os.write(c);

// EOF de is

is.close();

os.close();

}

V. Granet U.N.S.A. Le langage Java 81

Part 10: Les entrees/sorties

Fichier d’objets elementaires

— DataInputStream et DataOutputstream

— readChar, writeChar, readInt, writeInt,

readDouble, writeDouble, ...

— fin de fichier ⇒ exception EOFException

pub l i c double moyenne (String in)

throws IOException {

DataInputStream is = new DataInputStream(

new FileInputStream(in));

i n t nbElem = 0;

double moy = 0;

try {

whi le ( true ) {

moy+= is.readDouble();

nbElem ++;

}

}

catch (EOFException e) {

is.close();

}

return nbElem == 0 ? 0 : moy / nbElem;

}

V. Granet U.N.S.A. Le langage Java 82

Part 10: Les entrees/sorties

Fichier d’objets

— ObjectInputStream et ObjectOutputstream

— Object readObject()

— void writeObject(Object)

Rectangle r = new Rectangle(3,4);

ObjectOutputStream os = new ObjectOutputStream (

new FileOutputStream("Frect"));

// ecriture d’un objet de type Rectangle sur le fichier os

os.writeObject(r);

os.close();

ObjectInputStream is = new ObjectInputStream (

new FileInputStream("Frect"));

// lecture d’un objet de type Rectangle sur le fichier is

r = (Rectangle) is.readObject();

// ⇐ la conversion necessaire

is.close();

— interface Serializable

pub l i c c l a s s Rectangle

implements Serializable {

V. Granet U.N.S.A. Le langage Java 83

Part 10: Les entrees/sorties

Fichier de texte

- caracteres Unicode

- FileReader et FileWriter

V. Granet U.N.S.A. Le langage Java 84

Part 10: Les entrees/sorties

FileReader is = new FileReader("entree ");

boolean etatDansMot = f a l s e ;

i n t c, nbCar = 0, nbMots = 0, nbLignes = 0;

whi le ((c = is.read ()) != -1) {

// incrementer le compteur de caracteres

nbCar++;

i f (c == ’ ’ || c == ’\t’ || c == ’\n’) {

// c est un separateur de mot

i f ( etatDansMot) etatDansMot = f a l s e ;

i f (c == ’\n’)

// fin d’une ligne ⇒ incrementer le compteur de lignes

nbLignes ++;

}

e l s e // on est dans un mot

i f (! etatDansMot) {

// 1er car du mot ⇒ incrementer le compteur de mots

nbMots ++;

etatDansMot = true ;

}

}

// fin de fichier ⇒ afficher les resultats

is.close();

System.out.println(nbLignes + " " + nbMots

+ " " + nbCar);

V. Granet U.N.S.A. Le langage Java 85

Part 10: Les entrees/sorties

E/S bufferisees

Pour ameliorer les performances, les lectures et

les ecritures utilisent une zone tampon.

— BufferedInputStream,

BufferedOutputStream

— BufferedReader, BufferedWriter

FileInputStream is =

new FileInputStream("entree");

FileOutputStream os =

new FileOutputStream("sortie");

BufferedInputStream bis =

new BufferedInputStream (is);

BufferedOutputStream bos =

new BufferedOutputStream (os);

V. Granet U.N.S.A. Le langage Java 86

Part 10: Les entrees/sorties

Entree et sortie standard

— System.in de type InputStream

— System.out de type PrintStream

— System.err de type PrintStream

La classe PrintStream propose des methodes print

et println pour ecrire tout type d’objet apres

conversion en chaıne de caracteres avec

toString()

System.in ne permet de lire que des octets. Pas de

conversion de type implicite ⇒ classe locale StdIn-

put

double x = System.in.read (); // ⇐ suspect

double x = StdInput .readlnDouble ();

V. Granet U.N.S.A. Le langage Java 87

Fonctions anonymes (Lambda)

V. Granet U.N.S.A. Le langage Java 88

Part 11: Fonctions anonymes (Lambda)

Introduction

— depuis la version 8 de Java

— API fortement recrite + nouveautes

(Stream)

— modele fonctionnel (lisp, haskell, ...)

— fonction sans nom (anonyme)

(x, y) → x+ y

— valeur fonctionnelle :

(x,y) -> x + y

( i n t x, i n t y) -> x + y

V. Granet U.N.S.A. Le langage Java 89

Part 11: Fonctions anonymes (Lambda)

Type d’une fonction anonyme (1/3)

C’est une interface fonctionnelle (une seule

methode abstraite)

i n t e r f a c e FoncInt {

i n t apply( i n t x, i n t y);

}

FoncInt f = (x,y) -> x + y;

FoncInt f = (x,y) -> x * x + y;

V. Granet U.N.S.A. Le langage Java 90

Part 11: Fonctions anonymes (Lambda)

Type d’une fonction anonyme (2/3)

(x) -> { assert x >=0;

return Math.sqrt(x);

}

() -> {

System.out.print("n = ");

i n t n = StdInput .readlnInt ();

System.out.println (n*n);

}

i n t e r f a c e FoncDouble {

double apply(double x);

}

i n t e r f a c e Procedure {

void apply() throws IOException ;

}

V. Granet U.N.S.A. Le langage Java 91

Part 11: Fonctions anonymes (Lambda)

Type d’une fonction anonyme (3/3)

Les fonctions anonymes peuvent etre generiques

i n t e r f a c e BiFunction <T, U, R> {

R apply(T t, U u);

}

BiFunction <Integer ,Integer ,Integer > f =

(x,y) -> x + y;

— java.util.function

V. Granet U.N.S.A. Le langage Java 92

Part 11: Fonctions anonymes (Lambda)

Utilisation

— Evaluation (inference de types)

FoncInt f = (x,y) -> x + y;

System.out.println(f.apply (2 ,3)); // 5

— Lambda en parametre

pub l i c double calculerAire(double a,

double b, i n t n,Function <Double , Double > f)

— Lambda resultat de fonction

// (g ◦ f)(x) = g(f(x))

<T,R,Z> Function <T,Z> compose (Function <T,R> f,

Function <R,Z> g) {

return x -> g.apply(f.apply(x));

}

V. Granet U.N.S.A. Le langage Java 93

Part 11: Fonctions anonymes (Lambda)

Fermeture

— Occurrences liees vs libres

— En Java, la portee est statique

(environement de definition de la fct

anonyme)

i n t e r f a c e Procedure { void apply(); }

...

i n t x=1;

Procedure p = () -> { System.out.println(x); };

p.apply();

— Les variables libres sont implicitement

final (i.e. elles ne peuvent donc pas etre

modifiees)

Procedure p = () -> { System.out.println(x++); };

// ERREUR DE COMPILATION !!!!!!!!!!

V. Granet U.N.S.A. Le langage Java 94

Part 11: Fonctions anonymes (Lambda)

Methodes par defaut

— plusieurs methodes dans une interface

fonctionnelle ?

— pour garantir la compatibilite avec

l’existant (i.e. Iterable, Runnable, ...)

— methodes par defaut (default)

pub l i c i n t e r f a c e Iterable <T> {

// methode a implementer

pub l i c Iterator <T> iterator ();

// methode par defaut

pub l i c d e f au l t void

forEach(Consumer <? super T> action) {

f o r (T t : t h i s )

action.accept(t);

}

}

V. Granet U.N.S.A. Le langage Java 95

L’API

V. Granet U.N.S.A. Le langage Java 96

Part 12: L’API

Application Programming Interface

— ensemble de classes pretes a l’emploi

— couvre de nombreux aspects de

l’informatique

— facilite la construction des applications

— offre des algorithmes efficaces

— collections

— arithmetique precision infinie

— gestion d’images 2D et3D

— gestion du son

— interfaces graphiques et applet

— processus legers - synchronisation

— reseau (URL, modele client-serveur RMI,

objets distribues IDL Corba)

— beans

— base de donnees (jdbc)

— reflexivite

— SDK (mecanismes de securite)

V. Granet U.N.S.A. Le langage Java 97

Part 12: L’API

Collections et Tables

— paquetage java.util

— Vector, tableaux dynamiques

— Hashtable, tables d’adressage disperse

— Stack, piles

— ensembles

— listes

— arbres

— algorithmes de tri

— algorithmes de recherche

— ...

V. Granet U.N.S.A. Le langage Java 98

Part 12: L’API

Collections

Collection

ArrayList Vector LinkedList SortedSet HashSet

TreeSet

SetList

— Liste et Ensembles generiques

— Enonce foreach

List <String > vs = new Vector <String >();

SortedSet <String > ts = new TreeSet <String >(vs);

V. Granet U.N.S.A. Le langage Java 99

Part 12: L’API

La classe Vector

tableau dynamique dont la taille est ajustable en

fonction des besoins

Vector v = new Vector (3);

System.out.println(v.size ()); // ⇒ 0

f o r ( i n t i = 0; i < 10; i++)

v.addElement(new Integer(i*i));

System.out.println(v.size ()); // ⇒ 10

System.out.println(v.elementAt(3)); // ⇒ 9

v.setSize (20);

v.setElementAt(new Integer (3) ,18);

System.out.println(v.size ()); // ⇒ 20

v.removeElementAt (0);

System.out.println(v.size ()); // ⇒ 19

v.removeAllElements ();

System.out.println(v.size ()); // ⇒ 0

V. Granet U.N.S.A. Le langage Java 100

Part 12: L’API

Tables

SortedMap

TreeMap

Map

HashtableHashMap

— Valeur + Cle

V. Granet U.N.S.A. Le langage Java 101

Part 12: L’API

La classe Hashtable

Table dont les elements sont reperes par des cles

et dont l’acces se fait par adressage disperse.

Hashtable <String ,Integer > ht =

new Hashtable <String ,Integer >();

ht.put("Paul", 3);

ht.put("Pierre" ,19);

Integer n = ht.get("Pierre");

i f (n != nu l l )

System.out.println("Pierre = " + n);

V. Granet U.N.S.A. Le langage Java 102

Part 12: L’API

Les Properties

— sous-classe de Hashtable

— correspondance cles et des valeurs String

— une instance de Properties peut etre reliee

a une autre instance de Properties

— lues et sauvegardees dans un fichier (texte

ou XML)

Properties p1 = new Properties();

Properties p2 = new Properties(p1);

p1.setProperty("Auteur", "Moliere ");

p2.setProperty("Compositeur", "Bach");

System.out.print(p1.getProperty("Auteur"));

System.out.print(p2.getProperty("Compositeur"));

System.out.println(p2.getProperty("Acteur","inconnu"));

// proprietes de l’environnement d’execution

System.out.print(System.getProperty("java.version "));

System.out.print(System.getProperty("os.version "));

System.out.println(System.getProperty("os.arch"));

V. Granet U.N.S.A. Le langage Java 103

Part 12: L’API

Threads

— processus legers vs processus

— execution (quasi) parallele des processus

— partage de ressources communes

— interface runnable

— synchronisation (methodes synchronized)

c l a s s MonThread extends Thread {

pub l i c MonThread() { ... }

pub l i c void run() { ... }

}

pub l i c c l a s s TestThread {

pub l i c s t a t i c void main(String [] arg) {

MonThread threadA = new MonThread(),

threadB = new MonThread();

threadA.start() // et non pas run()

threadB.start();

}

}

V. Granet U.N.S.A. Le langage Java 104

Part 12: L’API

Interfaces Graphiques

— necessite des interfaces graphiques

— Abstract Window Toolkit (AWT)

— Java Foundation Classes (JFC) – Swing

— applet (little application)

— programmation par evenements

— composants graphiques (boutons, menus,

canvas, ascenseurs, boıtes de dialogue, etc.)

V. Granet U.N.S.A. Le langage Java 105

Introspection

V. Granet U.N.S.A. Le langage Java 106

Part 13: Introspection

Introspection

— possibilite de consulter et d’utiliser

dynamiquement la structure de classe des

objets.

— necessaire pour les butineurs de classes,

debogueurs, ...

— la classe Class et le paquetage

java.lang.reflect permet l’introspection

V. Granet U.N.S.A. Le langage Java 107

Beans

V. Granet U.N.S.A. Le langage Java 108

Part 14: Beans

Beans (1/13)

— grain (de cafe)

— composant logiciel reutilisable destine a

etre manipule par un outil de

developpement interactif et graphique

(beanbox, beanbuilder, ...)

— bean = classe Java

— implemente l’interface Serializable

— constructeur public sans parametre

— pour etre exploitable, un bean doit etre

archive (format jar)

V. Granet U.N.S.A. Le langage Java 109

Part 14: Beans

Beans (2/13)

Un bean :

— est capable d’introspection (reflect,

inspector)

— possede des proprietes (accessibles par des

methodes setXX(), getXX(), isXX()),

— realise la persitence (une fois crees, les

beans doivent pouvoir etre conserves)

— communication entre beans par des

evenements

V. Granet U.N.S.A. Le langage Java 110

Part 14: Beans

Beans (3/13)

import java.awt.*;

import java.io.*;

pub l i c c l a s s FirstBean extends Canvas

implements Serializable {

f i n a l pub l i c s t a t i c i n t RECTANGLE = 0;

f i n a l pub l i c s t a t i c i n t CERCLE = 1;

protected i n t forme = CERCLE; // propriete

pub l i c FirstBean() {

setSize (100 ,100); // taille du canvas

}

pub l i c void paint(Graphics g) {

g.drawRect (2,2,90,90);

g.setColor (Color.red);

i f (forme == RECTANGLE) g.fillRect (10 ,10 ,20 ,20)

e l s e g.fillArc (10 ,10 ,20 ,20 ,0 ,360);

}

// methodes d’acces a la proriete forme

pub l i c i n t getForme () { return forme; }

pub l i c void setForme ( i n t f) { forme = f; }

}

V. Granet U.N.S.A. Le langage Java 111

Part 14: Beans

Beans (4/13)

Compilation et archivage

javac FirstBean.java

jar cvfm FirstBean.jar manifest.tmp FirstBean.class

fichier manifest

Name: FirstBean.class

Java-Bean: True

V. Granet U.N.S.A. Le langage Java 112

Part 14: Beans

Beans (5/13)

Un bean source peut emettre un evenement qui

produit l’execution d’une action sur un bean cible.

1. definition de l’evenement (ObjectEvent)

import java.util .*;

pub l i c c l a s s MyEvent extends EventObject {

pub l i c MyEvent (Object o) {

super (o);

}

}

2. definition de l’auditeur (EventListener)

import java.util .*;

pub l i c i n t e r f a c e MyEventListener extends EventListe

pub l i c ab s t r a c t void myEventPerformed (MyEvent e

}

V. Granet U.N.S.A. Le langage Java 113

Part 14: Beans

Beans (6/13)

3. gestion de l’emission de l’evenement (source)

V. Granet U.N.S.A. Le langage Java 114

Part 14: Beans

import java.util .*;

pub l i c c l a s s Source {

pr iva t e Vector myEventListeners = new Vector ();

pub l i c synchronized void addMyEventListener (MyEv

myEventListeners .addElement (l);

}

pub l i c synchronized void removeMyEventListener (M

myEventListeners .removeElement (l);

}

protected void notifyMyEvent () {

Vector l;

MyEvent e = new MyEvent ( t h i s );

synchronized ( t h i s ) {

// pour eviter toute modification

l = (Vector) myEventListeners .clone();

}

f o r ( i n t i=0; i<l.size (); i++) {

MyEventListener mel = (MyEventListener)l.ele

mel.myEventPerformed (e);

}

}

...

// appel a notifyMyEvent pour emettre l’evenement

...

}

V. Granet U.N.S.A. Le langage Java 115

Part 14: Beans

Beans (7/13)

4. gestion de la reception (cible)

pub l i c c l a s s Cible implements MyEventListener {

Source src = new Source ();

pub l i c Cible() {

src.addMyEventListener ( t h i s );

}

pub l i c void myEventPerformed (MyEvent e) {

// callback ...

}

}

V. Granet U.N.S.A. Le langage Java 116

Part 14: Beans

Beans (8/13)

Les proprietes peuvent etre liees (lien

unidirectionnel).

Lorsqu’il y modification d’une propriete liee, il

faut notifier le changement.

Elle envoie un PropertyChangeEvent chaque fois

qu’elle change. L’evenement est recu par les

auditeurs qui implementent

PropertyChangeListener.

PropertyChangeEvent possede les methodes :

— getSource()

— getOldValue()

— getNewValue()

— getPropertyName()

V. Granet U.N.S.A. Le langage Java 117

Part 14: Beans

Beans (9/13)

import java.beans.*;

pub l i c c l a s s FirstBean extends Canvas implements

....

pr iva t e PropertyChangeSupport changes

= new PropertyChangeSupport ( t h i s )

pub l i c void addPropertyListener (PropertyChangeListene

{

changes.addPropertyChangeListener (l);

}

pub l i c void removePropertyListener (

PropertyChangeListener l) {

changes.removePropertyChangeListener (l);

}

pub l i c void setForme ( i n t newForme )

{

i n t oldForme = newForme ;

forme = newForme ;

changes.firePropertyChange ("forme",oldForme ,newForm

}

...

}

V. Granet U.N.S.A. Le langage Java 118

Part 14: Beans

Beans (10/13)

Le bean auditeur doit implementer l’interface

PropertyChangeListener.

import java.beans.*;

pub l i c c l a s s BeanAudit

implements PropertyChangeListener , Serializable

{

......

pub l i c void propertyChange(PropertyChangeEvent e)

....

}

...

}

V. Granet U.N.S.A. Le langage Java 119

Part 14: Beans

Beans (11/13)

Une propriete peut etre aussi contrainte :

— elle envoie un PropertyChangeEvent juste

avant qu’elle ne change. Mais d’autres

composants peuvent s’oppser a ce

changement VetoableChangeListener.

— Les methodes setXX doivent gerer

l’exception PropertyVetoException.

V. Granet U.N.S.A. Le langage Java 120

Part 14: Beans

Beans (12/13)

import java.beans.*;

pub l i c c l a s s FirstBean extends Canvas

implements Serializable {

pr iva t e VetoableChangeSupport veto

= new VetoableChangeSupport ( t h i s )

pub l i c void addVetoableChangeListener (

VetoableChangeListener l) {

changes.addVetoableChangeListener (l);

}

pub l i c void removeVetoableChangeListener (

PropertyChangeListener l) {

changes.removeVetoableChangeListener (l);

}

pub l i c void setForme ( i n t newForme )

throws PropertyVetoException {

i n t oldForme = newForme ;

veto.fireVetoableChange ("forme",oldForme ,newForme );

forme = newForme ;

changes.firePropertyChange ("forme",oldForme ,newForm

}

...

}

V. Granet U.N.S.A. Le langage Java 121

Part 14: Beans

Beans (13/13)

Le bean qui emet le veto

pub l i c c l a s s BeanAudit

implements VetoableChangeListener , Serializable

{

......

pub l i c void vetoableChange(PropertyChangeEvent e)

throws PropertyVetoException {

....

}

}

V. Granet U.N.S.A. Le langage Java 122

Threads

V. Granet U.N.S.A. Le langage Java 123

Part 15: Threads

Introduction

— processus = programme en cours

d’execution

— execution (quasi) parallele des processus

— processus leger (thread)

— la classe Thread (java.lang)

— la methode run

— un thread pour main

— application terminee lorsque tous les

threads sont finis

— priorite (getPriority() et setPriority(p))

V. Granet U.N.S.A. Le langage Java 124

Part 15: Threads

La classe Thread

c l a s s MonThread extends Thread {

// constructeur

pub l i c MonThread() { ... }

// code a executer par le thread

pub l i c void run() { ... }

}

/**

* Classe de Test qui cree et execute 2 threads

*/

pub l i c c l a s s TestThread {

pub l i c s t a t i c void main(String [] arg) {

MonThread threadA = new MonThread(),

threadB = new MonThread();

threadA.start() // et non pas run()

threadB.start();

}

}

V. Granet U.N.S.A. Le langage Java 125

Part 15: Threads

L’interface Runnable (1/2)

— pas d’heritage multiple ⇒

interface fonctionnelle Runnable

— Thread t1 = new Thread(t2)

c l a s s MonThread implements Runnable {

pub l i c MonThread() { ... }

pub l i c void run() { ... }

}

....

MonThread tA = new MonThread();

MonThread tB = new MonThread();

new Thread(tA).start ();

new Thread(tB).start ();

Runnable r = () -> System.out.println("1");

new Thread(r).start();

// ci-dessous le type Runnable est determine par inference

new Thread (() -> System.out.println("2")).start();

V. Granet U.N.S.A. Le langage Java 126

Part 15: Threads

L’interface Runnable (2/2)

pub l i c c l a s s Aleatoire implements Runnable {

pub l i c Thread proc = new Thread( t h i s );

pr iva t e Random rand;

pr iva t e long intervalle;

pub l i c Aleatoire( long germe , long time) {

rand = new Random(germe);

intervalle = time * 1000;

}

pub l i c void run() {

whi le ( true ) {

try { Thread.sleep(intervalle); }

catch (InterruptedException e) {}

System.out.print(rand.nextInt () + " ");

System.out.flush();

}

}

} // fin classe Aleatoire

V. Granet U.N.S.A. Le langage Java 127

Part 15: Threads

L’interface Runnable (2/2)

pub l i c c l a s s TestProd {

pub l i c s t a t i c void main(String [] args) {

new Aleatoire(10, 1).proc.start();

new Aleatoire(15, 3).proc.start();

new Aleatoire(13, 3).proc.start();

}

}

V. Granet U.N.S.A. Le langage Java 128

Part 15: Threads

Etats d’un threads

BLOCKED thread en attente de la liberation d’une

donnee.

NEW thread qui n’a pas encore commence a

s’executer.

RUNNABLE thread executable, pret a disposer de la

puissance de calcul.

TERMINATED thread dont l’execution est terminee.

TIMED WAITING thread en attente avec une duree maxi-

mum specifiee.

WAITING thread en attente.

new Thread()

NEW TERMINATED

fin de run()start()

RUNNABLE

yield()

notify()wait()IO ok

IO?fin duréesleep(durée)

TIMED_WAITING BLOCKED WAITING

V. Granet U.N.S.A. Le langage Java 129

Part 15: Threads

Interruption d’un processus (1/2)

— methode interrupt()

— le processus peut verifier s’il est

interrompu ou non (il gere l’interruption)

pub l i c void run() {

whi le (!Thread.interrupted()) {

try {

Thread.sleep(intervalle);

}

catch (InterruptedException e) {

// interruption lors du sleep

break ;

}

System.out.print(rand.nextInt () + " ");

System.out.flush ();

}

}

V. Granet U.N.S.A. Le langage Java 130

Part 15: Threads

Interruption d’un processus (2/2)

pub l i c c l a s s TestProd {

pub l i c s t a t i c void main(String [] args) {

new Aleatoire(10, 1).proc.start();

new Aleatoire(15, 3).proc.start();

Aleatoire p = new Aleatoire(13, 1);

p.proc.start ();

...

// arret du 3eme thread

p.proc.interrupt();

}

}

— interruption dans le sleep ⇒ exception

— hors du sleep ⇒ drapeau

Thread.interrupted()

— getPriority() et setPriority(int)

V. Granet U.N.S.A. Le langage Java 131

Part 15: Threads

Attente de la fin d’un thread

— methodes join() ou join(long ms) (pour

les timeout)

pub l i c s t a t i c void main(String [] args) {

Aleatoire p1 = new Aleatoire(10, 1);

Aleatoire p2 = new Aleatoire(15, 2);

Aleatoire p3 = new Aleatoire(13, 1);

p1.proc.start();

p2.proc.start();

p3.proc.start();

try {

p1.proc.join (); // attendre la fin de p1

p2.proc.join (); // attendre la fin de p2

p3.proc.join (); // attendre la fin de p3

}

catch (InterruptedException e) {}

...

}

V. Granet U.N.S.A. Le langage Java 132

Part 15: Threads

Gestion des threads (1/2)

static Thread currentThread()

Retourne une reference sur le thread

actif.

static void dumpStack()

Affiche une trace de la pile d’execution

du thread courant.

String getName()

Retourne le nom du thread.

int getPriority()

Retourne la priorite du thread.

Thread.State getState()

Retourne l’etat courant du thread.

static boolean interrupted()

Retourne true si le thread est inter-

rompu.

boolean isAlive()

Teste si le thread est actif.

void setName(String name)

Change le nom du thread.

void setPriority(int newPriority)

Change la priorite du thread.

V. Granet U.N.S.A. Le langage Java 133

Part 15: Threads

Gestion des threads (2/3)

void interrupt()

Interrompt le thread.

void join() ou join(long millis) ou join(long

millis, int nanos)

Attend que le thread meurt, au plus le temps

indique en millisecondes et nanosecondes si

ces parametres sont fournis.

void notify()

Reveille le thread precedemment mis en at-

tente.

void run()

Cette methode par defaut ne fait rien. Si le

thread est issu d’un objet de type Runnable,

c’est la methode run de cet objet qui est

executee ou sinon sa redefinition eventuelle.

V. Granet U.N.S.A. Le langage Java 134

Part 15: Threads

Gestion des threads (3/3)

static void sleep(long millis) ou sleep(long millis, int

nanos)

Provoque l’endormissement du thread pour

une duree egale au nombre de millise-

condes auquel s’ajoutent les eventuelles nano-

secondes.

void start()

Provoque le demarrage du thread, la JVM ap-

pelle alors sa methode run .

void wait() ou wait(long timeout) ou wait(long

timeout, int nanos)

Met le thread en attente d’un notify invoque

par un autre processus ou du depassement du

temps passe en parametre.

void yield()

Force le scheduling, le thread cede sa place aux

autres processus eligibles.

V. Granet U.N.S.A. Le langage Java 135

Part 15: Threads

Synchronisation des threads (1/3)

— pb de l’acces a une ressource critique (i.e.

compte bancaire)

— pose d’un verrou

— toutes les methodes qui modifient l’etat

d’un d’objet partage ≪ doivent ≫ etre

declarees synchronized.

c l a s s CompteBancaire {

pr iva t e double solde;

pub l i c synchronized

void operation(double somme)

{

i f (solde+somme <0)

System.err.println("retrait impossible");

e l s e

solde+=somme;

}

}

V. Granet U.N.S.A. Le langage Java 136

Part 15: Threads

Synchronisation des threads (2/3)

— synchronized (obj) enonce ;

ainsi une methode qualifiee synchronised peut se

recrire :

...

void uneMethodeASynchroniser () {

synchronized ( t h i s ) {

... //code du corps de la methode

}

}

...

V. Granet U.N.S.A. Le langage Java 137

Part 15: Threads

Synchronisation des threads (3/3)

...

synchronized (...) { //debut du bloc controle

... //actions diverses

//tests de verification des donnees

wait (); //les donnees ne sont pas pretes

//attente d’un notify() transmis par ailleurs

//reveil et reprise du cours de l’execution

... //actions sur les donnees

//le besoin de verrouiller n’est plus

notify() //message de reveil des processus endormis

... //actions diverses

} //fin du bloc

...

V. Granet U.N.S.A. Le langage Java 138

Part 15: Threads

Producteurs Consommateurs (1/2)

File d’attente

Producteurs Consommateurs

— producteurs et consommateurs doivent se

synchroniser (file vide)

V. Granet U.N.S.A. Le langage Java 139

Part 15: Threads

Producteurs Consommateurs (2/2)

import java.util .*;

pub l i c c l a s s File <T> extends Vector <T> {

pub l i c synchronized void enfiler(T e) {

addElement(e);

notify ();

}

pub l i c synchronized T defiler () {

i f (isEmpty ())

try {

wait ();

}

catch (InterruptedException e) {

return nu l l ;

}

T e = elementAt(0);

removeElementAt (0);

return e;

}

} // fin classe File

V. Granet U.N.S.A. Le langage Java 140

Part 15: Threads

Tubes (1/2)

— Un tube est un canal bidirectionnel entre 2

threads

— Les threads peuvent ecrire et lire dans le

tube

TubeThread1 Tread2

— La synchronisation

Producteur/Consommateur est geree par le

support d’execution

V. Granet U.N.S.A. Le langage Java 141

Part 15: Threads

Tubes (2/2)

— PipedInputStream et PipedOutputStream

— les tubes d’entree et de sortie doivent etre

connectes :

— a la creation, avec le constructeur

PipedInputStream pi = new PipedInputStream ();

PipedOutputStream po = nu l l ;

try {

po = new PipedOutputStream (pi);

}

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

— avec la methode connect()

PipedInputStream pi = new PipedInputStream ();

PipedOutputStream po = new PipedOutputStream ();

try {

pi.connect(po);

}

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

V. Granet U.N.S.A. Le langage Java 142

Applet

V. Granet U.N.S.A. Le langage Java 143

Part 16: Applet

Applet

— applet = petite application graphique

— necessite une autre application graphique

(navigateurs, appletviewer)

— plugin (inclus dans la jre)

— classe Applet

lang.Object

awt.Component

awt.Container

awt.Panel

applet.Applet

— pas de methode main

— pas de constructeur, mais init

— contexte execution HTML

V. Granet U.N.S.A. Le langage Java 144

Part 16: Applet

Exemple

import java.awt.*;

import java.applet .*;

pub l i c c l a s s HelloWorldApplet extends Applet {

Font f;

pub l i c void init () {

f = new Font("Times", Font.BOLD , 20);

}

pub l i c void paint(Graphics g) {

g.setFont(f);

g.setColor (Color.pink );

g.drawString("Hello World!", 5, 25);

}

} // fin classe HelloWorldApplet

<OBJECT code="HelloWorldApplet.class"

width=400 height=150>

</OBJECT>

V. Granet U.N.S.A. Le langage Java 145

Part 16: Applet

AppletContext

Concept de contexte d’execution (document

HTML), information sur l’environnement, et en

particulier sur les autres applets du document.

— AppletContext Applet.getAppletContext()

Applet AppletContext.getApplet(String name)

Enumeration<Applet> AppletContext.getApplets()

void AppletContext.showStatus(String status)

void AppletContext.showDocument(URL url)

void AppletContext.showDocument(URL url, String

avec ou = \_self, \_parent, \_blank, name

V. Granet U.N.S.A. Le langage Java 146

Part 16: Applet

AudioClip

Concept de clip audio (necessite un dispositif de

reproduction sonore). Plusieurs clips peuvent etre

interpretes en meme temps par mixage sur la

meme plate-forme.

— AudioClip Applet.getAudioClip(URL url)

charger le clip audio donne a l’URL.

— void AudioClip.loop(), interpretation

indefinie de ce clip.

— void AudioClip.play(), interpretation de ce

clip, une seule fois depuis le debut.

— void AudioClip.stop(), arret de

l’interpretation de ce clip.

V. Granet U.N.S.A. Le langage Java 147

Part 16: Applet

La classe Applet (AWT)

— void init(), initialisation

— void start(), juste apres init(), ou

automatiquement a chaque reapparition a

l’ecran (changement de page Web ou

de-iconification), pour signifier a cette applet

qu’elle doit demarrer ou redemarrer sa

veritable execution.

— void stop(), arret de l’applet.

Automatiquement appele a chaque disparition

de l’applet de l’ecran (changement de page

Web ou iconification) ou juste avant sa

destruction complete.

— boolean isActive(), applet est active des le

debut de l’execution de sa methode start() et

cesse de l’etre des que l’execution de stop()

est terminee.

— void resize(Dimension d),

void resize(int l, int h)

— String getAppletInfo()

— void showStatus(String m), affichage du

message m dans la zone d’etat de l’applet.

V. Granet U.N.S.A. Le langage Java 148

Part 16: Applet

Evenements

— reaction aux evenements clic de souris

import java.awt.Event;

pub l i c boolean mouseDown(Event event , i n t x, i n t y)

// code traitement

....

return true ;

}

V. Granet U.N.S.A. Le langage Java 149

Part 16: Applet

Chargement de fichiers

images ou sons, relatifs a une URL (base du code

ou base du document)

— URL getCodeBase(), adr reseau de l’applet

(.class)

— URL getDocumentBase(), adr reseau du

contexte de l’applet (.html)

— AudioClip getAudioClip(URL u), le clip

audio situe a l’adr reseau u

— AudioClip getAudioClip(URL u, String x),

idem, mais le clip est recherche a l’adresse x,

relativement a l’adresse de base u.

— Image getImage(URL u), l’image situee a l’adr

reseau u. Chargement progressif lors de la

premiere demande d’affichage dans le contexte

graphique courant, sauf si un controleur de

medias (java.awt.MediaTracker bloque l’applet

jusqu’a la fin du chargement).

— Image getImage(URL u, String x), idem ,

l’image est recherchee a l’adresse x,

relativement a l’adresse de base u.

Image image = getImage(getCodeBase(), "Fig/f.gif");

V. Granet U.N.S.A. Le langage Java 150

Part 16: Applet

Composants Graphiques

— Utilisation des CG d’AWT (Buttons,

Checkboxes, Labels, Canvas, etc.)

— les methodes de classe Container (par

heritage) permettent leur manipulation

— add, ajout d’un composant

— remove, suppression

— setLayout, definition de l’agenceur

— Composants graphiques Swing

— classe JApplet

V. Granet U.N.S.A. Le langage Java 151

Part 16: Applet

Parametres d’une applet (1/2)

import java.awt.event.*;

import java.net.*;

import java.applet .*;

pub l i c c l a s s BoutonURL extends Applet

implements ActionListener {

Button b;

String url;

pub l i c void init () {

url = getParameter("URL");

i f (url == nu l l ) url = "Vide";

add(b = new Button(url));

b.addActionListener ( t h i s );

}

pub l i c void actionPerformed(ActionEvent e) {

i f (e.getSource() == b)

try {

getAppletContext (). showDocument(

new URL(b.getLabel ()), "_blank");

}

catch (MalformedURLException ex) {}

}

} // fin BoutonURL

V. Granet U.N.S.A. Le langage Java 152

Part 16: Applet

Parametres d’une applet (2/2)

Dans la balise Applet du fichier html, on passe les

valeurs des parametres

<applet code="Bouton.class" width=400 height=150>

<PARAM NAME=Url VALUE="http://www.unice.fr">

</applet>

— noms des parametres conventionnels

(SOURCE, xxxSOURCE, etc)

— les parametres sont des chaınes de car,

mais l’applet pourra interpreter des

entiers, des booleens, etc.

— description des parametres (peut etre

utilisee par le navigateur)

V. Granet U.N.S.A. Le langage Java 153

Part 16: Applet

pub l i c String [][] getParameterInfo () {

String [][] info = {

// Parametre Type Description

{"Url", "URL", "page a afficher "},

};

return info;

}

V. Granet U.N.S.A. Le langage Java 154

Part 16: Applet

Securite

L’action des applets est limitee. Chaque

navigateur possede un SecurityManager qui

assure le controle (SecurityException).

Une applet ne peut :

— utiliser que son propre code et l’API des

paquetages java.*. C’est tout.

— lire ou ecrire des fichiers de la machine

client. Fichiers cote serveur. Exception

pour les applets locales ou identifiees

(trusted, signature).

— etablir des connexions reseaux, sauf avec la

machine d’ou il est issu. Le serveur peut

servir de passerelles entre plusieurs applets

sur des clients differents.

— executer des programmes de la machine

client.

— lire certaines proritetes systemes :

java.class.path, java.home, user.dir,

user.home, user.name

V. Granet U.N.S.A. Le langage Java 155

Part 16: Applet

System.getProperty(""os.name"); // OK

V. Granet U.N.S.A. Le langage Java 156

Part 16: Applet

Thread et Applet

— graphique actif (animation)

— initialisation de l’applet (init() ⇒

start())

— terminaison (stop() ⇒ finalize())

import java.awt.*;

import java.applet .*;

pub l i c c l a s s ThreadApplet

extends Applet implements Runnable {

pr iva t e Thread proc;

pub l i c void init () {

// initialisation des attributs

}

pub l i c void start() {

i f (proc == nu l l ) {

proc = new Thread( t h i s );

proc.start();

}

}

V. Granet U.N.S.A. Le langage Java 157

Part 16: Applet

pub l i c void stop () {

i f (proc != nu l l ) {

proc.interrupt();

proc = nu l l ;

}

}

pub l i c void run() {

whi le (isActive ()) {

// attendre laps de temps

// calculer les changements

repaint ();

}

}

pub l i c void paint(Graphics g) {

// redessiner le motif

}

} // fin classe ThreadApplet

V. Granet U.N.S.A. Le langage Java 158

Animation

V. Granet U.N.S.A. Le langage Java 159

Part 17: Animation

Introduction

Pb reduction des clignotements lies au reaffichage

1. ne pas effacer la fenetre ;

2. redessinner le strict necessaire (detourage) ;

3. le double buffering.

V. Granet U.N.S.A. Le langage Java 160

Part 17: Animation

1 - ne pas effacer la fenetre

repaint ⇒ update ⇒ paint

pub l i c void update (Graphics g) {

g.setColor (getBackground ());

g.fillRect (0, 0, getsize ().width , getsize (). height );

g.setColor (getForeground ());

paint(g);

}

on reecrit update de la facon suivante :

pub l i c void update(Graphics g) {

paint(g);

}

— methode a utiliser lorsque les nouveaux

dessins doivent se superposer avec les

anciens

V. Granet U.N.S.A. Le langage Java 161

Part 17: Animation

2 - Detourage

Ne reafficher que ce qui est necessaire

Definir une portion de la fenetre sur laquelle

s’appliquera le reaffichage.

setClip(x, y, w, h) et clipRect(x, y, w, h)

Pour les animations, la portion doit se deplacer !

Pb : les appels a repaint peuvent etre tres

rapides, et certains appels a update et paint

peuvent etre perdus !

void repeindre() {

// Relance le dessin de l’ecran et attend jusqu’a ce que la

// procedure "paint" ait effectivement ete executee.

paintOK = f a l s e ;

repaint ();

whi le (! paintOK) {

try { .... sleep(time); }

catch (InterruptedException e) {}

}

} // fin repeindre

V. Granet U.N.S.A. Le langage Java 162

Part 17: Animation

3 - Double buffering (1/2)

Principe : ecrire dans une image auxiliaire. Une

fois l’image terminee, on l’affiche d’un coup sans

avoir a effacer l’image reelle precedente

Image temp; // Tampon pour image d’ecran.

Graphics gTemp; // Contexte graphique associe.

dans init :

temp = createImage(getSize ().width , getSize (). height );

gTemp = temp.getGraphics ();

V. Granet U.N.S.A. Le langage Java 163

Part 17: Animation

3 - Double buffering (2/2)

La methode paint dessine dans le contexte gTemp

associe a l’image tmp, et execute a la fin :

gTemp.drawRect (1,1,30,50);

...

// Afficher l’image tampon sur le veritable ecran :

g.drawImage(temp , 0, 0, t h i s );

g est connecte a l’ecran reel, temp est l’image a

dessiner a partir des coordonnees (0,0). Le dernier

parametre supervise l’affichage.

// suppression du clignotement

pub l i c void update(Graphics g) {

// effacer l’image temp

gTemp.setColor (getBackground ());

gTemp.fillRect (0, 0, getSize ().width , getSize (). heigh

gTemp.setColor (getForeground ());

paint(g);

}

V. Granet U.N.S.A. Le langage Java 164

Reseau

V. Granet U.N.S.A. Le langage Java 165

Part 18: Reseau

Connexion a des URL (1/3)

— paquetage java.net

— classe java.net.url

— URL (Uniform Ressource Locator)

protocole ://[utilisateur@]hote [:port ][/chemin /fichier ]

URL(adr)

URL(prot,host,file)

getProtocol()

getHost()

getFile()

URLConnection openConnection()

setDoInput(), setDoOutput()

connect()

openStream() (pour la lecture)

getContent()

V. Granet U.N.S.A. Le langage Java 166

Part 18: Reseau

Connexion a des URL (2/3)

URL u =

new URL("ftp ://vg:[email protected]/in/f");

URLConnection uc = u.openConnection ();

// indiquer l’acces en ecriture

uc.setDoOutput( true );

// creer un flot de sortie

OutputStream os = uc.getOutputStream ();

FileInputStream is = new FileInputStream("f");

// copie le fichier f.txt

i n t b;

whi le ((b = is.read ()) != -1)

os.write((byte ) b);

// fin de fichier

is.close(); os.close();

V. Granet U.N.S.A. Le langage Java 167

Part 18: Reseau

Connexion a des URL (3/3)

import java.net.*;

import java.io.*;

pub l i c c l a s s AfficherUrl {

pub l i c s t a t i c void main(String [] args)

throws IOException {

try {

URL url = new URL(args [0]);

// convertir l’url en InputStream

InputStream in = url.openStream();

i n t c;

System.out.println(url.getHost ()+ "/" +

url.getFile ());

whi le ((c = in.read ()) != -1)

System.out.print(( char ) c);

}

catch (MalformedURLException e) {

System.err.println("Bad Url: " +

args [0]);

}

catch (UnknownHostException e) {

System.err.println("Bad Url: " +

args [0]);

}

}

} // fin classe AfficherUrl

V. Granet U.N.S.A. Le langage Java 168

Part 18: Reseau

Socket

— services (http, ftp, telnet, ...) sont associes

a des ports

— un port est une entree virtuelle de

l’ordinateur

— pour obtenir un service, il faut (host, port)

— dans un programme, on etablit une ligne

virtuelle entre les ports des ordinateurs a

connecter grace a une socket.

programme programme

Ordinateur A Ordinateur B

Internet

socket

port port

— port = entier sur 16 bits. Ports jusqu’a

1024 reserves (http 80, telnet 23, ...), au

dessus, libres

— un programme peut gerer plusieurs ports

et plusieurs sockets

V. Granet U.N.S.A. Le langage Java 169

Part 18: Reseau

Modes de transmission

Communication par commutateurs :

1) Mode non connecte :

— commutation par paquets independants,

— chaque paquet possede les adresses de

depart et d’arrivee

— Internet UDP, datagrams

— multicast

— connexion non fiable, ordre non garanti

2) Mode connecte :

— circuit virtuel de commutation etabli au

prealable

— Internet TCP

— connexion fiable, ordre garanti

V. Granet U.N.S.A. Le langage Java 170

Part 18: Reseau

Datagrammes (emission 1/2)

— classe DatagramPacket definit les paquets a

transmettre

— classe InetAddress definit les adresses

Internet

InetAddress adrSource = InetAddress.getLocalHost();

InetAddress adrDest = InetAddress.getByName("djinn");

Un paquet Datagram contient l’information a

transmettre :

String msg = "blabla blabla";

byte [] data = msg.getBytes ();

DatagramPacket paquet =

new DatagramPacket(data , data.length ,

adrDest , port );

Pour envoyer le paquet, il faut une socket :

V. Granet U.N.S.A. Le langage Java 171

Part 18: Reseau

DatagramSocket socket = new DatagramSocket ();

socket.send(paquet);

V. Granet U.N.S.A. Le langage Java 172

Part 18: Reseau

Datagrammes (emission 2/2)

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

pub l i c c l a s s Emetteur {

pub l i c s t a t i c void main (String [] args)

throws IOException {

// adresse du destinataire

InetAddress adrDest =

InetAddress.getByName(args [0]);

i n t portDest = Integer.parseInt (args [1]);

// creation de la socket

DatagramSocket socket = new DatagramSocket ();

byte [] data;

DatagramPacket paquet = nu l l ;

whi le ( true ) {

System.out.print("> ");

String msg = StdInput .readLine ();

i f (msg == nu l l ) break ;

// convertir le message en tableau de bytes

data = msg.getBytes ();

// creer le paquet et l’expedier

paquet = new DatagramPacket(data ,

data.length , adrDest , portDest );

socket.send(paquet );

}

socket.close();

}

}

V. Granet U.N.S.A. Le langage Java 173

Part 18: Reseau

Datagrammes (reception 1/2)

Un paquet Datagram contenant l’information a

recevoir doit etre cree :

byte [] data = new byte [512];

DatagramPacket paquet =

new DatagramPacket(data , data.length);

Pour recevoir le paquet, il faut egalement une

socket avec le port :

DatagramSocket socket = new DatagramSocket(port );

socket.receive(paquet );

V. Granet U.N.S.A. Le langage Java 174

Part 18: Reseau

Datagrammes (reception 2/2)

import java.net.*;

import java.io.*;

pub l i c c l a s s Receveur {

pub l i c s t a t i c void main (String [] args)

throws IOException {

i n t port = Integer.parseInt (args [0]);

// creation de la socket

DatagramSocket socket =

new DatagramSocket(port);

// tampon ou mettre le message recu

byte [] data = new byte [512];

// creer un paquet de reception des messages

DatagramPacket paquet = new DatagramPacket(

data , data.length );

whi le ( true ) {

// recevoir le prochain message

socket.receive(paquet );

// afficher le message recu

System.out.print("from " +

paquet.getAddress(). getHostName ());

String msg = new String(paquet.getData (),

0,paquet.getLength());

System.out.println(" " + msg);

}

}

}

V. Granet U.N.S.A. Le langage Java 175

Part 18: Reseau

Datagrammes

Sur l’ordinateur emetteur, lyre :

lyre $ javac Emetteur.java

lyre $ java Emetteur djinn 17000

> blabla blabla

> abracadabra

>

Sur l’ordinateur recepteur, djinn :

djinn $ javac Receveur.java

djinn $ java Receveur 17000

from lyre.esinsa.unice.fr blabla blabla

from lyre.esinsa.unice.fr abracadabra

V. Granet U.N.S.A. Le langage Java 176

Part 18: Reseau

Datagrammes - Multicast

— Pour envoyer un message a un groupe de

machines destinatrices

— MulticastSocket

— les paquets sont envoyes a une adresse

multicast : 224.0.0.1 – 239.255.255.255 a

laquelle doit se joindre tous les

destinataires

MulticastSocket mcs = new MulticastSocket(port);

InetAddress mcsAdr =

InetAddress.getByName("228.5.6.7 ");

mcs.joinGroup(mcsAdr);

— Les datagrammes sont ensuite

normalement expedies ou recus avec les

methodes send et receive precedentes

— quitter le groupe :

mcs.leaveGroup(mcsAdr);

— exemple d’utilisation : programme chat

V. Granet U.N.S.A. Le langage Java 177

Part 18: Reseau

Mode connecte TCP (emission 1/2)

Un emetteur se connecte sur la machine

destinatrice grace a une socket :

Socket socket = new Socket("djinn", portDest );

// ou bien

Socket socket = new Socket ();

// 1er port libre

socket.bind(new InetSocketAddress ("localhost " ,0));

socket.connect(new InetSocketAddress ("djinn",

portDest ));

Un flot est cree entre les deux machines.

DataOutputStream out =

new DataOutputStream (socket.getOutputStream ());

DataInputStream in =

new DataInputStream(socket.getInputStream ());

L’emetteur ecrit (ou lit) dans le fichier out (ou

in).

V. Granet U.N.S.A. Le langage Java 178

Part 18: Reseau

Mode connecte TCP (emission 2/2)

import java.net.*;

import java.io.*;

pub l i c c l a s s Emetteur {

pub l i c s t a t i c void main (String [] args)

throws IOException {

i n t portDest = Integer.parseInt (args [1]);

// creation du socket

Socket socket = new Socket ();

socket.bind(

new InetSocketAddress ("localhost ", 0));

socket.connect (new InetSocketAddress (

args[0], portDest ));

DataOutputStream out =

new DataOutputStream(

socket.getOutputStream ());

whi le ( true ) {

System.out.print("> ");

String msg = StdInput .readLine ();

i f (msg == nu l l ) break ;

// ecrire le message

out.writeChars(msg); out.writeChar(’\n’);

}

out.close();

socket.close ();

}

}

V. Granet U.N.S.A. Le langage Java 179

Part 18: Reseau

Mode connecte TCP (reception 1/2)

— Le receveur doit creer une socket speciale,

ServerSocket en specifiant le numero de

port

— Il indique ensuite qu’il est pret a accepter

la connexion d’un emetteur

ServerSocket socketServeur =

new ServerSocket(port);

Socket socketEmetteur = socketServeur.accept ();

V. Granet U.N.S.A. Le langage Java 180

Part 18: Reseau

Mode connecte TCP (reception 1/2)

import java.net.*;

import java.io.*;

pub l i c c l a s s Receveur {

pub l i c s t a t i c void main (String [] args)

throws IOException {

i n t port = Integer.parseInt (args [0]);

// creation de la socket serveur

ServerSocket socketServeur =

new ServerSocket(port);

// creation du socket de reception

Socket socket = socketServeur.accept ();

// creation du flot de communication

BufferedReader din =

new BufferedReader(

new InputStreamReader (

socket.getInputStream ()));

whi le ( true ) {

System.out.print("from " +

socket.getInetAddress (). getHostName ());

System.out.println(" " + din.readLine ());

}

}

}

V. Granet U.N.S.A. Le langage Java 181

Part 18: Reseau

Sur l’ordinateur emetteur, lyre :

lyre $ javac Emetteur.java

lyre $ java Emetteur djinn 17000

> blabla blabla

> abracadabra

>

Sur l’ordinateur serveur, djinn :

djinn $ javac Receveur.java

djinn $ java Receveur 17000

Serveur actif sur le port 17000

from lyre.esinsa.unice.fr blabla blabla

from lyre.esinsa.unice.fr abracadabra

V. Granet U.N.S.A. Le langage Java 182

Part 18: Reseau

Modele Client/Serveur (1/4)

Dans un modele client/serveur, le receveur est le

serveur qui peut accepter plusieurs connexions de

differents clients. Chaque client est traite par

dans un thread.

whi le ( true ) {

// attendre la prochaine connexion

Socket socketClient = socketServeur.accept ();

new GestionDuClient(socketClient); // thread

}

V. Granet U.N.S.A. Le langage Java 183

Part 18: Reseau

Modele Client/Serveur (2/4)

import java.net.*;

import java.io.*;

pub l i c c l a s s Serveur {

pub l i c s t a t i c void main (String [] args)

throws IOException {

i n t port = Integer.parseInt (args [0]);

// creation de la socket

ServerSocket socketServeur =

new ServerSocket(port);

System.out.println ("Serveur actif " +

"sur le port " + port);

whi le ( true ) {

// attendre la prochaine connexion

Socket socketClient =

socketServeur.accept ();

System.out.println(

socketClient.getInetAddress ().

getHostName() + " connecte ");

// gerer le client dans un thread

new GestionDuClient(socketClient);

}

}

}

V. Granet U.N.S.A. Le langage Java 184

Part 18: Reseau

Modele Client/Serveur (3/4)

c l a s s GestionDuClient implements Runnable {

pub l i c Thread proc = new Thread( t h i s );

pr iva t e Socket socket;

pr iva t e BufferedReader din;

pub l i c GestionDuClient(Socket s)

throws IOException {

socket = s;

InputStreamReader in =

new InputStreamReader (s.getInputStream ());

din = new BufferedReader(in);

proc.start();

}

pub l i c void run() {

whi le ( true )

try {

// creer un paquet de reception des messages

System.out.print("from " + socket.

getInetAddress (). getHostName ());

System.out.println(" " + din.readLine ());

}

catch (IOException e) { break ; }

System.out.println(socket.getInetAddress ().

getHostName() + " deconnecte");

try { socket.close ();}

catch (IOException e) {}

}

}

V. Granet U.N.S.A. Le langage Java 185

Part 18: Reseau

Modele Client/Serveur (4/4)

Sur les ordinateurs clients

lyre $ javac Emetteur.java

lyre $ java Emetteur djinn 17000

> blabla blabla

> abracadabra

>

mondrian $ javac Emetteur.java

mondrian $ java Emetteur djinn 17000

> hello ...

>

Sur l’ordinateur serveur, djinn :

V. Granet U.N.S.A. Le langage Java 186

Part 18: Reseau

djinn $ javac Serveur.java

djinn $ java Serveur 17000

Serveur actif sur le port 17000

mondrian.esinsa.unice.fr connecte

lyre.esinsa.unice.fr connecte

from lyre.esinsa.unice.fr blabla blabla

from mondrian.esinsa.unice.fr hello ...

from lyre.esinsa.unice.fr abracadabra

V. Granet U.N.S.A. Le langage Java 187

Jni

V. Granet U.N.S.A. Le langage Java 188

Part 19: Jni

Jni (1/6)

Jni (Java Native Interface) permet d’executer du

code C, C++, ... dans une application Java

Interet :

— reutilisation de code existant

(bibliotheque)

— code particulier en assembleur

— ...

Jni permet une communication bidirectionnelle

entre entre les deux formes de code (Java et C par

exemple).

V. Granet U.N.S.A. Le langage Java 189

Part 19: Jni

Jni (2/6)

Exemple : l’incontournable HelloWorld

c l a s s HelloWorld {

pub l i c nat ive void displayHelloWorld ();

s t a t i c {

// le code C est dans la bibliotheque hello

System.loadLibrary("hello");

}

pub l i c s t a t i c void main(String[] args) {

new HelloWorld(). displayHelloWorld ();

}

}

On compile

javac HelloWorld.java

V. Granet U.N.S.A. Le langage Java 190

Part 19: Jni

Jni (3/6)

Creation du .h associe a la classe HelloWorld

javah HelloWorld

Le fichier donne le prototype de la fonction C qui

assure l’interface avec Java. Nom conventionnel

Java_Nom de la classe _Nom de la methode

Java_HelloWorld_displayHelloWorld

V. Granet U.N.S.A. Le langage Java 191

Part 19: Jni

Jni (4/6)

/* DO NOT EDIT THIS FILE - it is machine generated */

#inc lude <jni.h>

/* Header for class HelloWorld */

#i f n d e f _Included_HelloWorld

#de f i n e _Included_HelloWorld

#i f d e f __cplusplus

extern "C" {

#end i f

/*

* Class: HelloWorld

* Method : displayHelloWorld

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorl

(JNIEnv *, jobject );

#i f d e f __cplusplus

}

#end i f

#end i f

V. Granet U.N.S.A. Le langage Java 192

Part 19: Jni

Jni (5/6)

Le fichier C :

#inc lude <jni.h>

#inc lude "HelloWorld.h"

#inc lude <stdio.h>

JNIEXPORT void JNICALL

Java_HelloWorld_displayHelloWorld (JNIEnv *env , jobject o

{

printf("Hello world!\n");

return ;

}

Creation de la bibliotheque libhello (Linux)

gcc -shared -I${JAVA_HOME}/include \

-I${JAVA_HOME}/include/linux HelloWorld.c -o libhello.so

Execution de l’application Java

LD_LIBRARY_PATH=. java HelloWorld

Hello world!

V. Granet U.N.S.A. Le langage Java 193

Part 19: Jni

Jni (6/6)

Jni permet egalement l’acces a Java depuis le

code natif (C, C++).

L’interface JNI offre :

— des definitions d’equivalence de type

(jboolean, jint, jdouble, jstring, jarray,

jclass, etc.)

— des fonctions de manipulation de ces types

par l’intermediaire de (JNIEnv *env)

— l’acces aux attributs et aux methodes

d’objets Java

V. Granet U.N.S.A. Le langage Java 194

Jdk 1.5

V. Granet U.N.S.A. Le langage Java 195

Part 20: Jdk 1.5

Nouveautes Tiger

La version 1.5 (Tiger) apporte des changements

importants au langage :

— Autoboxing

— Importation static

— Enonce foreach

— Enumerations

— Genericite

V. Granet U.N.S.A. Le langage Java 196

Part 20: Jdk 1.5

Autoboxing

Les conversions explicites entre les types

elementaires et leurs equivalents ≪ objet ≫ n’est

plus necessaire :

Character c = ’a’;

i n t i = new Integer (10);

Hashtable ht = new Hashtable();

ht.put("Paul", 3);

ht.put("Pierre", 19);

Integer n = (Integer) ht.get("Pierre");

i f (n != nu l l )

System.out.println("Pierre = " + n);

V. Granet U.N.S.A. Le langage Java 197

Part 20: Jdk 1.5

Importation static

Specialisation de la directive import pour l’acces

non qualifie aux objets declares static d’une

classe

i1 = Math.sqrt(-∆)/(2*a);

on pourra ecrire :

import s t a t i c java.lang.Math .*;

...

i1 = sqrt(-∆)/(2*a);

V. Granet U.N.S.A. Le langage Java 198

Part 20: Jdk 1.5

Enonce ≪ foreach ≫ (1/2)

Forme generalisee de l’enonce pour lorsqu’il s’agit

d’appliquer un meme traitement a tous les

elements d’un tableau ou d’une collection :

— ecriture plus naturelle et plus sure

i n t [] tab;

....

i n t somme = 0;

f o r ( i n t i=0; i <tab.length; i++)

somme += tab[i];

i n t [] tab;

....

i n t somme = 0;

f o r ( i n t x : tab)

somme+=x;

V. Granet U.N.S.A. Le langage Java 199

Part 20: Jdk 1.5

Enonce ≪ foreach ≫ (2/2)

Vector v = new Vector ();

v.addElement (13); v.addElement (128); ....

i n t somPairs = 0;

f o r (Iterator i = v.iterator (); i.hasNext (); ) {

Integer x = (Integer ) i.next ();

i f (x % 2 == 0) somPairs +=x;

}

Vector v = new Vector ();

v.addElement (13); v.addElement (128); ....

i n t somPairs = 0;

f o r (Object x : v)

i f ((Integer) x % 2 == 0) somPairs += (Integer) x;

V. Granet U.N.S.A. Le langage Java 200

Part 20: Jdk 1.5

Enumeration (1/2)

Enumeration de constantes representees par des

noms (comme en C)

enum Couleur { trefle , carreau , coeur , pique }

enum Valeur {deux , trois , quatre , cinq , six , sept ,

huit , neuf , dix , valet , dame , roi , as }

c l a s s Carte {

Couleur couleur;

Valeur valeur;

Carte(Valeur v, Couleur c) {

valeur = v;

couleur = c;

}

}

...

new Carte(Valeur.as, Couleur.coeur);

...

V. Granet U.N.S.A. Le langage Java 201

Part 20: Jdk 1.5

Enumeration (2/2)

— les enumerations sont des objets

— methode predefinie values()

— on peut ajouter des attributs et des

methodes

// fabrication d’un jeu de 52 cartes

Carte [] jeu52 = new Carte [52];

i n t i = 0;

f o r (Couleur c : Couleur.values ())

f o r (Valeur v : Valeur.values ())

jeu52[i++] = new Carte(v, c);

V. Granet U.N.S.A. Le langage Java 202

Part 20: Jdk 1.5

enum Valeur {

deux(2), trois(3), quatre (4), cinq (5),

six(6), sept (7), huit(8), neuf (9), dix(10),

valet(10), dame (10), roi(10), as(20);

i n t valeur;

Valeur( i n t v) { valeur = v; }

i n t valeur () { return valeur; }

} // fin enum

System.out.println(Valeur.as); // as

System.out.println(Valeur.as.valeur ()); // 20

V. Granet U.N.S.A. Le langage Java 203

Part 20: Jdk 1.5

Genericite (1/5)

— Permet de parametrer le type des

structures de donnees

— evite les conversions explicites de type dues

a Object

— assure les controles de type

Hashtable <String , Integer > ht =

new Hashtable <String , Integer >();

ht.put("Paul", 3);

ht.put("Pierre", 19);

Integer n = ht.get("Pierre"); // pas de conver. explicite

i f (n != nu l l )

System.out.println("Pierre = " + n);

Vector <Integer > v = new Vector <Integer >();

v.addElement("toto"); // ! erreur compilation

v.addElement (13); v.addElement (128); ...

i n t somPairs = 0;

f o r (Integer x : v)

// pas de conversion explicite

i f (x % 2 == 0) somPairs += x;

V. Granet U.N.S.A. Le langage Java 204

Part 20: Jdk 1.5

Genericite (2/5)

c l a s s Noeud <T> {

T val;

Noeud <T> suivant;

Noeud(T v) { val = v; }

}

c l a s s Pile <E> {

Noeud <E> sommet;

void empiler(E x) {

// ajouter en tete l’element x

Noeud <E> p = new Noeud <E>(x);

p.suivant = sommet;

sommet = p;

}

E sommet() {

// retourner la valeur du sommet de pile

return sommet.val;

}

}

V. Granet U.N.S.A. Le langage Java 205

Part 20: Jdk 1.5

Genericite (3/5)

// Definition simplifiee d’une Pile generique

c l a s s Pile <T> {

pr iva t e f i n a l i n t N = 100;

pr iva t e i n t sommet = 0;

// pas de genericite sur les tableaux !

pr iva t e T [] elements = (T[]) new Object[N];

pub l i c void empiler(T x) {

elements [sommet ++] = x;

}

pub l i c void depiler () {

sommet --;

}

pub l i c T sommet () {

return elements [sommet -1];

}

}

V. Granet U.N.S.A. Le langage Java 206

Part 20: Jdk 1.5

Genericite (4/5)

// une pile de chaınes

Pile <String > p1 = new Pile <String >();

// une pile de piles d’entiers

Pile <Pile <Integer >> p2 =

new Pile <Pile <Integer >>();

Mais aussi, sans genericite

Pile p = new Pile();

p.empiler("bonjour");

p.empiler(6); // OK

// la conversion suivante est obligatoire

Integer i = (Integer) p.sommet();

mais alors, message du compilateur

Note: Test.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

V. Granet U.N.S.A. Le langage Java 207

Part 20: Jdk 1.5

Genericite (5/5)

Genericite sur plusieurs types :

c l a s s Noeud <C,V> {

C cle;

V val;

Noeud <C,V> suivant;

Noeud (C c, V v) { cle = c; val = v; }

}

et avec les interfaces :

i n t e r f a c e Pile <T> { void empiler(T x);

}

// Implementation d’une pile par un tableau

c l a s s PileTableau <E> implements Pile <E> { ... }

// idem avec une structure chaınee

c l a s s PileChaınee <E> implements Pile <E> { ... }

...

Pile <String > p = new PileChaınee <String >();

Notez le meme nom E

V. Granet U.N.S.A. Le langage Java 208

Part 20: Jdk 1.5

Genericite et Polymorphisme (1/2)

Pile <Integer > p1 = new Pile <Integer >();

Pile <Object > p2 = p1;

Illegal : car on pourrait empiler autre chose que

des Integer !

De meme :

void afficherSommet(Pile <Object > p) {

System.out.println(p.sommet ());

}

...

Pile <Integer > p = new Pile <Integer >();

afficherSommet(p); // types incompatibles

V. Granet U.N.S.A. Le langage Java 209

Part 20: Jdk 1.5

Genericite et Polymorphisme (2/2)

Solution : la notation ?

void afficherSommet(Pile <?> p) {...}

...

Pile <Integer > pi = new Pile <Integer >();

afficherSommet(pi); // OK

Pile <String > ps = new Pile <String >();

afficherSommet(ps); // OK

— pour limiter le polymorphisme aux

sous-classes de A

void afficherSommet(Pile <? extends A> p) {...}

— ? super A pour limiter le polymorphisme

aux super-classes de A

V. Granet U.N.S.A. Le langage Java 210

Part 20: Jdk 1.5

Methodes generiques

void dupliquerSommet(Pile <?> p) {

Object o = p.sommet (); // OK

p.empiler(o); // erreur de compilation

// car le type des elements est inconnu

}

Solution : methodes generiques

<T> void dupliquerSommet(Pile <T> p) {

T o = p.sommet ();

p.empiler(o);

}

Pile <Integer > p1 = new Pile <Integer >();

Pile <String > p2 = new Pile <String >();

dupliquerSommet(p1);

dupliquerSommet(p2);

V. Granet U.N.S.A. Le langage Java 211

Jdbc

V. Granet U.N.S.A. Le langage Java 212

Part 21: Jdbc

JDBC (1/8)

— Java Database Connectivity

— offre la connexion d’applications Java avec

differents types de BD (SQL, tableurs, etc.)

— API JDBC est independante du SGBD.

— Ensemble de classes (java.sql.*)

client client

serveur BDserveur BD

midleware

Modele 2 couches Modele 3 couches

V. Granet U.N.S.A. Le langage Java 213

Part 21: Jdbc

JDBC (2/8)

L’acces a la BD se fait par l’intermediaire d’un

pilote.

1. un pont entre JDBC et ODBC (Microsoft).

La communication se fait via des fonctions

C appelees par les methodes du pilote ;

2. les pilotes recourant a des fonctions

non-Java specifiques du SGBD ;

3. les pilotes permettent l’emploi d’un serveur

middleware. Il s’agit d’une interface avec le

SGBD via une API specifique ;

4. les pilotes Java proprietaires utilisant

directement le protocole reseau du SGBD

(e.g. mysql-connector).

V. Granet U.N.S.A. Le langage Java 214

Part 21: Jdbc

JDBC (3/8)

— import java.sql.*

— JDBC gere :

— la connexion a la BD

— l’envoi de requetes SQL

— l’exploitation des resultats provenant

de la BD

V. Granet U.N.S.A. Le langage Java 215

Part 21: Jdbc

JDBC - Connexion (4/8)

DriverManager :

— gere les pilotes charges (ici pour mysql) :

try {

// creer une nouvelle instance du Driver

Class.forName(

"com.mysql.jdbc.Driver"). newInstance();

}

catch (Exception ex) { /* gerer les erreurs */ }

— cree les connexions (Connection) :

String urlBD="jdbc:mysql:// localhost /bd";

try (Connection conn =

DriverManager.getConnection(urlBD ,"user","pass");

)

{

// code de l’application qui accede a la BD

...

} catch (Exception ex) { /* gerer les erreurs */ }

V. Granet U.N.S.A. Le langage Java 216

Part 21: Jdbc

JDBC - Statement (5/8)

— Envoi de requetes SQL (Statement

— createStatement pour une requete SQL

simple (sans parametre)

— prepareStatement pour une requete SQL

(precompilee) avec parametres

— prepareCall pour l’appel d’une procedure

preparee.

— ResultSet executeQuery(),

int executeUpdate()

// creer un Statement

Statement stmt = conn.createStatement ();

// executer une requete SQL

ResultSet rs = stmt.executeQuery(

"SELECT * FROM uneTable ;");

V. Granet U.N.S.A. Le langage Java 217

Part 21: Jdbc

JDBC - ResultSet (6/8)

— ResultSet resultat d’une requete SQL (i.e.

lignes de la table)

— methodes get pour acceder aux colonnes

de la ligne courante

— next() pour passer le curseur a la ligne

suivante

— previous()

— conversion de types entre SQL et Java

(getString, getInt, getDate, ...)

rs.absolute (2);

System.out.println("Resultat : " + rs.getInt (1));

rs.beforeFirst();

whi le (rs.next ()) {

String nom = rs.getString("nom");

String espece = rs.getString("espece");

Date naissance = rs.getDate ("naissance ");

System.out.println(nom + " " + espece +

" " + naissance);

}

V. Granet U.N.S.A. Le langage Java 218

Part 21: Jdbc

JDBC - prepareStatement (7/8)

— requete precompilee (plus efficace)

— parametres

// INSERT INTO animal VALUES

// -> (’Coco’,’Diane’,’Perroquet’,’f’,’2000-06-09’,NULL);

PreparedStatement pstmt =

conn.prepareStatement (

"INSERT INTO animal VALUES (?,?,?,?,?, NULL );");

// definir les parametres

pstmt.setString(1, "Coco");

pstmt.setString(2, "Diane");

// executer la requete

pstmt.executeUpdate ();

V. Granet U.N.S.A. Le langage Java 219

Part 21: Jdbc

JDBC - callStatement (8/8)

— requete precompilee pour appeler une

fonction de la BD

— parametres

CallableStatement cstmt =

conn.prepareCall("call myfunc (?,?); ");

// fixer la valeur du 1er parametre donnee ( e.g. un reel)

cstmt.setFloat (1, 34.5f);

// le 2eme parametre est un resultat ( e.g. une chaıne)

cstmt.registerOutParameter (2,Types.VARCHAR );

// executer la requete

cstmt.execute ();

// afficher le le resultat

System.out.println(cstm.getString(2));

V. Granet U.N.S.A. Le langage Java 220