Vous êtes sur la page 1sur 147

PROGRAMMATION ORIENTE OBJET

Illustrations en JAVA

Auteur : Mdoune Kane

Plan du cours
Le Concept Orient Objet (9h) o Notions dobjet o Notion de classe
Attribut Mthodes
o o o o o o o

Encapsulation et niveau de visibilit Notion de constructeur Affectation et comparaison dobjets Notion de ramasse miettes Attributs et mthodes de classe Les packages Surdfinition des mthodes

Lhritage et le polymorphisme(9h) o Notion dhritage o Accs aux membres de la classe de base o Construction et initialisation des objets drivs

o o o o o

Redfinition et surdfinition des membres Le polymorphisme Classes et mthodes finales Les classes abstraites Les interfaces

La programmation graphique(9 h) Les vnements(9h) Devoir(3h) Les applets(6h) Les threads(6h) Les bases de donnes (JDBC)(6h) Les flux et les fichiers(6h) Archives et dploiements(6h) Examen(3h)

Le concept Orient Objet

Les Objets

Tout est objet: le logiciel est vu une collection d'objets dissocis Un programme est un ensemble d'objets se disant les uns aux autres quoi faire en s'envoyant des messages Chaque objet runit en son sein ses proprits et mthodes : cest lencapsulation. En POO pure on ne peut accder aux donnes (champs ou attributs ) dun objet qu travers ses mthodes ( gestion de la cohrence des donnes) Chaque objet possde son identit et peut tre distingu des autres.

A un instant donn un objet possde un tat qui correspond la valeur de ces attribut cet instant

Lexpression instance d'objet fait rfrence une chose prcise, et l'expression classe d'objets dsigne un groupe de choses similaires.

Objet = Identit + Etat + Comportement

En rsum

Donnes

Traitements

Donnes

Traitements

Champs Membres

Mthodes Objet 1

Champs Membres

Mthodes

Objet 2

Donnes

Traitements

Champs Membres

Mthodes Objet 3

Logiciel

Les Classes

Une classe est un modle utilis pour crer plusieurs objets prsentant des caractristiques communes: cest une abstraction des objets Chaque objet possde ses propres valeurs pour chaque attribut mais partage noms d'attributs et mthodes avec les autres objets de la classe.

On dit que l'objet est une instance (variable) de sa classe (type).

Les Attributs

Un attribut est une valeur de donne dtenue par les objets de la classe Chaque attribut une valeur pour chaque instance d'objet Les instances peuvent avoir des valeurs identiques ou diffrentes pour un attribut donn Chaque nom d'attribut est unique l'intrieur d'une classe Chaque objet stocke sa propre valeur pour chacune de ses attributs.

Les Mthodes

Une mthode est une fonction ou une transformation qui peut tre applique aux objets ou par les objets. Tous les objets d'une mme classe partagent les mmes mthodes. Chaque mthode a un objet cible comme argument implicite (c'est l'objet lui-mme this, elle peut donc accder chacun des attributs) Une mthode peut avoir des arguments, en plus de son objet cible. Les mthodes sont des groupes d'instructions relies les unes aux autres au sein d'une classe d'objets qui agissent sur eux-mmes, ainsi que sur d'autres classes et d'autres objets.

Surdfinition des mthodes(Surcharge)

Une mthode peut tre dclare plusieurs fois dans une mme classe ou ses classes drives, avec le mme nom mais des paramtres de types diffrents, ou de mme type mais dans un ordre diffrent. Au moment d'tre invoque, la bonne mthode est choisie pour qu'il y ait correspondance sur les paramtres de l'appel et les arguments de la mthode. Le compilateur recherche alors la mthode qui se rapproche le plus et utilise le transtypage pour coller parfaitement la signature de la mthode. Les valeurs de retours peuvent tre aussi diffrentes, mais il est interdit de crer deux mthodes avec les mmes paramtres et un type de valeur de retour diffrent (par exemple, int methode () et float methode ()).

LEncapsulation

L'encapsulation est le principe qui permet de regrouper les attributs et mthodes au sein d'une classe: principe de la bote noire. Il consiste, entre autre, protger au maximum les attributs d'un objet. Cette notion est aussi associe au systme de protection qui permet de contrler la visibilit d'une variable ou d'une mthode. Cela consiste demander un objet d'effectuer une action, sans se proccuper de comment il l'effectue. Elle permet galement de faire des contrles de scurit et de cohrence, et de ne pas effectuer les actions demandes si une condition particulire n'est pas respecte, ceci afin de garantir l'intgrit des donnes contenues dans l'objet. L'encapsulation permet aussi de dfinir des niveaux de visibilit des lments de la classe. Ces niveaux de visibilit dfinissent les droits d'accs aux donnes selon que l'on y accde par une mthode de la classe elle-mme, d'une classe hritire, ou bien d'une classe quelconque.

Les niveaux de visibilit


Il existent trois niveaux de visibilit:

public: les fonctions de toutes les classes peuvent accder aux donnes ou aux mthodes d'une classe dfinie avec le niveau de visibilit public. Il s'agit du plus bas niveau de protection des donnes protg: l'accs aux donnes est rserv aux fonctions des classes hritires, c'est--dire par les fonctions membres de la classe ainsi que des classes drives priv: l'accs aux donnes est limit aux mthodes de la classe ellemme. Il s'agit du niveau de protection des donnes le plus lev

Notions de constructeur
La dclaration: Les rfrences

Une rfrence est un pointeur vers la structure de donnes correspondants aux attributs propres lobjet. Une rfrence peut possder une valeur null. Dclarer une rfrence ne rserve pas demplacement mmoire pour un objet, mais seulement de lespace pour une rfrence vers lobjet. Elle contient ladresse dune structure. A la diffrence des pointeurs la seule opration autorise sur les rfrences est laffectation dune rfrence de mme type. Laffectation de rfrence ne porte pas sur lobjet mais sur la rfrence elle mme.

Linstanciation

Se fait avec appel de loprateur unaire new. Cre un objet partir dune classe, lobjet est appel instance de la classe et renvoi une rfrence sur cet objet. 3 tapes:
Obtention de lespace mmoire ncessaire lobjets et initialisation des

attributs en mmoire. Appel de mthodes particulires: les constructeurs dfinis dans la classe. Renvoi dune rfrence sur lobjet maintenant cr et initialis.

Le mot rserv this:

Il permet de faire rfrence lobjet en cours

Les constructeurs

Mthode particulire portant le mme nom que la classe. Doit tre de visibilit publique Appel lors de la cration de lobjet (instanciation de la classe). Permet d'initialiser l'objet sa cration en donnant par exemple des valeurs chacun de ses attributs. Nadmet pas de type de retour(mme pas le type void) Peut tre surcharg. Un constructeur par dfaut initialise les attributs de la classe leur valeur par dfaut, si aucun constructeur na t dfini pour cette classe.

Les diffrentes tapes de la construction dun objet


Allocation mmoire . Initialisation par dfaut des champs. Initialisation explicite des champs . Excution des instructions du constructeur .

Laffectation et comparaison dobjet


Elle portent sur les rfrences et non sur les objets eux-mmes. a=b; Celle-ci recopie simplement dans a la rfrence contenue dans b, ce qui nous conduit la situation ci-contre. Dornavant, a et b dsignent le mme objet, et non pas deux objets de mme valeur. Les oprateurs == et != s'appliquent thoriquement des objets. Mais comme ils portent sur les rfrences elles-mmes, leur intrt est trs limit Point a, b ; L'expression a == b est vraie uniquement si a et b font rfrence un seul et mme objet, et non pas seulement si les valeurs des champs de a et b sont les mmes.

Notion de ramasse miettes (le Garbage-Collector)

En Java il n'existe aucun oprateur permettant de dtruire un objet dont on n'aurait plus besoin, Java utilise un mcanisme de gestion automatique de la mmoire connu sous le nom de ramasse-miettes (en anglais Garbage Collector), contrairement au C++ ou il faut appeler une mthode particulire: le destructeur. En C# et VB.Net ces deux mthodes cohabitent mais les destructeurs ne sont pas utiliss. Le GC permet de grer automatiquement les ressources utilises par les objets d'une application Java. Il dtermine les objets inutiliss par un programme(non rfrencs), pour ensuite les traiter de sorte rcuprer leur espace mmoire pour une ventuelle rutilisation.

Il n'existe aucun moyen de contraindre le GC accomplir un nettoyage de la mmoire la demande. Pour forcer la destruction dun objet il faut supprimer toutes les rfrences sur cet objet.

Attribut de classe

Cre au chargement de la classe en mmoire (mme sil existe pas encore dinstance de la classe). Il a la mme valeur pour tous les objets de la classe. Lorsqu'un des objets modifie cette information, les autres en soient automatiquement avertis. Sa dclaration se fait avec le mot cl static. On accede aux attributs de classe avec linstruction: NomDeLaClasse.NomAttribut

Mthode de classe

Ce sont des mthodes propres la classe et non pas aux objets de la classe. Elles sont dclares avec le mot rserv static. Il n'est pas ncessaire de dclarer un objet pour chaque utilisation, il suffit de l'utiliser au travers de la classe. Elles sont appeles prcdes du nom de la classe (et non d'un objet), facultatif l'intrieur de la classe, exemple:
Math.cos(x,y); (mthode cos de la classe Math)

Une mthode de classe ne peut en aucun cas agir sur les champs usuels (non statiques) puisque, par nature, elle n'est lie aucun objet en particulier, elle nagit que sur les attributs de classe.

Les packages

Permettent de regrouper des classes apparentes . Permettent de ne rendre des groupes de classes disponibles que quand ils sont ncessaires, et ils liminent les risques de conflits entre des noms de classes communs des groupes de classes diffrents. (bien souvent, un paquetage correspond physiquement un rpertoire). Les bibliothques de classes Java sont contenues dans un paquetage appel java.

LHritage et le polymorphisme

Lhritage

L'hritage est un mcanisme qui permet une classe d'hriter de l'ensemble des comportements et attributs d'une autre classe. De cette faon, les classes hrites forment une hirarchie descendante, au sommet de laquelle se situe la classe de base. On appelle galement la classe hrite la sous-classe, classe drive ou la classe fille et la classe parente la super-classe, la classe de base ou la classe mre.

La classe drive peut en plus des attributs et mthodes hrits ajouter de nouveaux attributs et mthodes.

Avec Java, l'arborescence est stricte, c'est--dire qu'une classe donne ne peut possder qu'une seule superclasse (l'hritage est dit simple contrairement des langages comme le C++, pour lesquels un hritage dit multiple est possible).

Une classe peut possder un nombre illimit de sous-classes. En java la partie suprieure de la hirarchie de classes est occupe par la classe Object ; toutes les classes hritent des attributs et du comportement de cette super-classe. En java le mot cl extends est utilis dans la dclaration de la classe drive pour spcifier la super-classe ex: class Herbivore extends Animal{}.

Accs d'une classe drive aux membres de sa classe de base


Une classe drive n'accde pas aux membres privs de sa classe de base. Elle accde aux membres publics et protgs. Elle se fait avec le mot cl super qui permet: de faire rfrence la super-classe. de manipuler les attributs et mthodes de la superclasse: super.nom_Attribut super.nom_Methode(argument1,argument2..) de faire appel au constructeur de la classe parente en fournissant des arguments au mot-cl super de la faon suivante: super(parametre1,parametre2,...)

Construction et initialisation des objets drivs

En Java, le constructeur de la classe drive doit prendre en charge l'intgralit de la construction de l'objet. S'il est ncessaire d'initialiser certains champs de la classe de base et qu'ils sont convenablement encapsuls, il faudra disposer de fonctions d'altration ou bien recourir un constructeur de la classe de base . Si un constructeur d'une classe drive appelle un constructeur d'une classe de base, il doit obligatoirement s'agir de la premire instruction du constructeur et ce dernier est dsign par le mot cl super. Appeler un constructeur spcifique de la classe mre correspondant appeler super avec les arguments du constructeur cibl. ex: super(5); appelle le constructeur de la classe de base ayant un argument de type int.

Les diffrentes tapes de la construction dun objet dune classe drive

Allocation mmoire pour un objet de type B ; il s'agit bien de l'intgralit de la mmoire ncessaire pour un tel objet, et pas seulement pour les champs propres B (c'est--dire non hrits de A). Initialisation par dfaut de tous les champs de B (aussi bien ceux hrits de A, que ceux propres B) aux valeurs "nulles" habituelles . Initialisation explicite, s'il y a lieu, des champs hrits de A ; ventuellement, excution des blocs d'initialisation de A. Excution du corps du constructeur de A. Initialisation explicite, s'il y a lieu, des champs propres B ; ventuellement, excution des blocs d'initialisation de B. Excution du corps du constructeur de B.

Redfinitions et surdfinition des membres

La surdfinition de mthode l'intrieur d'une mme classe correspondait des mthodes de mme nom, mais de signatures diffrentes. Une classe drive pourra son tour surdfinir une mthode d'une classe ascendante, les mthodes de la super-classe cohabiteront en mme temps que celles surdfinies dans la classe drive. la recherche d'une mthode acceptable ne se fait qu'en remontant la hirarchie d'hritage, jamais en la descendant . La redfinition de mthode permet une classe drive de proposer une nouvelle dfinition une mthode de sa classe de base. C'est alors cette nouvelle mthode qui sera appele sur tout objet de la classe drive, masquant en quelque sorte la mthode de la classe de base.

Encore faut-il respecter la signature de la mthode (type des arguments), ainsi que le type de la valeur de retour. exemple:

Lappel de la mthode de la super-classe dans celle redfinie de la classe de drive devra tre prcd du mot cl super, sinon il provoquerait un appel rcursif de la mthode de la classe drive. La redfinition d'une mthode ne doit pas diminuer les droits d'accs cette mthode, mais elle peut les augmenter.

Surdfinition et redfinition peuvent cohabiter.

La richesse des possibilits de cohabitation entre surdfinition et redfinition peut conduire des situations complexes qu'il est gnralement prfrable d'viter en soignant la conception des classes.

exemple:

Les classes et mthodes finales

Les classes et mthodes finales sont dclares avec le mot cl final.

Il interdit la modification des valeurs des variables locales ou des champs de classe(constante dobjet ou de classe).

Ce mot cl peut aussi s'appliquer une mthode ou une classe, mais avec une signification totalement diffrente : Une mthode dclare final ne peut pas tre redfinie dans une classe drive.

Le comportement d' une mthode finale est donc compltement dfini et il ne peut plus tre remis en cause, sauf si la mthode appelle elle-mme une mthode qui n'est pas dclare final.

Une classe dclare final ne peut plus tre drive.

Le polymorphisme est la troisime caractristique essentielle d'un langage de programmation orient objet, aprs lencapsulation et lhritage En POO il est possible d'affecter une variable objet non seulement la rfrence un objet du type correspondant, mais aussi une rfrence un objet d'un type driv, on parle aussi de compatibilit par affectation entre un type classe et un type ascendant. Ce principe est appel surclassement ou upcasting Exemple Animal medor=new Chien(); Animal titi= new Oiseau(); Lorsquun objet est surclass il est vu comme un objet du type de la rfrence utilis pour le designer. Ces fonctionnalits sont alors restreintes celles proposes par la classe du type de la rfrence. Lorsquune mthode est accde partir dune rfrence surclasse, cest la mthode telle quelle est dfinie au niveau de la classe effective de lobjet qui est invoque et excute.

Le polymorphisme

Les mthodes sont rsolues lexcution: cest le lien dynamique ou late binding ou run-time binding ou dynamic binding Les conversions explicites de rfrences : La compatibilit par affectation n'a pas lieu dans le sens inverse. Exemples: Oiseau titi; titi= new Animal();//Refuse la compilation
Lappel dune mthode spcifique de la classe drive est refus la

compilation, mais cependant nous pouvons forcer le compilateur raliser la conversion correspondante en utilisant l'oprateur de cast: cest une promesse faite au compilateur. Animal titi; titi=new Oiseau(); titi.voler(); // refuse la compilation ((Oiseau)titi).voler(); //accepte la compilation, mais sera vrifie lexcution,OK promesse faite au compilateur

Il permet a un programme de ragir de manire diffrencie lenvoi dun mme message(lappel dune mthode) en fonction des objets qui reoivent ce message. Il consiste considrer les fonctionnalits suivant le type rel de lobjet et non suivant le type de la variable dans laquelle il est stock. le polymorphisme signifie que la mme opration peut se comporter diffremment sur diffrentes classes de la hirarchie

Les classes abstraites

Une classe abstraite est une classe incomplte. Une classe abstraite est dclare avec le modificateur abstract.

Une classe est abstraite si elle contient au moins une mthode abstraite ; elle ne peut pas tre instancie, mais ses sous-classes non abstraites le peuvent. Par contre on peut toujours crer une rfrence du type de cette classe.

Une mthode abstraite ne contient pas de corps, mais doit tre implmente dans les sous-classes non abstraites : abstract nomDeMthode (<arguments>); ce n'est qu'une signature

Exemple: public abstract class Animal{ public abstract void deplacer(); //juste la signature et le type } // de retour
-

La classe animal ne peut plus tre instancier. Chaque classe drive de Animal (Chien, Chat, Oiseau) devra redfinir la mthode deplacer() selon sa propre faon de se dplacer pour lever labstraction.

Rgles - Ds qu'une classe comporte une mthode abstraite, elle est abstraite, et ce mme si l'on n'indique pas le mot cl abstract devant sa dclaration (ce qui reste quand mme vivement conseill).
-

Une mthode abstraite doit obligatoirement tre dclare public, ce qui est logique puisque sa vocation est d'tre redfinie dans une classe drive. Dans l'en-tte d'une mthode dclare abstraite, les noms d'arguments muets doivent figurer (bien qu'ils ne servent rien). Une classe drive d'une classe non abstraite peut tre dclare abstraite et/ou contenir des mthodes abstraites.

Les interfaces
En fait, ce mcanisme n'est qu'une gnralisation du concept de classe abstraite.

Une interface est une classe dont toutes les mthodes sont abstraites.

On n'a donc plus besoin de spcifier que les mthodes sont abstraites (signales par le mot cl abstract), car elle doivent forcment l'tre.

Une interface est dclare non plus par le mot cl class mais par le mot interface.

On n'hrite pas d'une interface, mais on l'implmente. En d'autres termes, on doit forcment fournir le code de toutes les mthodes de l'interface utilise.

Limplmentation dune interface par une classe se ralise grce au mot cl implements. La diffrence essentielle entre une classe abstraite (dont toute les mthodes seraient abstraites) et une interface rside dans le fait que l'on ne peut hriter que d'une seule classe (hritage simple), alors que l'on peut implmenter plusieurs interfaces. C'est une solution pour simuler l'hritage multiple. Il s'agit essentiellement d'une annonce (ou d'un contrat) indiquant qu'une classe implmentera certaines mthodes Les interfaces contiennent uniquement des dfinitions de constante et des dclarations de mthodes, sans leur dfinition (autrement dit, les mthodes indiques dans les interfaces ne comportent que le prototype, et pas le corps).

Les attributs et les mthodes d'une interface sont automatiquement publics; cela implique qu'une classe qui implmente une interface devra dclarer publiques (avec le modificateur public) les mthodes de l'interface qu'elle dfinit. Si une classe A implmente une interface I, une sous-classe B de A implmente aussi automatiquement I ; une instance B pourra tre rfrence par une variable de type I et bnficiera, au moins par hritage, des dfinitions des mthodes prototypes dans I. Bien que la vocation d'une interface soit d'tre implmente par une classe, on peut dfinir des variables de type interface. Bien entendu, on ne pourra pas affecter cette dernire une rfrence un objet de type I puisqu'on ne peut pas instancier une interface (pas plus qu'on ne pouvait instancier une classe abstraite !).

En revanche, on pourra affecter i n'importe quelle rfrence un objet d'une classe implmentant l'interface I :

On peut dfinir une interface comme une gnralisation d'une autre. On utilise l encore le mot cl extends, ce qui conduit parler d'hritage ou de drivation, et ce bien qu'il ne s'agisse en fait que d'emboter simplement des dclarations : La drivation des interfaces revient simplement concatner des dclarations

EXEMPLE DAPPLICATION DU POLYMORPHISME

Le terme polymorphisme dcrit la caractristique d'un lment qui peut prendre plusieurs formes. En programmation Objet, le polymorphisme signifie que la mme opration peut se comporter diffremment sur diffrentes classes de la hirarchie.

//: c07:Shapes.java // Polymorphisme en Java. abstract class Shape { abstract void draw(); abstract void erase(); } class Circle extends Shape { void draw() { System.out.println("Circle.draw()"); } void erase() { System.out.println("Circle.erase()"); } } class Square extends Shape { void draw() { System.out.println("Square.draw()"); } void erase() { System.out.println("Square.erase()"); } }

class Triangle extends Shape { void draw() { System.out.println("Triangle.draw()"); } void erase() { System.out.println("Triangle.erase()"); } } public class Shapes { public static Shape randShape() { switch((int)(Math.random() * 3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } } public static void main(String[] args) { Shape[] s = new Shape[9]; // Remplissage du tableau avec des formes [shapes]: forint i = 0; i < s.length; i++) s[i] = randShape(); // Appel polymorphe des mthodes: forint i = 0; i < s.length; i++) s[i].draw(); } }

Quelles classes Java

La classe super-classe Object

Elle est la racine de lensemble de la hirarchie des classes java.

Une rfrence de type Object peut tre utilis pour rfrencer nimporte quel type dobjet.

Il faudra effectuer la conversion ncessaire pour appliquer une mthode prcise un objet rfrenc par une variable de type Object exemple: Objetc o; o=new Point(); (Point)o.deplace(2,3);

Notez bien les consquences des rgles relatives au polymorphisme. Pour pouvoir appeler une mthode f par o.f(), il ne suffit pas que l'objet effectivement rfrenc par f soit d'un type comportant une mthode f, il faut aussi que ladite mthode existe dj dans la classe Object. Ce n'est manifestement pas le cas de la mthode dplace.

Les mthodes de la Object

String toString() Elle fournit une chane, c'est--dire un objet de type String. La mthode toString de la classe Object fournit une chane contenant :

le nom de la classe concerne l'adresse de l'objet en hexadcimal (prcde de @). Exemple: titi.toString== Oiseau@fecdac12

boolean equals(Object obj) Renvoie true si les adresses mmoires des deux objets concerns sont gales et false dans le cas contraire. Exemple: Pomme p1=new Pomme( verte ,20); Pomme p2=new Pomme( verte ,20); p1.equals(p2);// renvoie false protected Object clone() Cre et retourne une copie de l'objet. protected void finalize() Appel par le Garbage Collector sur un objet lorsque ce dernier dtermine qu'il n'y a plus de rfrences vers des objets.

protected Object clone() Cre et retourne une copie de l'objet. protected void finalize()

Appel par le Garbage Collector sur un objet lorsque ce dernier dtermine qu'il n'y a plus de rfrences vers des objets. Class getClass() Retourne la classe d'excution d'un objet.

int hashCode() Retourne une valeur hash code pour l'objet.

La classe String

En java il nexiste pas de type primitif reprsentant les chanes de caractres. Java ne contient pas de type chane prdfini. En revanche, la bibliothque Java standard contient une classe prdfinie appele String. Chaque chane est un objet (une rfrence) de la classe String

Il est impossible de modifier la chaine de caractre dun String.

Quelques mthodes de la classe String

char charAt(int index) retourne la caractre positionn l'index spcifi. int compareTo(String anotherString) compare deux chanes lexicographiquement.

int compareToIgnoreCase(String str) compare deux chanes lexicographiquement en ignorant la casse de caractres. String concat(String str) concatne l'objet String une autre chane de caractres. boolean equals(Object anObject) compare deux chanes de caractres entre elles. String substring(int beginIndex, int endIndex)

retourne une nouvelle chane de caractres qui est une sous-chane de l'objet String par l'intermdiaire d'un intervalle spcifi. String toLowerCase() convertit tous les caractres dans l'objet String en casse minuscule en utilisant les rgles de l'objet Locale par dfaut. String toLowerCase(Locale locale) convertit tous les caractres dans l'objet String en casse minuscule en utilisant les rgles de l'objet Locale fourni. int length() retourne la longueur de l'objet String.

String toString() retourne une chane de caractres issue de l'objet String. String toUpperCase() convertit tous les caractres dans l'objet String en casse majuscule en utilisant les rgles de l'objet Locale par dfaut. String toUpperCase(Locale locale) convertit tous les caractres dans l'objet String en casse majuscule en utilisant les rgles de l'objet Locale fourni. String trim() retourne une copie de l'objet String en supprimant les espaces blancs avant et aprs la chane de caractres. String replace(char oldChar, char newChar) retourne un nouvel objet String rsultant du remplacement de toutes les occurrences d'un caractre donne par un autre caractre. String[] split(String regex) dcoupe une chane de caractres autour des correspondances donnes par l'expression rgulire. int indexOf(int ch) retourne l'index l'intrieur l'objet String de la premire occurrence du caractre spcifi.

Exemple

Conversion dun type primitif en une chane de caractres static String valueOf(int i) retourne un reprsentation sous forme d'un objet String de la valeur de type int passe en argument. exemple: String ch=String.valueOf(10); // ch= 10

Conversion d'une chane en un type primitif Il faut recourir une mthode de la classe enveloppe associe au type primitif : Integer pour int, Double pour double, etc... Par exemple, pour convertir une chane en un entier de type int, on utilisera la mthode statique parseInt de la classe enveloppe Integer, exemple: String ch= 412 ; int n=Integer.parseInt(ch);

Les tableaux

Les tableaux permettent de regrouper une suite de variables de mme type. Chaque lment du tableau est une variable que vous pouvez utiliser comme n'importe quelle variable de ce type. Il est possible de dfinir des tableaux pour les types primaires ou les classes. Cependant, tous les lments doivent tre du mme type. En Java, les tableaux sont des objets Dclarer une variable pour rfrencer le tableau. char[] monTableau; char monTableau[];

Crer un objet de type tableau en initialisant la rfrence ce tableau. On utilise pour ce faire l'oprateur new

il est possible de fournir la valeur chacune des cases du tableau. Il suffit de donner la liste entre accolades sans utiliser l'oprateur new.

Lutilisation des tableaux

Tableaux de plusieurs dimensions exemple: int[][] monTableau; monTableau = new int[2][4];

La classe ArrayList

Elle ralise limplmentation des tableaux de taille variable dont les lments sont des objets. La taille du vecteur peut augmenter ou diminuer si ncessaire, afin de sajuster lors d'ajouts ou de suppressions de composants. Les constructeurs : Vector() // Cre un vecteur vide Vector(int initialCapacity) // Cre un vecteur vide dont la capacit initiale est gale l'argument spcifi. Vector(int initialCapacity, int capacityIncrement) // Cre un vecteur vide dont la capacit est gale initialCapacity, et dont la capacit s'accrot de capacityIncrement lorsqu'il est satur.

void addElement(Object obj) // ajoute l'lment obj au vecteur Object elementAt(int index) // renvoie l'objet d'indice index. Object firstElement() // renvoie le premier lment du vecteur. void insertElementAt(Object obj, int index) // insre l'objet obj de faon qu'il occupe l'indice index, les objets situs la suite tant dcals. boolean isEmpty() // renvoie true si le vecteur est vide, sinon false. Object lastElement() // renvoie le dernier lment du vecteur. void removeAllElement() // supprime tous les lments du vecteur et remet 0 le nombre de ses lments. boolean removeElement(Object obj) // supprime la premire occurrence de l'objet obj et avance d'un indice tous les lments situs derrire. // renvoie true si l'objet existe, sinon false.

void removeElementAt(int index) // Supprime l'lment d'indice index et avance d'un indice tous les lments situs derrire. void setElementAt(Object obj, int index) // remplace l'lment d'indice index par l'objet obj. int size() // donne le nombre dlments du vecteur

La programmation graphique

Les types de GUI ( IHM)


L'lment le plus important dans une interface utilisateur est la fentre. Il y a plusieurs sortes de fentres : celle cre par le systme pour le programme java, et les autres, cres par java l'intrieur de la premire. Java dispose de deux composants principaux : Window et Applet. Les fentres Windows sont utiliss pour les applications fonctionnant localement. Le Applets sont employs pour les programmes fonctionnant par l'intermdiaire d'un rseau et au travers d'un navigateur auxquels de nombreuses restrictions sont imposes pour des raisons de scurit. Java implmentes les classes Windows et Applets pour la gestion des interfaces graphiques

Interface Window

Deux packages fournis par java pour la gestion des application windows: AWT(Abstract Windows Toolkit) et Swing. Les objets AWT utilisent les objets natifs de lOS sur lequel ils tournent.Gestion lourde: consommation de mmoire, perte de performance Les objets Swing(dernire version) sont des objets java donc portables sur tout environnement sans modification de leur aspect. Ils sont simplement dessins l'intrieur de leur conteneur comme s'il s'agissait d'une image: composant allgs. A chacune des classes du package java.awt correspond une classe du package javax.swing, portant le mme nom prcd d'un J

Dans la suite nous retenons la solution Swing. Toute application windows(swing) utilise des fentres drivant ou utilisant la classe JFrame. JFrame est compos quatre couches superposes JRootPane JLayeredPane contentPane glassPane

Ma premire fentre Swing


Classe JFrame du package javax.swing Les constructeurs: JFrame() Construit une fentre vide initialement invisible. JFrame(java.lang.String) Construit une nouvelle fentre initialement invisible avec un titre fournit en argument

Quelques mthodes
getContentPane(): recupre le conteneur principal de la fentre Remove(): efface le composant de la fentre setTitle(): dfinit le titre de la fentre setVisible(): rend la fentre visible setBounds: dfinit la position et les dimensions de la fentre

Exemple dutilisation de la classe JFrame :

package interfacegraphique; import javax.swing.*; public class MaFenetre { public static void main(String[] args) { JFrame fenetre=new JFrame(); fenetre.setSize(350,500); fenetre.setTitle("Ma premire fentre swing"); fenetre.setVisible(true); } }

import javax.swing.*; //import le package javax.swing contenant les classes swing public class MaFenetre { public static void main(String[] args) { JFrame fenetre=new JFrame(); //construction dune fentre sans titre fenetre.setSize(350,500); //dimensionner la largeur et la hauteur de la fentre fenetre.setTitle("Ma premire fentre swing"); //donner un titre la fentre fenetre.setVisible(true); //rendre la fentre visible } }

Exemple de drivation de la classe JFrame import javax.swing.*; class MaSecondeFenetre extends JFrame { public MaSecondeFenetre () { this.setTitle("Ma seconde fentre swing"); this.setBounds(30,50,400,500); this.setVisible(true); } } public class TestMaFenetre { public static void main(String[] args) { MaSecondeFenetre fenetre=new MaSecondeFenetre (); } }

import javax.swing.*; class MaFenetre extends JFrame { //classe drive de la classe JFrame public MaFenetre(){ //constructeur sans argument this.setTitle("Ma seconde fentre swing"); //definition du titre de la fentre this. this.setBounds(30,50,400,500); //dfinition la position(30,40) et la taille(400,500) de la fentre } } public class TestMaFenetre{ //classe de test de ma classe MaFenetre public static void main(String[] args) { MaFenetre fenetre=new MaFenetre(); //cration dun objet de type MaFentre (appel du constructeur) fenetre.setVisible(true); //affichage de lobjet fentre } }

Les boutons de commande: le composant JButton


Classe implmentant les boutons de commandes JButton():cre un button sans text ni icne JButton(String text):cre un button avec text JButton(Icon icone):cre un button avec une icne public boolean isDefaultButton(): verifie si cest le button par dfaut du conteneur principal.

Ajout dun composant sur une fentre

Le composant doit tre ajout un panel(conteneur) Rcuprer le conteneur principal (contentPane) de la fentre avec la mthode getContentPane() qui renvoie une rfrence de type Container implmentant la classe des objets qui pouvant contenir des composants: les panel, frame. Ajouter le composant sur lobjet conteneur ainsi recupr avec la mthode add() du Container.

import javax.swing.*; import java.awt.*;// pour pouvoir utiliser le gestionnaire de rpartition et les conteneurs public class TestMaFenetreBouton{ public static void main(String[] args) { JFrame fenetre=new JFrame(); //cration de la fentre JButton cmdValider= new JButton("Valider"); //cration du button de commande Valider Container panel=fenetre.getContentPane(); //recupration du conteneur principal de la fentre panel.add(cmdValider); //ajout du button de commande sur le conteneur panel.setLayout(new FlowLayout()); // repartition du conteneur principal avec le type FlowLayout fenetre.setVisible(true); //afficher la fentre } }

Les deux instructions: Container panel=fenetre.getContentPane(); panel.add(cmdValider); auraient pu tre remplaces par: fenetre.getContentPane().add(cmdValider); Ceci du au fait que la mthode getContentPane de lobjet JFrame renvoie un objet Container donc on peut rajouter des composants directement sur lobjet renvoy qui correspond en ralit au conteneur principal du JFrame.

Nous avons rajout le package java.awt pour pouvoir accder aux classes FlowLayout et Container; Il est conseill dimporter les classes awt, awt.event, swing, et swing.event pour ne plus se poser des questions sur lorigine des classes.

Les cases cocher: le composant JCheckBox


Ils permettent aux utilisateurs de faire un choix du type oui/non En cliquant sur la case cocher son tat passe de on off Constructeurs: JCheckBox(): permet de crer une case cocher vide. JCheckBox(Icon icone): cration en spcifiant une image JCheckBox(String Texte): Les mthodes AddActionListener(); removeActionListener() setText(): pour spcifier le texte de la case cocher setIcon(): pour spcifier limage setSelected(): pour spcifier ltat IsSelected(): retourne letat de la case cocher

Les vnements

Tout systme d'exploitation qui supporte des interfaces graphiques doit constamment surveiller l'environnement afin de dtecter des vnements tels que la pression sur une touche du clavier ou sur un bouton de la souris. Le systme d'exploitation en informe alors les programmes en cours d'excution. Chaque programme dtermine ensuite s'il doit rpondre ces vnements.

Illustration

Les sources d'vnement sont des composants de l'interface utilisateur: des fentres et des menus.... Le systme d'exploitation notifie une source d'vnements les activits qui peuvent l'intresser, comme les mouvements de la souris ou les frappes du clavier. La source d'vnement dcrit la nature de l'vnement dans un objet vnement - ##Event. Elle stocke galement une liste d'couteur - des objets qui souhaitent tre prvenus quand l'vnement se produit. La source d'vnement appelle la mthode approprie de l'interface couteur afin de fournir des informations sur l'vnement aux divers couteurs recencs. Pour cela la source passe l'vnement objet adquat la mthode de la classe couteur.

L'couteur analyse l'objet vnement pour obtenir de informations dtailles. Par exemple, nous pouvons utiliser la mthode getSource pour connatre la source, ou les mthodes getX et getY de la classe MouseEvent pour connatre la position courante de la souris.

Linterface MouseListener
Linterface

couteur MouseListener dclare les mthodes suivantes:


void mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e)

Rappel

quand une classe implmente une interface, elle devra implmenter(dfinir) le code de toutes les mthodes de linterface.

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Souris extends JFrame implements MouseListener{ //implmentation de la mthode mouseClicked public void mouseClicked(MouseEvent evt){ JOptionPane.showMessageDialog(this, "Souris clicke en: "+evt.getX()+"et "+ evt.getY() +"avec :" + evt.getClickCount()+" click" ); } //implmentation des mthodes abstraites public void mouseEntered(MouseEvent e){}; public void mouseExited(MouseEvent e){}; public void mousePressed(MouseEvent e){}; public void mouseReleased(MouseEvent e){}; } public class TestSouris { public static void main(String[] args){ TestSouris ts=new TestSouris(); JLabel l=new JLabel("Cliquer ici "); l.addMouseListener(ts); ts.getContentPane().add(l); ts.setBounds(0,0,200,100); ts.setVisible(true); } }

Linterface KeyListener

Linterface couteur KeyListener coute les vnements du clavier(KeyEvent). Elle dclare les mthodes suivantes: void keyTyped(KeyEvent e) lorquune touche a t frappe void keyPressed(KeyEvent e) lorsquune touche a t presse void keyReleased(KeyEvent e) lorsquune touche a t relache

package lesevenements; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class TestClavier extends JFrame implements KeyListener { //les attributs de la classe JLabel alt,shift,ctrl,touche,code; //le constructeur public TestClavier() { super("Test du clavier"); alt =new JLabel("Alt");getContentPane().add(alt); shift =new JLabel("Shift");getContentPane().add(shift); ctrl =new JLabel("Ctrl");getContentPane().add(ctrl); touche =new JLabel("Touche: ");getContentPane().add(touche); code =new JLabel("Code: ");getContentPane().add(code); getContentPane().setLayout(new FlowLayout()); addKeyListener(this); setBounds(100,100,600,100); setVisible(true); }

//implmentation de la mthode keyPressed public void keyPressed(KeyEvent e){ if(e.isAltDown()) alt.setForeground(Color.red); if(e.isShiftDown()) shift.setForeground(Color.red); if (e.isControlDown()) ctrl.setForeground(Color.red); code.setText("Code: " + e.getKeyCode()); } //implmentation de la mthode keyRealeased public void keyReleased(KeyEvent e){ if(!e.isAltDown()) alt.setForeground(Color.black); if(!e.isShiftDown()) shift.setForeground(Color.black); if (!e.isControlDown()) ctrl.setForeground(Color.black); code.setText("Code: " ); } //implmentation de la mthode KeyType public void keyTyped(KeyEvent e){ touche.setText("Caractre: '" + e.getKeyChar()+"'"); }

public static void main(String[] args) { TestClavier t = new TestClavier(); } }

Linterface WindowListener

Linterface couteur WindowListener coute les vnements de la fentre (WindowEvent). Elle dclare les mthodes suivantes: public void windowOpened(WindowEvent evt) public void windowActivated(WindowEvent evt) public void windowDeactivated(WindowEvent evt) public void windowIconified(WindowEvent evt) public void windowDeiconified(WindowEvent evt) public void windowClosed(WindowEvent evt) public void windowClosing(WindowEvent evt)

package lesevenements; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class TestWindow extends JFrame implements WindowListener{ public void windowOpened(WindowEvent evt) {} public void windowActivated(WindowEvent evt){} public void windowDeactivated(WindowEvent evt){} public void windowIconified(WindowEvent evt){} public void windowDeiconified(WindowEvent evt){} public void windowClosed(WindowEvent evt){} public void windowClosing(WindowEvent evt){ System.out.print("Au revoir"); System.exit(0); } public static void main(String[] args) { TestWindow tw = new TestWindow(); tw.addWindowListener(tw); tw.setBounds(100,100,200,300); tw.setVisible(true); }

Les mthodes de programmation des couteurs


La classe conteneur elle mme est couteur.


La classe conteneur implmente linterface de lcouteur.

Une classe interne de la classe conteneur.


Classe dclare lintrieure de la classe conteneur.

Une classe externe de la classe conteneur(rare).


Classe dclare en dehors de la classe conteneur.

Une classe anonyme(frquent).


Classe dfinie son instanciation au moment de labonnement

un objet couter.

La classe conteneur elle mme

Cas dj trait Exemple: public class Fenetre extends JFrame implements ActionListener{

La classe Fentre est elle mme couteur daction

Cas dune classe interne


package lesevenements; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class TestEcouteurInterne extends JFrame { JButton b1,b2; public TestEcouteurInterne() { b1=new JButton("OK"); b2=new JButton("Annuler"); EcouteurInterne oreille=new EcouteurInterne(); b1.addActionListener(oreille); b2.addActionListener(oreille); this.getContentPane().add(b1); this.getContentPane().add(b2); this.getContentPane().setLayout(new FlowLayout()); this.setTitle("Test d'un couteur interne"); this.setBounds(100,100,200,300); this.setVisible(true); }

class EcouteurInterne implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource()==b1) b1.setBackground(Color.green); if(e.getSource()==b2) b2.setBackground(Color.red); } } public static void main (String args[]){ TestEcouteurInterne t=new TestEcouteurInterne(); } }

Cas dune classe anonyme

Une classe anonyme est une classe locale sans nom. Une classe anonyme est dfinie et instancie dans une unique expression concise en utilisant l'oprateur new. Lorsqu'une classe locale n'est utilise qu'une seule fois, envisagez d'utiliser la syntaxe des classes anonymes qui place la dfinition et l'utilisation de la classe au mme endroit. Si le nom suivant le mot cl new est le nom d'une classe, la classe anonyme devient une sous-classe de la classe nomme. Si le nom suivant new spcifie une interface, alors la classe anonyme implmente cette interface et devient une sous-classe de Object. A utiliser si lcouteur coute un seul composant et que son code nest pas trs volumineux. Lcouteur est prs de lobjet cout.

package lesevenements; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class TestEcouteurClasseAnonyme extends JFrame { JButton b1; public TestEcouteurClasseAnonyme () { b1=new JButton("OK"); b1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){b1.setBackground(Color.cyan);}}); this.getContentPane().add(b1); this.getContentPane().setLayout(new FlowLayout()); this.setTitle("Test d'un couteur anonyme"); this.setBounds(100,100,200,300); this.setVisible(true); } public static void main (String args[]){ TestEcouteurClasseAnonyme t=new TestEcouteurClasseAnonyme (); } }

Les adaptateurs

Pour viter aux programmeurs davoir implmenter toutes les mthodes dune interface couteur, AWT fournit des classes qui implmentes toutes ces mthodes. Le code des mthodes ne fait rien. Cette technique permet au programmeur de redfinir dans les sous-classe des adaptateurs que les mthodes qui lintressent. Les classes suivantes du package java.awt.event sont des adaptateurs: KeyAdapter, MouseAdapter, MouseMotionAdapter, WindowAdapter NB: les adaptateurs sont des classes(et non des interfaces) donc ils faut les driver(et non les implmenter).

La classe MouseAdapter implmente toutes les mthodes de MouseListener avec un code vide. Nous pouvons tendre la classe Adapter en ne redfinissant que la(les) mthode(s) ncessaire(s).

Exemple: dun ecouteur MouseAdapter implment par la mthode dune classe anonyme.

Un MouseAdapter en implmentation classe anonyme sur un JFrame

Un KeyAdapter implmentation classe anonyme sur un JTextField et un WindowAdapter en implmentation classe anonyme sur JFrame

Les Applets

Quest ce quune Applet

Java est surtout connu pour sa capacit fonctionner sur des pages du World Wide Web. Ces programmes, appels Applets, se prsentent comme des images sur une page Web. Contrairement aux images, toutefois, les applets peuvent tre interactives - c'est--dire admettre des donnes entres par l'utilisateur, y rpondre et prsenter du contenu capable d'voluer en permanence. Les applets peuvent servir crer des animations, des figures, des jeux, des formulaires capables de ragir des informations entres par l'utilisateur, ou tout autre type d'effets interactifs sur une mme page Web, au milieu d'lments de texte et de graphismes.

Les applets peuvent tre tlcharges depuis le World Wide Web de la mme manire que des pages HTML, des images ou n'importe quel lment de site Web. Si le navigateur Web utilis est quip pour traiter les applets Java, l'applet tlcharge commence s'excuter ds qu'elle a fini de se tlcharger. Contrairement aux ActiveX, Java dispose d'un modle de scurit. Le systme garantit l'utilisateur un niveau de protection lev pour son systme. Au sein de l'applet, par exemple, il ne sera pas possible d'accder aux fichiers du disque dur du poste client ou de lancer un exe sur la machine locale.

Caractristiques dune applet

Nous avons dcouvert qu'une applet est un programme qui tourne au sein d'une page Web. Ce n'est donc pas une application et c'est le navigateur qui doit grer l'applet. La mthode main n'existe plus, la place le navigateur excute la mthode init. Le navigateur gre galement l'affichage de l'applet en rservant une zone au sein de la page Web. Pour que la classe principale soit reconnue comme une applet, elle doit hriter de JApplet du package javax.swing ou de la classe Applet du package java.awt.

Les mthodes spcifiques dune applet


public void init(): appel par le navigateur lors du chargement de la page juste aprs le constructeur; donc une seule fois public void start(): appel par le navigateur lorsque la page devient active public void stop(): appel par le navigateur lorsque la page devient inactive public void destroy(): appel par la navigateur lorsque lapplet doit tre dfinitivement arrt public void paint(Graphics g): appel chaque fois que la page doit tre redessine.

Ma premire applet
import javax.swing.*; import java.awt.*; public class MaPremiereApplet extends JApplet { public void paint(Graphics g) { g.drawString("Je suis affich par l'applet",0,100); }

Appel dune applet via une page HTML


<html> <head> </head> <body> <APPLET CODE=MaPremiereApplet.class Width=100 Height=200> </APPLET> </body> </html>

Transmissions de paramtres

Sur la page HTML elle se fait via la commande < Param Name= Value=.. > Dans le tag < Applet > Dans le code java les paramtres sont recuprs avec linstruction getParameters(" " ) Attention cette mthode nest pas disponible dans le constructeur de lapplet mais ds lappel de la mthode init().

Exemple
import javax.swing.*; import java.awt.*; public class AfficherMois extends JApplet { public void paint(Graphics g) { String leMois=getParameter("Mois"); g.drawString("Mois: "+ leMois,0,100); } }

<html> <head> </head> <body> <APPLET CODE=AfficherMois.class> <Param Name="Mois" Value="Janvier"> </APPLET> </body> </html>

La classe Graphics
Classe

abstraite contenant les outils necessaires pour dessiner. Instancie par lOS via la JVM. mthodes de la classe Graphics drawArc() drawImage() drawLine() drawString() drawRect() drawOval() setColor() setFont()

Quelques

import java.awt.*; import java.javax.swing.*; import java.awt.event.*; public class Figure extends JApplet { public void paint(Graphics g) { //Cration dune police de caractre Font helvetica14Normal = new Font("Helvetica",Font.PLAIN,14); // Affectation dune couleur noire g.setColor(Color.black); //Affectation de la police g.setFont(helvetica14Normal); //Dessiner le texte g.drawString("Figures ...", 50, 20); //Dessiner une line g.drawLine(50,25,100,25); //Changer la couleur en rouge g.setColor(Color.red);

//Dessiner un rectangle g.drawRect(50,30,20,30); //Dessiner un rectangle plein g.fillRect(80,30,20,30); //Dessiner un rectangle aux angles arrondis g.drawRoundRect(50,70,20,30,15,15); //Dessiner un rectangle plein aux angles arrondis g.fillRoundRect(80,70,20,30,15,20); //Dessiner un rectangle 3Dimensions g.draw3DRect(50,110,20,30,true); //Dessiner un rectangle 3Dimensions rempli g.fill3DRect(80,110,20,30,false); // polygones int listeX[]={50,40,80,100,55,0}; int listeY[]={150,170,200,170,160,0}; int nbrXY=listeX.length-1; g.drawPolygon(listeX, listeY, nbrXY); int listeY2[]={200,220,250,220,210,0}; g.fillPolygon(listeX, listeY2, nbrXY);

// ovales g.drawOval(120,30,20,30); g.fillOval(150,30,30,30); // arcs g.drawArc(120,70,20,30,45,180); g.fillArc(150,70,30,30,45,-150); } }

Applet avec composant Swing


import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingApplet extends JApplet implements ActionListener{ JButton b1; JButton b2; public void init() { b1=new JButton("OK"); b2=new JButton("Annuler"); b1.addActionListener(oreille); b2.addActionListener(oreille); this.getContentPane().add(b1); this.getContentPane().add(b2); this.getContentPane().setLayout(new FlowLayout()); } public void actionPerformed(ActionEvent e){ if(e.getSource()==b1) b1.setBackground(Color.green); if(e.getSource()==b2) b2.setBackground(Color.red); } } NB: pas mthode main, setSize, setBounds car gres par le navigateur

Quelsques

exemples dapplets sur ces liens http://cui.unige.ch/java/exemples/ /

Accs aux bases de donnes avec JDBC(Java Database Connectivity)

Architecture JDBC

JDBC est un ensemble de classes et dinterfaces destines permettre la connexion et la communication avec les moteurs de bases de donnes . Le langage de communication entre JDBC et les BDD est le SQL. Architecture repose sur:
JDBC API: ensembles des classes et dinterfaces pour dvelopper les

application utilisant les BDD. JDBC Manager: cest le noyau Java de JDBC JBDC Driver: ces sont les implmentations des interfaces spcifiques chaque moteur de BDD. Ils peut en exister plusieurs pour un mme moteur.

Types de drivers JDBC


Application Java
Type 1 Pont JDBC-ODBC

Type 2 Driver Natif

Type 4

Type 3

ODBC API spcifique API spcifique du SGBDR du SGBDR

Driver Driver Pont 100% Java Rseau 100% Java

SGBDR

Serveur Pont rseau 100% Java

http://java.sun.com/products/jdbc/jdbc.drivers.html

JDBC

Utilisation des classes de base


Les classe de JDBC sont dans le package java.sql Ce package est principalement compos dinterfaces destines tre implmentes par les drivers JDBC. 8 interfaces : Statement CallableStatement, PreparedStatement DatabaseMetaData, ResultSetMetaData ResultSet, Connection Driver

DriverManager

Connection

Statement

Resultset

Mettre en uvre JDBC


0.

Importer le package java.sql 1. Enregistrer le driver JDBC 2. Etablir la connexion la base de donnes 3. Crer une zone de description de requte 4. Excuter la requte 5. Traiter les donnes retournes 6. Librer les diffrents espaces mmoires

Etape 1: Enregistrer le driver


Il

se fait avec la mthode statique forName() de la classe Class :


Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("oracle.jdbc.driver.OracleDriver");

quand une classe Driver est charge, elle doit crer une

instance d elle mme et s enregistrer auprs du DriverManager certains compilateurs refusent cette notation et demande plutt :
Class.forName("driver_name").newInstance();

Etape 2: Connexion la base

Mthode getConnection() de DriverManager 3 arguments : l URL de la base de donnes le nom de l utilisateur de la base son mot de passe

Connection objConnexion = DriverManager.getConnection(url,user,password);

le DriverManager essaye tous les drivers qui se sont enregistrs (chargement en mmoire avec Class.forName()) jusqu ce quil trouve un driver qui peut se connecter la base.

URL de connexion
Accs

la base via un URL de la forme :

jdbc:<sous-protocole>:<nom-BD>;param=valeur, ...

qui spcifie : l utilisation de JDBC le driver ou le type de SGBDR l identification de la base locale ou distante
avec des paramtres de configuration ventuels nom utilisateur, mot de passe, ...

Exemples :
String url = "jdbc:odbc:MaDataSourceName" ; String url = "jdbc:mysql://mv05:1114:maBase";

Etape 3: Crer une zone de description de requte


L

objet Statement possde les mthodes ncessaires pour raliser les requtes sur la base associe la connexion dont il dpend. types de Statement :

Statement : requtes statiques simples PreparedStatement : requtes dynamiques pr-

compiles (avec paramtres d entre/sortie) CallableStatement : procdures stockes

partir de l objet Connexion, on rcupre le Statement associ :

Statement stmt = connexion.createStatement(); PreparedStatement stmtPrepare = connexion.prepareStatement(str); CallableStatement stmtProcStockees = connexion.prepareCall(str);

Etape 4: Excution d une requte


3

types d excution :
retournent un ResultSet (tuples rsultants)

executeQuery() : pour les requtes (SELECT) qui

executeUpdate() : pour les requtes (INSERT,

UPDATE, DELETE, CREATE TABLE, DROP TABLE) qui retournent un entier (nombre de tuples traits)
execute() : procdures stockes (cas rares)

executeQuery()

et executeUpdate() de la classe Statement prennent comme argument une chane (String) indiquant la requte SQL excuter :

Statement st = connexion.createStatement(); ResultSet rs = st.executeQuery( "SELECT nom, prenom FROM clients " + "WHERE nom=Diop ORDER BY nom"); int nb = st.executeUpdate("INSERT INTO dept(DEPT) " +"VALUES(06)");

remarques :

le code SQL n est pas interprt par Java.


c est le pilote associ la connexion (et au final par le moteur de la base de donnes) qui interprte la requte SQL si une requte ne peut s excuter ou quune erreur de syntaxe SQL a t dtecte, l exception SQLException est leve

le driver JDBC effectue d abord un accs la base

pour dcouvrir les types des colonnes impliques dans la requte puis un 2me pour l excuter..

Etape 5: Traiter les donnes retournes


L

objet ResulSet (retourn par l excution de executeQuery() ) permet d accder aux champs des tuples slectionns
seules les donnes demandes sont transfres

en mmoire par le driver JDBC

il faut donc les lire "manuellement" et les stocker dans des variables pour un usage ultrieur

Il

se parcourt itrativement ligne par ligne


par la mthode next()


retourne false si dernier tuple lu, true sinon chaque appel fait avancer le curseur sur le tuple suivant initialement, le curseur est positionn avant le premier tuple
excuter next() au moins une fois pour avoir le premier

while(rs.next()) {// Traitement de chaque tuple}

impossible de revenir au tuple prcdent ou de

parcourir l ensemble dans un ordre alatoire

Les L

colonnes sont rfrences par leur numro ou par leur nom accs aux valeurs des colonnes se fait par les mthodes de la forme getXXX()
lecture du type de donnes XXX dans chaque

colonne du tuple courant

int val = rs.getInt(3) ; // accs la 3e colonne String prod = rs.getString("PRODUIT") ;

Connection connexion =DriverManager.getConnection(url,user,pss); Statement st = connexion.createStatement(); ResultSet rs = st.executeQuery( "SELECT a, b, c, FROM Table1"); while(rs.next()) { int i = rs.getInt("a"); String s = rs.getString("b"); byte[] b = rs.getBytes("c"); }

Types de donnes JDBC


Le

driver JDBC traduit le type JDBC retourn par le SGBD en un type Java correspondant
le XXX de getXXX() est le nom du type Java correspondant au

type JDBC attendu


chaque driver a des correspondances entre les types SQL du

SGBD et les types JDBC


le programmeur est responsable du choix de ces mthodes

SQLException gnre si mauvais choix

Correspondance des types


Type JDBC Type Java CHAR, VARCHAR , LONGVARCHAR String NUMERIC, DECIMAL java.math.BigDecimal BINARY, VARBINARY, LONGVARBINARY byte[] BIT boolean INTEGER int BIGINT long REAL float DOUBLE, FLOAT double DATE java.sql.Date TIME java.sql.Time . ..

Cas des valeurs nulles


Pour

reprer les valeurs NULL de la base :


renvoie true si l on vient de lire un NULL, false sinon

utiliser la mthode wasNull() de ResultSet les mthodes getXXX() de ResultSet convertissent une

valeur NULL SQL en une valeur acceptable par le type d objet demand :

les mthodes retournant un objet (getString() , getObject() et getDate() ) retournent un "null " Java les mthodes numriques (getByte() , getInt() , etc) retournent "0" getBoolean() retourne " false "

Etape 6:Fermer les diffrents espaces


Pour

terminer proprement un traitement, il faut fermer les diffrents espaces ouverts


sinon le garbage collector s en occupera mais moins

efficace
Chaque

objet possde une mthode close() :

resultset.close(); statement.close(); connection.close();

Accs aux mta-donnes


La

mthode getMetaData() permet d obtenir des informations sur les types de donnes du
ResultSet elle renvoie des ResultSetMetaData on peut connatre entre autres :

le nombre de colonne : getColumnCount() le nom d une colonne : getColumnName(int col) le type d une colonne : getColumnType(int col) le nom de la table : getTableName(int col) si un NULL SQL peut tre stock dans une colonne : isNullable()

ResultSetMetaData
Resultset rs = stmt.executeQuery("SELECT * FROM emp"); ResultSetMetaData rsmd = rs.getMetatData(); int nbColonnes = rsmd.getColumnCount(); for(int i = 1; i <= nbColonnes; i++) { // colonnes numerotees a partir de 1 (et non 0) String typeCol = rsmd.getColumnTypeName(i); String nomCol = rsmd.getColumnName(i); }

DataBaseMetaData
Pour

rcuprer des informations sur la base de donnes elle-mme, utiliser la mthode getMetaData() de l objet Connection
dpend du SGBD avec lequel on travaille elle renvoie des DataBaseMetaData on peut connatre entre autres :

les tables de la base : getTables() le nom de l utilisateur : getUserName() ...

Requtes pr-compiles
L

objet PreparedStatement envoie une requte sans paramtres la base de donnes pour prcompilation et spcifiera le moment voulu la valeur des paramtres
plus rapide qu un Statement classique

le SGBD analyse quune seule fois la requte (recherche d une stratgie d excution adquate) pour de nombreuses excutions d une mme requte SQL avec des paramtres variables

tous les SGBD nacceptent pas les requtes pr-

compiles

Cration d une requte prcompile


La mthode prepareStatement() de l objet Connection cre un PreparedStatement :
PreparedStatement ps = c.prepareStatement("SELECT * FROM ? " + "WHERE id = ? ");

les arguments dynamiques sont spcifis par un "?" ils sont ensuite positionns par les mthodes setInt() ,

setString() , setDate() , de PreparedStatement

positionne le paramtre NULL (SQL) ces mthodes ncessitent 2 arguments :


setNull()

le premier (int) indique le numro relatif de l argument dans la requte le second indique la valeur positionner

Excution dune requte prcompile


PreparedStatement ps = c.prepareStatement( "UPDATE emp SET sal = ? WHERE name = ?"); int count; for(int i = 0; i < 10; i++) { ps.setFloat(1, salary[i]); ps.setString(2, name[i]); count = ps.executeUpdate(); }

Validation de transaction : Commit


Utiliser pour valider tout un groupe de transactions la fois Par dfaut : mode auto-commit

un "commit " est effectu automatiquement aprs chaque ordre SQL

Pour repasser en mode manuel :


connection.setAutoCommit(false);

L application doit alors envoyer la base un "commit" pour rendre

permanent tous les changements occasionns par la transaction :

connection.commit();

Annulation de transaction : Rollback


De

mme, pour annuler une transaction (ensemble de requtes SQL), l application peut envoyer la base un "rollback" par :

connection.rollback();
restauration de ltat de la base aprs le dernier

"commit"

Exceptions
SQLException

est leve ds qu une connexion ou un ordre SQL ne se passe pas correctement


la mthode getMessage() donne le message en clair

de l erreur
renvoie aussi des informations spcifiques au

gestionnaire de la base comme :


SQLState code d erreur fabricant

SQLWarning

: avertissements SQL

La gestion des exceptions

Pourquoi traiter les exceptions

Parce qu'en Java, contrairement au C et au C++, les exceptions et leur traitement font partie intgrante du langage et sont utilises systmatiquement pour signaler toute erreur survenue pendant l'excution d'une mthode (dbordement d'indice d'un tableau, erreur d'accs un fichier, division par 0...). De nombreuses mthodes sont susceptibles de dclencher (throw) des exceptions et donc il est impratif de savoir comment les traiter ou passer outre.

La gestion d'erreur par exceptions permet d'crire de manire plus claire (donc plus maintenable) un programme, en isolant le traitement d'erreur de la suite d'instructions qui est excute si aucune erreur ne survient. Voici la syntaxe type d'une classe grant des exceptions: try{ // Instructions susceptibles de provoquer des erreurs; } catch (Exception ex) { // Instructions de traitement de l'erreur; } Instructions suivantes

Lorsque le programme rencontre une erreur dans un bloc try{}, une exception est instancie puis lance. L'interprteur cherche un bloc catch(){} partir de l'endroit o l'exception a t cre en cherchant vers le bas. S'il ne trouve aucun bloc catch{}, l'exception est lance dans le bloc de niveau suprieur, ainsi de suite jusqu'au bloc de la classe qui par dfaut enverra l'exception au handler de l'interprteur. Celui-ci mettra alors un message d'alerte standard pour le type d'exception. Si jamais un bloc catch{} est trouv, celui-ci grera l'exception sa faon (ou plutt la votre) et l'exception ne sera pas envoye au handler de l'interprteur. Si par contre on dsire que l'exception soit trait par les blocs de niveaux suprieurs, il suffit d'inclure la fin de la srie d'instructions contenues dans le bloc catch{} une clause throw, suivie du type de l'exception entre parenthse puis du nom de l'exception (son handle pour utiliser un terme exact). Ainsi l'exception continuera son chemin...

Comment les exceptions sontelles traites?

Le bloc finally
try{ } catch(Exception ex){ } finally{ } Le bloc finally optionnel permet de spcifier les traitements entreprendre quelque soit lissue de lxcution du bloc try.

Rsum

try{

// Instructions...

} catch (type_exception1 nom) { // Instructions de traitement d'exception } catch (type_exceptionN nom) { // Instructions de traitement d'exception } finally{ // Instructions de fin... }

exception pourrait se produire. L'instruction catch doit tre associe try et contient un bloc d'instructions susceptible de grer un type d'exception particulier.

L'instruction try contient un bloc d'instructions l'intrieur duquel une

Il est possible d'utiliser plusieurs instructions catch afin de capturer des exceptions de types diffrents.

L'instruction finally facultative, doit tre associe try et place aprs catch. Elle contient un bloc d'instructions qui est excut dans tous les cas de figure.