Académique Documents
Professionnel Documents
Culture Documents
Support de Cours Java2 PDF
Support de Cours Java2 PDF
Date : 4/6/02
Matrisedelaprogrammationenlangage
J ava
2
Intutil Cours : Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Protections Juridiques
Protections Juridiques
AVERTISSEMENT
Ce produit ou document est protg par un copyright et distribu avec des licences qui en restreignent lutilisation, la
copie, la distribution, et la dcompilation. Aucune partie de ce produit ou de sa documentation associe ne peut tre
reproduite sous aucune forme, par quelque moyen que ce soit, sans lautorisation pralab
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction
Objectifs
Ce cours a pour objectif de permettre des programmeurs Java
dapprofondir et dlargir leur pratique des aspects fondamentaux du
langage.
Les aspects conceptuels et techniques y sont abords en parallle.
Lobjectif est damener les professionnels vers une pratique mature de la
programmation Java.
Sortent du primtre de ce cours :
-Ltude dtaille de librairies trs spcialises comme sound,
CORBA etc..
- Les approches Java sortant du primtre Standard Edition
comme Java Entreprise Edition, Java Micro-Edition, etc.
- Les librairies dextension
Ces points sont abords dans dautres cours spcialiss
/4
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction
Prrequis
Pour pouvoir tirer un maximum de bnces de ce cours il est vivement
conseill:
Davoir une bonne pratique des aspects fondamentaux de Java
1
:
classes et interfaces, membres, constructeurs
hritage, polymorphisme
exceptions
Davoir de bonnes connaissances thoriques sur la programmation
en gnral et la programmation objet en particulier.
Davoir des notions sur les technologies du Web internet (usage
dun navigateur, adresses URL, langage HTML)
De connatre un minimum danglais (il faut pouvoir lire la
documentation)
1. Ces notions sont dveloppes dans notre cours SL-265
(Programmation en langage Java) et les cours drivs SL-110
(Langage Java pour programmeurs dbutants) et SL-010
(fondamentaux java pour programmeurs objet)
/5
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction
Phases
Le cours est dcompos en plusieurs parties :
1. Un bloc de chapitres revient sur les aspects fondamentaux de Java
Les interfaces graphiques Swing servent de support ces rappels
qui sont complts par un cours sur les processus lgers (threads).
2. Un bloc de chapitres introduit les relations avec lenvironnement
local dexcution: archives, ressources, internationalisation,
prfrences, rapports et journalisation.
3. Un bloc de chapitres traite des systmes dentres/sorties et
dchanges: diffrents systmes dE/S , programmation rseau,
rfrences distantes (RMI), accs aux bases relationelle(JDBC).
Chaque chapitre dispose dannexes qui ne font pas proprement parler
partie du cours, mais qui permettent de signaler des informations
complmentaires. Le support dispose galement dannexes globales qui
abordent des dispositifs avancs de programmation comme la
programmation dynamique, les rfrences faibles ou les codes natifs.
/6
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Table des Matires
Introduction............................................................................................................... 3
Introduction technique, composants Swing.......................................................... 15
Le code portable Java........................................................................................................... 16
Portabilit: exemple des applications graphiques................................................................ 18
Un premier programme Swing............................................................................................. 20
Disposer des composants dans un Container ....................................................................... 24
FlowLayout : synthse ......................................................................................................... 27
Gestionnaires de disposition :BorderLayout........................................................................ 28
BorderLayout : exemple dvelopp..................................................................................... 30
Quelques autres gestionnaires de disposition ...................................................................... 34
Introduction technique (suite), vnements .......................................................... 45
Les vnements.................................................................................................................... 46
Modle dvnements ......................................................................................................... 47
Les interfaces ....................................................................................................................... 49
Exemple de mise en place de traitement dvnement ........................................................ 50
Catgories dvnements ..................................................................................................... 52
Considrations architecturales: classes interdpendantes.................................................... 54
Processus lgers (threads)....................................................................................... 61
Multi-tches (rappel)............................................................................................................ 62
Processus lgers: principes .................................................................................................. 63
Conception dun Thread ...................................................................................................... 64
/8
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Cycle de vie : dbut et fin de vie.......................................................................................... 65
Cycle de vie: retrait de ltat actif........................................................................................ 67
Cycle de vie: attente de la terminaison dune tche............................................................. 68
Autres techniques de cration.............................................................................................. 69
Etats dun Thread (rsum).................................................................................................. 71
Accs concurrents.................................................................................................... 77
Accs concurrents: problmatique....................................................................................... 78
Blocs synchronized.............................................................................................................. 80
Autres points sur lutilisation du moniteur .......................................................................... 82
Producteur/consommateur: problmatique .......................................................................... 86
Producteur/consommateur: mise en oeuvre......................................................................... 87
Etats dun Thread (rsum).................................................................................................. 91
Archives, ressources, scurit................................................................................. 97
Les ClassLoaders ................................................................................................................. 98
Archives jar.......................................................................................................................... 99
Archives jar: lancement dune application ........................................................................ 101
Ressources.......................................................................................................................... 103
Ressources applicatives ..................................................................................................... 104
Scurit .............................................................................................................................. 106
Scurit: politique configure............................................................................................ 107
Internationalisation............................................................................................... 117
Pourquoi internationaliser une application?................................................................... 118
Contextes culturels : Locale............................................................................................... 119
Contexte culturel: obtention, mise en place....................................................................... 120
Paramtrage de ressources: Resourcebundle ..................................................................... 121
ListResourceBundle........................................................................................................... 122
PropertyResourceBundle ................................................................................................... 123
Classes de mise en forme/analyse...................................................................................... 125
Prfrences ............................................................................................................. 131
Preferences: principes ........................................................................................................ 132
Preferences: contextes de nommage .................................................................................. 133
/9
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Obtention dun contexte..................................................................................................... 134
Consultation dans un contexte ........................................................................................... 135
Enregistrement dune valeur .............................................................................................. 136
Harmonisation avec le systme de persistence .................................................................. 137
Rapports, journalisations, assertions .................................................................. 141
LA.P.I. de log................................................................................................................ 142
Contraintes architecturales des oprations de log .......................................................... 143
Qui dtermine un comportement effectif de Logger?........................................................ 145
Rglages dun Logger .................................................................................................... 146
Cheminement des rapports................................................................................................. 147
Mise en place des Loggers................................................................................................. 148
Mise en place explicite dun Handler ................................................................................ 150
Un code de Handler ........................................................................................................... 151
Un code de Formatter......................................................................................................... 152
Assertions........................................................................................................................... 154
Pourquoi utiliser des assertions.......................................................................................... 155
Assertions: syntaxe, activations......................................................................................... 157
Application dun pattern: les flots dE/S......................................................... 163
Modles structurels (design patterns) ................................................................................ 164
Un exemple dutilisation de pattern ............................................................................... 166
Application du modle structurel aux E/S flot en Java: ................................................. 170
Flots doctets (InputStream, OutputStream) ...................................................................... 172
Flots de caractres (Reader, Writer) .................................................................................. 173
Typologie par ressources................................................................................................ 174
Conversions octets-caractres............................................................................................ 175
Filtres ................................................................................................................................. 176
Filtres courants................................................................................................................... 177
Programmation rseau ......................................................................................... 181
Modles de connexions rseau en Java.............................................................................. 182
Sockets ............................................................................................................................... 183
Sockets TCP/IP. ................................................................................................................. 184
Serveur TCP/IP (exemple simple) ..................................................................................... 185
Client TCP/IP (exemple simple)........................................................................................ 186
Serveur TCP/IP (exemple avec threads) ............................................................................ 187
/10
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Echanges U.D.P. ................................................................................................................ 189
Serveur U.D.P. (exemple).................................................................................................. 190
Client U.D.P. (exemple)..................................................................................................... 191
UDP en diffusion (Multicast)........................................................................................... 192
Diffuseur Multicast (exemple)........................................................................................... 193
Ecouteur Multicast (exemple)............................................................................................ 194
Dispositifs avancs dE/S ...................................................................................... 197
E/S dobjets........................................................................................................................ 198
Les objets dans un flot ....................................................................................................... 199
Objet adapt la linarisation (exemple)........................................................................... 200
Effets de la linarisation..................................................................................................... 201
Personnalisation de la linarisation.................................................................................... 202
Le package java.nio ........................................................................................................... 204
Mise en oeuvre de Buffers ................................................................................................. 205
Un exemple de mise en oeuvre de Buffers ........................................................................ 206
Ventilation des lectures/critures dans des Buffers ........................................................... 208
E/S asynchrones , slecteurs .............................................................................................. 210
Les rfrences distantes (R.M.I.).......................................................................... 215
La notion de service distant ............................................................................................... 216
Principe de la communication entre objets distants........................................................... 218
Exportation dun objet ....................................................................................................... 219
Les instances de Stub......................................................................................................... 221
Annuaire dobjets distants.................................................................................................. 222
Le serveur: enregistrement auprs du Registry.................................................................. 223
Le client: demande au Registry.......................................................................................... 224
Check-list pour une mise en oeuvre simple ....................................................................... 225
Laccs aux bases relationnelles (J.D.B.C).......................................................... 235
Le package java.sql ............................................................................................................ 236
Types de drivers JDBC...................................................................................................... 237
Modalits dune session JDBC.......................................................................................... 238
Enregistrement des pilotes ................................................................................................. 239
Dsignation de la ressource ............................................................................................... 240
Obtention de la connexion ................................................................................................. 241
Obtention dun contexte de requtes.................................................................................. 242
/11
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Exploitation de resultats..................................................................................................... 243
Correspondance des types de donnes SQL en Java ......................................................... 244
Requte prpare................................................................................................................ 245
Procdure stocke .............................................................................................................. 246
Batch .................................................................................................................................. 247
ANNEXES.............................................................................................................. 249
Programmation dynamique ................................................................................. 251
Pourquoi une programmation sur des classes dcouvertes au runtime?............................ 252
La classe java.lang.Class.................................................................................................... 253
Obtention des informations sur la classe ........................................................................... 254
Le package java.lang.reflect .............................................................................................. 255
Les champs......................................................................................................................... 256
Les mthodes ..................................................................................................................... 257
Les constructeurs ............................................................................................................... 258
Les tableaux ....................................................................................................................... 259
Mandataires dynamiques ................................................................................................... 261
Notion de Bean............................................................................................................... 264
Les packages java.beans et java.beans.beancontext .......................................................... 265
XMLEncoder, XMLDecoder............................................................................................. 266
Rfrences faibles .................................................................................................. 269
Problmatiques de caches mmoire................................................................................... 270
Les objets rfrences.......................................................................................................... 271
SoftReference..................................................................................................................... 272
WeakReference.................................................................................................................. 274
Oprations lies labandon dun objet, finaliseurs, PhantomReferences........................ 276
Utilisation de code natif : J.N.I............................................................................. 281
Pourquoi raliser du code natif? ........................................................................................ 282
Un exemple : "Hello World" en C..................................................................................... 283
Prsentation de JNI ............................................................................................................ 290
JNI: types, accs aux membres, cration dobjets ............................................................. 291
Rfrences sur des objets JAVA:....................................................................................... 294
Exceptions.......................................................................................................................... 295
/12
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Invocation de JAVA dans du C ......................................................................................... 296
Java et le Web: les applets .................................................................................... 297
Applets ............................................................................................................................... 298
Applets: restrictions de scurit......................................................................................... 300
Hirarchie de la classe Applet............................................................................................ 302
Applets: groupes de mthodes ........................................................................................... 303
H.T.M.L.: la balise Applet ................................................................................................. 304
Mthodes du systme graphique de bas niveau................................................................. 306
Mthodes daccs aux ressources de lenvironnement ...................................................... 307
Mthodes du cycle de vie................................................................................................... 309
Rappels: syntaxe, spcifications simplifies ....................................................... 311
Plan gnral dune classe................................................................................................... 312
Plan gnral dune interface............................................................................................... 313
Rappels syntaxiques (simplifis) ....................................................................................... 314
Variables ............................................................................................................................ 322
Mthodes............................................................................................................................ 329
Constructeurs ..................................................................................................................... 333
Blocs .................................................................................................................................. 335
Types primitifs scalaires, types objets ............................................................................... 339
Packages, rgles de responsabilit ..................................................................................... 340
Aide-mmoire........................................................................................................ 341
Le SDK.............................................................................................................................. 342
Les outils............................................................................................................................ 343
javadoc et HTML............................................................................................................... 344
Glossaire ............................................................................................................................ 347
Adresses utiles ................................................................................................................... 369
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Premire partie: aspects fondamentaux du langage
.
/14
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing 1
Points essentiels
Premire revue des bases techniques de Java.
Si ncessaire un court prologue peut tre insr ici: Voir Java et le Web: les
applets, page 297.
Une prsentation des composants graphiques Swing sert de trame:
composants portables, philosophie dune disposition de composants
indpendante de la plate-forme.
1
1/16
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Le code portable Java
La lire de production du code Java :
On a donc ici deux phases :
Compilation du code source : javac Hello.java
Excution du pseudo-code gnr: java Hello (appel de
lexcuteur avec en paramtre le nom de classe qui sert de point
dentre) - on notera quil existe dautres manires dappeler
lexcuteur de code Java comme par exemple un excuteur
enchass dans le code dun navigateur. Dans ce cas on
tlcharge un code distant qui est dynamiquement pris en compte
par lexcuteur, le code doit rpondre un certain nombre de
contraintes (dans ce cas celles dcrites par la classe
java.applet.Applet).
chier source
chier binaire
compilation: javac excution
Hello.java Hello.class
1/17
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Les machines virtuelles
Le pseudo-code Java (bytecode) obit des spcications prcises.
Portable, il est excut sur la plate-forme locale par un excuteur propre
cette plate-forme
Lexcuteur local est un code natif spcique au systme local.
La librairie systme de Java doit tre installe localement. Cette librairie
contient :
des classes compltement crites en Java
des classes contenant du code natif. Ces codes natifs permettent
en particulier de dlguer des services au systme dexploitation
local (ouverture de chiers, etc.) ou au systme de fentrage local
(cration dune fentre, etc.)
OS
systme de
JVM
(interprteur
spcique)
librairies
java
fentrage
OS
systme de
JVM
(interprteur
spcique)
librairies
java
fentrage
chier binaire (pseudo-code)
conforme aux spcications JVM
plate-forme de type A plate-forme de type B
1
1/18
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Portabilit: exemple des applications graphiques
AWT
Le package java.awt dnit un ensemble de composants graphiques
standard que lon retrouve sur toutes les plateformes. Ces composant
dinteractions graphiques sont essentiellement raliss avec des
composants natifs du systme de fentrage local. Le mme code Java
connaitra sur des sytmes diffrents une ralisation sensiblement
diffrente (tout en conservant la mme logique):
Ici on a dispos deux boutons (classe java.awt.Button) lintrieur
dune fentre (classe java.awt.Frame).
AWT ne se contente pas de dnir un vocabulaire graphique, il dnit
galement une philosophie dassemblage de ses composants. Dans la
mesure o un code Java portable ne connait pas a priori la plateforme
cible, il est malvenu de raliser un positionnement absolu des composants
(Component) lintrieur des Containers (composants qui en
contiennent dautre).
La disposition des composants sappuie sur le principe des gestionnaires
de disposition (LayoutManager): un objet associ chaque container
calcule la position des composants en fonction de contraintes logiques
(nous allons en voir des exemples ultrieurement).
Motif Windows
(0,0)
x
y
Container (Frame)
Composant (TextField)
Bien que possible le positionnement en coordonnes absolues nest pas portable
1/19
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Swing
Le package javax.swing dnit une autre catgorie de composants. Ces
composants ne sappuient pas sur des composants natifs mais sont
dessins partir des primitives graphiques de bas niveau (accessibles
en AWT).
On a ici un vocabulaire graphique plus riche (de par sa nature AWT a un
vocabulaire limit), et de nombreuses techniques qui compltent celles
dAWT. Ainsi lutilisation de gestionnaires de disposition est reprise et
enrichie.
Pour une dmonstration des capacits de la librairie voir le sous-
rpertoire demo/jfc/SwingSet2 de linstallation de votre kit de
dveloppement java (SDK). On remarquera, entre autres, la capacit de
changer de look and feel, cest dire de passer dune charte graphique
portable (appele Metal) au look and feel de la plateforme locale (voire
celui dune autre plateforme comme un look Motif sur Windows par
exemple).
1
1/20
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Un premier programme Swing
Ici sur un systme de fentrage Motif, le rsultat de lexcution dun
programme montrant un message simple dans une fentre:
Le chier source Message.java
Un autre chier source (TestMessage.java) pour assurer le lancement
de lapplication :
public class TestMessage {
public static void main (String[] args) {//point dentre
Message messager = new Message(args[0]) ;
messager.dmarrer() ;
}
}
La compilation des 2 chiers donne les chiers de pseudo-code :
Messsage.class et TestMessage.class. Le lancement de
lapplication se fait par la commande (ici en syntaxe Shell Unix) :
java TestMessage Bien le bonjour de SWING!
import javax.swing.* ; //directive utilisation de librairie
public class Message {//dclaration classe
JFrame fentre ;
public Message (String mess) {
fentre = new JFrame("Message") ;
JLabel label = new JLabel(mess) ;
fentre.getContentPane().add(label);
}
public void dmarrer() {
fentre.pack();
fentre.show() ;
}
}// fin classe
var.membre instance
mthode dinstance
constructeur
1/21
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Un premier programme Swing: contenu
Aspects fonctionnels
Dans une fentre Swing (JFrame: container racine partir duquel on
peut oprer en Swing) on dispose une tiquette Swing (JLabel: on ne
peut pas mlanger composants AWT et composants Swing).
Comme pour tous les containers racine cette disposition (application de
la mthode add) ne sapplique pas directement sur le JFrame mais sur
son Content Pane (tapisserie de fond) -dans ce cas il y a une petite
diffrence entre Swing et AWT qui, lui, dispose directement dans le
Container Frame-.
La mthode pack() de JFrame lui permet de tenter de prendre les
dimensions strictement ncessaires pour contenir les composants (effet
plus portable que lemploi de setSize(largeur, hauteur)).
Code java
La classe Message (dans le chier Message.java!) dnit une variable
dinstance (fentre) qui est initialise dans le constructeur et utilise
dans la mthode dinstance dmarrer (mthode dinstance sans
paramtre ni resultat).
La classe TestMessage contient juste un point dentre standard dont la
description doit tre :
public static void main(String[] parms)
Le tableau de chanes de caractres pass en argument du main
correspond aux arguments de lancement du programme. La premire
chane (index 0) est rcupre pour tre passe en argument au
constructeur de Message. Cette invocation du constructeur rend une
refrence vers un objet de type Message; la mthode dmarrer est
invoque sur cette instance.
1
1/22
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Point intermdiaire :miseenplacedunprogramme
Mini-exercice :
En vous inspirant du modle prcdent raliser un code Java
Swing qui afche un message. Compiler, excuter.
Pour varier les plaisirs utiliser pour afcher un message un
autre composant que JLabel (par exemple un JButton, ou
un JTextField) -lire la documentation associe au SDK-
Pour les trs rapides ou ceux qui rvisent : changer la couleur
de fond, la couleur du texte, la fonte du texte (mthodes
setBackground, setForeground, setFont ,...)
1/23
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
1
1/24
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Disposer des composants dans un Container
Voici un exemple plus complexe qui va nous permettre dobtenir ceci:
Le code du Container dans lequel on va disposer des boutons :
import javax.swing.* ;
import javax.swing.border.* ;
import java.awt.* ;
public class Barre extends JPanel {
/** Cre un barre horizontale de composants Swing
* <P>
* Les composant sont cadrs dans le sens naturel de lecture
*/
public Barre(JComponent[] tbComp) {
super(new FlowLayout(FlowLayout.LEADING)) ;
for(int ix = 0 ; ix < tbComp.length; ix++) {
this.add(tbComp[ix]) ;
}
}
/** Un cadre et un titre sont diposs autour des composants
*/
public Barre(String leTitre, JComponent[] tbComp) {
this(tbComp) ;
Border bordure = BorderFactory.createEtchedBorder() ;
Border titre = BorderFactory.createTitledBorder(
bordure, leTitre,TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.TOP) ;
this.setBorder(titre) ;
}
}
1/25
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Disposition : le code
Aspects fonctionnels
La classe Barre dcrit un Panneau (JPanel) dans lequel les composants
sont disposs les uns la suite des autres.
Une telle disposition est assure par un gestionnaire de disposition appel
FlowLayout. Pour doter un container dun gestionaire de disposition
particulier, il faut faire appel sa mthode
setLayout(gestionnaire). La classe JPanel dispose galement dun
constructeur qui permet de passer le gestionnaire de disposition en
paramtre.
Dans le cadre dun FlowLayout on doit ajouter les composants au
container en employant la mthode add(composant) -lordre des ajouts
est important puisquil dtermine lordre de disposition des composants-
Il est possible de construire deux types de Barres: celles qui alignent
simplement des composants et celles qui entourent cet alignement avec
une bordure comprenant un titre (cas illustr dans limage). Cette
possibilit de placer une bordure autour dun composant est
caractristique de Swing (et nexiste pas en AWT classique).
Code java
Barre hrite de JPanel (dclaration extends). On dcrit deux
constructeurs dont lun se dnit par rapport lautre:
Le premier constructeur fait appel au constructeur de JPanel en
lui passant une instance de FlowLayout (argument dterminant
un cadrage gauche: constante de la classe FlowLayout).
On parcourt ensuite le tableau de composants pass en argument
et on les ajoute linstance courante (qui est un Container).
Le second contructeur fait dabord appel au premier, puis
construit une bordure compose.
Ces bordures sont fabriques par des mthodes de classe de la
classe BorderFactory (mthodes fabriques).
1
1/26
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Disposer des composants dans un Container (suite)
Le code utilisant Barre pour crer limage en exemple:
import javax.swing.* ;
public class TestBarre {
public static void main (String[] args) {
JComponent[] tb = {
new JButton("OUI"),
new JButton("NON"),
new JButton("Sans Opinion"),
} ;
Barre barre = new Barre(" Votre avis? ", tb) ;
JFrame fen = new JFrame("Sondage") ;
fen.getContentPane().add(barre) ;
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
fen.pack();
fen.show() ;
}
}
Aspects fonctionnels
Un tableau contenant 3 boutons est pass au constructeur de Barre et
cette Barre est mise directement dans le ContentPane de la fentre.
On notera que pour que lapplication sarrte quand on ferme la fentre,
on xe lopration dclencher (fonctionnalit spcique au JFrame: dans
le AWT classique il faudra suivre une procdure dcrite au chapitre
suivant).
Code java
Noter la cration dun tableau littral de JComponent (qui dailleurs ne
contient que des JButtons).
1/27
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
FlowLayout : synthse
Le gestionnaire de disposition FlowLayout positionne les composants les
uns la suite des autres. Au besoin il cre une nouvelle ligne pour
positionner les composants qui ne tiennent pas dans la ligne courante.
A la diffrence de beaucoup dautres gestionnaires de disposition, une
instance de FlowLayout ne modie pas la taille des composants (tous les
composants comportent une mthode getPreferredSize() qui est
appele par les gestionnaires de disposition pour demander quelle taille le
composant voudrait avoir).
FlowLayout est le gestionnaire par dfaut associ aux containers
de type Panel (AWT) et JPanel (Swing)
1
.
Il existe plusieurs manires de construire un FLowLayout ce qui
permet de faire varier lalignement ( gauche, droite, centr,..) ou
de faire varier la taille des gouttires sparant les composants.
Les composants sont ajouts au Container en employant la
mthode add(Component) , bien entendu lordre des add est
important puisquil dtermine lordre des composants dans la
disposition.
1. note: un autre gestionnaire par dfaut est associ au
ContentPane le add na pas ici le mme effet -voir suite de
lexpos-
redimensionnement
de la fentre
(exemple en AWT)
1
1/28
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Gestionnaires de disposition :BorderLayout
BorderLayout divise son espace de travail en cinq zone nommes et les
composants sont ajouts explicitement une zone donne. On ne peut
placer quun composant par zone, mais toutes les zones ne sont pas
ncessairement occupes.
BorderLayout est le gestionnaire par dfaut des Containers de
type Window (AWT) et ContentPane des JFrame (Swing).
Les add sont qualis: il faut prciser dans quelle zone on met le
composant (par dfaut un add simple met le composant dans la
zone centrale).
En cas dlargissement du container le gestionnaire respecte les
hauteurs prfres des composants en NORTH et SOUTH, et les
largeurs prfres des composants en EAST et WEST. La zone
centrale tend occuper toute la place restante dans les deux
directions.
redimensionnement
de la fentre
(exemple AWT)
1/29
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
BorderLayout: exemple de code (simpli )
...;
import javax.swing.* ;
import javax.swing.text.* ;
import java.awt.* ;
public class PresentationMessage extends JPanel {
... ;
protected JButton rep= new JButton("Rpondre") ;
protected JButton prec= new JButton("Prcdent") ;
protected JButton suiv= new JButton("Suivant") ;
public PresentationMessage() {
... ;
setLayout(new BorderLayout(5,5)) ;// gouttires de 5
// ---------- en-tte
String descr = ... ;
JLabel label = new JLabel(descr) ;
this.add(label, BorderLayout.NORTH) ;
// ---------- TEXTE
String message = ... ;
JTextArea jt = new JTextArea(message, 3, 50) ;
this.add(new JScrollPane(jt), BorderLayout.CENTER) ;
// ---------- boutons
JButton[] tbBout = {rep, prec, suiv};
Barre boutons = new Barre(tbBout) ;
this.add(boutons, BorderLayout.SOUTH) ;
}
....
}
On notera que le add prend ici une forme particulire (add quali).Par
ailleurs la combinaison JTextArea (texte multiligne), JScrollPane
est spcique Swing.
1
1/30
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
BorderLayout : exemple dvelopp
Voici laspect graphique de la prsentation recherche :
Cette prsentation graphique sert aux interactions sur un objet Message
dont voici la dnition:
package chat;// la class appartient au package chat
public class Message {// vrai nom : chat.Message
public static final int ORIGINAL = -1 ;
public final int numero ;
public final int repondA ;
public final String auteur ;
public final String message ;
public Message(String auteur,int num,int rep,String message){
this.auteur=auteur; numero = num;
repondA = rep; this.message = message;
}
public Message(String auteur,int num,String message) {
this(auteur, num, ORIGINAL, message) ;
}
}
Cette classe dnit en quelque sorte une structure de donnes simple
dont tous les champs sont immuables une fois linstance construite. Du
coup il ny a pas encapsulation des variables dinstance et celles-ci sont
publiques. (On notera galement la dnition de la constante de classe
ORIGINAL).
Toute classe Java qui sort du domaine de la petite dmonstration doit tre
dnie dans le cadre dun package(Voir Packages, rgles de responsabilit,
page 340..)
1/31
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Exemple dvelopp de linterface graphique:
package chat;
import javax.swing.* ;
import javax.swing.text.* ;
import java.awt.* ;
public class PresentationMessage extends JPanel {
private Message msg ;
protected JButton rep= new JButton("Rpondre") ;
protected JButton prec= new JButton("Prcdent") ;
protected JButton suiv= new JButton("Suivant") ;
public PresentationMessage(Message mess) {
msg = mess ;
setLayout(new BorderLayout(5,5)) ;// gouttires de 5
// ---------- en-tte
String descr = "De: " +msg.auteur +" ["+ msg.numero+ "] ";
if( msg.repondA != Message.ORIGINAL) {
descr += " rpond A: [" + msg.repondA +"]" ;
}
JLabel label = new JLabel(descr) ;
label.setFont(new Font("Monospaced",Font.BOLD,15)) ;
label.setForeground( Color.RED ) ;
this.add(label, BorderLayout.NORTH) ;
// ---------- TEXTE
JTextArea jt = new JTextArea(msg.message, 3, 50) ;
jt.setEditable(false) ;
this.add(new JScrollPane(jt), BorderLayout.CENTER) ;
// ---------- boutons
JButton[] tbBout = {rep, prec, suiv};
Barre boutons = new Barre(tbBout) ;
this.add(boutons, BorderLayout.SOUTH) ;
}
public Message getMessage() {// accesseur dun membre priv
return msg ;
}
}
1
1/32
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Point intermdiaire :coder avecdes
LayoutManagers
Mini-exercice :
Raliser un code Java Swing qui soit lquivalent de cette
prsentation AWT:
Faites un code simple, mais les classes utilises doivent appartenir
un package. Si vous ne savez pas organiser un dveloppement
en package: Voir Dveloppement avec des packages, page 43..
Pour les trs rapides ou ceux qui rvisent : faites des expriences
avec des composants Swing (JLabel, JButton) en leur passant du
html comme texte.
Ci-aprs un exemple analogue au code prcdent mais qui utilise
un JEditorPane("text/html", texte) en remplacement
dun TextArea.
1/33
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
1
1/34
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Quelques autres gestionnaires de disposition
GridLayout
Dispose un tableau dans lequel tous les composants ont la mme
hauteur et la mme largeur:
Utilise essentiellement des add(composant) -lordre des appels tant
important pour dterminer lordre de composants-
redimensionnement
de la fentre
disposition avec des lments manquants
1/35
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
BoxLayout
Cest un gestionnaire spcique Swing. A utiliser ventuellement avec la
classe Box pour permettre des alignements de composants dans une
direction avec des insertions despaces et de glue qui maintient des
lments ensembles.
1
1/36
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
GridBagLayout
Cest le plus complexe des gestionnaires standard. Les composants sont
disposs dans un tableau dans lequel chaque ligne et chaque colonne a
une dimension dicte par le plus grand composant qui loccupe
(dnissant ainsi un tartan irrgulier de cellules) :
1/37
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
On dispose par add(composant, contraintes) dans lequel
contraintes est une instance de GridBagConstraints (rutilisable), les
champs de cette instance comprennent:
gridx, gridy : donne les coordonnes x, y de lobjet dans la grille
(celle-ci dduit automatiquement son propre nombre de lignes et
de colonnes)
gridwidth, gridheight : nombre de cellules occupes par le
composant
ll : direction du remplissage (le composant tend alors occuper
toute sa cellule dans la direction donne). Valeurs: NONE, BOTH,
VERTICAL, HORIZONTAL
anchor: lorsquun composant est plus petit que sa cellule, bord
dancrage du composant (un point cardinal: EAST, NORTHEAST,
etc.)
insets: dtermination des "gouttires" (distance minimum entre le
composant et les frontires de sa cellule)
weightx,weighty : "poids" relatif de la cellule lorsque le container
dispose de plus de place que ncessaire pour les cellules et que
lon souhaite largir la disposition (valeur de type double
comprise entre 0 et 1)
Exemple de code :
GridBagConstraints gbc = new GridBagConstraints() ;
gbc.gridx = 0 ; gbc.gridy = 0 ;
add(new JButton ("<html><li>gridx=0;gridy=0"), gbc);// couteux!
gbc.gridx = 1 ; gbc.gridy = 1 ;
add(new JButton ("<html><li>gridx=1;gridy=1"), gbc) ;
1
1/38
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Exercice: pratiquedesLayoutManagers
Exercice :
Raliser en Swing un formulaire comprenant un champ de saisie,
un bouton et une plage de texte (pour afcher la rponse la
question)
1/39
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
1
1/40
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Complments
Les complments techniques suivants constituent une annexe de rfrence
Swing
La programmation Swing est un vaste sujet (voir notre cours SL-320).
Quelques remarques gnrales complmentaires sur les composants
Swing:
bordures :
En utilisant la mthode setBorder() on peut spcier une
bordure autour du composant courant. Cette Bordure peut tre un
espace vide (lusage de EmptyBorder remplace lutilisation de
setInsets()) ou un dessin de bordure (implantant linterface
Border et rendu par la classe BorderFactory).
double buffering :
les techniques de double-buffering permettent dviter les effets
visuels de clignotement lors de rafraichissements frquents de
limage du composant. On na plus crire soi-mme le double-
buffering, Swing gre par dfaut les contextes graphiques
ncessaires.
bulles daide (Tool tips):
en utilisant la mthode setToolTipText() et en lui passant une
chane de caractres explicative on peut fournir lutilisateur une
petite bulle daide. Lorsque le curseur fait une pause sur le
composant la chane explicative est afche dans une petite fentre
indpendante qui apparat proximit du composant cible.
utilisation du clavier :
en utilisant la mthode registerKeyBoardAction() on peut
permettre lutilisateur dutiliser uniquement le clavier pour
naviguer dans linterface utilisateur et pour dclencher des
actions. La combinaison caractre + touche de modication est
reprsente par lobjet KeyStroke.
pluggable look and feel :
au niveau global de lapplication un UIManager gre la charte
graphique (look and feel). La modication de laspect par
1/41
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
setLookAndFeel() est soumise des contrles de scurit.
Derrire chaque JComponent il y a un ComponentUI qui gre le
dessin, les vnements, la taille, etc.
utilisation de modles:
Swing comporte une trs grande varit de composants dont
certains sont trs complexes (voir JTree, JTable, etc.). Il est
pratique dutiliser des modles de programmation, cest dire
des structures de donnes qui grent en parallle des donnes et
leur reprsentation graphique (les modications de lune sont
rpercutes dans lautre).
1
1/42
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Java: bases fondamentales
Pour amliorer vos connaissances sur les bases fondamentales de Java,
vous devez, ce stade, approfondir les points suivants :
Architecture des dclarations de classes -Voir Plan gnral dune
classe, page 312.-, packages, rgles de visibilit (modicateurs
public, private, protected) -Voir Packages, rgles de
responsabilit, page 340.-.
Utilisation des types: types primitifs (int, boolean, double,
etc.), types objets (rfrences vers des instances) et cas
particulier des objets qui sont des tableaux. -Voir Types primitifs
scalaires, types objets, page 339.
Dclaration des variables --Voir Dclarations de variable membre :,
page 314.; Voir Variables, page 322.-
Dclaration des mthodes (arguments, rsultats) -Voir Dclarations
de mthode membre, page 315.; Voir Mthodes, page 329.-, rgles de
rednition dans les sous-classes. Polymorphisme des rfrences.
Dclaration des constructeurs - Voir Dclarations de constructeur,
page 317.; Voir Constructeurs, page 333. -, appel des constructeurs,
rgles de dnition des constructeurs dans les sous-classes.
Membres de classe : variables partages -Voir variables de classe,
page 325.-, constantes, mthodes de classe -Voir Mthodes de classe,
page 332.-.
Structures du code -Voir Syntaxe simplifie des blocs de code,
page 318.; Voir Blocs, page 335.-, structures de contrle -Voir
Syntaxe simplifie des blocs de code, page 318.; Voir structures de
contrle:, page 319.
1/43
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
1
Introduction technique, composants Swing
Dveloppement avec des packages
Exemple dorganisation pratique des rpertoires:
src
fr
gibis
utils p1 p2
Classe1.java C2.java
classes
fr
gibis
utils p1 p2
Classe1.class C2.class
javac -classpath classes -d classes -sourcepath src Classe1.java
variables
peut contenir une liste de chemins daccs
(spars par : -ou ; sous Win*-)
1
1/44
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique, composants Swing
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements 2
Points essentiels
La gestion des vnements dans une IHM va nous permettre de revenir
sur des dispositifs de programmation objet spciques Java: interfaces,
classes membres et classes locales.
Les mcanismes fondamentaux des vnements graphiques relvent de
AWT, mais sont repris et largis dans Swing.
2
2/46
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Les vnements
Lorsque lutilisateur effectue une action au niveau de linterface
utilisateur, un vnement est mis. Les vnements sont des objets qui
dcrivent ce qui sest produit. Il existe diffrents types de classes
dvnements pour dcrire des catgories diffrentes dactions utilisateur.
Sources dvnements
Un vnement (au niveau de linterface utilisateur) est le rsultat dune
action utilisateur sur un composant graphique source. A titre dexemple,
un clic de la souris sur un composant bouton gnre un ActionEvent.
LActionEvent est un objet contenant des informations sur le statut de
lvnement par exemple:
getActionCommand() : renvoie le nom de commande associ
laction.
getModifiers() : renvoie la combinaison des modicateurs,
cest dire la combinaison des touches que lon a maintenues
presses pendant le click (touche Shift par exemple).
getSource() : rend lobjet qui a gnr lvnement.
Gestionnaire dvnements
Un gestionnaire (handler) dvnement est une mthode qui reoit un
objet Event, lanalyse et traite les consquences de linteraction
utilisateur.
Pour certains types dvnements il peut y avoir plusieurs types de
gestionnaires qui seront respectivement appels en fonction de laction
qui sest produite au niveau du composant source. Ainsi pour un
vnement souris on pourra distinguer un gestionnaire correspondant
laction du clic ou un gestionnaire correspondant au fait que le curseur
soit pass sur le composant concern.
2/47
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Modle dvnements
Modle par dlgation
Le JDK 1.1 a introduit dans Java un modle dvnement appel modle
dvnement par dlgation. Dans un modle dvnement par
dlgation, les vnements sont (indirectement) gnrs par un
composant graphique (quali de source de lvnement); on doit
associer ce composant un objet de traitement dvnement (appel
veilleur: Listener) pour recevoir lvnement et le traiter. De cette faon,
le traitement dvnement peut gurer dans une classe distincte du
composant impliqu.
Un veilleur est susceptible de traiter plusieurs actions lies un type
dvnement et donc de disposer de plusieurs gestionnaires : par exemple
un gestionnaire charg de veiller sur les clics souris et un charg de
veiller sur le passage de la souris sur le composant.
Applet
Panel
Bouton
action
....
}
handler daction
actionPerformed(ActionEvent e) {
instance de veilleur
gnration ActionEvent
2
2/48
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Modle dvnements
Le type du veilleur
Les composants susceptibles de gnrer des vnements sont dots de
mthodes denregistrement des veilleurs spcialiss. On peut avoir
plusieurs mthodes denregistrement par exemple pour un bouton
JButton:
addActionListener(...) ; addMouseListener(...) ;...
Quelle est le type de largument qui permet de dsigner la nature du
veilleur?
Si ce type tait celui dune classe particulire on serait oblig au
niveau de la ralisation de crer une sous-classe pour implanter le
code de traitement.
Bien que possible, cette solution serait plus rigide: on pourrait
avoir besoin dinsrer ces codes de traitement dans des instances
qui drivent dautres classes (et, pourquoi pas, des instances qui
sont elles mmes des drivs de composants graphiques). De plus
si on voulait crer une classe de veille qui a plusieurs
comportement (ActionListener, MouseListener) lcriture du code
deviendrait difcile (pas dhritage multiple en Java).
On souhaiterait avoir ici la fois un contrle de type strict (lobjet
pass en paramtre doit savoir traiter lvnement considr) et
une grande souplesse au niveau du type effectif de lobjet qui rend
le service.
Le type du veilleur est dni par une interface Java
2/49
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Les interfaces
Une interface est en Java une dclaration de type qui permet de dcrire
une capacit.
public interface ActionListener {
public void actionPerformed(ActionEvent evt) ;
}
-------------------// autre exemple dans un autre fichier .java
public interface FocusListener {
public void focusGained(FocusEvent evt) ;
public void focusLost(FocusEvent evt) ;
}
Une classe pourra dclarer adhrer au contrat dni par linterface. Elle
sera oblige dimplanter le code correspondant aux mthodes dclares
mais cela lui permettra dtre vue comme conforme au contrat de type
exig.
public class Veilleur extends X implements ActionListener {
... // codes divers
public void actionPerformed(ActionEvent act) {
// code spcifique
}
}
On pourra alors crire :
monBouton.addActionListener(monVeilleur) ;
puisquun Veilleur remplit les obligations dun ActionListener.
Pour un point sur les interfaces Voir Plan gnral dune interface, page 313.
et les dtails concernant les dclarations de mthodes et de constantes de
classe dans le chapitre Rappels: syntaxe, spcications simplies,
page 311
2
2/50
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Exemple de mise en place de traitement dvnement
Les vnements sont des objets qui ne sont envoys quaux veilleurs
enregistrs. A chaque type dvnement est associ une interface dcoute
correspondante.
A titre dexemple, voici une fentre simple comportant un seul bouton :
import java.awt.*;
import javax.swing.* ;
public class TestButton {
public static void main (String args[]){
JFrame fr = new JFrame ("Test");
JButton bt = new JButton("Appuyer!");
bt.addActionListener(new VeilleurBouton());
fr.getContentPane().add(bt,BorderLayout.CENTER);
fr.pack();
fr.show();
}
}
La classe VeilleurBouton dnit une instance de traitement de
lvnement .
import java.awt.event.*;
public class VeilleurBouton implements
ActionListener{
public void actionPerformed(ActionEvent evt) {
System.err.println("Ae!sur " + evt.getActionCommand());
/* faire System.err.println dans un interface graphique nest
* pas fondamentalement une bonne ide! ceci est un exemple
*/
}
}
2/51
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Exemple de mise en place de traitement dvnement
La classe JButton hrite de AbstractButton une mthode
addActionListener(ActionListener).
Linterface ActionListener dnit une seule mthode ,
actionPerformed qui recevra un ActionEvent.
Lorsquun objet de la classe JButton est cr, on peut enregistrer
un objet veilleur pour les ActionEvent par lintermdiaire de la
mthode addActionListener, on passe en paramtre un objet
dune classe qui implante (implements) linterface
ActionListener.
Lorsque lon clique sur lobjet Bouton avec la souris, un
ActionEvent est envoy chaque ActionListener enregistr et
la mthode actionPerformed (ActionEvent)est invoque.
Remarquons que lon aurait pu enregistrer plusieurs veilleurs distincts
dvnements Action auprs du bouton. On aurait pu galement
enregistrer un veilleur qui sache traiter plusieurs types dvnement (par
exemple Action + Focus); dans ce cas la dclaration de la classe aurait t :
public class VeilleurBouton implements
ActionListener, FocusListener {
public void actionPerformed(ActionEvent evt) {
....
}
public void focusGained(FocusEvent evt) {
...
}
public void focusLost(FocusEvent evt) {
...
}
}
2
2/52
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Catgories dvnements
Il existe de nombreux types dinterfaces de veille dans les packages
java.awt.event et javax.swing.event. Quelques exemples AWT:
Catgorie Interface Methodes
Action ActionListener actionPerformed(ActionEvent)
Item ItemListener itemStateChanged(ItemEvent)
Mouse MotionMouseMotionListener mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
Mouse MouseListener mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mouseClicked(MouseEvent)
Key KeyListener keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
Focus FocusListener focusGained(FocusEvent)
focusLost(FocusEvent)
Window WindowListener windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
On remarquera quil existe des vnements de bas niveau (une touche est
presse, on clique la souris) et des vnements abstraits de haut niveau
(Action = sur un bouton on a cliqu, sur un TextField on a fait un
<retour chariot>, ...)
Dans certains cas le package fournit une classe XXXAdapter qui
implante toutes les mthodes du contrat de veille mais sans
comportement associ. Cette facilit permet de dnir des classes de veille
simples par hritage de lAdapter et ainsi permet dviter dimplanter
toutes les mthodes du Listener -on ne dnit que celles dont on a
besoin-.
2/53
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Point intermdiaire :Miseenplacedunveilleur
Mini-exercice :
Reprendre lexercice de mise en place dun formulaire question-
rponse (Exercice :, page 38).
Faire en sorte que lorsque lon a valid une question dans le
champ de saisie, on afche un cho de cette question dans le
composant rponse.
Prcision: la production de la rponse doit tre dclenche quand
on appuie sur le bouton JButton ET quand on valide le
champs de saisie JTextField (en appuyant sur la touche
<ENTER>). Quel est le type dvnement qui permet de grer ces
deux actions de la mme manire?
2
2/54
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Considrations architecturales: classes interdpendantes
La mise en place dune interface utilisateur est particulirement
intressante par les problmes dorganisation qui sont poss. Il faut faire
collaborer des codes qui traitent la logique applicative avec les codes
chargs de la prsentation. De plus, il faut impliquer les codes qui grent
les vnements et permettent la mise jour des instances .
Dans le cadre de techniques dorganisation, on utilise souvent des
modles architecturaux (pattern) qui distinguent le Modle ( les donnes
qui vont tre manipules) de la Vue (la reprsentation graphique de ces
donnes) et mettent en place des automatismes de mise jour.
Sans entrer dans ces techniques nous allons nous poser un problme
dorganisation courant: imaginons un exemple trs simple dans lequel un
JFrame contient un bouton JButton et un JTextField dans lequel
nous afchons le nombre de clics sur le bouton.
Si nous crivons un code tel que :
bouton.addActionListener(new ControleurAction());
Comment linstance de contrle (de type ControleurAction) peut-elle
connatre le champ de type JTextField pour lui demander dafcher un
message?
2/55
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Considrations architecturales
Le gestionnaire dvnement dans une classe externe
Le fait que le contrleur doive connatre un composant sur lequel il doit
agir nous amne raliser une classe qui garde en mmoire une rfrence
sur ce composant cible :
public class ControleurAction implements ActionListener {
private int compteur ;
private JTextField message ;
public ControleurAction (JTextField cible) {
message = cible ;
}
public void actionPerformed(ActionEvent evt) {
message.setText("nombre de clics =" + (++compteur));
}
}
et dans le code de disposition de composants graphiques :
bouton.addActionListener(new ControleurAction(leTextField));
Quelques remarques sur cette conception:
On crit un code de classe ad hoc : il nest pratiquement pas
rutilisable en dehors de ce besoin prcis. De plus la maintenance
nest pas facilite: dans le code de la classe dinteraction on na pas
le code de contrle dvnement sous les yeux, une modication
de la ralisation peut ncessiter une intervention sur deux chiers.
Que se passe-t-il si on dcide de remplacer le champ JTextField
par un JLabel?
Cette remarque devient dautant plus pertinente quon peut tre
amen ne crer quune seule instance de ControleurAction et
cibler de nombreux composants dans le code de gestion
dvnement.
2
2/56
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Considrations architecturales
Le gestionnaire dvnement intgr
Le gestionnaire dvnement peut tre intgr la classe de disposition
graphique:
public class Disposition extends JFrame implements ActionListener{
...
private JTextField leTextField ;
....
private int compteur ;
public void actionPerformed(ActionEvent evt) {
leTextField.setText("nombre de clics =" + (++compteur));
}
....
bouton.addActionListener(this) ;
...
}
Ici on a tout sous la main mais:
si on doit veiller sur plusieurs composants (par exemple faire de
cette manire des addActionListener sur plusieurs boutons) le
code du gestionnaire dvnement risque de devenir scabreux -il
devra implanter des comportements diffrents en fonction du
composant source: ce qui est criticable dans le cadre dune
programmation objets-
si, de plus, le code doit assurer simultanment la veille de
Listeners complexes comme MouseListener et
WindowListener, on risque daboutir un fouillis de
gestionnaires dvnements.
2/57
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Considrations architecturales
Le gestionnaire dvnement dans une classe interne
Une autre solution consiste dnir une classe de veille dans le contexte
de la classe de disposition. Ceci est rendu possible en Java par la
dnition dune classe interne.
public class Disposition extends JFrame {
...
private JTextField leTextField ;
....
private class ControleurAction implements ActionListener{
int compteur ;
public void actionPerformed(ActionEvent evt) {
leTextField.setText(
nombre de clics =" + (++compteur));
}
}// fin classe interne
....
bouton.addActionListener(new ControleurAction()) ;
...
}
On a ici une classe membre dinstance de la classe Disposition qui est
situe dans le contexte de la classe englobante. Du coup linstance du
veilleur a directement accs au champ leTextField.
2
2/58
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Considrations architecturales
Le gestionnaire dvnement dans une classe anonyme
Dans lexemple prcdent on a une classe interne qui est dnie alors
quil ny a quune seule instance utilisable. Il est donc possible dutiliser
une criture plus synthtique qui est celle dune classe anonyme :
public class Disposition extends JFrame {
...
private JTextField leTextField ;
....
bouton.addActionListener(new ActionListener() {
int compteur ;
public void actionPerformed(ActionEvent evt) {
leTextField.setText(
nombre de clics =" + (++compteur));
}
}) ;// fin classe anonyme
...
}
La syntaxe indique une dnition la vole dune classe aprs lappel du
new. Cette classe (sans nom) fait implicitement extends Object
implements ActionListener .
En voici un autre exemple (une fentre AWT qui ne dispose pas de lotion
DISPOSE_ON_CLOSE de JFrame)
fen.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
dispose() ; //mthode de Frame
}
}) ;
Ici la classe anonyme fait implicitement extends WindowAdapter (on a
considr que lon tait dans le code dune classe drive de Frame,
sinon il aurait fallu crire fentre.dispose() )
2/59
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
2
Introduction technique (suite), vnements
Exercices :Miseenplacedunveilleur
Exercices :
Reprendre lexercice prcdent de mise en place dun formulaire
question-rponse et rorganiser le code de manire le rendre le
plus rutilisable possible.
Mise en application : faire en sorte que les saisies soient de la
forme:
cos 0.234
sin 0.254
....
(donc en gnral: fonction valeur_double) afcher le rsultat
du calcul (java.lang.Math).
Pour analyser la chane utiliser un
java.util.StringTokenizer. Pour raliser la transformation
chane->double voir classe java.lang.Double.
2
2/60
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Introduction technique (suite), vnements
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads) 3
Points essentiels:
Comment faire raliser plusieurs tches en mme temps? En conant ces
tches des processus diffrents. Java dispose dun mcanisme de
processsus lgers (threads) qui sexcutent en parallle au sein dune
mme JVM.
La notion de Thread
Cration de Threads, gestion du code et des donnes,
Cycle de vie dun Thread et contrles de lexcution
3
3/62
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Multi-tches (rappel)
Comment un systme dexploitation permet-il davoir plusieurs tches
qui sexcutent en mme temps? Mme sil ne dispose que dun seul
processeur pour rellement excuter une tche, il est capable de donner
une illusion de paralllisme: pendant quil pilote une imprimante, il
continue dialoguer avec lutilisateur par exemple.
Dans un systme dexploitation multi-tches il y a plusieurs programmes
(processus) qui tournent en mme temps. Chacun excute un certain
code et dispose de ses donnes propres. Lillusion de lexcution en
parallle est obtenue en nexcutant une partie de code de chaque
processus que pendant un laps de temps trs court. Si chaque tche ne
voit son tour quune partie de son code excute on aura limpression
que plusieurs programmes sexcutent en parrallle.
A linterieur du systme lordonnanceur de tches a un rle essentiel :
cest lui qui dcide quel sera le processus actif un moment donn et
pour combien de temps.
Pour des raisons diverses il existe des algorithmes dordonnancement
diffrents selon les systmes : un algorithme de time-slicing alloue des
tranches de temps pratiquement quivalentes pour chaque processus,
dans dautres algorithmes un processus actif garde la main jusqu ce
quil se bloque sur un appel systme comme une opration dE/S.
Ces algorithmes sont complexes car ils tiennent compte de facteurs
supplmentaires comme des priorits entre processus.
3/63
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Processus lgers: principes
Dans de nombreux systmes dexploitation modernes la notion de tche
est gre un niveau plus n. A lintrieur mme dun processus il existe
des processus lgers qui partagent les mmes donnes. Un mme
programme peut donc faire vivre plusieurs tches en son sein, et, le cas
chant, le systme est capable de ventiler ces tches sur plusieurs
processeurs.
Java intgre la notion de thread lintrieur mme du langage. Une fois
cre cette tche va disposer dune pile dexcution qui lui est propre et
partager des codes et des donnes des classes.
La J.V.M. dexcution pourra soit associer un thread Java un thread
systme soit elle-mme raliser un algorithme dordonnancement.
Pour permettre une grande souplesse dadaptation la spcication ne
place que trs peu de contraintes standard sur les comportements dun
thread. Le programmeur ne doit donc surtout pas faire dhypothses sur le
comportement de lalgorithme dordonnancement.
Voici un exemple de mauvaise conception:
// A PROSCRIRE !!!
Image img = getToolkit().getImage(urlImage) ;//dans un composant AWT
// mthode asynchrone: le chargement est ralis par une tche de fond
while(-1 == img.getHeight(this)) { /* rien : polling */ }
// tant que limage nest pas charge sa hauteur est -1
Ce programme ( proscrire!) est susceptible de tomber en marche sur
des systmes utilisant le time-slicing et ne fonctionne absolument pas sur
dautres (tout en touffant la C.P.U.!)
1
.
1. Lattente du chargement complet dune image (si elle est ncessaire) se fait
laide dun objet MediaTracker.
3
3/64
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Conception dun Thread
On peut considrer que la classe Java Thread fournit un moteur qui
permet dexcuter une tche. Une instance de Thread va disposer de
caractristiques propres comme un nom permettant de lidentier ou une
priorit, mais surtout elle va fournir une pile dexcution pour drouler
un code.
Le code excut par le Thread est fourni par une autre classe qui ralise
le contrat dinterface Runnable au travers de sa mthode run().
import java.io.* ;
public class Compteur implements Runnable {
public final int max ;
public Compteur( int max){
this.max = max ;
}
public void run () {
for(int ix = 0 ; ix < max ; ix++) {
try {
File temp = File.createTempFile("cpt","");
System.out.println("#"+this+":"+temp);
temp.delete() ;
} catch (IOException exc){/*test */}
}
}// FIN DE TACHE
}
Ceci nous permet la dnition dune tche comme :
Thread tche = new Thread(new Compteur(33)) ;
Ici il sagit dune tche de dmonstration sans porte pratique (la
formule magique dans la boucle cre des chiers temporaires), mais le
fait de faire un appel systme lourd dans la boucle va probablement
mettre en lumire le comportement de lordonnanceur.
3/65
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Cycle de vie : dbut et n de vie
Une fois cr le Thread est prt tre activ: ceci se fait par linvocation
de la mthode start()sur linstance
tche.start() ;
A partir de ce moment le code du run() est pris en charge par
lordonnanceur. En fonction des dcisions de lordonnanceur le Thread
passe par une srie dtats: par exemple actif (le code tourne) ou ligible
(le code ne tourne pas, mais lordonnanceur peut le ractiver tout
moment).
Quand le code du run() est puis (on arrive laccolade fermante de la
mthode) le Thread devient zombie: linstance du Thread existe
encore (jusqu ce quelle soit ventuellement rcupre par le garbage-
collector) mais on ne peut plus lui demander de re-excuter la tche
(IllegalThreadStateException).
Pour tester si un Thread est vivant :
if( tche.isAlive()) { ....
Cette mthode indique que start() a t excute et que linstance cible
nest pas devenue zombie.
Cette mthode nindique pas que le Thread tche est en tat actif (cest
le Thread demandeur qui excute le code qui est actif!).
Actif Eligible new mort
start()
Ordonnanceur
}//FIN DE TACHE
run() {
3
3/66
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Point intermdiaire :lancement dethreads
Mini-exercice :
Reprendre le Thread Compteur dcrit prcdemment. Crer un
main qui lance plusieurs Compteurs en parallle et observer
lordonnancement (quel thread est actif quel moment).
3/67
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Cycle de vie: retrait de ltat actif
Dans le code exctu par un thread il est possible de demander passer en
tat dinligibilit pendant un certain temps. Le code qui sexcute va
sinterrompre, et le thread est retir du pool des threads ligibles par
lordonnanceur:
public class Compteur2 implements Runnable {
public final int max ;
public Compteur2( int max){
this.max = max ;
}
public void run () {
for(int ix = 0 ; ix < max ; ix++) {
System.out.println(#+this+:+ix);
try {
Thread.sleep(1000) ;
} catch (InterruptedException exc) {
...// message?
}
}
}// FIN DE TACHE
}
La mthode de classe Thread.sleep(long millis) rend le thread qui
lexcute inligible pendant au moins millis millisecondes.
On notera que cette mthode est susceptible de propager une exception si
on invoque sur linstance courante de ce thread la mthode interrupt().
La mthode de classe Thread.yield() permet au thread qui lexcute de
demander lordonnanceur de bien vouloir le faire passer ltat ligible.
Si il existe dautres threads de priorit au moins quivalente qui sont en
attente il est possible que lordonnanceur dcide de rendre un de ces
autres threads actif
2
.
2. Ceci ne garantit pas que le Thread qui excute yield ne sera pas
immdiatement reactiv par lordonnanceur. Ce dernier est matre de sa
stratgie, mme sil y a dautre threads ligibles il peut tout fait conserver le
Thread demandeur en activit puis nalement le dsactiver sur un appel
ultrieur de yield() (ou pour une autre raison).
3
3/68
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Cycle de vie: attente de la terminaison dune tche
La mthode dinstance join() permet au Thread qui lexcute
dattendre la n de lexcution du Thread cible :
public class CompteurChaine extends Compteur{
private Thread autre ;
public CompteurChaine( int max, Thread autre){
super(max) ;
this.autre = autre ;// gag si on fait un cycle!
}
public void run () {
System.out.println(prt: + this ) ;
try {
autre.join() ;
} catch (InterruptedException exc) {/*test*/}
super.run() ; // mais oui! rien de magique
}// FIN DE TACHE
}
Le thread qui va excuter ce Runnable va attendre la n de lexcution du
Thread pass en paramtre pour excuter la suite du code.
3/69
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Autres techniques de cration
On peut galement dnir une classe drive de Thread qui spcialise sa
propre mthode run().Ceci peut se produire lorsquon a besoin dun
thread avec un comportement spcique (ou aussi pour simplier
lcriture dun code):
public class UnThread extends Thread {
public void run() {
//qqch a excuter
}
}
Exemple:
Thread patience = new Thread() {
public void run() {
while(!isInterrupted()) {
System.out.print(.) ;
}
}
};
patience.start() ;
..... //on fait des tas de choses
patience.interrupt() ;
try {
patience.join() ;
} catch(InterrruptedException xc) { ...}
On notera galement deux mthodes intressantes en phase
dinitialisation:
setPriority(int prior): permet de xer la priorit du
Thread (une valeur comprise entre les constantes MIN_PRIORITY
et MAX_PRIORITY)
setDaemon(boolean b) : permet de spcier si le Thread est
un daemon ou un Thread utilisateur. La machine virtuelle
Java sarrte automatiquement quand les seuls threads actifs sont
des deamon.
3
3/70
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Point intermdiaire :laviedesthreads
Mini-exercice :
Le Thread patience dans lexemple prcdent ne marche pas de
faon compltement satisfaisante. Le modier de faon ce quil
tente dalterner son excution avec le Thread principal qui la cr
(pour un test essayer par exemple que lun afche ping et lautre
pong -essayer dabord avec yield puis avec sleep -).
Vos conclusions?
3/71
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Etats dun Thread (rsum)
Actif Eligible
En Attente
new mort
les dattente
(sera vu ultrieurement)
start()
Ordonnanceur
Thread.yield()
Thread.sleep() n attente
interruption autreThread.join()
3
3/72
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Exercice :threads
Exercice:
Concevoir et raliser un composant Swing ImageAnimee :
un Thread permet de dclencher intervalles rguliers lafchage
successif des images dun tableau.
(Rechercher dabord le composant Swing qui va vous servir de
point de dpart, chercher dans la documentation comment
changer limage courante afche. Dans le main de test charger les
images depuis le systme de chier courant -nous verrons
ultrieurement une autre manire de recherhcer ces images-).
3/73
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Complments
Les complments techniques suivants constituent une annexe de rfrence
ThreadGroup
Les threads dune application peuvent directement interagir entre eux. En
pratique on peut limiter ces interactions en partitionnant lapplication en
groupes de Threads ThreadGroup.
Les ThreadGroups sont organiss de manire hirarchique. Un Thread
dans un ThreadGroup pourra obtenir des informations uniquement sur
son groupe (voir mthode checkAccess()).
Des mthodes comme setDaemon(bool) ou setMaxPriority(pri)
permettent de xer des caractristiques globales au groupe (et
eventuellement transmises aux sous-groupes crs ). De la mme manire
linvocation de interrupt() permet de diffuser une demande
dinterruption aux Threads et sous-groupes du groupe.
Une possibilit intressante est de crer une classe drive de
ThreadGroup et de rednir sa mthode
uncaughtException(Thread, Throwable): on peut ainsi mettre en
place un traitement par dfaut des exceptions qui remontent la pile et qui
nont pas t captures (pour un traitement dcent Voir Rapports,
journalisations, assertions, page 141. ).
3
3/74
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Variables partages lies un Thread
Dans certaines situations on peut avoir besoin dune variable partage qui
ne soit pas lie une classe (membre static de classe) mais lie un
contexte de thread. Typiquement une telle variable pourrait tre un
identiant de session utilisateur sur un serveur: un ensemble de codes
pourraient avoir besoin dune variable partage qui soit spcique au
thread qui les excute.
Pour rpondre cette situation on peut mettre en place un objet partag
de type ThreadLocal.
public class Session {
public static ThreadLocal uid = new ThreadLocal() ;
...
}
public class TacheUtilisateur implements Runnable {
Utilisateur ut ;
public TacheUtilisateur(Utilisateur u) {
ut = u ;
}
public void run() {
Session.uid.set(ut) ;
....
}
}
et maintenant dans un code de lapplication:
utilisateurCourant= (Utilisateur) Session.uid.get();
Des threads crs par un Thread principal peuvent hriter des valeurs
partages de niveau Thread en utilisant un objet
InheritableThreadLocal.
3/75
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
3
Processus lgers (threads)
Images de la mmoire
Le partage de donnes par plusieurs threads pose des problmes
compliqus (voir blocs synchronized dans la leon suivante). Il faut
savoir quen Java les variables sont stockes dans une mmoire principale
qui contient une copie de rfrence de la variable. Chaque Thread
dispose dune copie de travail des variables sur lesquelles il travaille. Les
mises jour rciproques de ces versions dune mme variable reposent
sur des mcanismes complexes qui sont dcrits dans le chapitre 17 de JLS
(spcication du langage). Il faut comprendre que ce modle permet des
ralisations trs performantes en laissant une grande libert aux
compilateurs/excuteurs et permet au maximum dutiliser des registres,
les instructions en tunnel des processeurs, etc.
Les blocs synchronized dcrits dans prochaine leon ont pour effet de
mettre en place des barrires qui forcent ces mises jour. En dehors de ces
blocs il est possible de forcer des rconciliations de valeurs en dclarant
des variables membres comme volatile .
public class Partage {
public volatile int valeurCourante;
}
Dans ce cas un Thread sait que lorsquil prend une copie de cette
variable sa valeur peut subir des modications et les compilateurs doivent
sinterdire certaines optimisations. Les lectures et critures de ces
variables suivent donc un protocole particulier.
3
3/76
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Processus lgers (threads)
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents 4
Points essentiels
Dans la mesure o lon ne contrle pas compltement lordonnancement
des tches qui agissent en parallle, il peut savrer ncessaire de contrler
laccs un objet de manire ce que deux Threads ne le modient pas
de manire inconsistante. Pour adresser ce problme Java a adopt un
modle de moniteur (C.A.R. Hoare).
Lorsquun Thread rentre dans un bloc de code synchronized
rattach un objet , il y a un seul de ces Threads qui peut tre
actif, les autres attendent que le Thread qui possde le verrou
ainsi acquis le restitue.
Un Thread en attente dune ressource peut se mettre dans un le
dattente o il attendra une notication dun autre Thread qui
rend la ressource disponible (mcanisme wait/notify).
4
4/78
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Accs concurrents: problmatique
Imaginons une classe grant une pile dobjets (ceci nest quun exemple: il
serait inutile dcrire un tel code puisquune classe existe
java.util.Stack!)
class MaPile {
... // code divers dont dfinition de MAX
private Object[] tb = new Object[MAX] ;
private int idx = 0 ;
public void push(Object obj) {
//on suppose que lon traite le pb de la taille
...
tb[idx] = obj ;
this.idx++ ;
}
public Object pop() {
// on suppose quon empche
// de dpiler une pile vide (exception)
....
this.idx-- ;
return tb[idx] ;
/* autre version avec mnage mmoire
* Object res = tb[idx] ;
* tb[idx] = null ;
* return res ;
*/
}
....// autre codes dont par ex. la taille de la pile
}
Notons quaprs chaque appel lindex idx indique le premier
emplacement disponible dans le tableau pour mettre un nouvel objet.
Et maintenant tudions ce qui se passerait si plusieurs threads pouvaient
faire des demandes la mme instance de MaPile (souvenons nous que
nous ne sommes pas matre de lordonnancement des threads).
4/79
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
Dans ce scnario (et bien dautres), on arrive un tat incohrent de
linstance!
Ici le problme vient du fait que les deux membres tb et idx de
linstance participent un tat cohrent : si lun est modi il doit tre
garanti que lautre est modi en consquence. On a ici des blocs de code
tels que : lorsquun thread a commenc une excution il faut garantir que
le mme thread sera seul autoris agir dans ce bloc.
Pour traiter ce problme on a mis en place en Java un mcanisme de
moniteur.
tat de linstance x ThreadA ThreadB autres Threads
idx== 3
x.push(obj1){
tb[3] = obj1 ;
tb[3] == obj1
x.push(obj2){
tb[3] = obj2 ;
this.idx++ ;
tb[3] == obj2
idx ==4
autres activits
this.idx++
tb[3]== obj2
//obj1 perdu
tb[4] == ?
idx == 5
}
4
4/80
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Blocs synchronized
Reprenons partiellement le code prcdent et dotons une partie du code
dun bloc qui permette de protger une partie du code contre des accs
concurrents intempestifs:
class MaPile {
... // code divers dont dfinition de MAX
private Object[] tb = new Object[MAX] ;
private int idx = 0 ;
public void push(Object obj) {
//on suppose que lon traite le pb de la taille
...
synchronized(this){
tb[idx] = obj ;
this.idx++ ;
}
}
En Java tout objet est dot dun moniteur : cest un dispositif qui gre un
verrou et des les dattente daccs ce verrou.
Ici le bloc synchronized est rattach lobjet courant : tout thread qui va
chercher entrer dans le bloc devra tenter dacqurir le verrou ou restera
bloqu en le dattente en attendant son tour dacqurir le verrou
4/81
Intitul Cours: Matrise de la programmation en langage Java
Copyright Sun Educational Services Rvision : J3
Rf. Sun : SL275+ Date : 4/6/02
4
Accs concurrents
Blocs synchronized
Dans ce scenario:
Le thread A demande le premier le verrou sur linstance courante
et lacquiert. Mme sil nest plus actif il conserve le verrou. Quand
il redevient actif il sort du bloc et relache le verrou.
Le thread B tente dacqurir le verrou, il passe en le dattente et
ne peut plus tre ligible tant quil nest pas sorti de la le. Quant
il est lu il acquiert automatiquement le verrou quil a demand.
tat de linstance x ThreadA ThreadB autres Threads
idx== 3
x.push(obj1){
tb[3] = obj1 ;
tb[3] == obj1
x.push(obj2){
tb[3] = obj2 ;
this.idx++ ;
autres activits
this.idx++
}
autres activits
synchronized(this)
synchronized(this)
bloqu! inligible
idx == 4
...//autre code
lu
tb[4] == obj2
idx == 5
}
ligible
4
4/82
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Autres points sur lutilisation du moniteur
Tous les codes qui manipulent le mme ensemble de valeurs qui
doivent rester cohrentes doivent imprativement se synchroniser
sur le mme moniteur. Donc pour complter le code prcdent il
faut aussi:
public Object pop() {
....
synchronized(this) {
this.idx-- ;
return tb[idx] ;
}
}
Normallement les blocs synchronized doivent tre les plus
troits possible et se concentrer juste sur le code critique. Toutefois
lorsque toute une mthode est synchronise sur linstance
courante, il et possible dadopter la dclaration suivante :
public synchronized void push(Object obj) {
...
}
public synchronized Object pop() {
...
}
Il nest pas toujours possible de choisir linstance courante comme
support du moniteur:
Le code peut contenir plusieurs combinaisons de membres
solidaires:
class EtatsMultiples {
Truc objetX;
int entierX;
Object moniteurPourX = new Object() ;
Machin objetY ;
int entierY ;
Object moniteurPourY = new Object() ;
4/83
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
On peut, par exemple, utiliser un objet pass en paramtre
dune mthode (voir rserve ci-aprs)
static Comparable[] trier(Comparable[] tb) {
synchronized(tb) {
// suppose que tout utilisateur de ce tableau
// soit au courant! et fait lui mme appel
// au moniteur avant daccder
..... // re-arranger les lments du tableau
return tb; // sort du bloc synchronized
Java ne dtecte pas automatiquement les treintes mortelles
(deadlock). Si le code excut par un Thread A acquiert un moniteur
X, puis tente dacqurir un moniteur Y, si un Thread B a acquis Y et
tente dacqurir X tout est bloqu! A moins davoir une mauvaise
conception il est peu probable que ce code soit crit dans la classe
EtatsMuliples ci-dessus, mais pour un moniteur partag entre
plusieurs classes (pass en paramtre par exemple) le risque existe.
Une mthode de classe peut tre synchronized: le moniteur
utilis est le champ statique .class de la classe courante (objet
de type Class). Dans un code static il est bien sr possible de
se synchroniser sur une variable partage.
Classiquement un systme de verrou est source de problmes de
performance ( la fois pour des raisons lies au droulement de
lapplication et des raisons lies aux performances intrinsques
des moniteurs). Il faut donc faire attention. Typiquement les
classes de collection du package java.util ne sont pas
synchronises : on peut transformer une collection avec
Collections.synchronizedCollection(Collection),
mais on a aussi des stratgies optimistes qui permettent de
parcourir une collection non synchronise avec un iterateur et
dtre averti si une modication intempestive se produit
(ConcurrentModificationException).
Pour tester si le Thread courant a acquis le verrou sur un objet
donn :Thread.holdsLock(objet) ; (essentiellement utile pour
vrier des prconditions).
4
4/84
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Point intermdiaire :blocssynchronized
Mini-exercice :
Reprendre lexercice pingPong prcdent (Mini-exercice :,
page 70) et faire en sorte que chaque fois quun des threads
commence afcher un Ping (ou un Pong) il soit garanti quil
puisse afcher 5 fois le mme message conscutivement.
(exemple : 5 Pings, 5 Pongs, 5 Pings, 5 Pings, etc...)
-bien choisir lobjet support de la synchronisation-
4/85
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
4
4/86
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Producteur/consommateur: problmatique
Imaginons maintenant que nous crivions le code dune classe contenant
des objets et fonctionnant en le FIFO (First In First Out). Nous pourrions
ici faire usage dune des classes ArrayList ou LinkedList de
java.util. Ces collections ordonnes ont la particularit dassurer la
contiguit de leurs lments : on peut toujours rajouter un lment en n
et quand on prend le premier lment de la liste, le second devient le
premier, etc.
public class FIFO {
private ArrayList liste = new ArrayList();
public Object prendre() {
return liste.get(0) ;
}
public void poser(Object obj) {
liste.add(obj) ;
}
}
Maintenant un objet de cette classe va tre partag par plusieurs threads:
certains remettent dans la le des objets dont ils nont plus besoin,
dautres viennent chercher un objet pour lutiliser.
Le code de cette classe pose un problme pour le thread preneur: si le
stock dobjets est vide, dune part, la mthode get propage une exception
(quil va falloir traiter) et, dautre part, il va falloir attendre quun autre
thread veuille bien remettre un objet dans le stock. On ne peut pas
imaginer une boucle innie qui teste sans arrt la taille de la liste
(polling)!.
Il nous faut ici un mcanisme tel que le thread preneur affam (qui se
trouve face une ressource vide) puisse passer dans un tat dinligibilit
qui durera tant quun thread fournisseur na pas signal explicitement
quil a effectivement dpos un Objet.
Ici aussi le mcanisme du moniteur va tre mis contribution, un objet
(linstance courante) va servir de support un dispositif de coordination
entre threads.
4/87
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
Producteur/consommateur: mise en oeuvre
Reprenons le code prcdent pour quil assure une coordination entre
producteurs et consommateurs:
public class FIFO {
private ArrayList liste = new ArrayList();
public synchronized Object prendre() {
while( 0 == liste.size()) {
try {
this.wait() ;
} catch (InterruptedException exc) {
// on peut toujours logger!
}
}
return liste.get(0) ;
}
public synchronized void poser(Object obj) {
this.notify() ;
liste.add(obj) ;
}
}
Le principe gnral est le suivant :
si la liste est vide les threads affams vont se mettre dans un pool
associ linstance courante. La mthode wait() met le thread qui
lexcute dans ce pool.
un thread qui vient dposer un objet signale que les threads en
attente peuvent redevenir ligibles pour aller rechercher un objet
dans le stock. Il excute sur lobjet support du moniteur la
mthode notify() .
Ce code appelle de nombreuses remarques :
4
4/88
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Producteur/consommateur: mise en oeuvre (suite)
public class FIFO {
private ArrayList liste = new ArrayList();
public synchronized Object prendre() {
while( 0 == liste.size()) {
try {
this.wait() ;
} catch (InterruptedException exc) {
// loguer ou
//grer des interruptions
}
}
return liste.get(0) ;
}
public synchronized void poser(Object obj) {
this.notify() ;
liste.add(obj) ;
}
}
Les mthodes wait et notify (de Object) ne peuvent tre
appeles que si le thread courant a acquis le moniteur sur lobjet
concern. Bien que le compilateur ne vrie pas cette condition au
runtime on verrait apparatre une
IllegalMonitorStateException (thread not owner).
Bien entendu le bloc synchronized doit englober tout le code
fragile (ici par exemple il faut tre sr au moment du get(0)
que la liste na pas t modie - et vide!-).
Pour cette raison faire, dans lexemple, notify avant le add nest
pas incorrect!
wait() peut etre interrompu (voir mthode interrupt() ) et
exige donc dtre plac dans un bloc try-catch.
Le thread qui excute wait() est mis dans un pool dattente, quand
il en sort il revient dans le bloc synchronized et entre en
comptition avec dautres threads pour acqurir le verrou courant.
Il nest donc pas certain que la condition qui a accompagne le
notify soit encore remplie au moment o le thread acquiert enn
le verrou: le test sous forme while est obligatoire!
4/89
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
notify existe sous deux formes : notify() (un thread est pris
dans le wait-pool ) et notifyAll() (tous les threads du wait-pool
vont chercher acqurir le verrou). Noter que le choix dun
Thread particulier dans le pool est dpendant dune stratgie de
ralisation de la JVM: le programmeur ne doit donc pas faire
dhypothses ce sujet.
Invoquer notify() ou notifyAll() alors quil ny a aucun
thread dans le wait-pool ne prte pas consquence, on peut donc le
faire sans risque.
Il existe une version de wait qui permet de limiter le temps
dattente: wait(long attenteEnMillisecondes) . Bien
entendu la sortie on nest vraiment pas sr que la condition
attendue soit remplie!
4
4/90
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Point intermdiaire :producteur-consommateur
Mini-exercice :
Reprendre lexercice prcdent (squence de 5 messages) et
sassurer que les messages vont alterner ( 5 pings, 5 pongs, etc.).
Alternativement chaque processus se mettra en veille pour ensuite
attendre que lautre le rveille.
(la solution est trs simple, mais nest pas immdiatement
vidente!).
4/91
Intitul Cours: Matrise de la programmation en langage Java
Copyright Sun Educational Services Rvision : J3
Rf. Sun : SL275+ Date : 4/6/02
4
Accs concurrents
Etats dun Thread (rsum)
Remarques : 1) Dans un bloc synchronized le processus peut tre actif
ou prempt par lordonnanceur . 2) Lorsque un processus reoit un
notify() il nest pas forcment ractiv immdiatement: il peut avoir
attendre quun autre processus relache le verrou sur lobjet synchronis
courant.
Actif
Eligible
En Attente
new mort
start()
Ordonnanceur
yield()
sleep()/join() n attente
interruption
wait()
BLOC SYNCHRONIZED
pool
attente
notify()
notifyAll()
autres processus actifs
interrupt()
4
4/92
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Exercice :threads
Exercice (au choix):
En utilisant la classe Fifo (vue prcdemment) concevoir une le
spciale qui contient des Threads (appellons la ThreadPool).
Ces threads sont particuliers :
leur mthode run() est une boucle innie
en dbut de boucle le thread se met de lui-mme dans le
ThreadPool et se bloque en attente.
maintenant lorsquon soumet un Runnable au ThreadPool,
Ce dernier retire un thread, le ractive et lui fait excuter la
mthode run du Runnable. Quand cette tche est termine le
thread se replace en dbut de boucle. etc.
(question subsidiaire: quoi peut servir ce dispositif?)
Reprendre le composant ImageAnimee ( Exercice:, page 72) et
faire en sorte que lon puisse suspendre lanimation, la reprendre
et,ventuellement, larrter dnitivement.
Lire dabord suspend, resume, stop, page 93, on procdera alors
de la manire suivante :
dnir un type de Thread spcial appel Trame
Cette Trame dispose de mthodes qui sont appeles par
dautres threads : suspendRequest(), resumeRequest(),
stopRequest() . Ces mthodes ont des effets sur linstance
courante qui seront pris en compte par une mthode going()
qui permet au thread courant de savoir sil peut continuer
travailler, ou sil doit se bloquer en attente dune demande de
continuation (ou darrt).
Utiliser une instance de Trame pour animer ImageAnimee.
(question subsidiaire: cette conception prsente un dfaut majeur,
lequel?).
4/93
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
4
Accs concurrents
Complments
Les complments techniques suivants constituent une annexe de rfrence
Excution des constructeurs
Le code dun constructeur ne peut pas tre synchronized : il nest
excut que par un seul thread pour la cration dun objet donn et,
normalement, une rfrence sur lobjet en construction ne devrait pas tre
rendue avant la n de lexcution du constructeur.
Il reste quil y a, potentiellement, quelques situations dangereuses: passer
une rfrence sur lobjet courant dans le code dun constructeur
(enregistrement dun callback par exemple) risque doffrir un accs
linstance avant que celle-ci ne soit dans un tat cohrent! Le danger vient
de lemploi dans le constructeur de mthodes qui cachent le fait quelles
passent this dautres objets: lexemple le plus courant se trouve dans
les constructions de hirarchies (exemple: hirarchies
Container/Component en AWT).
suspend, resume, stop
Dans des versions prcdentes de Java il existait des mthodes qui
permettait un Thread dagir de lextrieur sur un autre Thread.
Ces mthodes (suspend() pour suspendre lactivit, resume() pour
faire repartir le thread suspendu, stop() pour arrter le thread) ont t
rendues obsolete (deprecated) car le thread demandeur ignorait tout de
laction courante du thread cible et cela tait susceptible de provoquer des
catastrophes. Pour plus de dtails lire:
docs/guide/misc/threadPrimitiveDeprecation.html.
La mthode interrupt() reste, elle, intressante pour rveiller des
threads abusivement somnolents.
4
4/94
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Accs concurrents
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Deuxime partie: ressources
.
/96
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit 5
Points essentiels
Le dploiement professionnel dune application ne saurait se rduire
une simple installation dun ensemble de rpertoires et de chiers
binaires. Nous allons voir quelques techniques simples de dploiement
archives Jar
ressources applicatives
contraintes de scurit
5
5/98
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit
Les ClassLoaders
Un programme java a la particularit dtre un assemblage dynamique
de codes. O la machine virtuelle trouve-t-elle ces codes? :
Dans les librairies Java du runtime (JRE). Ce sont les librairies
bootstrap de Java qui font partie de linstallation de la machine
virtuelle.
Dans les extensions installes de Java. (a priori des librairies
standard installes dans le sous-rpertoire jre/lib/ext de
linstallation du SDK)
Dans les codes applicatifs qui sont les codes vus par le
CLASSPATH au moment du lancement de la machine virtuelle.
Dans certaines documentations ces codes sont improprement
qualis de codes systme.
Les codes java sont chargs par des ClassLoaders. Les ClassLoaders
ont une organisation hirarchique : une classe reconnue par le
ClassLoader pre est toujours charge en priorit ; comme le
ClassLoader primordial (bootstrap) est pre de tous les autres on ne peut
donc pas charger une classe qui porterait le mme nom quune classe Java
fondamentale.
En cours dexcution dautres ClassLoaders peuvent tre crs pour
mettre en oeuvre des techniques de chargement spciques (par exemple
pour charger des codes au travers du rseau), et pour crer des espaces de
gestion de classes lies une origine de code (scurit).
5
5/110
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit
Complments
Les complments techniques suivants constituent une annexe de rfrence
Autres services sur les archives Jar
Voir la documentation <install_java>/docs/guide/jar/jar.html
et en particulier :
Description dans le Manifeste de packages complets (attribut
Sealed:): toute classe du package marqu Sealed sera alors
ncesssairement contenue dans le jar courant. Ceci permet de bien
grer la consistance dune distribution et de sa version et
damliorer les contraintes de scurit,
Description dans le Manifeste des informations de version du
package. Ces informations peuvent tre ventuellement exploites
par programme, pour sassurer des compatibilits de
comportement. (rappel: en Java le package est lunit indivisible
de livraison et de version des APIs -versions vues du point de vue
utilisateur de lAPI-).
Mise en place dun class-path auxiliaire des classes
dpendantes du jar courant et mise en place dun index
doptimisation (jarindex) pour optimiser le chargement des
archives jar dpendantes du jar courant.
5/111
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
5
Archives, ressources, scurit
Manipulations des certi cats de scurit
Voici un exemple simple de cration et de gestion des certicats de
scurit :
Soit une Applet nomme SnoopApplet.java et qui lit la proprit
user.home de lutilisateur de lApplet. Normalement la consultation de
cette valeur est interdite, on va donc crer une ressource de scurit
(chier .java.policy) qui autorise un serveur particulier (celui de la
socit acme.fr) raliser cette opration.
Le serveur va adresser un chier jar sign au client. Cette signature
sopre avec la clef priv de la socit ACME. Par ailleurs ACME met la
disposition du client sa Clef publique qui permettra au client
dauthentier larchive jar.
Le serveur met la disposition du client un Certicat qui contient les
informations ncessaires. Ce certicat est stock localement dans une
ressource (keystore). Lobtention du certicat peut se faire de diverses
manires (par ex. transaction avec une tierce partie qui se porte garante
du serveur).
5
5/112
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit
Gnrationducerticat (cotserveur) :
Ici on supposera que cest le serveur lui-mme qui fabrique le certicat , il
va gnrer ses clefs publiques/clefs privs et va stocker le rsultat dans
une base locale (keystore), ce certicat est connu sous lalias
acmeserver:
$ keytool -genkey -alias acmeserver
Enter keyStore password : 14juillet
What is your first and last name?
[Unknown]: Jean Dupond
What is the name of your organizational unit?
[Unknown] : service informatique
What is the name of your organization?
[Unknown]: ACME France
What is the name of your City or Locality?
[Unknown]: Toulouse
What is the name of your State or Province?
[Unknown]: Midi-Pyrenees
What is the two-letter country code for this unit?
[Unknown]: FR
Is <CN=Jean Dupond, OU=service informatique, O=ACME France,
L=Toulouse,ST=Midi-Pyrenees, C=FR>
correct?
[no]: yes
Enter key password for <acmeserver>
(RETURN if same as keystore password) acme14
On notera que laccs la base et au certicat sont protgs par des mots
de passe.
5/113
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
5
Archives, ressources, scurit
Consultationdelabasedescerticats(cotserveur):
$ keytool -list
Enter keystore password: 14juillet
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
acmeserver, Tue Mar 09 17:21:07 CET 1999, keyEntry,
Certificate fingerprint (MD5):
ED:55:F3:0D:E4:A1:13:A3:BE:34:AB:7D:DE:BF:C8:B3
Signaturedelarchivejar (cotserveur) :
$ jarsigner snoop.jar acmeserver
Enter Passphrase for keystore: 14juillet
Enter key password for acmeserver: acme14
Contenudelarchivejar :
Dans le rpertoire META-INF de larchive on trouve les chiers :
MANIFEST.MF
ACMESERV.SF
ACMESERV.DSA (donnes)
Manifest-Version: 1.0
Created-By: 1.2 (Sun Microsystems Inc.)
Name: sl275/secur/SnoopApplet.class
SHA1-Digest: wrvJn8RFHRxB5RilIcYNdNRFCSM=
Signature-Version: 1.0
SHA1-Digest-Manifest: 1gAPmlinU6BRogZ5VF0smNXfAVg=
Created-By: 1.2 (Sun Microsystems Inc.)
Name: sl275/secur/SnoopApplet.class
SHA1-Digest: +QoJQIt14oTI8v+AmbD4X7q1BIE=
5
5/114
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit
Exportationduncerticat dansunchier (fournisseur de
certicat) :
$ keytool -export -alias acmeserver -file acmeserver.certificate
Enter keystore password: 14juillet
Certificate stored in file <acmeserver.certificate>
I mportationduncerticat depuisunchier (cotclient) :
$ keytool -import -alias acme -file acmeserver.certificate
Enter keystore password: client14
Owner: CN=Jean Dupond, OU=Service informatique, O=ACME France,
L=Toulouse,ST=Midi-Pyrenees, C=FR
Issuer: CN=Jean Dupond, OU=Service informatique, O=ACME France,
L=Toulouse,ST=Midi-Pyrenees, C=FR
Serial number: 36e54a23
Valid from: Tue Mar 09 17:19:47 CET 1999
until: Mon Jun 07 18:19:47 CEST 1999
Certificate fingerprints:
MD5: ED:55:F3:0D:E4:A1:13:A3:BE:34:AB:7D:DE:BF:C8:B3
SHA1:
C8:E3:54:FD:2C:BA:76:12:27:97:90:FC:BE:47:90:20:59:82:7A:A5
Trust this certificate? [no]: yes
Certificate was added to keystore
Nota: lalias local du certicat peut tre diffrent de lalias original (acme au lieu de
acmeserver dans lexemple). La base et ses mots de passe est bien sr diffrente.
5/115
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
5
Archives, ressources, scurit
Contenudelabasedescerticats(Cotclient) :
$ keytool -list
Enter keystore password: client14
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
acme, Wed Mar 10 17:44:47 CET 1999, trustedCertEntry,
Certificate fingerprint (MD5):
ED:55:F3:0D:E4:A1:13:A3:BE:34:AB:7D:DE:BF:C8:B3
Politiquedescurit(cotclient) :
Fichier .java.policy
Lutilitaire policytool peut permettre de spcier cette politique de
scurit.
On notera que le chier dcrit lemplacement de la base des certicats
(avec une URL).
Toute classe authentie situe dans larchive jar dont la signature
correspond celle dsigne par lalias acme aura la possibilit de
provoquer une lecture de la proprit user.home.
keystore "file:/home/leclient/.keystore" ;
grant signedBy "acme" {
permission java.util.PropertyPermission "user.home","read";
} ;
5
5/116
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Archives, ressources, scurit
Autres aspects de la scurit
De manire gnrale les aspects scurit sont approfondis dans notre
cours SL-303. Quelques points toutefois:
Les permissions accords un code au moment de lxcution
dpendent des permissions accords aux autres codes appels
dans la pile dexcution. Ainsi un code relativement privilgi ne
peut accder des services qui sont refuss son code appelant.
Dans certains cas ce code peut accorder au code appelant des
privilges qui lui sont attachs : voir documentation de java
docs/guide/security/doprivileged.html
Les conguration de scurit abords ici concernent les droits
accords des codes; pour des droits accords des utilisateurs
voir JAAS
(docs/guide/security/jaas/tutorials/index.html)
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Internationalisation 6
Points essentiels
Linternationalisation est un cas particulier dexploitation des ressources.
Java dispose dun ensemble de mcanismes prdnis :
Dnition dun contexte culturel: java.util.Locale
Mise en place dun mcanisme abstrait de recherche de ressources:
ResourceBundle
Classe de formattage (mise en forme, analyse) dans le cadre de
conventions dpendantes de la culture locale.
6
6/118
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Internationalisation
Pourquoi internationaliser une application?
Pourquoi internationaliser :
Traduire des messages/des interactions
(pouvoir dynamiquement dadapter la langue de lutilisateur)
Traduire des messages paramtrs ce rpertoire contient 1000
chier(s)
Analyser/ afcher selon des conventions locales : formats de
nombres, dates, formats valeurs montaires
Savoir sadapter des ordres alphabtiques diffrents,
comparaisons de chanes.
Adapter automatiquement lordre de disposition de composants
(exemple: formulaires en arabe TextField de saisie situ
gauche du Label dinvite -document lu de droite gauche-)
Une application doit pouvoir sadapter automatiquement la langue de
lutilisateur (ou mme permettre des crans multilingues)
6/119
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
6
Internationalisation
Contextes culturels : Locale
Les mcanismes de localisation du language Java utilisent une
information de contexte culturel dnie au moyen de la classe
java.util.Locale.
Locale : constructeurs, constantes
Locale(langue, pays)
Locale(langue, pays,variant)
new Locale(fr, CA) ; //franais du Canada
new Locale (fr,CA, WINDOWS) ;
new Locale (fr,FR, EURO) ;
// monnaie euro et franais de France
Les arguments langue (chane en minuscule) et pays (chane en
majuscules) obissent des standard de dsignation (voir documentation
et mthodes statiques getISOLanguages, getISOCountries).
La classe fournit galement des constantes prdnies :
// constantes de classe
Locale.FRENCH ; // Locale(fr,)
Locale.FRANCE ; // Locale (fr, FR)
Les objets Locale (et les dsignations associes comme la chane fr_FR)
permettront de crer des hirarchies de ressources:
1. Le Francais
2. Le Franais de Belgique
3. La belgique francophone avec lEuro comme monnaie
6
6/120
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Internationalisation
Contexte culturel: obtention, mise en place
Au moment o une JVM dmarre elle met en place un Locale par dfaut
(en fonction de paramtres de lenvironnement)
Locale local = Locale.getDefault(); // local
System.out.println(local.toString()) ;
//-> fr_FR : chane clef
System.out.println(local.getDisplayName());
// Franais (France)
System.out.println(Locale.ENGLISH.getDisplayName());
// Anglais
// on a traduit en franais le nom!
On peut positionner globalement cette valeur
(Locale.setDefault(locale)), mais il est plus pertinent de la xer
pour chacun des objets qui utilisent ces contextes dinternationalisation:
NumberFormat nbf = NumberFormat.getInstance(local) ;
// sert mettre en forme des nombres
// on cre un formatteur propre au contexte
Comment demander une classe les Locales quelle sait grer:
Locale[] locs = NumberFormat.getAvailableLocales();
b
a
n
q
u
e
d
e
m
a
n
d
e
d
e
r
f
re
n
c
e
so
u
s le
n
o
m
b
a
n
q
u
e
cre un objet
BanqueExportee
12/223
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
Le serveur: enregistrement auprs du Registry
Voici un code de serveur trs simple:
...
import java.rmi.* ;
public class Serveur {
public static void main (String[] args) throws Exception {
BanqueExportee bank = new BanqueExportee() ;
Naming.rebind("banque", bank) ;
}
}
On cr un objet Banque serveur
On lenregistre auprs du registry sous le nom banque
Cet appel a pour effet denvoyer une instance de
BanqueExportee_Stub au registry.
Il y a deux mthodes statiques possibles dans la classe Naming :
bind(..) pour un enregistrement dnitif, rebind(..) pour
des re-enregistrements successifs.
On notera que le programme ne sarrte pas: il y a en effet maintenant un
thread dcoute lattente des demandes de services sur lobjet export.
Utiliser UnicastRemoteObject.unexportObject() pour retirer un
objet du runtime RMI.
Pour une forme plus dvelope de largument du bind voir page
suivante.
12
12/224
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Le client: demande au Registry
Un code de client trs simple :
...
import java.rmi.* ;
public class Client {
public static void main (String[] arg) throws Exception {
........
BanqueDistante bk =
(BanqueDistante) Naming.lookup("rmi://"+hote+"/banque") ;
CompteDistant cpt = bk.compteClient(nomClient) ;
cpt.depot(depot) ;
cpt.retrait(retrait) ;
........;
}
}
La demande de refrence distante initiale au registry se fait au
moyen de la mthode Naming.lookup() .
Comme cette mthode rend un rsultat de type Object noter la
ncessiter doprer une projection de type (cast).
Largument de dsignation est une chane en format URL de la
forme:
rmi://hote:port/clef
hote est la dsignation de la machine hte sur laquelle tourne
le registry
la dsignation du port est optionnelle (si le registry coute sur
un port diffrent du port par dfaut 1099)
clef est le mot-clef sous lequel est enregistr le service.
on notera que cette dsignation est aussi valable pour le bind
//code cot serveur
Naming.rebind(rmi://localhost:6666/banque, bank );
// ici registry coute sur port 6666
12/225
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
Check-list pour une mise en oeuvre simple
Le cadre de notre exemple suppose que les classes suivantes soient
accessibles dans le classpath des applications:
SERVEUR:
Banque.class CompteDistant.class
BanqueDistante.class CompteExporte.class
BanqueExportee.class CompteExporte_Stub.class
BanqueExportee_Stub.class ExceptionDecouvert.class
Compte.class Serveur.class
Remarquer la ncessit de disposer des classes de Stub : le bind envoie
au registry une instance de ce type.
RMIREGISTRY:
BanqueDistante.class CompteDistant.class
BanqueExportee_Stub.class CompteExporte_Stub.class
Le cas est ici particulier pour deux raisons:
rmiregistry dcode les objets qui lui sont passs et donc a
besoin des classes et interfaces correspondantes au type des
Stubs. Ce comportement est particulier cette implantation de
rfrence du service de registry.
Dans le cas de chargement dynamique des classes de Stub (voir
annexe) il faut, au contraire, viter davoir de telles classes
accessibles dans le classpath de rmiregistry.
CLIENT:
BanqueDistante.class CompteDistant.class
BanqueExportee_Stub.class CompteExporte_Stub.class
Client.class ExceptionDecouvert.class
Ici cest la prsence des classes de Stub qui peut surprendre. Dans de
nombreux cas de dploiement, comme pour les Applets, ceci ne pose
aucun problme puisque cest le serveur qui dploie le code client. Dans
dautres cas on pourra sorienter vers un chargement dynamique de ces
classes (voir annexe).
12
12/226
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Exercice:miseenplacedeR.M.I .
Exercice :
On dnira un service distant de la manire suivante :
package rmi ;
import java.rmi.* ;
import java.sql.* ;
public interface TimeService extends Remote {
Timestamp[] echo(Timestamp arg) throws RemoteException;
}
Ici le service demand est analogue celui vu dans Mini-
exercice:, page 188. On envoie un Timestamp et on en rcupre
deux. Le nom du service (tel quil sera index par le Registry)
sera timestamp.
Faire lexercice en plusieurs phases :
dabord en lanant le test en local et en partageant toutes les
classes entre client, serveur et registry
ensuite en sparant soigneusement les classes visibles par le
client, le serveur, le registry (toujours en local).
Pour les trs rapides (ou ceux qui rvisent) : faire fonctionner le
service entre plusieurs machines avec tlchargement
dynamique des classes.
12/227
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
Complments
Les complments techniques suivants constituent une annexe de rfrence
Telechargement dynamique des codes de classe
Un partenaire dun change RMI peut se trouver dans une situation o il
ne dispose pas dun code de classe:
parcequune classe de Stub na pas t installe localement
parceque le type effectif dun objet accompagnant un appel de
mthode nest pas connu localement. Du fait du polymorphisme
on peut avoir en effet un type runtime diffrent du type dclar
dans le contrat de linterface Remote.
On notera que cette incertitude peut exister pour chacun des partenaires
(client ou serveur -de fait la distinction traditionelle entre client et serveur
peut devenir peu pertinente: un serveur pouvant prendre linitiative
dun change vers un objet export par le client-).
Contexte de scurit
Le premier point est que toute J.V.M qui tlcharge dynamiquement du
code doit mettre en place un SecurityManager (sil nest pas dj
prsent -cas des Applets par ex.-):
System.setSecurityManager(new SecurityManager());
//ou par option lancement de la J.V.M.
La prsence dun environnement de scurit ncessite une mise en place
dune politique de scurit:
java -Djava.security.policy=myrmi.policy pack.Client .....
Ce chier policy contenant une entre de type :
permission java.net.SocketPermission host:1024-, connect ;
On peut galement tenter de rduire le nombre de ports admis en
spciant : le port du rmiregistry, un port que les objets serveurs ont
choisi (voir constructeur spcial de UnicastRemoteObject).
12
12/228
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Mise en place du tlchargement des classes
Les objets impliqus dans des changes R.M.I. contiennent une annotation
qui permet dindiquer une URL dorigine de la classe correspondante. Le
ClassLoader local qui dsrialize lobjet peut prendre en compte cette
URL pour charger la classe en fonction du protocole indiqu dans lURL.
De manire pratique le protocole le plus utilis est http. Ce qui suppose la
mise en place dun serveur http pour exporter le code des classes.
Pour annoter correctement les objets et Stubs impliqus :
Soit xer la proprit java.rmi.server.codebase dans le
contexte de la JVM exportatrice.
Soit xer un ensemble dURL accessibles et les passer un
URLClassLoader. Exemple :
public static void main(String args[]) throws Exception {......
URL[] tbURL = new URL[args.length] ;
for (int ix = 0 ; ix < args.length; ix++) {
tbURL[ix] = new URL(args[ix]) ;
}
URLClassLoader classLoad = new URLClassLoader( tbURL) ;
Remote ss = (Remote) classLoad.loadClass(nomClasseRacine).
newInstance();
// ici la classe racine a un constructeur sans paramtre
//attention les classes dpendantes ne doivent pas tre vue du classpath local
Naming.rebind("Server", ss) ;
}
}
Dans les deux cas il est souhaitable dorganiser un dploiement dans des
jars et dutiliser des URLs comme:
jar:http://server:8080/mesclasses.jar!/
Attention: dans ce cas si on utilise rmiregistry comme registry prendre
soin de lui retirer toute visibilit directe sur les classes concernes (sinon il
reconstituera des annotations errones au moment o il envoie le Stub au
client).
12/229
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
Personnalisation des mcanismes sous-jacents RMI
La classe java.rmi.server.UnicastRemoteObject dispose de
constructeurs ou de mthode de classe qui permettent :
de xer le numero de port utilis pour exporter lobjet (utile
dans un contexte sous SecurityManager).
de personnaliser les Sockets sous-jacentes (via
RMIServerSocketFactory et RMIClientSocketFactory).
On peut ainsi par exemple mettre en place des sockets UDP, des
Sockets SSL -voir package javax.net.ssl-), ou des Sockets
avec compression des donnes, etc. voir:
docs/guide/rmi/socketfactory/index.html
Pour une liste des Properties de conguration voir :
docs/guide/rmi/spec/rmi-properties.html.
Par ailleurs RMI est automatiquement capable de transformer une requte
bloque par un pare-feu en appel HTTP POST.
12
12/230
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Serveurs dormants, serveurs rsilients
Les objets exports ne sont pas ncessairement des instances situes dans
un serveur actif. On peut tout fait dclarer un objet pour lexportation
et ensuite arrter la JVM serveur.
Lorsquun client demande une rfrence lobjet est resuscit au sein dune
JVM active.
Ces objet particuliers sont Activatable et un dmon systme particulier
rmid sert enregistrer ces objets et les activer (notons que rmid joue
aussi le rle de registry).
Voir docs/guide/rmi/activation.html
12/231
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
JINI
(voir http://www.jini.org)
JINI permet lorganisation de services spontans sur un rseau.
Cest un ensemble de protocoles et de rgles de programmation qui
permettent de rechercher un service (ou de le publier), de tlcharger
un mandataire (proxy) de service (code java qui gre un dialogue avec le
service, ou partie de service qui sexcute sur le client).
Lutilisation de ces services par des codes clients est soumis des rgles
de comportement (bail de ressource sur le serveur, vnements distribus,
transactions distribues).
Protocoles de recherche et dcouverte
Unicast Discovery Protocol : on se connecte un
ServiceRegistrar connu (URL Jini, messages TCP): pour
enregistrement dun service, recherche dun service,
enregistrement dune consigne (vt. distribu).
Multicast Request: demande de recherche de ServiceRegistrar
diffuse en multicast.
Multicast Announcement: un ServiceRegistrar annonce son
existence sur le rseau.
12
12/232
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Utilisation des Services
RMI Classique
Code sur client + talon de communication
Code sur client
talon
client
telechargement talon
service (Java)
RMI, ....
mandataire service
client
telechargement proxy (+talons)
service (Java)
RMI, ....
+talon
service autonome
client
telechargement code service
12/233
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
12
Les rfrences distantes (R.M.I.)
Talon daccs un service non-Java
Codes Java servant de frontaux des dispositifs matriels
mandataire
client
telechargement proxy
(non Java)
protocole priv
mandataire
mandataire
telechargement proxy
(Java?)
mandataire
device
code substitut
device
device
service
12
12/234
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Les rfrences distantes (R.M.I.)
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Laccs aux bases relationnelles (J.D.B.C) 13
Points essentiels
LAPI JDBC contient une srie dinterfaces conues pour permettre au
dveloppeur dapplications qui travaillent sur des bases de donnes de le
faire indpendamment du type de base utilis
Ce chapitre constitue une introduction technique JDBC:
Pilotes (drivers) JDBC.
tablissement de connexion et contexte dexcution (Statement)
requtes la base et rcupration des rsultats.
13
13/236
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Laccs aux bases relationnelles (J.D.B.C)
Le package java.sql
Le package java.sql permet de raliser des applications qui exploitent
des bases de donnes relationnelles. Laccs aux bases se fait en SQL au
travers de modalits standardises (JDBC). En ce sens JDBC est typique
des API daccs: java.sql dnit essentiellement des interfaces daccs qui
sont ralises par des pilote (drivers).
Une application Java qui fait appel JDBC sappuiera sur un petit nombre
de classes standard (comme le DriverManager) qui permettront
lutilisation de classes complmentaires livres avec les pilotes spciques
une base..
Liste indicative des pilotes :
http://java.sun.com/products/jdbc/jdbc.drivers.html
APPLICATION JAVA
JDBC DriverManager (java.sql)
Driver JDBC (fournisseur A) Driver JDBC (fournisseur B)
S.G.B.D. A
S.G.B.D. B
13/237
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
13
Laccs aux bases relationnelles (J.D.B.C)
Types de drivers JDBC
Le choix des pilotes dpend des caractristiques de la base et du type
darchitecture systme retenue :
architecture deux parties : lapplication communique
directement avec le systme de gestion de base de donnes.
architecture trois parties : lapplication cliente fait traiter ses
requtes par une application serveur qui gre les modalits et la
cohrence des appels la base de donnes.
Le protocole client/serveur peut trs bien ne contenir aucune
rfrence SQL.
On classe habituellement les pilotes en 4 catgories:
1. Pont JDBC-ODBC : permet de transcrire les appels JDBC en appels
un driver ODBC (les deux modles sont assez proches). Les
driver ODBC sont raliss en code natif.
2. Accs direct lAPI de la base: le pilote est ralis en code natif sur
lAPI daccs la base de donnes.
3. Driver deux parties JDBC-Net: le pilote est en pur Java et
communique avec un correspondant capable de dialoguer
directement avec la (ou les) base(s).
4. Driver pur Java sur protocole spcique: le pilote retranscrit les
appels JDBC en appels du protocole distant spcique la base.
13
13/238
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Laccs aux bases relationnelles (J.D.B.C)
Modalits dune session JDBC
La ralisation dun accs JDBC aux bases de donnes suit toujours le
mme schema :
Dsignation de la ressource cible. Cette dsignation se fait au
travers dune chane de description dune URL et permet dactiver
un pilote particulier. Le DriverManager permet cette activation
condition que le programmeur ait veill lui faire connatre un
pilote adapt.
Obtention dun objet de type Connection.
Permet de grer une session de consultation de la base.
Obtention dun objet de type Statement.
Dans le cadre dune Connection on obtient des objets de ce type
pour formuler des requtes SQL la base.
Exploitation des rsultats : si la requte est de type SELECT, les
objets ResultSet permettent de recuprer les donnes
rsultantes.
13/239
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
13
Laccs aux bases relationnelles (J.D.B.C)
Enregistrement des pilotes
Il y a deux mthodes principales pour faire connatre un pilote JDBC
lobjet DriverManager:
Chargement explicite de la classe principale du pilote.
Les spcications JDBC prcisent que lorsque le ClassLoader
charge une classe qui ralise lAPI dcrite par java.sql.Driver,
celle ci doit crer un objet du type correspondant et lenregistrer
auprs du DriverManager.
Dans ce cas il faut:
Connatre le nom complet de la classe Driver: par ex.
com.imaginary.sql.msql.MsqlDriver
Faire en sorte que cette classe (ou une archive .jar la contenant)
soit dans le CLASSPATH de lapplication.
public class LanceurJDBC {
public static void main(String[] args) throws Exception{
Class.forName(args[0]);
// nom de la classe passe en paramtre dappel
// ou de tout autre manire
....
}
}
Communication dune liste de classes Driver au travers des
arguments dappels de Java:
java -Djdbc.drivers=com.acme.ThatDriver:fr.gibi.MonPilote
Le DriverManager peut interroger le systme pour connatre la
liste des pilotes disponibles et les charger.
13
13/240
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Laccs aux bases relationnelles (J.D.B.C)
Dsignation de la ressource
Pour tablir une connexion une base on va adresser au
DriverManager une chane didentication de la ressource recherche.
Cette chane doit suivre une syntaxe standard qui suit la syntaxe des URL:
jdbc:sous_protocole:parametres
sous_protocole dsigne un type spcique de mcanisme pouvant tre
ralis par un ou plusieurs pilotes. Le contenu des paramtres dpendent
de ce sous_protocole. Il convient donc de suivre le mode demploi
indiqu par les pilotes pour savoir dsigner une ressource dune manire
adapte: cest la rdaction correcte de cette url qui permettra au pilote de
se reconnatre.
En effet le DriverManager essaie, dans lordre, tous les pilotes
enregistrs en leur passant lurl demande. Le premier pilote qui sait
tablir la connexion emporte la dcision.
Voici, par exemple, une chane de caractres reprsentant une url pour un
pilote de nom msql qui tablit une connexion rseau sur une machine
serveur sur un numro de port donn:
jdbc:msql://monserveur:6666/MaBase
ceci tant fabriqu par exemple par linstruction:
String url = jdbc:msql:// +nomserveur + : + port +/ + base ;
13/241
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
13
Laccs aux bases relationnelles (J.D.B.C)
Obtention de la connexion
Pour obtenir une instance daccs la base conforme
java.sql.Connection on doit appeler:
Connection conx = DriverManager.getConnection(chaineUrl) ;
Cet objet permet dobtenir des informations sur la base et, surtout, permet
dtablir des contextes de requtes.
Dautres formes de getConnection existent; si aucun pilote nest trouv
le rsultat sera null, si une anomalie sest produite au regard des
exigences de la base une SQLException sera propage.
13
13/242
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
Laccs aux bases relationnelles (J.D.B.C)
Obtention dun contexte de requtes
Des objets contexte de requte (Statement) peuvent tre obtenus dans
le cadre dune connexion. Un objet Statement permet de traiter une seule
requte SQL statique en mme temps. Si lon veut traiter plusieurs
requtes en parallle il faut ouvrir plusieurs Statement.
// cration dun contexte de requte
Statement stmt = null ;
try {
stmt = conx.createStatement() ;
} catch (SQLException exc) {
// traiter exception
}
Lobjet Statement permet dexcuter divers type de requtes, ainsi , par
exemple, pour une requte modicative de la base (INSERT, UPDATE,
DELETE):
//
int nombre = stmt.executeUpdate(
DELETE from Clients WHERE id = 16899023455);
La mthode executeUpdate(sqlString) renvoie un entier qui
reprsente le nombre denregistrements affects.
13/243
Intitul Cours: Matrise de la programmation en langage Java
Rvision : J3
Date : 4/6/02
13
Laccs aux bases relationnelles (J.D.B.C)
Exploitation de resultats
Dans un contexte Statement la mthode executeQuery permet de lancer
une requte rendant des enregistrements (SELECT):
ResultSet res = stmt.executeQuery(SELECT * from Clients) ;
Lobjet de type ResultSet permet dobtenir des informations sur le rsultat
et de parcourir les enregistrements:
while (res.next()) {
String nomClient = res.getString(2) ;
String id = res.getString(1) ;
table[ix++] = new Client(id, nomClient) ;
}
Les colonnes de lenregistrement sont numrotes partir de 1. Pour
chaque colonne on peut rcuprer le rsultat dans un type Java appropri
en utilisant une des mthodes getXXX() -voir table page suivante-. Il est
galement possible de rechercher une colonne par son nom plutot que par
son numro dordre.
Les ResultSets permettent galement des rcuprations par blocs de N
enregistrements:
regroupement de rsultats en blocs : stmt.setFetchSize(25);
navigation dans les rsultats : rs.previous(), ...