381
les Cahiers du Programmeur Emmanuel Puybaret Gratuit ! Borland JBuilder 2005 Foundation, Eclipse 3, Java, MySQL, Tomcat Versions complètes pour Windows, Linux et Mac OS X, sans limitation de durée. 3 e édition

À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

les Cahiersdu Programmeur

E. P

uyba

ret

Programmez intelligent

À travers la réalisation d’un forum de discussion et plus de 50 études decas, ce cahier montre à tous les programmeurs comment exploiter larichesse de Java pour créer sans mal des applications fiables et évolutives.

Ce cahier met à la portée de tous les développeurs les meilleures pratiquesJava, depuis l'installation des outils de développement et la création d'unpremier objet jusqu'à la programmation multitâche, en passant par l'accèsaux bases de données, la conception d'interfaces utilisateur, la gestion deformulaires, de fichiers, la maîtrise des subtilités objet…

Cod

e éd

iteur

: G

11916

ISB

N:

2-2

12

-11

91

6-X

29 €

9782212119169

Java 1.4 et 5.0Premières applicationsJ2SE 1.4, J2SE 5.0, XML, JDBC, Swing, applets, servlets, JSP, JavaBeans, comparaisons C++ et C#

avec les Cahiersdu Programmeur

Con

cept

ion

couv

ertu

re:

Nor

dcom

po

Ingénieur en informatique etaéronautique, EmmanuelPuybaret a plus de dix ansd’expérience en programmationobjet multiplateforme dans desdomaines aussi variés quel’industrie, les télécoms et labanque. Consultant indépendantpartagé entre développementset formations, il créa en 1998le site eteks.com entièrementconsacré à Java.

Emmanuel Puybaret

Java

SommairePrésentation des études de cas. Principes de base et installation de l’environne-ment. De l’utilité d’une démarche objet • Cycle de développement • Télécharger et ins-taller Java sous Windows, Linux et Mac OS X. Création de classes. Pourquoi typer ?• Encapsulation • Créer ses propres classes • Organisation des fichiers des classes •Paquetages et import. Opérateurs et instructions de contrôle. Réutilisation desclasses. Composition • Héritage • Polymorphisme. Classes de base. L’ancêtre Object• Gestion des dates • Tableaux • Collections. Abstraction et interface. Gestion deserreurs avec les exceptions. Pile d’exécution • Intercepter avec try et catch •Déclencher avec throw • Exceptions contrôlées. Gestion des fichiers. Flux de données• Filtres. XML et Java. SAX-DOM. Connexion à une base de données avec JDBC.Installer MySQL • Programmer en SQL avec JDBC. Interfaces utilisateur avec Swing.Composants et conteneurs • Layouts • Gestion événementielle et listeners • Créationd’applets. Serveurs web avec servlets/JSP/JavaBeans. HTTP et CGI • Servlets •Installer Tomcat • Application web • Balises JSP • JavaBeans. Interface utilisateurdu forum. Scénario d’utilisation • Programmation des pages JSP du forum.Programmation multithread. Timer • Thread • Programmation du chat •Synchronisation. Annexes. Licences logicielles • Organisation des fichiers du forum •Erreurs de compilation les plus fréquentes • Glossaire • Contenu du CD-Rom.

Cette 3e édition mise à jour et augmentée du Cahier du programmeur Java estaccompagnée d’un CD-Rom offert contenant :• les outils et environnements de développement Java pour Linux, Windows et Mac

OS X : JDK 1.5, MySQL, Tomcat, JBuilder 2005 Foundation (version française) etEclipse 3, ConTEXT (Windows uniquement) ;

• le code source des études de cas testé sous Windows, Linux et Mac OS X.

1.4

et

5.0

Gratuit !Borland JBuilder 2005 Foundation, Eclipse 3, Java, MySQL, TomcatVersions complètes pour Windows, Linux et Mac OS X,

sans limitation de durée.

Configuration recommandée :128 à 512 Mo de RAM suivant les outils • 560 Mo d'espace disqueVersions Windows et Linux :PC avec processeur Pentium III 233 MHz ouplus (ou compatible) • Windows 98, Me, NT,2000, XP, Red Hat Linux 7.3, Debian… Version Mac OS X : version 10.3 ou supérieure.

3e édition

_ g

Page 2: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

les Cahiersdu Programmeur

Java1.4 et 5.0

3e édition

PDT_Puybaret_Java3 27/01/06 16:27 Page 1

Page 3: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Dans la même collection Les Cahiers du programmeur XUL Jonathan PROTZENKO

N°11675, 2005, 320 pagesEmbarqués dans l’excellent navigateur libre Mozilla Firefox, XUL et leframework XPFE de Mozilla ouvrent la voie à la création et au déploie-ment d’applications web riches s’appuyant, à la manière d’AJAX, sur lesstandards du Web (CSS, Javascript, XML, RDF…).

Les Cahiers du programmeur SPIP 1.8 Vincent CARON, Yann FORGERIT

N°11428, 2005, 446 pagesSPIP devient incontournable pour la réalisation de sites web collaboratifsauxquels tout un chacun doit pouvoir contribuer. Fondé sur PHP, MySQL,HTML et CSS, il offre un contrôle fin des étapes de création de conte-nus hiérarchisés.

Les Cahiers du programmeur PHP/MySQL et JavaScriptPhilippe CHALÉAT, Daniel CHARNAY et Jean-René Rouet

N°11672, 2005.L’association de PHP/MySQL et de JavaScript offre au développeurun large éventail de possibilités pour réaliser, autour de formulairesHTML et de feuilles de styles CSS, des applications ergonomiqueset performantes.

Les Cahiers du programmeur PHP 5PHP objet et XML Stéphane MARIEL – N°11234, 2004.L’étude de cas, une application IRC de rencontre sur le Web, tireparti de tout ce qu’offre PHP 5 : design patterns et objets, créationde documents XML à la volée, transformation XSL pour des sitesaccessibles même depuis votre téléphone mobile, utilisation de SQ-Lite…

Les Cahiers du programmeur UML 2Pascal ROQUES – N°11770, 2006.UML est un outil simple et universel : nullement réservé aux appli-cations Java ou C++, il peut servir à modéliser des sites Web mar-chands, dont la complexité en fait des candidats naturels à la mo-délisation. Toutes les étapes de conception sont décrites,abondamment illustrées et expliquées, à travers une démarche si-tuée à mi-chemin entre processus lourd et processus léger.

Les Cahiers du programmeur ASP.NETThomas PETILLON – N°11210, 2003.Ce cahier décrit la mise en place d’une base de données publiée etéditable via ASP.NET en VB.NET et C#. Le développeur apprendraà manipuler des données XML, mettre en œuvre des services Web,sécuriser et déployer la base.

Les Cahiers du programmeur Java/XMLRenaud FLEURY, Caroline de VASSON – N°11316, 2005.Au fil de la refonte d'un système d'information de site e-commerce,ce cahier illustre les meilleures pratiques J2EE à mettre en oeuvretant pour la modélisation et la présentation de flux XML que pour laconception de services web.

Dans la collection Accès libreB. CACCINOLO, L. DRICOT, J. MARKOLL, N. PERRIAULT, G. FABIO

UbuntuN°11608, 2006, 360 pages, avec CD-Rom.

C. GÉMY

Gimp 2 efficaceN°11666, 2005, 362 pages.

S. GAUTIER, C. HARDY, F. LABBE, M. PINQUIER,

L. GODARD, E. BACHARD

OpenOffice.org efficace 2N°11638, 2006, 420 pages avec CD-Rom.

S. BLONDEEL, D. CARTRON, H. SINGODIWIRJO

Débuter sous Linux avec MandrivaN°11689, 2006, 530 pages, avec CD-Rom.

V. GARCIA

Home cinéma et musique sous Linux.N°11402, 2004, 200 pages.

T. TRUBACZ

Firefox, Retrouvez votre efficacitésur le Web !N°11604, 2005, 210 pages, avec CD-Rom.

D. GARANCE, A.-L. QUATRAVAUX, D. QUATRAVAUX

Thunderbird, Le mail sûr et sans spamN°11609, 2005, 300 pages, avec CD-Rom.

M.-M. MAUDET, A.-L. et D. QUATRAVAUX

SPIP 1.8 Créer son site avec des outils libresN°11605, 2005, 380 pages

A.-L. QUATRAVAUX, D. QUATRAVAUX

Réussir un site web d’association…avec des outils gratuitsN°11350, 2004, 280 pages.

Chez le même éditeurA. HABERT, C. BRAVO

Scripting windowsN°11692, 2005, 352 pages.

R. GOETTER

CSS 2 Pratique du design web

N°11570, 2005, 300 pages.

R. HERTZOG

Debian GNU/Linux2e édition (coll. Cahiers de l’Admin) – N°11639, 2005, 320 pages.

B. MARCELLY, L. GODARD

Programmation OpenOffice.orgMacros OOoBASIC et APIN°11439, 2004, 700 pages.

B. BOUTHERIN, B. DELAUNAY

Sécuriser un réseau Linux2e édition, (coll. Cahiers de l’Admin) – N°11445, 2004, 188 pages.

E. DREYFUS

BSD2e édition (coll Cahiers de l’Admin) – N°11463, 2004, 300 pages.

PDT_Puybaret_Java3 27/01/06 16:27 Page 2

Page 4: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

les Cahiersdu Programmeur

Java1.4 et 5.0

3e édition

Emmanuel Puybaret

PDT_Puybaret_Java3 27/01/06 16:27 Page 3

Page 5: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

Avant-propos

Java est reconnu comme l’un des meilleurs langages de programmationobjet. Cet ouvrage suit une démarche didactique progressive et vous aidera àcomprendre la modélisation objet telle qu’elle est appliquée en Java et danssa bibliothèque. Chaque concept est abordé isolément et accompagné d’uneapplication simple et le plus possible concrète. Enfin, pour vous permettrede percevoir l’environnement Java dans sa globalité, cet ouvrage met enœuvre la création d’un forum de discussion.

Organisation de l’ouvrageAprès une présentation des principales applications dans le premier chapitre,cet ouvrage est divisé en trois parties.

La première partie couvre les fondements objet du langage Java : son archi-tecture, la création de classes, la programmation de traitements et les méca-nismes de réutilisation mis à disposition.• Le chapitre 2 présente les principes de la programmation objet et leur

application dans l’architecture de Java avant d’aborder l’installation desoutils de développement Java.

• Le chapitre 3 est consacré à la création des classes et des objets, avec leursméthodes et leurs champs.

• Le chapitre 4 aborde la programmation des traitements d’une méthodegrâce aux opérateurs et aux instructions de contrôle Java.

• Le chapitre 5 explore les possibilités de la composition, de l’héritage etdu polymorphisme pour créer l’architecture de vos classes.

Configuration logicielle requise

Les études de cas présentées dans cet ouvragepeuvent être reproduites sur toute machine quisupporte Java 1.4 (ou une version ultérieure deJava) et le système de gestion de bases de don-nées MySQL, c’est-à-dire à peu près sur n’importequel système, notamment Windows, Linux, MacOS X, Solaris, HP-UX, AIX, SGI IRIX et FreeBSD.Ces études de cas en particulier ont été testéesavec succès avec J2SE 5.0_06, MySQL 5.0.18 etTomcat 4.1.31 sous Windows 98 SR2 / XP, Linux(distribution Knoppix 3.9) et Mac OS X (10.4).

Page 6: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004VI

La deuxième partie de l’ouvrage met en œuvre les classes principales de labibliothèque Java dans diverses applications, avant d’aborder les mécanismesd’abstraction et de traitement d’erreurs.• Le chapitre 6 est consacré aux classes de la bibliothèque Java qui permet-

tent de manipuler des textes et des dates, effectuer des calculs mathéma-tiques ou gérer des tableaux et des ensembles d’objets. Ce chapitre intro-duit aussi les classes de base du forum de discussion.

• Le chapitre 7 aborde des notions indispensables pour bien utiliser labibliothèque Java, à savoir les classes abstraites et les interfaces.

• Le chapitre 8 présente les exceptions, qui constituent le mécanisme degestion des erreurs en Java.

La troisième partie décrit comment exploiter en Java les informations enre-gistrées dans des fichiers ou une base de données en Java et exposer cesinformations aux utilisateurs grâce à une interface homme machine.• Le chapitre 9 présente les possibilités offertes par Java pour lire et écrire

des informations dans des fichiers sous forme de flux de données.• Le chapitre 10 consacré à la création d’interfaces utilisateur graphiques

avec Swing, aborde comment mettre en page des composants Swing etgérer les interactions de l’utilisateur avec ces composants, puis la créationd’une application de carnet d’adresses et d’une applet de calcul de men-sualités d’emprunt.

• Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informationsdans une base de données grâce à JDBC et SQL, avec une mise en prati-que pour gérer dans MySQL les utilisateurs et les messages du forum dediscussion.

• Le chapitre 12 présente comment créer des pages HTML dynamique-ment avec les servlets et les pages JSP sur un serveur tel que Tomcat.

• Le chapitre 13 est consacré à la création de l’interface utilisateur duforum de discussion avec des pages JSP.

• Le chapitre 14 montre les différentes façons d’exploiter XML en Java.• Le chapitre 15 explique comment ajouter au forum une applet de chat et

la rendre réactive grâce aux fonctionnalités multitâches intégrées à Java.

À qui s’adresse cet ouvrage ?Que vous ayez peu de connaissances en programmation ou que vous maîtrisiezsur le bout des doigts les langages C, C++ ou C#, ce livre a pour objectif devous apprendre à programmer en Java comme un « pro ». Les débutantscomme les développeurs Java y trouveront une description des fonctionnalitésclés de Java illustrées par des solutions prêtes à l’emploi et la programmation

Le code source des études de cas est proposé surle CD-Rom qui accompagne cet ouvrage ou peutêtre téléchargé sur le site d’accompagnement, àl’adresse :

B http://www.editions-eyrolles.com

Si vous avez des remarques à faire ou si vousrecherchez des informations complémentaires surles sujets abordés dans cet ouvrage, n’hésitez pasà utiliser le forum prévu à cet effet à l’adresse :

B http://www.eteks.com

Les lignes de code réparties sur plusieurs lignes enraison de contraintes de mise en pages sont signa-lées par la flèche X.Les portions de texte écrites avec une police decaractères à chasse fixe et en italique, comme�������, signalent des informations à remplacerpar un autre texte.

Les appellations suivantes sont des marques com-merciales ou déposées des sociétés ou organisa-tions qui les produisent :• Java, JDBC, JSP, JVM, JDK, J2SE, J2EE,

JavaBeans, Solaris de Sun MicroSystems, Inc.• Windows de Microsoft Corporation.• Mac OS X de Apple Computer Inc.• MySQL de MySQL AB.

Aux programmeurs C/C++

Vous connaissez déjà le C ou, mieux encore,le C++ et vous désirez apprendre Java ? Tantmieux, car ces langages ont des syntaxes proches,ce qui accélérera d’autant plus votre apprentissagede Java. Pour vous aider à passer du C++ à Javaplus rapidement, vous retrouverez tout au long decet ouvrage les principales différences qui distin-guent ces deux langages sous formed’apartés C++.

Aux programmeurs C#

Comme C# et Java sont des cousins très proches,vous vous rendrez rapidement compte que passerde l’un à l’autre n’est pas une tâche très ardue. Lesprincipales différences entre ces deux langagessont mentionnées dans les apartés C# et certainsdes apartés intitulés JAVA 5.0.

Page 7: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Avan

t-pr

opos

© Groupe Eyrolles, 2004 VII

d’un forum de discussion. La démarche pédagogique de cet ouvrage vous gui-dera d’autant mieux qu’il utilise une mise en page élaborée pour mettre envaleur l’information essentielle, en reléguant sous forme de nombreux apartésles compléments d’informations.

RemerciementsJe tiens à remercier d’abord toutes les personnes de mon entourage qui m’ontsoutenu dans ce travail de longue haleine, ne serait-ce que par leur curio-sité... et particulièrement Diem My, Thomas et Sophie.

J’aimerais remercier aussi les stagiaires de la Brigade des Sapeurs Pompiersde Paris et de l’ITIN qui m’ont permis d’expérimenter l’approche du langageJava exposée dans cet ouvrage.

Finalement, un grand merci à l’équipe des Éditions Eyrolles, tout particuliè-rement à Muriel, Jean-Marie et Martine pour leur patience et leurs sugges-tions, ainsi qu’à Frédéric Baudequin, Régis Granarolo, Bernard Amade, Fré-déric, Sophie, Eliza, et Gaël.

Emmanuel PUYBARET

À propos de J2SE 5.0

Vous retrouverez tout au long de cet ouvrage lesnouveautés majeures apportées par la version 5.0de Java 2 Standard Edition sous forme d’apartésintitulés JAVA 5.0.

À propos de J2SE 6.0

Aucune des nouveautés prévues à ce jour dans laversion 6.0 de Java 2 Standard Edition, n’appor-tera de modifications aux bases fondamentales deJava qui sont abordées dans ce livre. Toutes lesinformations présentées dans cet ouvrage reste-ront donc d’actualité même si vous choisissez detravailler avec cette toute dernière version.

Page 8: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à
Page 9: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Eyrolles, 2002

Table des matières

IX

AVANT-PROPOS .................................................................... V

1. PRÉSENTATION DES ÉTUDES DE CAS ........................................... 1Applications isolées 2Carnet d’adresses 2Calcul des mensualités d’un emprunt 3Forum de discussion 4

Principales fonctionnalités 4Architecture technique 5

Module de messagerie instantanée (chat) 6En résumé... 6

2. PRINCIPES DU LANGAGE ET INSTALLATION DE L’ENVIRONNEMENT ...... 7Programmer en Java : une démarche objet 8

Du binaire à l’objet, 50 ans d’évolution de la programmation 8Ce que fait un objet et comment il le fait… interface et implémentation 10De l’analyse objet à l’écriture des classes Java 11

Écriture, compilation, exécution 11À chaque besoin son environnement Java : applets, servlets, applications 12

Télécharger et installer les programmes pour développer en Java 14Installation sous Windows 95/98/ME, NT, 2000/XP 15Installation sous Linux 16Installation sous Mac OS X 16

Télécharger, installer et utiliser la documentation 17Tester l’installation : votre première application Java 18

Compilation de l’application 18Les cinq erreurs de compilation les plus fréquentes 19Exécution de l’application 20Les trois erreurs d’exécution les plus fréquentes 21

En résumé... 22

3. CRÉATION DE CLASSES .......................................................... 23Typer : pourquoi et comment ? 24

Types de données objet et références 25Écrire une valeur littérale 25Affectation de variable 26Par l’exemple : déclarer et utiliser quelques variables 26

Encapsuler pour protéger les données des objets 28Portée d’utilisation et durée de vie 29

Manipuler des chaînes avec les méthodes de la classe java.lang.String 30Par l’exemple : construire un texte avec plusieurs chaînes 32

Définir une nouvelle classe 33Structure d’un fichier .java 33Commenter une classe 34Déclarer les champs d’une classe 34Déclarer les méthodes d’une classe 35

Paramétrage d’une méthode 35Implémenter les méthodes 36

Par l’exemple : une classe simulant une télécarte 36Créer des objets 39

Par l’exemple : une histoire de télécarte empruntée... 39Initialiser les champs d’un objet 40Initialiser un objet avec un constructeur 41

Par l’exemple : une classe simulant un service 42Surcharger les méthodes et les constructeurs 44

Organiser les fichiers des classes 45Automatiser la compilation avec un fichier de commandes 46Exécuter une application 48

Simplifier l’écriture des classes avec import 48Par l’exemple : afficher les unités restantes d’une télécarte 49

En résumé... 50

4. CONTRÔLE DES TRAITEMENTS AVEC LES OPÉRATEURS,BOUCLES ET BRANCHEMENTS .................................................. 51Opérateurs à connaître 52

Conversions numériques avec l’opérateur de cast 54Par l’exemple : conversion euro/franc français 55

Priorité des opérateurs 57Par l’exemple : comparer la somme de montants convertis 57

Piloter le programme avec les instructions de contrôle : boucles et branchements 59

Tester et décider sur condition avec if et switch 59Par l’exemple : convertir un nombre en toutes lettres 60

Répéter un traitement avec les boucles while, do et for 63Par l’exemple : quelques calculs de probabilité classiques 65

En résumé… 68

5. RÉUTILISATION DES CLASSES .................................................. 69Réutiliser en composant : la relation « a un » 70

Par l’exemple : une même adresse pour deux personnes 70Réutiliser en héritant : la relation « est un » 72

Définir une sous-classe 73Initialisation en deux temps pour les objets d’une sous-classe 73

Par l’exemple : alcoolisée ou non, choisissez votre boisson 74

Page 10: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Eyrolles, 2002X

Réutiliser en implémentant différemment : le polymorphisme 76Relation « est un » et conversion de référence 76

Par l’exemple : boisson et boisson alcoolisée, ne mélangez pas les genres... 76

Modifier l’implémentation d’une méthode avec la redéfinition 78Par l’exemple : changer de message 78

Modifier l’implémentation sans oublier la méthode redéfinie 79Par l’exemple : calculer les intérêts d’un compte épargne 80

Réutiliser sans créer d’objet avec les méthodes de classe 81Par l’exemple : afficher l’état d’un compte 82

Limiter la réutilisation avec final 84Déclarer des constantes 85

Par l’exemple : tester le titre d’un contact 85En résumé… 86

6. LES CLASSES DE BASE DE LA BIBLIOTHÈQUE JAVA ........................ 87La super-classe de toutes les classes : java.lang.Object 88

La méthode equals 88La méthode hashCode 88La méthode toString 89Forum : utilisateur du forum de discussion 89

Manipuler les chaînes de caractères (java.lang.String) 93Forum : outils de traitement pour les textes du forum 93

Communiquer avec la machine virtuelle (java.lang.System) 96Par l’exemple : ce que connaît la JVM de votre système… 97

Effectuer des calculs mathématiques (java.lang.Math) 98Par l’exemple : quelques valeurs mathématiques remarquables 99

Utiliser un type primitif sous forme d’objet avec les classes d’emballage 99

Par l’exemple : calculer les mensualités d’un emprunt 100Gérer la date et l’heure 103

Mémoriser la date et l’heure (java.util.Date) 103Afficher la date et l’heure (java.text.DateFormat) 103

Forum : message du forum 104Fixer et manipuler la date et l’heure (java.util.GregorianCalendar) 107

Par l’exemple : bon anniversaire ! 107Les tableaux pour gérer des ensembles d’éléments 110

Déclarer et créer un tableau 110Utiliser un tableau 111

Forum : générer le mot de passe d’un utilisateur 112Par l’exemple : afficher les jours fériés de l’année 112

Tableau multidimensionnel 114Manipuler les tableaux avec java.util.Arrays 115

Par l’exemple : trier les paramètres d’une application 116Les collections pour gérer des ensembles d’objets 117

Listes ordonnées d’objets (java.util.ArrayList et java.util.LinkedList) 118

Par l’exemple : casier à bouteilles ou cave à vin ? 119Ensembles d’objets uniques (java.util.HashSet et ja-va.util.TreeSet) 120

Dictionnaires d’objets (java.util.HashMap et java.util.TreeMap) 120

Par l’exemple : organiser les définitions d’un glossaire 121En résumé… 123

7. ABSTRACTION ET INTERFACE ................................................. 125Créer des classes abstraites pour les concepts abstraits 126

Par l’exemple : comparer les surfaces de différentes figures 126Séparer l’interface de l’implémentation 128

Définir une interface 129Par l’exemple : donner un prix à un objet 130

Implémenter une interface 130Par l’exemple : implémenter le prix d’un objet 131

Utilisation des interfaces 132Conversion de référence, suite et fin 132

Par l’exemple : boisson ou service, tout se paie 132Par l’exemple : l’addition s’il vous plaît ! 134

Implémenter l’interface java.lang.Comparable pour comparer deux objets 136

Par l’exemple : gérer l’ordre chronologique d’événements 136Énumérer les éléments d’une collection avec l’interface java.util.Iterator 138

Par l’exemple : trier les événements d’un agenda dans l’ordre chronologique 139

Encapsuler pour protéger le type des objets d’une collection 141Forum : gérer un ensemble d’utilisateurs 141

Manipuler les collections avec la classe java.util.Collections 142Par l’exemple : quels numéros mettre dans ma grille de loto aujourd’hui ? 144

En résumé… 148

8. GESTION DES ERREURS AVEC LES EXCEPTIONS .......................... 149La pile d’exécution, organisation et fonctionnement 150

Par l’exemple : calculer une factorielle 150Gérer les exceptions 153

Même un programme simple peut cacher des erreurs 153Intercepter une exception avec try catch 154

Par l’exemple : vérifier les erreurs de saisie 155Déclencher une exception avec throw 156

Par l’exemple : surveiller les cas limites 156Décrire un traitement final avec finally 159

Par l’exemple : finally, demander confirmation pour continuer 159

Catégories d’exceptions Java 160Exceptions non contrôlées 160Exceptions contrôlées 160Manipuler une classe à l’exécution avec la réflexion 162

Créer une classe d’exception 166En résumé… 166

9. LECTURE ET ÉCRITURE DE FICHIERS ......................................... 167Explorer le système de fichiers (java.io.File) 168

Page 11: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Tabl

e de

s m

atiè

res

© Eyrolles, 2002 XI

Par l’exemple : rechercher les fichiers dans un dossier et ses sous-dossiers 169

Lire et écrire des données sous forme de flux 170Mode d’accès aux données 171

Mode d’accès par flux de données 171Mode d’accès aléatoire 172

Lecture avec les flux de données 172Contrôler les erreurs sur un flux de données avec les exceptions 173

Par l’exemple : compter le nombre d’occurrences d’un caractère dans un fichier 175

Écriture avec les flux de données 176Filtrage des données d’un flux 178

Par l’exemple : éliminer les commentaires d’un programme Java 182Par l’exemple : compter les lignes de code d’un ensemble de fichiers Java 185

Configurer une application 187Fichiers de traduction 187Fichiers de préférences 188

En résumé... 188

10. INTERFACES UTILISATEUR AVEC SWING .................................. 189Composants d’interface utilisateur 190Mise en page des composants avec les layouts 191

Agencer les composants les uns à la suite des autres (java.awt.FlowLayout) 191

Par l’exemple : afficher des champs de saisie et leurs labels 192Disposer les composants dans une grille (java.awt.GridLayout) 193

Par l’exemple : interface utilisateur d’un clavier de calculatrice 193

Placer les composants aux bords du conteneur (java.awt.BorderLayout) 194

Par l’exemple : interface utilisateur d’un éditeur de textes 195Mise en page évoluée par combinaison de layouts 197

Par l’exemple : panneau de saisie des coordonnées d’un contact 198

À chaque système son look and feel 201Interagir avec l’utilisateur grâce aux événements 203

Événements 203Être à l’écoute des événements en implémentant un listener 203

Par l’exemple : quelle heure est-il ? 204Utiliser les classes anonymes pour implémenter un listener 205

Par l’exemple : générer des tirages de loto 206Par l’exemple : interface utilisateur d’un carnet d’adresses 208

Programmer une applet 210Par l’exemple : bienvenue dans le monde des applets ! 212

Créer une interface utilisateur avec une applet 213Par l’exemple : interface utilisateur du calcul de mensualité 213

En résumé... 216

11. CONNEXION À LA BASE DE DONNÉES AVEC JDBC .................... 217Utilisation d’une base de données en Java 218

Se connecter à une base de données avec un driver JDBC 219Par l’exemple : tester la connexion avec la base de données 220

Installation du SGBD MySQL 221Sous Windows 221Sous Linux 221Sous Mac OS X 222Installer le driver JDBC 222

SQL, le langage des bases de données 223Principaux types de données 223Mettre à jour les tables et les index 223Modifier et rechercher les enregistrements d’une table 224

Programmation SQL avec JDBC 225Utiliser une connexion JDBC (java.sql.Connection) 225Exécuter des instructions SQL (java.sql.Statement) 225Exploiter les résultats d’une sélection SQL (java.sql.ResultSet) 225

Par l’exemple : enregistrer les factures client 226Obtenir des informations sur la base de données (java.sql.DatabaseMetaData) 228

Forum : gérer la connexion à la base de données 228Paramétrer les instructions SQL d’accès à la base du forum (java.sql.PreparedStatement) 232

Forum : stocker utilisateurs et messages dans la base de données 232

En résumé... 238

12. PROGRAMMATION WEB AVEC LES SERVLETS, JSP ET JAVABEANS 239Protocole HTTP et programme CGI 240

Principe de l’architecture client-serveur 240Choisir un protocole pour communiquer 240Adresse IP et port, point de rendez-vous des serveurs Internet 241Requête HTTP vers une URL 241

Par l’exemple : afficher le contenu d’une URL dans une fenêtre Swing 242

Programme CGI 244Utiliser un formulaire HTML pour paramétrer un programme CGI 244

Par l’exemple : un formulaire de recherche 245Programmation d’une servlet sur le serveur 246

Classe javax.servlet.http.HttpServlet 246Interface javax.servlet.http.HttpServletRequest 246Interface javax.servlet.http.HttpServletResponse 247Renvoyer du texte HTML avec une servlet 247

Par l’exemple : Bienvenue dans le monde des servlets ! 247Installation de Tomcat 248Lancement de Tomcat 250Organiser les fichiers d’une application Web 251Compilation d’une application Web 252Mise en route d’une application Web 253

Page 12: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Eyrolles, 2002XII

Par l’exemple : exécuter la servlet de bienvenue 253Cycle d’exécution de la servlet de bienvenue 254Mise à jour d’une application Web 255

Créer l’interface d’une application Web avec les JavaServer Pages 258Balises JSP pour inclure du contenu dynamique 258

Variables JSP prédéfinies 259Par l’exemple : bienvenue dans le monde JSP 259Exécuter la page JSP de bienvenue 260

Contrôle des erreurs dans une page JSP 260Mise à jour des pages JSP 261Utiliser les classes Java dans une page JSP 261Utiliser les composants JavaBeans dans une page JSP 261

Par l’exemple : créer une liste de courses 264Faire appel à d’autres pages JSP 265

En résumé… 266

13. INTERFACE UTILISATEUR DU FORUM ...................................... 267Scénario d’utilisation 268

Scénario pour un utilisateur non identifié 268Scénario pour un utilisateur identifié 268

Programmation des pages du forum 270Organisation des pages du forum 270Utilisation des classes des paquetages com.eteks.forum et com.eteks.outils 270Identification de l’utilisateur 273Page d’accueil 276Inscription d’un utilisateur 278Messages d’un sujet 280Création de sujet, de message, et modification 282

Pages de saisie 282Pages d’ajout et de modification de message 284

Quitter l’application 286En résumé... 286

14. ÉCHANGER DES INFORMATIONS AVEC XML ............................ 287Premiers contacts avec XML 288

Description d’un document XML 288Par l’exemple : représenter une facture en XML 289

Document XML bien formé 290Document XML valide et DTD 291Créer une DTD 291

Par l’exemple : définir la DTD des factures 292Utiliser une DTD dans un document XML 293

Par l’exemple : utiliser la DTD d’une facture dans un document XML 293

Analyser un document XML avec JAXP 294Obtenir une instance d’un analyseur 294Analyser un document avec SAX 295

Par l’exemple : rechercher les articles d’une facture 295Vérifier la validité d’un document avec SAX 298

Par l’exemple : rechercher les erreurs dans un document XML 298

Analyser un document avec DOM 301Par l’exemple : rechercher le client d’une facture 301Forum : rechercher les utilisateurs ou les messages d’un document XML 303

En résumé... 307

15. MESSAGERIE INSTANTANÉE AVEC LA PROGRAMMATION MULTITÂCHE 309Gestion d’animations avec la classe javax.swing.Timer 310

Par l’exemple : afficher les nouvelles 310Programmation d’un thread avec la classe java.lang.Thread 312

Implémenter la méthode run 313Ajout d’un module de chat au forum de discussion 314

Interaction entre l’applet de chat et les pages JSP 315Composants JavaBeans du serveur pour le chat 316

Ensemble des messages du chat 316Message du chat 317Ensemble des participants au chat 317Date de la dernière lecture des messages 317

Pages JSP de gestion du chat 317Arrivée d’un utilisateur dans le chat 317Lecture des participants au chat 318Lecture des messages du chat 319Ajout d’un message dans le chat 320Départ d’un participant du chat 321

Interface utilisateur du chat 321Threads nécessaires au chat 325Gestion de l’accès aux pages JSP du serveur 326

Page de lancement de l’applet 327Intégration du chat au forum de discussion 327

Synchronisation du module de chat 328États d’un thread 328Synchroniser les traitements sur les données partagées 329

De la nécessité de synchroniser... 329Synchroniser avec synchronized 330Chat : synchroniser l’accès à la liste des participants 331

Synchroniser les traitements dans un ordre déterminé 334Synchroniser avec wait et notify 334Chat : synchroniser l’envoi des nouveaux messages aux applets 336

En résumé... 340

ANNEXES ............................................................................. 341A. Types de licences logicielles 341B. Fichiers du forum de discussion 342C. Précisions sur les commentaires javadoc 344D. Contenu du CD-Rom d’accompagnement 345E. Erreurs de compilation les plus fréquentes 354F. Glossaire 358G. Bibliographie 360

INDEX ................................................................................. 361

Page 13: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

1Présentationdes études de cas

SOMMAIRE

B Présentation des études de cas

B Carnet d’adresses

B Calcul de mensualités d’emprunt

B Forum de discussion

B Messagerie instantanée (chat)

MOTS-CLÉS

B ApplicationB JavaB Base de donnéesB MySQLB TomcatB ForumB Chat

Cet ouvrage décrit la création de différents types d’applications, depuis une simple application isolée mettant en pratique un concept Java, jusqu’au développement d’un forum de discussion développé sur plusieurs chapitres.

Page 14: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 20042

Applications isoléesLe tableau 1-1 donne la liste des applications isolées (définies sur une oudeux sections qui se suivent) les plus intéressantes de cet ouvrage. Celles-cipourront servir de socle pour le développement de vos propres applications.

Carnet d’adressesL’application de carnet d’adresses permet de saisir les coordonnées d’unensemble de contacts et de les afficher à l’écran dans un tableau. Cette application vous montre comment créer une interface utilisateur avecles composants graphiques que vous avez l’habitude de trouver dans la plu-part des applications de votre ordinateur : fenêtres, menus, boîtes de dia-logue, champs de saisie...

Tableau 1–1 Description des applications isolées

Titre de l’application Chapitre Description

Convertir un nombre en toutes lettres 4 Montre comment convertir en toutes lettres un nombre compris entre 0 et 99 en tenant compte des exceptions de la langue française.

Quelques calculs de probabilité classiques 4 Calcule quelques probabilités connues en appliquant les formules mathémati-ques du calcul combinatoire.

Calculer les intérêts d’un compte épargne 5 Montre comment organiser deux types de comptes bancaires, l’un simple et l’autre permettant de calculer des intérêts cumulés.

Ce que connaît la JVM de votre système 6 Affiche les informations que connaît un programme Java sur votre système et son organisation.

Bon anniversaire 6 Calcule le nombre de jours avant votre prochain anniversaire.

Afficher les jours fériés de l’année 6 Affiche la liste des jours fériés français d’une année choisie par l’utilisateur.

Organiser les définitions d’un glossaire 6 Montre comment associer, dans un glossaire, un mot ou une expression à la définition correspondante.

Trier les événement d’un agenda dans l’ordre chrono-logique

7 Explique comment trier automatiquement les événements d’un agenda.

Quels numéros mettre dans ma grille de loto aujourd’hui ?

7 Tire aléatoirement 6 nombres entre 1 et 49 et affiche les nombres tirés dans une grille de loto.

Calculer le nombre de lignes de code d’un programme 9 Calcule le nombre de lignes de code, hors commentaires et lignes vides, desfichiers sources situés dans un dossier et ses sous-dossiers.

Enregistrer les factures de clients 11 Crée une table de factures dans une base de données puis retrouve les factu-res d’un client.

Créer une liste de courses 12 Montre comment créer sur un serveur Web une liste de courses qui soit propre à chaque utilisateur du site.

Vérifier la validité d’un document XML 14 Vérifie si un document XML est bien formé et valide.

Afficher les nouvelles 15 Affiche un texte paramétrable défilant verticalement à l’écran.

Page 15: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

1 –

Prés

enta

tion

des

étud

es d

e ca

s

© Groupe Eyrolles, 2004 3

Calcul des mensualités d’un empruntL’application de calcul de mensualités calcule le montant des mensualités etdes intérêts d’un emprunt en fonction du capital emprunté, de la durée del’emprunt et d’un taux d’intérêts.

Figure 1–1Saisie d’un contact dans

l’application de carnet d’adresses

La programmation de l’application de carnetd’adresses sera décrite au chapitre 10, « Interfacesutilisateur avec Swing ».

Figure 1–2Calcul des mensualités d’un emprunt

Cette application sera développée aux chapitres 6 « Les classes de base de la bibliothèqueJava » et 10 « Interfaces utilisateur avec Swing » :• Dans la section « Calculer les mensualités d’un emprunt » du chapitre 6, il vous est

d’abord montré comment calculer des mensualités en fonction de valeurs saisies par unutilisateur.

• L’interface utilisateur de cette application étant pour le moins rudimentaire (la saisie ducapital, du taux d’intérêt et de la durée de l’emprunt se fait dans trois boîtes de dialogueaffichées tour à tour), on montre en fin de chapitre 10 comment en faire une interfacedigne de ce nom.

Page 16: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 20044

Forum de discussionLe forum de discussion présenté dans cet ouvrage reprend les fonctionnalitésprincipales des forums disponibles sur l’Internet. Il permet à une commu-nauté d’utilisateurs de partager des informations sous la forme de messagesqui sont enregistrés par un serveur Web. Ces messages sont regroupés parsujet, par exemple une question posée à la communauté ou un sujet de dis-cussion lancé par un utilisateur. Les autres utilisateurs répondent à la ques-tion ou apportent leur contribution à la discussion lancée.

Principales fonctionnalitésLa lecture des messages du forum est accessible à tout internaute connecté auserveur, mais la rédaction de nouveaux messages est réservée aux utilisateursidentifiés grâce à un pseudonyme et un mot de passe. Tout internaute peutdevenir un membre de la communauté du forum en choisissant un pseudo-nyme unique. Une fois qu’un utilisateur est enregistré, le serveur lui attribue unmot de passe pour lui permettre de s’identifier avec le formulaire adéquat puisde contribuer au forum. Un utilisateur identifié peut rédiger de nouveaux messages et modifier aubesoin le contenu de ses anciens messages, grâce aux formulaires de rédactionprévus. Ses messages peuvent venir en réponse à d’autres ou lancer un nouveausujet de discussion, chacun étant automatiquement daté du moment de sacréation et signé du pseudonyme de son auteur. Pour éviter toute dérive dansles messages contraire à la netiquette, un utilisateur spécial, le modérateur, a ledroit de modifier tous les messages du forum.

B.A.-BA Modérateur et netiquette

Le modérateur a la charge de modifier les messa-ges des auteurs qui ne respectent pas la netiquette,pour éviter qu’ils ne portent atteinte aux bonnesmœurs (insulte, diffamation...) ou aux droits despersonnes (non-respect des droits d’auteur, diffu-sion d’informations confidentielles...). Ce rôle demodérateur est d’autant plus nécessaire que lesauteurs signent leurs messages avec leur pseudo-nyme pour assurer leur anonymat et que les messa-ges du forum présenté dans cet ouvrage sont lisi-bles par tous les utilisateurs identifiés ou pas.

Figure 1–3Exemple de page du forum

affichant les messages d’un sujet

Le scénario complet d’utilisation du forum estdécrit au début du chapitre 13, « Interface utilisa-teur du forum ».

Page 17: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

1 –

Prés

enta

tion

des

étud

es d

e ca

s

© Groupe Eyrolles, 2004 5

Architecture techniqueLe forum utilise une architecture qui fait intervenir les acteurs suivants :• un serveur de base de données, pour enregistrer les utilisateurs et leurs

messages ;• un serveur Web programmé en Java, pour gérer l’accès à la base de don-

nées et répondre aux requêtes des utilisateurs ;• les navigateurs Web des utilisateurs, pour afficher les pages renvoyées par

le serveur Web.

Le forum présenté ici utilise la base de données MySQL et le serveur JavaTomcat, mais la portabilité d’un programme Java permet en fait de déployerle programme prévu initialement pour Tomcat sur n’importe quel serveurqui prend en charge les pages JSP.

La base de données MySQL est elle aussi interchangeable avec la plupartdes autres systèmes de gestion de base de données du marché grâce au para-métrage du driver JDBC prévu pour le forum et décrit dans le chapitre 13,« Interface utilisateur du forum ».

Le forum étant l’application la plus complète de cet ouvrage, il est développé sur plusieurschapitres comme suit :• Une partie du chapitre 6 montre comment décrire en Java un utilisateur et un mes-

sage du forum et comment programmer différents outils nécessaires au forum, notam-ment pour calculer un mot de passe de façon aléatoire.

• La fin du chapitre 7 est consacrée à la description en Java d’un ensemble d’utilisateursdu forum.

• Le chapitre 11 est presque entièrement consacré à la gestion de l’enregistrement etde la lecture des utilisateurs et des messages dans une base de données commeMySQL.

• Le chapitre 13 montre comment intégrer les outils décrits dans les chapitres précé-dents pour créer dynamiquement les pages HTML de l’interface utilisateur du forum surle serveur Web.

• Le chapitre 14 présente comment retrouver une liste d’utilisateurs ou de messages dansdes données au format XML.

• Enfin, le chapitre 15 montre comment créer un module de chat qui exploite les don-nées au format XML fournies par le serveur Web et comment l’intégrer au forum dediscussion.

L’organisation de tous les fichiers nécessaires au fonctionnement du forum et du chat ainsique le diagramme UML de leurs classes sont présentés dans l’annexe B.

Page 18: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 20046

Module de messagerie instantanée (chat)À la différence du forum de discussion, le module de messagerie instantanée(chat) permet à chaque utilisateur identifié de dialoguer en direct avec lesautres utilisateurs de la communauté. Ainsi, un utilisateur du chat voit appa-raître dans son navigateur les messages postés dès leur rédaction, et ce sansavoir à recharger la page dans son navigateur. Les conversations se déroulent« en temps réel » avec les autre utilisateurs.

Ce module additionnel manipule aussi des notions d’utilisateur et de mes-sage et réutilise une partie des outils développés pour le forum.

En résumé...De la plus simple à la plus complexe, les applications développées dans cetouvrage vous donnent un aperçu réaliste des possibilités de Java et de sa trèsriche bibliothèque. Ces applications, nous l’espérons, vous permettront dedémarrer vos premières applications Java sur des bases solides.

Figure 1–4Exemple de conversation sur le chat

Le chat est développé au chapitre 15, « Messagerieinstantanée avec la programmation multitâche »de cet ouvrage.

Page 19: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

2Principes du langage

et installation de l’environnement

SOMMAIRE

B Comprendre la démarche objet

B Vue d’ensemble sur l’architecture Java

B Installation

MOTS-CLÉS

B Objets et classesB JVMB JDKB javadoc

Java intègre les concepts les plus intéressants des technologies informatiques récentes dans une plate-forme de développement riche et homogène. L’approche objet de ce langage, mais aussi sa portabilité et sa gratuité, en font un des outils de programmation idéaux pour s’initier à la programmation objet.

DesktopApplication

+

JVM

Fichiers . class

Page 20: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 20048

Programmer en Java : une démarche objet

Du binaire à l’objet, 50 ans d’évolution de la programmation La programmation identifie les données d’une information et les traitementsqui s’y appliquent puis les codifie pour les rendre compréhensibles par unordinateur. Le microprocesseur d’un ordinateur ne manipulant que des ins-tructions et des données codées en binaire, différents langages de program-mation ont été créés pour permettre aux programmeurs de coder des con-cepts plus humains que des 0 et des 1. Le texte d’un tel programme esttraduit par un compilateur ou un interpréteur en instructions que le micro-processeur peut alors exécuter.

REGARD DU DÉVELOPPEUR Les atouts de Java

Mis au point par Sun Microsystems, Java est un langage deprogrammation utilisé dans de nombreux domaines. Son succès est dû à un ensemble de caractéristiques dontvoici un aperçu :• Langage de programmation objet et fortement typé :

contraignants pendant le développement, l’approcheobjet et le typage fort du langage Java rendent plusrobuste un programme Java dès sa conception.

• Syntaxe proche du C et C++ : en reprenant une grandepartie de la syntaxe de ces deux langages, Java facilitela formation initiale des programmeurs qui les connais-sent déjà.

• Gestion de la mémoire simplifiée : le ramasse-miettes(garbage collector en anglais) intégré à Java détecteautomatiquement les objets inutilisés pour libérer lamémoire qu’ils occupent.

• Gestion des exceptions : Java intègre la gestion desexceptions autant pour faciliter la mise au point desprogrammes (détection et localisation des bogues) quepour rendre un programme plus robuste.

• Multitâche : grâce aux threads, Java permet de pro-grammer l’exécution simultanée de plusieurs traite-

ments et la synchronisation des traitements qui parta-gent des informations.

• Système de sécurité : Java protège les informations sen-sibles de l’utilisateur et le système d’exploitation de samachine en empêchant l’exécution des programmesconçus de façon malintentionnée (contre un virus parexemple).

• Bibliothèque très riche : la bibliothèque fournie enstandard avec Java couvre de nombreux domaines (ges-tion de collections, accès aux bases de données, inter-face utilisateur graphique, accès aux fichiers et auréseau, utilisation d’objets distribués, XML…, sanscompter toutes les extensions qui s’intègrent sans diffi-culté à Java !)

• Exécutable portable : comme l’exprime l’accroche WriteOnce Run Anywhere, un programme Java, une fois écritet compilé, peut être exécuté sans modification sur toutsystème qui prend en charge Java.

• Gratuit : développement gratuit avec les commandes debases Java, ou certains outils plus évolués, et exécutiongratuite des programmes.

B.A.-BA Vocabulaire de la programmation objet

L’une des difficultés de la programmation en Javapasse par l’utilisation des nombreux termes asso-ciés aux concepts de la programmation objet. Cestermes, décrits au fur et à mesure de cet ouvrage,sont repris dans le glossaire en annexe si vousvoulez vous rafraîchir la mémoire en cas de besoin.

Figure 2–1Compilation et

exécutiond’un programme

Compilation Exécution

Fichier contenant le texte d'un programme respectant la syntaxe d'un langage de programmation

01100100100110...

Fichier exécutable contenant des instructions binaires du

microprocesseur

Page 21: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 9

Les langages de programmation ont évolué pour permettre aux programmeursd’utiliser des concepts de plus en plus proches de la réalité et du langage naturel.La programmation en assembleur a remplacé le codage en binaire des don-nées par un codage en hexadécimal, et les instructions codées en binaire dumicroprocesseur par des instructions symboliques.

Exemple

Ces instructions écrites en assembleur Motorola 68000 placent la valeur� dans le registre ��, la valeur �� (�� en hexadécimal) dans le registre ��,puis additionne les valeurs de ces deux registres.

La programmation procédurale et structurée de langages comme le C, lePascal…, identifie les groupes logiques de données et les procédures décri-vant des suites cohérentes d’instructions.

Exemple

Voici la trame d’un programme écrit en C qui pourrait être utilisé sur untéléphone ���� � pour l’� ���. Ce ���� � a ici pour données sa������� et l’état de sa ���������.

La programmation orientée objet regroupe les groupes de données et les traite-ments qui s’y appliquent sous forme d’entités nommées objets. À un objet phy-sique avec son état et son comportement correspond un objet informatique avecses données et ses traitements. La programmation objet est aussi utilisée pourdes concepts abstraits, par exemple la gestion de comptes bancaires.

Le traitement d’un objet est programmé sous la forme d’un message.Exemple

Un téléphone portable peut être représenté sous la forme d’un objet dotédes messages suivants :

Le dernier message, ���� �, est paramétrable. Il prend en paramètre unnuméro de téléphone.

�����������������������������

����� �!��"���#��$�������%���#�������������%&��'��� �%

(����� ����)'��� ��$�� ��#���*"��+$���!�����!�,�-���.����������!���� ����!��������#��$+&

� ������������� �)�����*

Assembleur et langage d’assemblage

On appelle assembleur le programme qui trans-forme en code binaire ou en exécutable un pro-gramme écrit en langage d’assemblage. Le langaged’assemblage se compose de mnémoniques (pluslisibles que le code binaire) représentant les ins-tructions binaires d’un microprocesseur. Un programme directement écrit en langaged’assemblage exploite de façon optimale les capa-cités du microprocesseur mais n’est pas portabled’une puce à l’autre, chaque famille de micropro-cesseurs (Intel x86, PowerPC,...) ayant son proprejeu d’instructions.

B.A.-BA Hexadécimal

En hexadécimal ou base 16, les nombresdécimaux 10, 11, 12, 13, 14 et 15 sont représentéspar les chiffres hexadécimaux A, B, C, D, E et F. Lanotation hexadécimale continue à être souventutilisée en informatique pour manipuler les infor-mations binaires des images ou de sons digitali-sées, car elle est pratique pour noter chaquegroupe de 4 bits ou chiffres binaires sous formed’un seul chiffre hexadécimal. En voici quelquesexemples :

• / en décimal = / en hexa = ���� en binaire ;

• �� en décimal = �0 en hexa = � ���� en binaire ;

• �11 en décimal = 22 en hexa = ���� ���� en binaire ;

• � ��0 en décimal = 0�� en hexa = ��� ���� ���� en binaire.

À RETENIR

Appeler un traitement d’un objet, c’est envoyer unmessage à cet objet.

Figure 2–2 L’objet 3. .�#�������� � et ses messages

Page 22: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200410

Ce que fait un objet et comment il le fait… interface et implémentationUn objet est une boîte noire, munie d’une interface et de son implémenta-tion. L’interface spécifie la liste des messages disponibles pour un objetdonné, tandis que l’implémentation correspond à la programmation propre-ment dite des messages de l’objet avec ses données et ses traitements.

On pourra souvent considérer que l’interface est la liste des services proposéspar l’objet, et l’implémentation la manière de réaliser ces services. Quand unobjet reçoit un message disponible dans son interface, les traitements implé-mentés par ce message sont exécutés.

Un message reçu par un objet provoque souvent une réaction en chaîne. Parexemple, le message � �� envoyé au bouton OK d’une boîte de dialogueenverra le message ��� à la boîte de dialogue puis provoquera une actionqui correspondra au choix proposé.

Figure 2–3 Ensemble d’objets d’un programme communiquant par messages

Programme

À chaque métier ses objets

Dans un programme objet, les objets sont mis enrelation et communiquent entre eux par messages.

La liste des messages de l’interface d’un objet estfixée en fonction des besoins du programme où cetobjet sera utilisé. Selon le type d’application, l’ana-lyse des besoins peut aboutir à une interface diffé-rente pour un même objet.Par exemple, un téléphone portable pourrait êtredoté d’une interface objet avec les messagessuivants :• pour le programme du téléphone : � ��������� ���� �)�����*

• pour l’application de l’exploitant du réseau :4������5���

• pour le programme de gestion du fabricant dutéléphone : 5�6��������� 5�'��5���!����

DANS LA VRAIE VIE Penser objet, une démarche qui demande de l’expérience

Bien que basée sur un concept simple, la maîtrise de laprogrammation orientée objet et du mode d’analyse quilui est associé ne va pas sans pratique et demande doncque l’on y consacre du temps. Voici les principales difficul-tés que vous aurez à surmonter :• L’identification des objets, pour un problème donné,

requiert un niveau d’abstraction élevé.• Réfléchir à l’interface et aux messages des objets avant

d’étudier leur implémentation n’est pas une démarchesi naturelle qu’il n’y paraît et demande un bon espritd’analyse.

• Le découpage d’un problème en objets qui soient leplus indépendants possible les uns des autres permet

d’obtenir un programme plus simple à maintenir et desobjets que l’on va pouvoir réutiliser dans plusieurs pro-grammes. Cette démarche gagnante sur le long termedemande plus de temps d’analyse au départ.

• Dans un programme où les objets sont mis en relation,les liens que l’on crée entre eux doivent être clairs etlimités pour éviter une interdépendance trop complexeentre les objets.

• Quand un message met en œuvre plusieurs objets, ladécision d’ajouter le message à un objet plutôt qu’à unautre n’est pas toujours évidente à prendre.

Page 23: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 11

De l’analyse objet à l’écriture des classes JavaPendant la phase de conception des objets, on essaiera d’identifier des catégoriesd’objets ayant les mêmes messages et les mêmes types de données (par exemple,tous les téléphones portables, tous les boutons d’une boîte de dialogue).

Plutôt que de programmer individuellement chaque objet avec ses messageset ses données, un développeur Java programme un modèle, ou classe, pourchaque catégorie d’objets et crée les objets à partir de leur modèle. Chaqueclasse implémente les messages et les types de données d’une catégoried’objets. En fait, tout objet est créé à partir d’une classe (on dit aussi qu’unobjet est une instance d’une classe) ; même un objet doté de messages et detypes de données uniques est une instance unique d’une classe.

Le concept de classe est très important puisqu’en Java tout se programme àl’intérieur des classes.

Exemple

Un téléphone portable connecté à un réseau pourrait être représenté parles objets et classes suivants :

Écriture, compilation, exécutionDe la conception à l’exécution d’un programme Java, on compte troisphases :1 Écriture des classes dans des fichiers portant une extension 74�(�72 Compilation des fichiers 74�(� avec la commande 4�(��. Le compilateur

crée pour chaque classe un fichier d’extension 7� �!! contenant du codebinaire (bytecode) spécifique à Java. Un fichier 7� �!! décrit une classe, seschamps, ses méthodes et les instructions des méthodes.

À RETENIR Terminologie

Identifier une catégorie d’objets (mêmes mes-sages, mêmes types de données), c’est identi-fier une classe avec ses membres (méthodes etchamps).

Figure 2–4Identification des classes correspondant aux objets portable et réseau

[...] class Portable{[...] carteSIM;

[...] void appeler(java.lang.String numero) { [...] } void eteindre() { [...] } void allumer() { [...] }}

[...]class Reseau{ [...] void deconnecter(Portable telephone) { [...] } void connecter(Portable telephone) { [...] }}

À RETENIR

Programmer en Java, c’est donc :

• écrire les classes du programme, leursméthodes et leurs champs ;

• instancier les classes (créer les objets duprogramme) ;

• appeler les méthodes de ces objets (leurenvoyer des messages).

Page 24: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200412

3 Lancement de la machine virtuelle Java ( JVM, pour Java VirtualMachine). La JVM charge les fichiers 7� �!! nécessaires à l’exécution duprogramme et interprète le code binaire des instructions des méthodes eninstructions du microprocesseur de la machine sur laquelle tourne le pro-gramme.

À chaque besoin son environnement Java : applets, servlets, applicationsLes trois principaux environnements d’exécution Java (frameworks enanglais) sont les applications �, les applets � et les servlets �. Chaqueenvironnement utilise une catégorie de classe et un point d’entrée différents ;le point d’entrée d’un programme est la méthode appelée par la JVM pourexécuter un programme.

Figure 2–5 Cycle de développement Java

C++ Pas de variables ou de fonctions globales en Java

La structure d’un fichier 74�(� est très simple caril n’est permis de définir, au niveau global d’unfichier, que des classes, des interfaces (sortes declasses dont toutes les méthodes sont virtuellespures) ou des énumérations (disponibles unique-ment à partir de Java 5.0). Il n’existe pas en Javade notion de constante globale, de variable glo-bale, de fonction globale, de macro, de structure,d’union ou de synonyme de type : 8�� ���,!��, ����� et ����� n’existent pas enJava. Les classes Java n’ont même pas besoind’être déclarées dans des fichiers #���� séparéspour les utiliser dans d’autres fichiers sources !

C++ Pas d’édition de liens en Java

Il n’y a pas de phase d’édition de liens en Java ;chaque classe d’un fichier 7� �!! peut être vuecomme une petite DLL (Dynamically Linked Library)dynamiquement chargée à l’exécution par la JVM,la première fois qu’elle est utilisée.

C# Équivalent bytecode/JVM

Le bytecode Java est l’équivalent du MSIL C# et lamachine virtuelle Java l’équivalent du CLR C#(Common Language Run time).

Fichier Portable.java

Fichier Reseau.java

javac

cafe babe 0003 002d...

bytecode Java

Fichier Portable.class

cafe babe 0003 002d...

bytecode Java

Fichier Reseau.class

Lancement JVM

JVM

Fichiers .class

+

class Portable{ void allumer () { [...] }[...]

}

class Reseau{

[...]}

� Application batch ou interface homme-machine lancée avec la commande java

Figure 2–6 Application Java

Une application s’exécute sur une machine isolée ou raccordée àun réseau.La JVM et les fichiers 7� �!! d’une application doivent être ins-tallés sur la machine.Le point d’entrée d’une application est la méthode ���� d’uneclasse respectant la syntaxe décrite ci-après.

� �!!������"����� ���!����(��������)4�(�7 ��57���5�9:��5!*��"����++�������5������&&

DesktopApplication

+

JVM

Fichiers . class

Page 25: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 13

� Applet d’un fichier HTML lancée par un navigateur

Figure 2–7 Applet Java

Une applet s’exécute dans une page HTML sur une machinecliente raccordée à un serveur Web.La JVM, installée sur la machine cliente, est lancée par le naviga-teur.Les fichiers 7� �!! d’une applet sont installés sur le serveur Webet téléchargés par le navigateur.Le point d’entrée d’une applet est la méthode ��� d’une classerespectant la syntaxe décrite ci-après.

��� ���� �!!�;�(�����������!�4�(��7!<��57;��� �"����� ���(��������)*��"����++�������5������&&

GET /jmine.html

GET /JavaMine.class

Fichiers .html

.class

<html ><body>...<appletcode=" JavaMine"width=500 height=400>

</applet></body></html> JVM

Serveur Serveur HTTP

Client Navigateur Décodeur HTML

+

cafe babe 0003 002d...

� Servlet lancée par une requête sur un serveur Web

Figure 2–8 Servlet Java

Une servlet s’exécute sur un serveur Web pour générer dynami-quement des pages HTML ou des images.La JVM et les fichiers 7� �!! d’une servlet doivent être installéssur le serveur Web.Le point d’entrée d’une servlet est la méthode ��=� d’une classerespectant la syntaxe décrite ci-après.

��� ���� �!!�2����������!�4�(��7!�( �7#�7>���( �"����� ���(������=�

)4�(��7!�( �7#�7>���( ���?��!���?��!@4�(��7!�( �7#�7>���( ���!���!���!���!�*#�<!�4�(��7!�( �7��( ���������@�4�(�7��7����������

��"����++�������5������&&

GET /servlet/FindIt?search=java

<html><body><h3>Resultats</h3>

<ul> <li>Sun</li> <li>Java SDK</li>

...</ul></body></html>

Décodeur HTML

Client

+

Serveur Serveur HTTP

Fichiers .html

Fichiers .class

JVM +

NavigateurCGI

Serveur servlet

B.A.-BA Machine virtuelle Java (JVM)

L’architecture d’exécution Java permet d’exécuter les instructions Java d’un fichier ������ surn’importe quelle machine avec la machine virtuelle (JVM) qui correspond à son système d’exploi-tation et son microprocesseur. La JVM Windows, par exemple, traduit les instructions Java en ins-tructions Intel, la JVM Mac OS traduit les instructions Java en instructions PowerPC, etc.

Page 26: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200414

Télécharger et installer les programmes pour développer en JavaLes versions de Java pour les systèmes Windows, Solaris et Linux sont dis-ponibles sur le site Internet de Sun Microsystems à http://java.sun.com. Sunfournit chaque version de Java sous deux formes :• L’une pour les développeurs : le JDK ( Java Development Kit) ou SDK

(Software Development Kit) comprenant la machine virtuelle Java pourun système d’exploitation, la bibliothèque des classes Java et les comman-des pour développer en Java.

• L’autre pour les utilisateurs : le JRE ( Java Runtime Environment) com-prenant la machine virtuelle Java et la bibliothèque des classes.

Voici les instructions qu’il faut suivre pour installer le JDK fourni par Sun.1 Téléchargez la version la plus récente du JDK. Ce fichier de plus de

40 Mo a un nom de la forme �������������� , où ������� représenteune suite de chiffres séparés par des points (par exemple ��������), et ��le système de destination du JDK (par exemple �����������).

2 Installez le JDK et ajoutez au ���� de votre système le chemin d’accès ausous-dossier ��� du JDK contenant les commandes Java comme cela estprécisé ci-après.

VERSIONS Un mode de téléchargement enfin moderne

Depuis la version 1.4.2, Java dispose d’outilsmodernes d’installation et de mise à jour. Il estmaintenant possible soit de télécharger le JDK (oule JRE) en un seul coup pour une installation offline, soit de télécharger un logiciel de quelquescentaines de Ko dont le rôle est de télécharger lereste du JDK (ou du JRE) avant de l’installer. Unefois installée, la JVM est capable de se mettre àjour d’elle-même si une nouvelle version de Javaest disponible sur le site de Sun Microsystems(sous Mac OS X, utilisez le module Mise à jourde logiciels du système).

Moteur de recherche

Accès rapide au téléchargement des dernières versions

Accès aux derniers articles du site

Accès aux informa-tions sur J2SE, J2EE, J2ME, XML...

Accès rapide au JRE

Figure 2–9Page d’accueil http://java.sun.com

Page 27: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 15

Installation sous Windows 95/98/ME, NT, 2000/XP

Sous Windows 95/98/ME1 Exécutez le fichier d’installation ��������������� et installez le JDK

dans le dossier proposé ���� �! �"#$�����%�&�����������.2 Éditez le fichier ����'�()*)��+�� et ajoutez-y la ligne :

3 Redémarrez votre machine.

Sous Windows NT1 Exécutez le fichier d’installation ��������������� et installez le JDK

dans le dossier proposé ���� �! �"#$�����%�&�����������.2 Cliquez avec le bouton droit de la souris sur l’icône de votre poste de tra-

vail et choisissez le menu Propriétés.3 Choisissez l’onglet Environnement dans la boîte de dialogue des Propriétés.4 Ajoutez la variable d’environnement ���� avec la valeur :

Si la variable ���� existe déjà, modifiez-la en ajoutant à la fin de sa valeur :

5 Confirmez votre saisie en cliquant sur Modifier et fermez la boîte de dia-logue.

VERSIONS Les versions de Java depuis 1995

Depuis sa première version en 1995, Sun Microsystems sort une version majeure de Javatous les 18 mois précédée de versions beta et pre release (Release Candidate) publiques.Chaque nouvelle version ajoute des fonctionnalités grâce à de nouvelles classes et améliorela vitesse d’exécution de Java :• 1995 : 1.0 (170 classes)• 1997 : 1.1 (391 classes)• 1998 : 1.2 (1462 classes)• 2000 : 1.3 (1732 classes)• 2002 : 1.4 (2367 classes)• 2004 : 1.5 ou 5.0 (2800 classes)Java respecte la compatibilité ascendante des classes, autorisant le fonctionnement desanciennes classes avec les versions les plus récentes.Depuis la version 1.2, la version standard de Java est dénommée J2SE (Java 2 Standard Edi-tion) et la technologie Java s’est décomposée en trois éditions différentes :• J2SE (Java 2 Standard Edition) est destinée au marché des ordinateurs de bureau (desktop).• J2EE (Java 2 Enterprise Edition) a une bibliothèque de classes plus riche et est destinée

au marché des serveurs d’entreprise prenant en charge les EJB (Enterprise JavaBeans).• J2ME (Java 2 Micro Edition) est une version allégée de Java qui n’est pas compatible

avec J2SE et est dédiée au marché des téléphones portables, PDA, cartes de crédits…

����,-����-./���� �! �"#$�����%�&���������������/

-����-.���� �! �"#$�����%�&���������������

.���� �! �"#$�����%�&���������������

VERSIONS Java 6.0

Contrairement à la version 5.0 du J2SE qui a entreautres choses, enrichi le langage Java de nouveauxéléments syntaxiques détaillés dans cet ouvrage,la version 6.0 du J2SE de nom de code Mustangn’apportera que des modifications à la bibliothè-que standard Java. Jusqu’à sa finalisation prévuepour le courant 2006, le site suivant lui est dédié :B https://mustang.dev.java.net/

VERSIONS Sous Windows 95, Java 1.4.0

Sun ne proposant plus d’assistance technique pourJava sous Windows 95, seule une ancienne versionde Java 1.4 est disponible en archive à l’adressesuivante :B http://java.sun.com/products/archive/j2se/

1.4.0_04/

ASTUCE Utilisation de DOSKEY

Si elle n’y figure pas déjà, ajoutez aussi à votrefichier �'�()*)��+�� la ligne :0(12)3

Cette fonctionnalité, disponible d’office sousWindows NT/2000/XP, Linux et Mac OS X, permetau système de mémoriser les commandes récentes.Dans une fenêtre de commandes, vous pouvez fairedéfiler ces commandes avec les flèches haut et bas.

B.A.-BA PATH

Bien qu’il ne soit pas obligatoire de modifier le���� pour faire fonctionner Java, il vous est con-seillé de respecter les instructions ci-contre poursimplifier l’utilisation des commandes Java. Eneffet, la variable d’environnement ���� décrit laliste des dossiers parmi lesquels votre système vachercher un programme pour l’exécuter en lignede commande quand vous ne donnez pas le che-min pour accéder à ce programme. Ceci vous per-mettra par exemple de lancer le compilateur Javaavec la commande ��&�� au lieu de ���� �! �"$�����%�&����4)516(7�������&��.

Page 28: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200416

Sous Windows 2000/XP1 Exécutez le fichier d’installation ���������(1���� et installez le JDK

dans le dossier proposé ���� �! �"#$�����%�&�����������.2 Cliquez avec le bouton droit de la souris sur l’icône de votre poste de tra-

vail et choisissez le menu Propriétés.3 Choisissez l’onglet Avancé dans la boîte de dialogue des Propriétés.4 Cliquez sur le bouton Variables d’environnement.5 Ajoutez la variable d’environnement ���� avec la valeur :

Si la variable ���� existe déjà, modifiez-la en ajoutant à la fin de sa valeur :

6 Confirmez votre saisie et fermez la boîte de dialogue.

Installation sous Linux1 Ouvrez une fenêtre de terminal.2 Déplacez-vous avec la commande �� dans le dossier où vous voulez ins-

taller le JDK.3 Rendez le fichier ��������������� exécutable avec la commande :

4 Exécutez le fichier d’installation ���������������.5 Éditez le fichier 89����: � et ajoutez-y les lignes :

6 Redémarrez votre session.

Installation sous Mac OS XLe JDK est préinstallé sous Mac OS X et les commandes Java sont disponi-bles dans l’application Terminal sans avoir à modifier le PATH. Les mises àjour éventuelles de Java s’installent simplement avec le module Mise à jour delogiciels... du menu Pomme, mais la version maximale de Java que vous aurezà disposition varie en fonction de la version de Mac OS X de votremachine : sous Mac OS 10.4, la version la plus récente est Java 5.0, sousMac OS 10.3, Java 1.4.2, sous Mac OS 10.2, Java 1.4.1.

Pour les autres systèmes, consultez le site de leurs éditeurs respectifs.

-����-.���� �! �"#$�����%�&���������������#

.���� �! �"#$�����%�&���������������

�:"��#;�#���������������

����,<�����9�� �9����9���������9�����=� #����

VERSIONS Sous Mac OS 9, le JDK 1.1.8

Le JDK 1.1.8 est la version la plus récente disponible pour Mac OS 9. Apple a préféré concentrerses efforts de développement pour Java exclusivement sur Mac OS X.

B.A.-BA Environnements de développement intégrés (IDE) Java

Dédiés au développement d’un programme Java,les IDE (Integrated Development Environment) Javasimplifient grandement l’édition et la gestion d’unprogramme. Ils intègrent pour la plupart les fonc-tionnalités suivantes :• Éditeur de textes avec mise en couleur des mots-

clés Java, des commentaires, des valeurs littéra-les...

• Complétion automatique (menus contextuelsproposant la liste des méthodes d’un objet).

• Génération automatique des dossiers nécessai-res à l’organisation d’un programme et despaquetages des classes.

• Intégration des commandes Java et de leursoptions dans des menus et des boîtes de dialo-gue appropriés.

• Débogueur pour exécuter pas à pas un pro-gramme en phase de mise au point.

• Gestion de versions avec CVS ou d’autres outils.Les IDE les plus importants du marché et fonction-nant sur tous les systèmes d’exploitation :• Borland JBuilder http://www.borland.fr/jbuilder/• Eclipse http://www.eclipse.org/• IntelliJ IDEA http://www.intellij.com/idea/• NetBeans http://www.netbeans.org/• Oracle JDeveloper 10g

http://otn.oracle.com/products/jdev• Sun Java Studio

http://wwws.sun.com/software/sundev/jde/Voir aussi en annexe une description de JBuilder etd’Eclipse fournis sur le CD-Rom qui accompagnecet ouvrage.

Page 29: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 17

Télécharger, installer et utiliser la documentationLa documentation des API Java (Application Programming Interface)décrit les fonctionnalités des classes de la bibliothèque Java. Elle se présentesous forme de fichiers HTML dont l’organisation permet de retrouver rapi-dement la description d’une classe et de ses méthodes grâce à de nombreuxliens hypertextes. Cette documentation indispensable peut être consultée enligne à http://java.sun.com/j2se/1.5/docs/api ou téléchargée pour la consulter horsconnexion.

Voici comment installer la documentation du J2SE, qui décrit les API Javaentre autres choses. Téléchargez la documentation qui correspond à la ver-sion de votre JDK. Ce fichier de plus de 30 Mo a un nom de la forme �������������>�=, ������� représentant une suite de chiffres séparés par despoints (par exemple �����).

Décompressez le fichier avec l’outil de votre choix ou utilisez la procéduresuivante pour décompresser la documentation :1 Ouvrez une fenêtre de commandes (sous Mac OS X, démarrez l’applica-

tion Terminal du dossier Applications/Utilitaires).2 Déplacez-vous avec la commande �� dans le dossier d’installation du

JDK ou dans un autre.3 Décompressez le fichier de documentation �������������>�= en exé-

cutant la commande :

La documentation du J2SE est décompressée dans le sous-dossier ����.

�� #�?#9�� �9����9�������������>�=

Figure 2–10 Documentation des API Java

REGARD DU DÉVELOPPEURNe vous laissez pas impressionner !

Ne vous inquiétez pas devant la quantité d’infor-mations que vous présente la documentation desAPI Java. Utilisez-la surtout comme outil de réfé-rence sur les classes Java et leurs méthodes.La documentation des API montrée par la captured’écran de la figure 2-10 s’obtient en cliquant suc-cessivement sur les liens API & Language Docu-mentation puis Java 2 Platform API Specifi-cation de la page ������: "� du dossierd’installation de la documentation du J2SE. Ajou-tez la page des API Java tout de suite à vos favoris/signets/bookmarks et apprenez à vous en servir carvous en aurez souvent besoin.

ATTENTION Mise à jour du PATH

Si le système vous indique que la commande�� est inconnue, vérifiez que le ���� a étécorrectement modifié en exécutant lacommande : • Sous Windows : ����• Sous Linux : ��:�#<����Le texte affiché doit refléter les modificationsopérées sur le ���� dans le point précédent.Pour que toute modification du ���� soit priseen compte dans une fenêtre de commande, ilvous faut :• sous Windows 95/98/ME, redémarrer votre

machine,• sous Windows NT/2000/XP, ouvrir une nou-

velle fenêtre de commande,• sous Linux, exécuter la commande :��@ �� 89����: �

Liste des packages (classement théma-tique des classes)

• Au départ, liste de toutes les classes

• Liste des classes d’un package après un clic sur un package

Frame principale : • Au départ, liste

détaillée de tous les packages

• Description d’une classe, de ses mé-thodes et de ses champs après un clic sur une classe

• Hiérarchie des classes

• Index…

POUR ALLER PLUS LOIN Autres documentations

Parmi les nombreuses documentations en anglaisfournies par Sun Microsystems sur son site, notezbien les deux suivantes à ne pas manquer :• Java Tutorial : cours sur Java très complet et

régulièrement mis à jour.• Java Language Specification : spécifications

détaillées du langage.

Page 30: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200418

Tester l’installation : votre première application JavaRecopiez le programme suivant dans un fichier texte dénommé +���&��@����&�.Respectez la casse des caractères du fichier et son extension ���&�.

Cette application � affiche dans une boîte de dialogue le texte Bienvenue �.

Compilation de l’applicationPour compiler le fichier +���&��@����&� :1 Ouvrez une fenêtre de commandes (sous Mac OS X, démarrez l’applica-

tion Terminal du dossier Applications/Utilitaires).2 Déplacez-vous avec la commande �� dans le dossier où se trouve le

fichier +���&��@����&��3 Exécutez la commande suivante :

Si votre programme est correctement compilé, la commande ��&�� n’afficheaucun message et crée le fichier +���&��@������� dans le dossier du fichier+���&��@����&�. Si le compilateur détecte une erreur, un texte décrivantl’erreur apparaît à l’écran. Remontez toujours à la première erreur du textegénéré par ��&��, car les dernières erreurs sont souvent liées aux premièreserreurs de la liste.

EXEMPLE Bienvenue.java

�����#+���&��@�A##=@����#� � ��#&���#"���#B��&�����!�1 ��!#CD#� !�E#�##A####��&�������!�%(= ���������:��F����!�0����!B�@��G#H+���&��@�HE.#�##II

��&��#+���&��@����&�

JAVA Commandes du JDK les plus utilisées

Voici un aperçu des commandes du JDK qui sont le plus utilisées.Ces commandes se lancent dans une fenêtre de commandes ou unterminal Unix :• ����� : le compilateur Java vérifie la syntaxe du (des) fichier(s)���&� passé(s) en paramètres et génère un fichier ������ pourchacune des classes qu’ils contiennent.

• ���� : cette commande lance la machine virtuelle Java quicharge la classe passée en paramètre puis appelle sa méthode"���.

• ���������� : cette commande lit le fichier HTML passé enparamètre puis affiche dans une fenêtre l’applet de chaque baliseJ�==�� K de ce fichier.

• ��� : cette commande crée et lit des archives au format ZIP.

• ���� �� : cette commande génère la documentation au formatHTML d’un ensemble de classes à partir de leurs commentairesau format javadoc. C’est avec cet outil que la documentation desAPI Java est créée.

Chaque commande Java propose un ensemble d’options repérableau tiret (-) qui les précède. La liste de ces options s’obtient entapant une commande Java seule dans une fenêtre de commandesou en cliquant sur le lien Tool Docs de la documentation du J2SE.Par exemple, la version de la JVM est obtenue en tapant lacommande :��&�#L&� ����Bien sûr, ces commandes et le paramétrage de leurs options sontintégrées dans les IDE Java disponibles sur le marché.

JAVA Espace, retour à la ligne et casse

SOUS WINDOWSOuverture d’une fenêtre de commandes

Les espaces, retours à la ligne, tabulations, ne sontpas significatifs en Java sauf pour séparer un motd’un autre. En revanche, vous devez faire attentionà la casse des lettres (minuscule ou majuscule) dansun programme, car Java traite différemment unelettre selon qu’elle est écrite en minuscule ou enmajuscule.

L’un des moyens les plus simples pour ouvrir unefenêtre de commandes sous Windows consiste àsélectionner l’élément Exécuter dans le menuDémarrer, puis de taper ��""��� sous Windows95/98/ME ou �"� sous Windows NT/2000/XP.

Figure 2–11Icônes de la fenêtre de commande

sous Windows 98

sous Windows XP

du Terminal sous Mac OS X

Page 31: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 19

Les cinq erreurs de compilation les plus fréquentes1 Commande inconnue

Sous Windows 95/98/ME :

Sous Windows NT/2000/XP :

Sous Linux :

La modification que vous avez apportée au ���� est incorrecte, ce quiempêche le système de retrouver la commande ��&��. Vérifiez le ���� etmodifiez-le comme indiqué précédemment.

2 Fichier absent

Vérifiez que le dossier courant contienne bien le fichier +���&��@����&�.Renommez le fichier exactement comme cela en cas de besoin, ou chan-gez de dossier courant pour aller dans le dossier où se trouve le fichier.

3 Argument inconnu

N’oubliez pas l’extension ���&� des fichiers. 4 Syntaxe : symbole oublié

Il vous faut certainement vérifier que vous ayez bien écrit le caractèreattendu.

5 Symbole introuvable

��""����#�@#��"#��#?��:�� #���� �� 3 Commande ��&�� inconnue

M��&��M#�M�� #=��# �����@#��# �� #N@�#��""����#�� � ���@#�� � ��G#@�#= �! �""�#��O�@ ����#�@#@�#?��:�� #��#��""������

3 Commande ��&�� inconnue

��&���#��""���#�� #?�@�� 3 Commande ��&�� inconnue

� � �#����� # ����#+���&��@����&� 3 Impossible de lire le fichier +���&��@����&�.

��&���#��&����#� !@"�� �#+���&��@�'��!��#��&��#J�= ����K#J��@ ��#?����K���

3 ��&�� ne connaît pas l’argument +���&��@�.

+���&��@����&����#M.M#��=�� ��B ���=��#��#��#��!��#�E

3 ��&�� s’attend à trouver le caractère cité (ici .)mais ne l’a pas trouvé.

+���&��@����&��P�#����� # ����&�#�Q"����Q"���##�#�����#� ��!���� ����#=���!�#���!B ���=��#��#��#��!��#PE

3 ��&�� ne retrouve pas le symbole cité, ici� ��!. Cette erreur peut survenir dans denombreux cas : mauvais nom de paquetage, declasse, de champ, de méthode, de variable, mau-vais paramètres d’une méthode, casse incor-recte...Vérifiez l’orthographe du symbole cité, ici � ��! qui doit s’écrire 1 ��!.

Autres erreurs de compilation

Voir aussi en annexe une liste plus complète des erreurs de compilation les plus fréquentes.

Page 32: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200420

Exécution de l’applicationExécutez ce programme avec la commande suivante :

Une fois que la fenêtre affichant Bienvenue est à l’écran, cliquez sur Ok. Sivous utilisez une version antérieure à Java 5.0, il vous faudra arrêter la JVMen tapant simultanément sur les touches Ctrl et C de votre clavier (nous ver-rons plus avant comment procéder pour quitter plus simplement un pro-gramme).

��&�#+���&��@�

JAVA main et showMessageDialog

Les termes qui accompagnent les méthodes "��� et �:��F����!�0����! seront expliqués au fur et à mesure de cet ouvrage. Il s’agitlà des seuls termes qu’il vous soit demandé d’admettre dans unpremier temps, la démarche de cet ouvrage étant de décrire systé-matiquement chaque élément de la syntaxe de Java avant sa pre-mière utilisation dans un programme.

C++ Différences sur le main

Le point d’entrée d’une application porte les mêmes noms en Javaet en C++, mais c’est bien là leur seule ressemblance ! En effet,comme il est interdit de définir une fonction globale en Java, lepoint d’entrée d’une application doit être une méthode "��� défi-nie dans une classe et cette méthode doit être déclarée commedans la classe +���&��@�. C’est la raison pour laquelle les applica-tions de cet ouvrage sont définies dans des classes utilisées unique-ment comme contenant de leur "���.Cette architecture permet de créer et de faire cohabiter n’importequel nombre de classes définissant une méthode "���. La classe

dont le "��� est utilisée comme point d’entrée est alors déterminéeau lancement de la JVM avec la commande ��&�.

C# Différences sur le main

Pour être utilisable comme point d’entrée d’une application Java, laméthode "��� d’une classe doit toujours être écrite tout en minus-cules et être précédée de =@���� � � �� &���. Elle doit aussidéclarer en paramètre un tableau de chaînes de caractères, mêmes’il ne sert pas dans l’application.

Figure 2–12 Application +���&��@�

les plus utiles

Effet Sous Windows Sous Unix

Lister les fichiers du dossier courant �� ��

Lister les fichiers d’extension ���&� �� R���&� �� R���&�

Lister les fichiers d’un dossier �� ���� �� �� ���� ��

Changer de dossier �� ���� �� �� ���� ��

Copier un fichier ��=Q � ��� � ��� �= � ��� � ���

Renommer un fichier ou un dossier �� � ��� � ��� "& � ��� � ���

Supprimer un fichier ��� � �� " � ��

Créer un dossier "� ���� �� "�� ���� ��

Supprimer un dossier vide � ���� �� "�� ���� ��

B.A.-BA Commandes système

Comme cet ouvrage prône l’utilisa-tion de la ligne de commande pourdébuter en Java, voici une liste descommandes les plus utiles sous Win-dows comme sous Unix (ce qui com-prend Linux et Mac OS X).Toute manipulation des fichiers etdes dossiers (création, copie, renom-mage, suppression) via le bureau devotre système, l’Explorateur Win-dows ou le Finder Mac OS X estimmédiatement disponible danstoute fenêtre de commandes ou toutterminal ouvert.

Page 33: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

2 –

Prin

cipe

s du

lang

age

et in

stal

latio

n de

l’en

viro

nnem

ent

© Groupe Eyrolles, 2004 21

Les trois erreurs d’exécution les plus fréquentesSi une erreur survient lors de l’exécution du programme, une exception estdéclenchée empêchant généralement la JVM de poursuivre son exécution.

1 Définition de classe non trouvée (1)

Vous avez dû taper la commande ��&�#+���&��@������� (la commande ��&�demande en paramètre une classe pas un fichier).

2 Définition de classe non trouvée (2)

Vérifiez que le dossier courant contienne bien un fichier +���&��@�������. Sile problème persiste, assurez-vous que la variable d’environnement �S�11����soit égale à rien.

3 Méthode "��� non trouvée

Vérifiez la déclaration de la méthode "��� puis recompilez le programme.

)���= ���#��# : ���#H"���H#��&�����!�7������0�?$�@��) � �#+���&��@�9�����

3 la JVM n’a pas trouvé la définition de la classe+���&��@�.

)���= ���#��# : ���#H"���H#��&�����!�7������0�?$�@��) � �#+���&��@� 3 la JVM n’a pas trouvé la définition de la classe+���&��@��

)���= ���#��# : ���#H"���H#��&�����!�7�1@�:F� :��) � �#"��� 3 la JVM n’a pas trouvé la méthode "����

REGARD DU DÉVELOPPEUR Quel éditeur utiliser pour débuter ?

Bien que cet ouvrage présente en annexe les fonctionnalités de deux des IDEles plus puissants, il vous est conseillé dans un premier temps d’apprendre Javaen vous servant d’un éditeur de textes et de la ligne de commande. Cetteapproche vous évitera de vous laisser noyer par toutes les possibilités de cesIDE, tout en vous permettant de mieux comprendre comment s’organisent lesfichiers d’un programme et comment s’utilisent les options des commandesJava que l’on retrouve dans les boîtes de dialogue des IDE.Toutefois, si le Bloc-notes Windows (notepad.exe) ou TextEdit sous Mac OS Xconviennent pour éditer quelques lignes de code, rien que l’absence de numé-ros de lignes dans ces éditeurs risque de vous pénaliser pour corriger leserreurs de compilation qui y font référence. Utilisez plutôt un éditeur de tex-tes plus élaboré comme ceux de la liste suivante, gratuits et peu consomma-teurs de mémoire :• ConTEXT sous Windows, disponible à http://www.context.cx/ et sur le CD-Rom

qui accompagne cet ouvrage (si l’anglais vous gêne, les options de cet édi-teur permettent de choisir un affichage en français) ;

• KEdit sous Linux (ou vi si vous le préférez) ;• Xcode sous Mac OS 10.3 ou ProjectBuilder sous Mac OS 10.2 (fournis avec les

outils de développement du système).

ASTUCES Simplifiez-vous la vie avec les raccourcis !

Tous les systèmes d’exploitation reproduisent lenom d’un fichier avec son chemin dans une fenêtrede commandes si vous glissez-déposez (drag anddrop) l’icône de ce fichier dans la fenêtre. Très pra-tique aussi, vous pouvez utiliser le copier/collerdans une fenêtre de commandes via son menu con-textuel. Finalement, Windows XP et Unix propo-sent la complétion automatique sur les fichiers etles dossiers dans une fenêtre de commandes pourvous éviter d’écrire entièrement leur nom : aprèsavoir tapé les premières lettres d’un fichier, laissezle système compléter son nom en appuyant sur latouche de tabulation.

Page 34: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200422

En résumé...Après avoir passé en revue les concepts de base de la programmationorientée objet, ce chapitre vous a montré comment ils se traduisent dansl’architecture Java. Les outils de développement Java étant installés, on peutmaintenant étudier comment créer des classes et manipuler des objets...

REGARD DU DÉVELOPPEUR Performances de la JVM, portabilité

Les performances de Java, langage principalement inter-prété, dépendent essentiellement de la machine virtuelleJava (JVM). Elles ont souvent été décriées par rapport àd’autres langages objet compilés tel que C++. Ce repro-che est de moins en moins fondé :

• Les performances de la JVM dépendent étroitementdes performances matérielles des machines (mémoireet processeur) et celles-ci ne cessent de progresser.

• Sun optimise régulièrement le système de gestionautomatique de la mémoire (ramasse-miettes). Ainsidans Java 1.4, le ramasse-miettes a-t-il été revu, ce quia permis de bien meilleures performances, surtout surles machines multi-processeurs.

• L’apparition de compilateurs « juste à temps » (JIT, JustIn Time compilers en anglais) avec le JDK 1.1 a permisd’améliorer les performances. Une JVM classique inter-prète au fur et à mesure chaque instruction dubytecode Java en instructions du processeur de lamachine, sans garder de trace de cette interprétation.En revanche, une JVM avec un compilateur JIT traduit àla volée (on-the-fly) le bytecode d’une méthode en ins-tructions du processeur, garde en mémoire le résultatde cette traduction, puis exécute directement ces ins-tructions chaque fois que nécessaire. Bien que cettecompilation initiale ralentisse l’exécution d’uneméthode à son premier appel, le gain en performancesest d’autant plus grand qu’une méthode est exécutéeplusieurs fois ou qu’elle contient des boucles d’instruc-tions. Pour vous convaincre de l’efficacité du compila-teur JIT, vous pouvez essayer vos applications Java enmode interprété pur grâce à l’option *�� de la com-mande ��&� pour voir la différence !

• Pour utiliser de façon optimale le compilateur JIT, latechnologie HotSpot apparue avec J2SE 1.3 décide defaçon intelligente s’il vaut mieux compiler uneméthode avec le compilateur JIT ou bien l’interprétercar le temps perdu pour cette compilation n’en vau-drait pas la peine.

B http://java.sun.com/products/hotspot/

Et qu’en est-il de la portabilité des programmes Java, l’unde ses atouts les plus mis en avant ?

Dans les faits, le passage d’un même programme Javad’un système d’exploitation à l’autre sans la moindremodification ne pose généralement aucun problèmepour les programmes à base de servlets/JSP comme lesserveurs Web.

Économiquement, cet argument est très intéressant pourles entreprises qui développent des serveurs pourInternet : ceci leur permet de mettre à disposition desdéveloppeurs de simples ordinateurs sous Windows,Linux ou Mac OS au lieu de multiplier à grands frais lesclones du serveur où sera déployé le programme final.

Du côté des programmes qui mettent en œuvre uneinterface utilisateur graphique avec les composantsSwing ou AWT, les éventuels problèmes de portabilité seposent plus sous la forme d’une intégration correcte auxdifférents systèmes d’exploitation (et aux navigateurspour les applets).

Vous devez donc prendre le temps d’étudier les spécifici-tés de chaque système et adapter si nécessaire votre pro-gramme pour respecter le plus possible leurs différences,tout en gardant le même code Java.

JAVA 5.0 Optimisation de la JVM

Apparu avec Java 5.0, le partage de classe(Class Data Sharing) entre plusieurs JVM apour but de réduire le temps de lancementdes programmes Java (surtout pour les pluspetits) et la quantité de mémoire nécessaire àleur fonctionnement. Pour ce faire, le pro-gramme d’installation de Java crée un fichierqui contient la représentation en mémoiredes classes de la bibliothèque standard Java,ce qui accélère ensuite le temps de charge-ment de ces classes et permet de les parta-ger entre différentes JVM en train de tournersimultanément. Le partage de classe n’estpas pris en charge sous Windows 95/98/ME.

Page 35: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

3Création de classes

SOMMAIRE

B Typer

B Encapsuler

B Créer une classe et ses objets

B Organiser les fichiers des classes

MOTS-CLÉS

B TypeB EncapsulationB classB thisB ConstructeurB javacB import

Avec Java, on peut créer des classes robustes grâce à un typage fort et au procédé de l’encapsulation. À partir des classes et des objets créés dans ce chapitre, nous allons voir comment il convient de mettre en œuvre ces principes et d’organiser les fichiers d’un programme.

package com.eteks.outils;

/** * Telecarte de 50 unites. */public class Telecarte50{private int unites = 50;

public void debiterUnites (int debit) {

int nouveauCredit = this.unites - debit;this.unites = nouveauCredit;

}

public int getUnites () { return this.unites; }}

unites

Classe com.eteks.outils.Telecarte50

Page 36: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200424

Typer : pourquoi et comment ?Il y a quatre catégories de données Java : les valeurs littérales pour manipulerune valeur fixe comme �# P�T# M�M ; les variables locales pour stocker desvaleurs temporaires utilisées dans les calculs d’une méthode ; les paramètresde méthode pour paramétrer une méthode ; les champs pour stocker lesvaleurs décrivant l’état d’un objet.

Chacune de ces données Java est dotée d’un type, soit primitif (numérique,caractère, booléen) soit objet. Le type d’une donnée est utilisé d’une partpour calculer la taille de son espace de stockage, et d’autre part pour déter-miner les opérations qu’il est possible de lui appliquer avec les opérateursJava, sans provoquer d’erreur de compilation ni d’exécution.

Dans le cas des variables, il faut les déclarer avant leur première utilisation,selon une syntaxe très simple : il suffit d’écrire le type de la variable, suivi deson nom ou identificateur.

Tableau 3–1 Types primitifs de Java

Type Description�Q � entier signé sur 8 bits (valeurs de – 128 à 127)

�:� entier signé sur 16 bits (valeurs de – 32 768 à 32 767)

�� entier signé sur 32 bits (valeurs de – 2 147 483 648 à 2 147 483 647)

���! entier signé sur 64 bits (valeurs de – 9 223 372 036 854 775 808 à9 223 372 036 854 775 807)

?��� décimal à virgule flottante sur 32 bits (valeurs de ± 10-45 à ± 1038 environ)

��@��� décimal à virgule flottante sur 64 bits (valeurs de ± 10-323 à ±10308 environ)

�:� code Unicode sur 16 bits (peut être utilisé aussi comme entier non signé)

������� valeur booléenne (vrai ou fausse)

����##���� �?��� �@ 4� �����

C++ Pas de unsigned, typedef et sizeof en Java

Le seul type entier non signé Java est le type �:� .Pour éviter toute confusion sur le type d’une varia-ble, il n’existe aucun équivalent en Java des syno-nymes de type avec Q=���?. Comme tous lestypes primitifs ont une taille fixe en Java, l’opéra-teur ��>��?#n’existe pas.

C++ Le type char Java est sur 16 bits

L’équivalent du type ��:� � du C++ est �:� en Java.

B.A.-BA Identificateur

En Java, un identificateur ne peut ni commencerpar un chiffre ni être un mot-clé Java. Cela mis àpart, il peut s’agir de n’importe quelle suite alpha-numérique (lettres ou chiffres Unicode) associée àdes caractères � ou <.Exemples : ��"# ��"� �# <7�"� �# ����@���==��� #!� 6�

��� �� ��� ��@� ?� ��� ��� �:

���� R ��?�@� !� �R =���!� �Q��: ���>��

������� �� �? = �&� � :��

� �� ��@��� �"=��"�� � = � �� �� : ��

�Q � ���� �"=� =@���� : ���

���� ��@"R ��� �����? � @ � ������

�� �: �� ���� �� �:� Q

�:� ?���� �� � ?��� � � �� &���

����� ?�����Q ���! � �� ?= &��� ���

���� R ?��� �� �&� �@=� �:���

À RETENIR Mots-clés Java

Chaque mot-clé Java a un sens prédé-terminé et s’utilise avec une syntaxeparticulière. Il est interdit de s’en servircomme identificateur pour éviter touteconfusion de sens.

R ���� est un mot-clé introduitavec Java 1.4. ��@" est un mot-cléintroduit avec Java 5.0. !� � et ���� sont des mots-clés réservés mais qui nesont pas utilisés par Java.

Page 37: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 25

Types de données objet et référencesLes données de type objet relèvent d’une classe de la bibliothèque standardJava (par exemple ��&�����!�1 ��!, ��&�����!�(���� ...), d’une autre biblio-thèque ou de votre propre programme.

Une variable de type objet est appelée une référence. Soit une référencedésigne un objet, soit elle est égale à �@��. Un objet peut être référencé parplusieurs variables.

Écrire une valeur littéraleUne valeur littérale représente une valeur fixe et se note différemment d’untype à un autre.

C ++ Référence ≈ pointeur ≈ adresse ≠ objet

La notion de pointeur ou d’adresse sur un objet du C++ est remplacée par la notion de référenceen Java, proche de celle du C++, mais limitée aux variables qui désignent des objets allouésdynamiquement. Observez bien au passage que l’instruction �������������� ��� necrée aucun objet en Java mais une référence sur un objet de classe ��������������.

Exemple

�������������� �� déclare la référence�� de type ��������������.

C++ null Java ≈ NULL C++

L’équivalent du pointeur NULL du C++ est la réfé-rence ���� en Java.

Type Notation valeur littérale Exemples

���

����

��

����

Les valeurs littérales entières peuvent se noter de 3 façons (faire suivre lenombre d’un � pour une valeur de type ����).

Suite de chiffres décimaux ���� �������� � �

Suite de chiffres hexadécimaux (base 16) précédée de ! !�" #���� !""""""""""�

Suite de chiffres octaux (base 8) précédée de . Rarement utilisée, cettenotation est signalée pour éviter que l’on ajoute devant un entier parsimple effet de style (ajouter plutôt des espaces).

��� ��

$���

%�����

Les valeurs littérales décimales se notent avec un point pour le séparateurdécimal et la lettre E pour séparer la mantisse de l’exposant : ����&'� = 3,14 10-5

Par défaut, toute valeur littérale numérique avec un point étant de type%�����, faire suivre le nombre d’un $ pour indiquer qu’une valeur est detype $���.

� � ��� ����� ����&'� ����$

(��� Les valeurs littérales de type caractère se notent entre apostrophes ()).

Caractère du code ASCII )�) )*) )+) ),)

Caractère du code Unicode : -� suivi des 4 chiffres hexadécimaux du codedu caractère

)-� �+) )-�� �()

Caractères spéciaux les plus courants :)-�) pour un retour à la ligne)-) pour une tabulation)-.) pour le caractère .)-)) pour le caractère ))--) pour le caractère -

)-�) )-) )-.) )-)) )--)

Page 38: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200426

Affectation de variablePour affecter une valeur à une variable, on utilise l’opérateur d’affectation / .Cet opérateur copie dans une variable une valeur littérale, la valeur d’uneautre variable ou le résultat d’un calcul.

Le type de la valeur et celui de la variable affectée doivent être les mêmes.Une variable locale n’ayant pas de valeur initiale, il est obligatoire de luiaffecter une valeur avant d’utiliser la variable, dès sa déclaration ou dans uneinstruction indépendante.

Par l’exemple : déclarer et utiliser quelques variablesL’application de classe 0��0�1�� montre comment déclarer des variables detype �� et de classe �������������� et comment leur affecter une valeur.

La méthode ���� de cette classe déclare les quatre variables locales ���2� �,���2�3��(����� �, 1�2��� � et ����3�2��� �. Dès leur déclaration, ���2�,����3�2��� sont initialisés respectivement à 2003 � et avec le texte Sophie �.

L’instruction ���2�3��(����� / ���2� 4 �� � copie (affecte) la valeur de���2� 4 � dans ���2�3��(�����.

������� Les valeurs littérales booléennes sont ��� et $����. ��� $����

�������������� Les valeurs littérales de type texte ou chaîne de caractères se notent avecdes caractères entre guillemets (.).

.5������. .-� �+�-� �+���.

Autre type objet La seule valeur littérale des références d’un autre type objet est ����. Elleest utilisée pour les références qui ne désignent aucun objet.

����

Type Notation valeur littérale Exemples

Exemple

L’instruction ! / �� affecte la valeur � à !.

B.A.-BA Codes ASCII /Unicode

Le code ASCII (American Standard Code forInformation Interchange) regroupe 128caractères et symboles de la langueanglaise qui ne comportent aucune lettreaccentuée. L’Unicode permet de coder65 536 caractères différents, dont les 128premiers sont ceux du code ASCII. Lesautres codes sont utilisés pour les caractè-res, les chiffres et les symboles des nom-breuses langues. Le tableau présenté ci-contre donne pour mémoire les codes Uni-code francophones et les codes HTML lesplus utilisés. B http://www.unicode.org

Lettre Unicode HTML

à -� � 6�������

â -� �� 6�(��(�

ä -� �� 6�����

ç -� �� 6((�%���

è -� �7 6�������

é -� �+ 6��(���

ê -� �� 6�(��(�

ë -� �� 6�����

î -� �� 6�(��(�

ï -� �$ 6�����

ô -� $� 6�(��(�

ö -� $� 6�����

œ -� ��� 6������

ù -� $+ 6�������

û -� $� 6�(��(�

ü -� $( 6�����

€ -�� �( 6�����

Lettre Unicode HTML

Page 39: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 27

�������������� 1�2���� � déclare la référence 1�2��� de classe �������������� mais ne crée aucun objet de classe ��������������. .0�����. est unevaleur littérale de classe ��������������. La référence qui désigne cet objetchaîne de caractères est affectée à 1�2��� �.

���� et la valeur de la référence 1�2��� sont ensuite passés en paramètres à laméthode ���89������:����� pour afficher la chaîne de caractères Thomas �.

L’instruction 1�2��� / ����3�2���� affecte la référence ����3�2��� à 1�2���. ����3�2��� et 1�2��� désignent alors le même objet .�1���.. La réfé-rence 1�2��� est à nouveau passée en paramètre à la méthode���89������:����� qui affiche cette fois-ci la chaîne de caractères Sophie .

DANS LA VRAIE VIEUtilisation des lettres accentuées

Comme dans le cas des variables ���2�,���2�3��(�����, 1�2��� et ����3�2���de cet exemple, les identificateurs Java peu-vent utiliser des lettres accentuées mais celles-ci sont déconseillées. Comme la plupart deséditeurs de texte et des systèmes d’exploita-tion n’utilisent pas l’Unicode pour les caractè-res accentués, cela complique la maintenanceen contraignant à utiliser un éditeur particulier.

Si vous décidez d’écrire les valeurs littérales detype texte avec des lettres accentuées au lieude leur code Unicode, faites mention del’encodage de caractères utilisé (encoding enanglais) dans l’en-tête de votre fichier, pourque les relecteurs éventuels de votre pro-gramme sache quel encodage choisir dansleur éditeur de textes et/ou dans l’option'��(�%��� de la commande ����(. Vouspouvez avoir recours aussi à la commande��������(�� du JDK, capable de convertirtous les caractères non ASCII d’un fichier enleur code Unicode.

B.A.-BA Indentation

L’indentation consiste à décaler vers la droiteles instructions comprises entre les accolades; < afin de visualiser facilement le début et lafin d’un bloc. Tous les éditeurs dédiés à la pro-grammation sont capables d’indenter automa-tiquement le point d’insertion du texte à cha-que retour à la ligne et vous n’aurez qu’àchoisir le décalage qui vous convient (on utilisele plus souvent 2, 4 ou 8 espaces). Comme lalargeur d’une tabulation n’est pas toujours lamême d’un éditeur à l’autre, préférez les espa-ces aux caractères de tabulation et configurezles options de votre éditeur dans ce sens.

ATTENTION Chaînes spéciales

La chaîne de caractères littérale vide notée ..(avec aucun caractère), la chaîne de caractèreslittérale .����. et la référence ���� sont troischoses différentes : .. ≠ .����. ≠ ����.

EXEMPLE TestTypes.java(���� 0��0�1��; 1����( ���( ���% ���� =�������������� >? ����@ ; �� ���2� / � �� � 3 Déclaration de la variable locale entière ���2�.

�� ���2�3��(������ � ���2�3��(����� / ���2� 4 �� �

3 Déclaration de la variable entière ���2�3��(�����.

�������������� 1�2���� � 1�2��� / .0�����.� �

3 Déclaration de la référence 1�2���.

����!��8����AB1���3�������89������:����� =����C 1�2���@� � 3 Affichage du texte �����.

�������������� ����3�2��� / .�1���.� � 1�2��� / ����3�2����

3 Déclaration de la référence ����3�2���.

����!��8����AB1���3�������89������:����� =����C 1�2���@� 1�2��� / ����� �

3 Affichage du texte ��� �.

����!��8����AB1���3�������89������:����� =����C .� -�� �( / ����+�� "".@� � <<

3 Affichage du texte � € = ������ !!.

Page 40: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200428

Une fois exécutée, l’instruction 1�2��� / ����� � la référence 1�2��� nedésigne plus aucun objet mais la référence ����3�2��� désigne toujours.�1���.. Une valeur littérale peut être aussi utilisée directement pourdonner la valeur d’un paramètre, ce que fait la dernière ligne du programmequi affiche le texte 1 € = 6.55957 FF �.

Encapsuler pour protéger les données des objetsL’approche de la programmation modulaire consiste à décomposer un pro-blème en un ensemble de sous-systèmes ou modules. Proposé par la plupartdes langages, ce mode de programmation facilite la maintenance d’un pro-gramme pour peu que chaque module soit cohérent et le plus indépendantpossible des autres. La programmation orientée objet est l’aboutissement dece principe où chaque objet susceptible d’être manipulé par son interface estun module. En Java, cette décomposition modulaire s’effectue non seule-ment sur les classes mais aussi à d’autres niveaux, imbriqués les uns dans lesautres comme des poupées russes :• Un paquetage (package en anglais) renferme les classes d’un même

thème.• Une classe contient des champs et des méthodes.• Une méthode a des paramètres et un bloc d’instructions.• Un bloc d’instructions contient des variables locales, des instructions et

d’autres blocs.

Figure 3–1 Imbrication des modules

JAVA Séparateurs

Le point virgule à la fin de chaque instruction estobligatoire et la virgule permet de séparer lesparamètres multiples passés à une méthode.

C++/C# package ≈ namespace

Les paquetages Java correspondent à peu de cho-ses près aux espaces de noms du C++ et de C#.

B.A.-BA Une classe = un fichier source

Comme vous le verrez tout au long de cet ouvrage,à chaque classe d’un programme Java correspondgénéralement un seul fichier source �����. Il fautdonc vous habituer à manipuler plusieurs fichierspour une application même modeste. Dans lemonde de l’entreprise, la répartition du codesource d’un programme sur plusieurs fichiers faci-lite l’organisation des tâches d’une équipe de pro-grammeurs en permettant à chacun d’eux de tra-vailler sur un fichier source différent à un momentdonné.

Package com.eteks.test

Fichier TestReseau.java

Classe Abonne Champ portable Champ reseau

Classe TestReseau

Package com.eteks.telecom

Fichier Portable.java

Classe Portable

Champ carteSIM

Méthode eteindre()

Méthode allumer()

Package com.eteks.outils.ihm

Méthode calculer()

Méthode main(args) Var locale abonne

Méthode appeler(num)

Fichier Reseau.java

Classe Reseau

Méthode deconnecter(p)

Méthode connecter(p)

Var locale reseau

Méthode tester()

Page 41: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 29

Ce principe de modularité permet aussi de réutiliser dans des modules diffé-rents un même identificateur, que ce soit celui d’une classe, d’un champ,d’une méthode, d’un paramètre ou d’une variable locale. Il suffit que chaqueidentificateur soit unique dans son module et dans sa catégorie : ainsi, deuxclasses peuvent avoir le même identificateur si elles sont dans des paquetagesdifférents, l’identificateur d’un champ peut être réutilisé dans une autreclasse ou dans une méthode comme identificateur de variable locale...

Portée d’utilisation et durée de vieLes variables locales, paramètres, champs, méthodes et classes déclarés dansles modules ont une portée et une durée de vie différentes, selon leur caté-gorie.

Figure 3–2 Portée des champs et méthodes d’une classe

B.A.-BA Encapsulation

L’encapsulation réunit les deux concepts suivants :• la notion de module, regroupant les champs et les méthodes qui forment une classe, ces

champs et ces méthodes étant encapsulés dans leur classe ;• la notion de portée, qui permet de limiter la zone d’utilisation des champs à la classe

dans lesquels ils sont déclarés. Ces champs sont encapsulés pour exprimer qu’ils font par-tie exclusivement de l’implémentation de leur classe et pour empêcher de modifierintempestivement leur valeur en dehors de leur classe. C’est souvent ce second sens del’encapsulation qui est retenu en Java.

CONVENTIONS Choix des identificateurs

Afin que vous puissiez tirer parti de la liberté dechoix et de réutilisation des identificateurs, ilvous est conseillé de respecter les quelques con-ventions de nommage habituellement admisesen Java et décrites au fil de cet ouvrage. Une foismémorisées, ces conventions vous aideront àreconnaître du premier coup d’œil la catégoried’un identificateur.

B.A.-BA Portée d’un identificateur

La portée d’un identificateur (scope) est la zone duprogramme où il peut être utilisé.

Portée des classes public Portable et Reseau du package com.eteks.telecom et de leurs méthodes public

Portée des classes friendly TestReseau et Abonne du package com.eteks.test et de leur méthodes public

Package com.eteks.test Package com.eteks.telecom

Package com.eteks.outils.ihm

Classe public Portable

Champ private carteSIM

Méthode public eteindre()

Méthode public allumer()

Méthode public appeler(num)

Classe public Reseau

Méthode public deconnecter(p)

Méthode public connecter(p)

Classe friendly Abonne Champ private portable Champ private reseau

Classe friendly TestReseau

Méthode private calculer()

Méthode public main(args)

Méthode public tester()

Page 42: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200430

Manipuler des chaînes avec les méthodes de la classe java.lang.StringLa classe �������������� est une classe 1����(, ce qui permet de l’utiliserdans n’importe quelle classe. Elle contient un ensemble de méthodes 1����(disponibles dans l’interface d’un objet de type chaîne de caractères et deschamps 1����� utilisés pour implémenter le stockage de ses caractères. Sur un objet de classe ��������������C on peut notamment appeler lesméthodes 1����( �����, (���D et (��(� : ����� renverra la longueur de lachaîne de caractères mémorisée par l’objet, et (���D le caractère à l’indice��%�!. La méthode (��(� crée une nouvelle instance de la classe�������������� dont le texte sera celui de l’objet original suivi des carac-tères de l’objet passé en paramètre à (��(�.Les champs ����� et (��� disposent du modificateur d’accès 1����� pourles encapsuler à l’intérieur de la classe ��������������. En dehors de laclasse ��������������, ����� et (��� sont en fait utilisés indirectementgrâce notamment aux méthodes (���D et �����.

Catégorie Portée et durée de vie Utilisation Exemple

variable localeparamètre

S’étend de leur déclaration à la fin du bloc dans lequel ils sontdéclarés.

Directement avec leur iden-tificateur.

����� / � ��

méthode La portée d’une méthode dépend du modificateur d’accès qui estdonné à sa déclaration :• 1����( : méthode accessible à l’extérieur de sa classe. À utili-

ser pour les méthodes spécifiées dans l’interface des objetsd’une classe.

• 1����� : méthode uniquement accessible à l’intérieur de saclasse. À utiliser pour les méthodes effectuant des traitementsnécessaires à l’implémentation des objets d’une classe.

Pour appeler la méthoded’un objet, il faut écrirel’identificateur de l’objetsuivi d’un point, suivi del’identificateur de laméthode.

1�����������=@ appellela �2��%� �����=@ del’objet désigné par 1�����.Cela correspond à l’envoi dumessage renvoyer la longueurdu prénom.

champ Comme les champs ne doivent faire partie que de l’implémenta-tion des objets d’une classe, prenez l’habitude de les encapsulerpour protéger les données d’un objet. Pour encapsuler un champ,on utilise le modificateur d’accès 1����� à sa déclaration, cequi limite la portée du champ à sa classe.La durée de vie des champs est la même que celle de l’objet dontils déclarent les données.

Un champ 1����� s’uti-lise avec la référence ���suivie d’un point et del’identificateur du champ.

���������Voir section « Implémenterles méthodes », page 36.

classe La portée d’une classe dépend du modificateur d’accès qui estdonné à sa déclaration :• ���� : classe accessible dans toutes les autres classes, quel

que soit leur paquetage.• friendly (ou paquetage) : classe accessible uniquement aux

classes du même paquetage. À utiliser pour les classes de testou les classes qui n’ont pas à être utilisées en dehors de leurpaquetage.

La durée de vie d’une classe s’étend de sa première utilisation àl’arrêt de la JVM.

Une classe s’utilise en fai-sant précéder son identifi-cateur du paquetage où estdéclarée la classe et d’unpoint.

�� ����������� repré-sente la classe ����� dupaquetage �� �����.

ASTUCE N’hésitez pas à consulter les sources de la bibliothèque Java

Le JDK est fourni avec les fichiers source desclasses de la bibliothèque Java. Ces fichierssont regroupés dans un fichier compressé auformat ZIP, nommé ������� ou ������selon les systèmes. Le fichier �������� �qui définit la classe �� ����������� (voirci-après) peut être extrait de ce fichier ZIP aumoyen de la commande suivante :• sous Windows :����������� �������������������

X��� �������������� �• sous Mac OS X :������������������� ����� ��������

X������� �������������� �• sous Linux :���������� �"�������������������X��� �������������� �

Page 43: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 31

Figure 3–3Quelques méthodes ����et champs �� �� de la classe �� �����������

[Extraits du fichier java/lang/String.java]package java.lang;[...] public final class String [...]{private char value []; private int count;

[...] public int length()

{ return this.count; } [...] public char charAt(int index)

{ if ((index < 0) || (index >= this.count)) throw new StringIndexOutOfBoundsException(index); return this.value[index + offset]; } [...] public java.lang.String concat(java.lang.String str)

{ return [...] } }

Classe java.lang.String

REGARD DU DÉVELOPPEUR Utiliser l’encapsulation pour bien répartir les rôles

La distinction entre l’interface présentée par un objet et son implé-mentation permettent avec l’encapsulation de séparer clairementles rôles d’utilisateur et de concepteur d’une classe : • Un utilisateur accède aux services d’un objet en utilisant les

méthodes ���� proposées par l’interface de sa classe.• Le concepteur de cette classe assure ces services en implémen-

tant dans la classe les méthodes correspondantes avec des ins-tructions opérant sur les champs �� �� adéquats.

Le contrat liant un utilisateur avec le concepteur d’une classes’exprime donc par la liste des méthodes ���� de cette classe.Cet engagement permet au concepteur d’une classe de faire évo-luer son implémentation sans que l’utilisateur de cette classe n’ait àmodifier son programme. Par exemple, la longueur d’une chaîne decaractères renvoyée par la méthode ���� ���! de la classe�� ����������� est implémentée en renvoyant la valeur duchamp �� �� �����. Cependant, rien ne dit que cette implé-mentation n’évoluera pas dans les prochaines versions de Java. Cequi compte pour vous, utilisateur de la classe �� �����������,c’est qu’elle continue à renvoyer la longueur d’une chaîne.

Attention ! Ce n’est pas parce que les rôles de concepteur et d’utili-sateur sont tenus par la même personne qu’il faut faire une entorseà cette bonne règle de conception. Dans l’entreprise, les rôles dechacun peuvent évoluer, certains abandonnant leur rôle à d’autrespersonnes pendant les phases de mise au point et de maintenanced’un programme. Alors, facilitez-leur la tâche en utilisant systémati-quement l’encapsulation.

Pour vous aider à digérer la programmation objet...

Pour utiliser un langage imagé, imaginez-vous (un utilisateur) aurestaurant en train de choisir un plat (un service) sur une carte(l’interface qui décrit la liste des services proposés par son concepteur,le cuisinier). Vous commandez une tarte au citron, (vous envoyez aucuisinier le message « Donnez-moi une tarte au citron »). La tarte estalors préparée (implémentée) en cuisine à l’abri des regards, laporte de la cuisine vous cachant les secrets de préparation : vous neconnaissez ni la liste exacte de ses ingrédients (les données qui sontencapsulées dans la cuisine), ni de quelle façon le cuisinier la prépare(implémente les instructions pour réaliser ce service). Ce qui vousimporte, c’est d’avoir une bonne tarte au citron (vous faites con-fiance au concepteur de la liste des services).

Page 44: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200432

Par l’exemple : construire un texte avec plusieurs chaînesL’application de classe "���! �# ��$� ���� vous montre comment appelerles méthodes d’un objet de classe �� �����������.

La méthode ��� de cette classe appelle la méthode ������ sur des instancesde �� ����������� pour construire et afficher les textes ThomasSophie �,puis Thomas et Sophie � �. Notez que, comme ����� est un champ �� �� ,l’instruction :

est interdite et remplacée par :

����� ��$� ����%��� � �$� ���������&�

���� ��$� ����%��� � �$� ���� ���!'(&

C++ Opérateurs -> et ::

Les opérateurs )* et ++du C++ sont remplacésen Java par l’unique opérateur point (�), utilisépour accéder aux membres d’un objet, d’uneclasse ou d’un paquetage.

EXEMPLE AfficherDeuxPrenoms.java�����"���! �# ��$� ����,������������� �������'�� �����������-.�����(��,

Déclaration de la référence �� � �$� ���.Obtention du nombre de caractères de �����.Déclaration de la référence � �� � $� ���.Déclaration de la référence � ��$� ����.

B ������ �������������� � �$� �����%�/0!����/&����������� ��$� ����%��� � �$� ���� ���!'(&������ ������������� �� � $� ����%�/���! /&������ ������������� ��$� ����&

Affectation à � ��$� ���� du résultat de la concaténation des chaînes désignées par �� � �$� ��� et � �� � $� ���.

B ����� ��$� �����%��� � �$� �����������'� �� � $� ���(&��

Affichage du texte �������� �. B ������ ����1����2����$�� ��!�13 ���� #���'��4�� ��$� ����(&

Déclaration de la référence �� � �$� ���" �5�.

B ������ �������������� � �$� ���" �5�&������ � �$� ���" �5��%��� � �$� �����������'/� ��/(&��

Affectation à � ��$� ���� du résultat de la concaténation des chaînes désignées par �� � �$� ���" �5� et � �� � $� ���.

B ����� ��$� �����%��� � �$� ���" �5���������'� �� � $� ���(&��

Affichage du texte ����� ��#��� �. B ������ ����1����2����$�� ��!�13 ���� #���'��4�� ��$� ����(&��66

Page 45: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 33

Définir une nouvelle classeComme pour �� �����������, vous devez définir vos classes dans unfichier ��� � avec leurs champs et leurs méthodes.

Structure d’un fichier .java Un fichier ��� � débute par la clause ������ suivie de la définition d’uneclasse (ou plusieurs) déclarée grâce au mot-clé ���� suivi de son identificateur.

Un fichier ��� � peut contenir plusieurs classes mais ne peut en renfermerqu’une seule qui soit déclarée ����. Si un fichier ��� � contient une classe����, il doit porter le même nom que cette classe (7��� 0 ����� ��pour laclasse 7��� 0 ��). Le modificateur d’accès d’une classe est soit ����, soitabsent. Un modificateur d’accès absent est dit friendly.

Une classe est définie en une seule fois dans un unique fichier. Chaquedéclaration de classe est suivie d’un bloc entre accolades { }, qui contient seschamps et ses méthodes. Les champs et les méthodes peuvent être cités etutilisés n’importe où dans la classe quel que soit leur ordre de déclaration.

Toutes les classes d’un fichier appartiennent au même paquetage.

C++/C# Paquetage d’une classe

Toutes les classes d’un fichier ��� � appartien-nent au même paquetage. Notez aussi que lepoint-virgule à la fin d’une classe n’est pas obliga-toire en Java et en C#.

�8��8�9�! ������ � ���� ���7��� 0 ����� ���8�7�����!��'�(�:;;:� 0 ����"�<�!���< � � ���8�

3 Commentaire en en-tête de fichier :• Nom du fichier (utile pour l’impression).• Copyright.

������ ����� � ���� ��& 3 Déclaration du paquetage des classes du fichier.

�88��8�7 �� ����� �� �� ��� �� �� ��=����������8�

3 Commentaire javadoc décrivant la classe.

����������7��� 0 ��,�����7!����� ���>�!�� ��� ������� ����� � ���� ���7��� 0 ��6

3 Déclaration de la classe �����7��� 0 ��.

�����7��� 2��,�����7!����� ���>�!�� ��� ������� ����� � ���� ���7��� 2��6

3 Déclaration de la classe friendly 7��� 2��.

CONVENTIONS Nommage des paquetages et des classes

Un paquetage s’écrit en minuscules. Pour assurer l’unicité des paquetages, une entreprise sebase sur son nom de domaine Internet, qu’elle inverse, par exemple ������� ou �������� Lepréfixe de paquetage ���� � �� a été choisi dans cet ouvrage car c’est le nom de domaineinversé de l’auteur.L’identificateur d’une classe est une suite d’un ou plusieurs mots en minuscules, chaque lettreinitiale de mot étant en majuscule.Si le fichier ne contient aucune classe ����, il porte généralement le nom de sa classe princi-pale.

C++/C# Structures et unions

Contrairement au C#, Java n’a pas repris la notionde structure (déclarée avec le mot-clé ������). Lanotion d’union n’existe pas non plus (commeen C#).

Page 46: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200434

Commenter une classeDifférents types de commentaires peuvent être ajoutés à vos classes. Ils per-mettent de documenter leur utilisation et facilitent leur maintenance et sontignorés par le compilateur �� ��.

Les commentaires à part, sur une ou plusieurs lignes, sont généralementplacés avant les instructions commentées.

Déclarer les champs d’une classeChaque donnée d’un objet correspond à un champ qui doit être déclaré danssa classe.

����$��� peut être un type primitif ou une classe. Si ����$��� est uneclasse, le champ est une référence.

Pour encapsuler un champ, n’oubliez pas le modificateur d’accès �� �� ,mais sachez que �� �� peut être aussi remplacé par ���� �� �, ����, ouêtre absent (friendly). Un champ friendly est accessible uniquement dans lesclasses qui appartiennent au même paquetage que celui de sa classe.

Type de commentaire Utilisation Exemple

Fin de ligne Tout ce qui suit �� est ignoré jusqu’à la fin de la ligne. Utilisez d’abordles commentaires fin de ligne pour permettre d’imbriquer ce type decommentaire dans les commentaires multiligne �8� 8�, s’il est néces-saire de commenter une portion de programme.

���&������� �� �����

Multiligne Tout ce qui est compris entre �8 et 8� est ignoré. Ces commentairespeuvent incorporer des commentaires fin de ligne ��, mais pas d’autrescommentaires avec la syntaxe �8�8�.

�8�7��� ���� ����?�>������&����@��� �� ����� 8�

javadoc Les commentaires entre �88 et 8� sont utilisés par �� ����� pourgénérer la documentation des classes. Ils doivent respecter une syntaxespéciale et précéder la déclaration d’une classe, d’une méthode ou d’unchamp (voir la section « Commentaires javadoc » en annexe).

�88��8�7 �� ����� �� �� ��� �� �� ���8�=����������8�

������ ����� � ���� ��&

�����7��� " �7!����,

Déclaration du champ �!���A initialisé à savaleur par défaut.

B ���� �� �����$�����!���A&

Déclaration du champ �!���: initialisé avecune valeur donnée.

B ���� �� �����$�����!���:�%���%�&��&�'����� ��&�6

C++ Initialisation des champs Java

En Java, il est possible de donner la valeur initialed’un champ à sa déclaration.

Page 47: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 35

Déclarer les méthodes d’une classeLa déclaration d’une méthode est suivie de son implémentation qui est écritedans un bloc entre ,�6 contenant les instructions de son traitement. L’identi-ficateur de la méthode est précédé de �� ou d’un type ��������&� :• L’identificateur d’une méthode qui ne renvoie pas de valeur est toujours

précédé de ��.• L’identificateur d’une méthode qui renvoie une valeur est précédé du type

de la valeur retournée. ��������&� peut être un type primitif ou uneclasse. Le résultat de la méthode est renvoyé au moyen de l’instruction� ���� qui doit être suivie d’une valeur de type ��������&�.

Le modificateur d’accès d’une méthode est généralement �� �� ou ����,mais peut aussi être ���� �� � ou absent (friendly).

Paramétrage d’une méthodeUne méthode peut prendre aucun, un ou plusieurs paramètres séparés parune virgule (4). Chaque paramètre a un identificateur différent, précédé deson type. Les valeurs passées à l’appel d’une méthode doivent être du mêmetype que celui déclaré des paramètres. Chaque paramètre reçoit une copie deces valeurs qu’elles soient de type primitif ou qu’il s’agisse d’une référence.Une méthode sans paramètre est toujours suivie de parenthèses ouvrante etfermante�'( à sa déclaration et à son appel.

JAVA Utilisation de la valeur de retour

Il n’est pas obligatoire de se servir de la valeur ren-voyée par une méthode.

������ ����� � ���� ��&�����7��� " �3 �!�� �,

��(�� � ���&�)��� ���� ��A�'(��,��������@������������ �� ��A��6

3 Déclaration de la méthode � ��A qui ne prendpas de paramètre et ne renvoie pas de valeur.

��(�� � ���&�)��� ���� ��:�'����*�����������A4�������������������������������������*�����������:(��,��������@������������ �� ��:��6

3 Déclaration de la méthode � ��: avec paramè-tres et qui ne renvoie pas de valeur.

��(�� � ���&�)�����������&��� ��B�'(��,��������@������������ �� ��B������ �������%�&��&�'����� ��&��6

3 Déclaration de la méthode � ��B qui ne prendpas de paramètre et renvoie une valeur.

��(�� � ���&�)�����������&��� ��C�'����*�����������A4�������������������������������������������*�����������:(��,��������@������������ �� ��C����� �������%�&��&�'����� ��&��66

3 Déclaration de la méthode � ��C avec paramè-tres et qui renvoie une valeur.

B.A.-BA Passage des paramètres par valeur

Quand un paramètre passé par valeur est modifiédans une méthode, la valeur de la variable passéeen paramètre n’est pas modifiée.

Page 48: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200436

Implémenter les méthodesUn message est envoyé à un objet pour effectuer des traitements sur les don-nées de cet objet :• Certains traitements comprennent des opérations visant à modifier les

données de cet objet.• D’autres renvoient une valeur calculée en fonction des données de cet objet.

Dans l’implémentation d’une méthode en Java, on distingue cet objet d’unautre de la même classe grâce au mot-clé �!� :• �!� est une référence créée implicitement lors de l’appel d’une méthode

et désigne l’objet qui a reçu le message.• �!� est suivi d’un point et d’un champ pour obtenir ou modifier la valeur

du champ mémorisé par cet objet.

Par l’exemple : une classe simulant une télécarteUne télécarte de 50 unités peut être représentée sous forme d’un objet avecles messages suivants (voir figure 3–4) :• � �� �D�� �'� ��( : ce message débite une télécarte d’un nombre

variable d’unités � ��.• � �D�� � : ce message renvoie le nombre d’unités restantes d’une télécarte.

Pour comprendre ce que représente �!� pendant l’appel à une méthode, con-sidérons �� 0 ���� , une référence de classe ���� � ��������0 ���� E;désignant un objet existant de ���� � ��������0 ���� E;.

CONVENTIONS Nommage des champs

L’identificateur d’un champ est un mot écrit en minuscules, suiviéventuellement d’autres mots en minuscules, avec chaque lettre ini-tiale de mot en majuscule. Par exemple : ��� �� $��� �����

Évitez les abréviations qui peuvent semer la confusion sur le but del’utilisation d’un champ. Par exemple, le champ �����A peut repré-senter une constellation ou une constante.

CONVENTIONS Nommage des méthodes

L’identificateur d’une méthode est un verbe d’action en minusculessuivi éventuellement d’autres mots en minuscules, la lettre initialede ces mots figurant en majuscule (par exemple, ��� �,� �� �D�� �).Les méthodes utilisées pour modifier ou interroger les valeurs d’unchamp, appelées aussi mutateur et accesseur d’un champ, sont pré-

fixées par � � ou � �. Un accesseur renvoyant le type ��� ��peut aussi être préfixé par �. Par exemple, le mutateur du champ�� ��� se nomme � �$� ��� et son accesseur � �$� ���.

C++ Identificateurs de champs et de méthodes

Bien que ceci ne doive jamais arriver si vous respectez les conven-tions de nommage Java, il est possible d’utiliser en Java le mêmeidentificateur pour un champ et une méthode, contrairement auC++.

C++/C# Passage des paramètres par valeur

En Java, il n’est possible de passer les paramètres d’une méthodeque par valeur : les opérateurs F, 8 et les mots-clés � � et ���n’existent pas. Les modifications d’un paramètre dans une méthoden’affecteront pas la variable passée en paramètre, mais si ce para-mètre est une référence qui désigne un objet, les champs de cetobjet peuvent être modifiés.

À RETENIR Que représente this ?

Pour implémenter la plupart des messages, on abesoin de connaître l’objet qui a reçu le messageafin de manipuler les données de l’objet en ques-tion. En Java, cet objet est représenté par la réfé-rence �!�.

Page 49: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 37

Figure 3–4 Implémentation des méthodes de la classe ���� � ���� ���0 ���� E;

DANS LA VRAIE VIE Représentation d’un objet en UML

En conception objet, les objets et les classes sont généralement représentés grâce aux dif-férents diagrammes proposés par UML (Unified Modeling Language). Même si elle se ren-contre moins souvent, la notation sous forme de cercles concentriques a été choisie dans laplupart des figures de cet ouvrage pour exprimer graphiquement l’encapsulation des don-nées d’un objet qui ne sont pas accessibles à l’extérieur de l’objet et l’interface d’un objetqui donne la liste des messages qu’un objet peut recevoir. Pour information, la figure ci-dessous est la représentation UML de la classe ���� � ���� ���0 ���� E;.

R Cahier du programmeur UML, Pascal Roques, Eyrolles 2002

/* Fichier com/eteks/outils/Telecarte50.java */ package com.eteks.outils;

/** * Telecarte de 50 unites. */ public class Telecarte50{ // Champ mémorisant le nombre d'unités d'une télécarte // avec une valeur initiale de 50 private int unites = 50;

/** * Debite cette telecarte du nombre d'unites debit. */ public void debiterUnites (int debit) { // Calcul du nombre d'unités diminué de debit int nouveauCredit = this.unites - debit; // Mise a jour du champ unites avec le nouveau crédit

this.unites = nouveauCredit; }

/** * Renvoie le nombre d'unites restantes. */ public int getUnites () { // Renvoie la valeur du champ unites return this.unites; } }

Classecom.eteks.outils.Telecarte50

- unites : int

+ getUnites() : int+ debiterUnites(n : int)

Telecarte50

com.eteks.outils

Figure 3–5Représentation UML

Page 50: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200438

L’exécution de l’instruction �� 0 ���� �� �� �D�� �'A(& appelle laméthode � �� �D�� � de la classe ���� � ��������0 ���� E; sur l’objetdésigné par �� 0 ���� et affecte son paramètre � �� de la valeur A : celacorrespond à l’envoi du message débiter d’une unité une télécarte.1 À l’appel de �����������, la référence temporaire ��� est créée avec la

même valeur que �� ���������2 ��� et �� �������� désignant le même objet pendant l’appel de

�����������, la modification du champ ���� avec la référence ��� aen fait pour effet de modifier le champ ���� de l’objet désigné par�� ��������.

3 Après l’appel de �����������, ��� n’existe plus et �� �������� désigneun télécarte dont le champ ���� a diminué d’une unité.

REGARD DU DÉVELOPPEUR Quand utiliser la référence à l’objet courant this

��� est souvent utilisé seul pour passer l’objet courant en paramètre à laméthode d’un autre objet. Nous verrons qu’il est quelquefois nécessaire derépéter le nom de la classe de l’objet devant ���, notamment dans une classeanonyme (par exemple ����������������).

Un champ ne doit être précédé de this qu’en cas de risque de confusion avecun paramètre ou une variable locale de même portée. Toutefois, on peut yrecourir systématiquement pour améliorer la lisibilité d’une classe, pour mon-trer que c’est bien un champ qui est manipulé.L’utilisation de ��� n’est pas non plus nécessaire pour appeler une autreméthode de sa propre classe, car un identificateur suivi de parenthèses repré-sente toujours l’appel à une méthode sans risque de confusion avec un autretype d’identificateur.

C++ Différences d’utilisation de this

Contrairement au C++, il n’est pas possible d’affecter un objet différent à���. Comme l’opérateur �� n’existe pas en Java, l’accès à un champ s’effectueavec l’opérateur point (l’équivalent de ��������� en C++ est ��������en Java).

C++ Une classe Java se définit en une seule fois

En Java, toutes les méthodes sont déclarées et implémentées à l’intérieur de la classe dontelles dépendent. Néanmoins, cela n’a pas pour conséquence de créer, comme en C++, tou-tes les méthodes ����, optimisation que ne peut contrôler le développeur Java. D’autrepart, les classes Java peuvent s’utiliser mutuellement sans avoir à être déclarées avant utili-sation, car le compilateur ����� est capable de retrouver de lui-même la définition d’uneclasse si vous respectez l’organisation décrite dans la section « Organiser les fichiers desclasses » de ce même chapitre. Ces caractéristiques évitent l’utilisation de fichiers ������en Java et l’éparpillement sur plusieurs fichiers de la définition d’une classe.

C++ Répétition du modificateur d’accès

Le modificateur d’accès d’un champ ou d’uneméthode doit être répété à la déclaration de cha-cun d’entre eux.

C++/C# Modificateur d’accès par défaut

Par défaut, tout membre d’une classe n’est pasprivé, mais friendly. Un peu comme le modificateurd’accès C# ������ rend un membre accessibleà toutes les classes d’une même assembly, unmembre friendly est accessible dans toutes lesclasses qui appartiennent au même paquetage.

Page 51: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 39

Créer des objetsOn programme la création d’un objet (ou instanciation d’une classe) avec lemot-clé �� suivi de l’identificateur d’une classe précédé de son paquetage, etsuivi de parenthèses ouvrante et fermante.

Quand un nouvel objet est créé, l’espace mémoire nécessaire pour stocker seschamps est réservé, puis ces derniers sont initialisés. L’objet renvoyé par ��peut être affecté à une référence ou utilisé directement dans une expression.

Par l’exemple : une histoire de télécarte empruntée...L’application de classe ������������� ���������������� crée plusieursobjets de classe ��������������� ���������� et appelle les méthodes decette classe. Cette application a pour but de vous montrer la différence entreun objet et une référence en racontant une histoire d’échange de télécartes.

C++ Création d’objets

Il n’est pas possible en Java de créer des objets en pile, contrairement au C++. Toute créa-tion d’objet s’effectue dynamiquement avec l’opérateur ��, qui par ailleurs doit être tou-jours suivi d’une classe et d’un couple de parenthèses.

Exemple

������������������ ���������� !

JAVA Objets de classe java.lang.String

Seule la classe �������"�#���" permet decréer des objets de sa classe sans utiliser le mot-clé��, grâce aux valeurs littérales de type chaîne decaractères.

EXEMPLE com/eteks/test/TelecarteEmpruntee.java�����"��������������$���� ����������������%������������������������ �������"�#���"�&'���"!��%

Déclaration de la variable locale �� ��������référence de classe ��������������� ������������������������������ ������������� ��������$ 3

������ ���������(������������������� ����������� !$�� 3 Instanciation de la classe ��������������� ���������� et affectation de laréférence désignant le nouvel objet à�� ��������.

������ ��������������������� )!$�� 3 Appel de la méthode ����������� pourdébiter d’une unité la télécarte désignée par�� ��������.

������������(��� ���������"������� !$ 3 Appel de la méthode "������ pour interro-ger le nombre d’unités restant sur la télécarte etaffectation de la valeur à la variable ����égale à 49.

������������������� ����������������������������$ 3 Déclaration de la référence ������������������.

����������������������(��� ��������$�� 3 Affectation de la référence �� �������� à la référence ����������������� :����������������� et �� �������� dési-gnent le même objet.

Page 52: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200440

Dans la méthode ���, un premier objet de classe ���������������

���������� est créé et désigné par la référence �� �������� � puis par laréférence �������������������. Cette télécarte est débitée d’une unité �puis de 46 unités �. Le nombre d’unités de la télécarte ne pouvant êtremodifiées en dehors de la classe ��������������� ���������� �,����������������� est affectée à �� �������� � et une deuxième instance de��������������� ���������� désignée par �� �������� est créée �. Si ondébite des unités sur ces deux télécartes , leur nombre d’unités est diffé-rent car chaque télécarte mémorise ses unités (pour compiler et exécutercette classe, voir la section « Organiser les fichiers des classes », page 45).

Initialiser les champs d’un objetChaque champ d’un nouvel objet est initialisé soit avec la valeur donnéedans la définition de sa classe, soit avec une valeur par défaut en fonction dutype du champ : � pour un champ de type numérique ou caractère, *���pour un champ de type ������ et ��� pour les références de type objet.

Débit de 46 unités sur la télécarte désignée par�����������������.

B ������������������������������ +,!$��

Les références ����������������� et�� �������� désignant le même objet, l’appelà "������ sur ces références renvoie lamême valeur : 3.

B ���������(�������������������"������� !$���������(��� ���������"������� !$

Cette instruction est mise en commentaire car lecompilateur la refuse : il n’est pas possible d’utili-ser le champ ������� ���� en dehors de laclasse ��������������� ����������, cequi le protège des modifications intempestives.

B ����--������������������������(�+.$�

Déclaration de la référence �� �������� ini-tialisée avec �����������������.

B ������������������� ������������� ���������(�����������������������������������������������������$��

�� �������� est réinitialisée avec unedeuxième instance de la classe ��������������� ����������.

B ������ ���������(������������������� ����������� !$��

Débit de deux unités sur la télécarte désignéepar �� ��������.

B ������ ��������������������� /!$�

Débit de deux unités sur la télécarte désignéepar �� ��������.

B ������ ��������������������� /!$�

Interrogation du nombre d’unités restant sur lesdeux télécartes : ����0� �������� vaut48, ���� � �������� vaut 1.

B �����������0� ���������(��� ���������"������� !$����������� � ���������(��� ���������"������� !$

Affichage d’une petite phrase de conclusion. B ��������1���"�23����4������0��"�5����"� ���6�������������������������78������������*������������7!$��99

Exemple

��������(���$

C++ Valeur par défaut des champs Java

Tout champ d’une classe Java a une valeur pardéfaut si elle n’est pas précisée.

Page 53: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 41

Initialiser un objet avec un constructeurLes champs d’un objet peuvent aussi être initialisés dans un constructeurappelé au moment de la création d’un objet.

Un constructeur a le même identificateur que la classe où il est déclaré etn’est pas précédé d’un type de retour. Un constructeur peut prendre aucun,un ou plusieurs paramètres séparés par une virgule (6), comme pour uneméthode.

(�� � ���&�)�� est généralement ������, mais peut être aussi �������,��������� ou absent.

La déclaration d’un constructeur est suivie d’un bloc entre %�9 contenant desinstructions pour initialiser l’objet. Ces instructions affectent des valeurscohérentes aux champs de l’objet en cours d’initialisation avec éventuelle-ment les valeurs reçues en paramètre. ��� peut être utilisé comme référencesur ce nouvel objet.

B.A.-BA Constructeur

Groupe d’instructions qui effectuent les initialisa-tions nécessaires d’un objet à sa création.

�����"��������������$����:�������:���������%

��(�� � ���&�)���:�������:���������� !��%�����--�:�������������������9

3 Déclaration du constructeur sans paramètre dela classe :�������:���������.

��(�� � ���&�)���:�������:���������� ����*�����������)6�������������������������������������������������*�����������/!��%�����--�:�������������������99

3 Déclaration du constructeur avec paramètres dela classe :�������:���������.

JAVA Constructeur par défaut

Toute classe qui ne définit aucun constructeur a un constructeur pardéfaut sans paramètre qui ne fait rien. Aussitôt qu’un constructeuravec ou sans paramètre est défini, ce constructeur par défautn’existe plus.

C++ Constructeur par recopie

Comme un objet ne peut pas être créé en pile en Java, le construc-teur par recopie et la surcharge de l’opérateur ( utilisés en C++pour initialiser les copies d’objets alloués en pile sont inutiles �.

C++ Que devient le destructeur ?

Vous n’avez pas à libérer la mémoire prise par les objets Java �.C’est le ramasse-miettes (garbage collector en anglais) de la JVMqui s’en charge : il détecte les objets qui ne sont plus référencés afinde récupérer la mémoire qu’ils occupent. Le ramasse-miettes estcapable de libérer la mémoire de tous les objets inutilisables : ceuxqui ne sont plus référencés par aucune variable locale et aussi leséventuels objets dont ils dépendent, même en cas de référencescroisées comme dans une liste doublement chaînée. L’opérateur������ du C++ n’existe donc pas en Java et la méthode *����;�équivalant au destructeur du C++ n’est que très rarement définiedans une classe. D’autre part, comme vous ne détruisez pas explici-tement les objets, une référence désigne un objet forcément valideou elle est égale à ��� ; vous n’avez donc aucun risque de mani-puler un objet qui n’existe plus.

Page 54: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200442

L’instanciation d’une classe ayant un constructeur avec des paramètres seprogramme avec �� suivi de la classe et de la liste des paramètres entreparenthèses correspondant à ceux déclarés par le constructeur.

Les classes de la bibliothèque standard Java ont très souvent un constructeur.Par exemple, la classe �������"�<���� (avec un < majuscule) permet de créerun objet qui mémorise une valeur de type primitif *����. Cette classe con-tient un champ ������� ����� de type *���� et un constructeur prenant enparamètre une valeur de type *���� utilisée pour initialiser le champ �����d’une instance de �������"�<����.

L’exécution de �� �������"�<���� ���*! respecte les étapes suivantes :1 L’espace mémoire nécessaire pour stocker un objet de classe

�������"�<���� est réservé.2 Son champ ����� est initialisé à sa valeur par défaut.3 Le constructeur prenant en paramètre une valeur de type *���� est appelé

et reçoit en paramètre la valeur ���*. Les instructions de ce constructeurrecopient cette valeur dans le champ de l’objet.

Par l’exemple : une classe simulant un serviceLa classe suivante montre comment créer une classe représentant un serviceavec un constructeur qui initialise l’intitulé et le prix du service.

EXEMPLE com/eteks/outils/Service.java�����"����������������$

Service avec un intitule et un prix B �����������#������%�����������������"�#���"��������$������������*��������1$��

Initialise un service avec son intitule B ���������#������� �������"�#���"��������6�*��������1!����%

Modifie le champ ������� avec l’intitulé enparamètre.

B ����������������(��������$

Modifie le champ ���1 avec le prix en paramètre. B �����������1�(����1$��9

Renvoie l’intitule de ce service B ����������������"�#���"�"��=������ !����%���������������������$��9

Modifie le prix de ce service B ����������������4��1 *��������1!����%�����������1�(����1$��9

Renvoie le prix de ce service B ���������*�����"��4��1 !����%�����������������1$��99

Page 55: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 43

La classe ���������������#������ mémorise l’intitulé � et le prix � d’unservice. Ces données sont initialisées pour tout nouveau service avec unconstructeur � prenant en paramètre l’intitulé et le prix du service. Cetteclasse définit aussi les méthodes "��=������ � et "��4��1 � qui renvoientl’intitulé et le prix d’un service et la méthode ��4��1 � qui permet dechanger son prix.

L’application suivante calcule la somme des prix de deux services et montrecomment créer des objets des classes ���������������#������ et�������"�<���� qui définissent toutes les deux un constructeur.

L’application de classe �������������4��1 ����#������ crée deux services� �, instances de la classe ���������������#������, puis calcule la sommede leur prix �.

Un objet de classe �������"�<���� mémorisant cette somme est ensuite créé� et la méthode ��#���" est appelée sur cet objet pour obtenir le texte cor-respondant à la valeur de la somme �.

Finalement, un texte est construit et affiché � (pour compiler et exécuter cetteclasse, voir plus loin la section « Organiser les fichiers des classes », page 45).

CONVENTIONS Nommage des paramètres

Les paramètres d’un constructeur et d’un muta-teur utilisent les mêmes identificateurs que leschamps qu’ils modifient pour suggérer lesquelssont modifiés. Exemple : le constructeur #������� �������"�#���"��������6�*��������1!et la méthode �������4��1 *���� ���1!de la classe ���������������#������.

EXEMPLE com/eteks/test/PrixTotalServices.java�����"��������������$����4��1 ����#������%������������������������ �������"�#���"�&'���"!��%�����������"�#���"�����������(�7=��������7$�������������������#�������������=��������$ 3 Instanciation d’un service de classe

���������������#������ initialisé avecl’intitulé Installation et le prix .��* puis affecta-tion à ������=��������.

����������=���������(�������������������������#������� ���������6�.��*!$��

�������������������#�������������<���5����������(�������������������������#������� 7<��������>����?��������76����������������������������������/.�)�*!$��

3 Création d’une deuxième instance de���������������#������.

����������<���5������������4��1� /?���*!$����--�:�����������������������1����1����*��������1=���������(�������=���������"��4��1� !$����*��������1<����(�������<���5����������"��4��1� !$����*����������(����1=���������@����1<���$��

3 Appel de la méthode ��4��1 pour modifier leprix des frais de déplacement.

Instanciation de la classe �������"�<����mémorisant un nombre de type primitif *����initialisé dans son constructeur avec la valeur enparamètre.�����������"�<����������#�����(�����������"�<����� ����!$�� 3

�����������"�#���"���1��#�����(������#�������#���"� !$�������������"�#���"���1�� �����(�7 �����A�7������� ��1��#����!$�����������"�#���"����"�����(���1�� ����������� 7�>�/���7!$

3 Appel de la méthode ��#���" qui renvoie untexte contenant le nombre pour construire letexte Total : xxx.xx €.

��������1���"�23����4������0��"�5����" ���6����"�!$����99

3 Affichage du texte Total : 109.55 €.

Page 56: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200444

Surcharger les méthodes et les constructeursUne méthode est surchargée (overloaded en anglais) quand elle est définieplusieurs fois dans une classe, avec le même identificateur mais avec desparamètres de type différent, ou de même type mais dans un ordre différent.

Une classe peut aussi définir plusieurs constructeurs qui prennent des para-mètres de type différent. En fait, ce sont les constructeurs qui sont le plussouvent surchargés. L’instruction ��� !$, avec ou sans paramètres, peut êtreutilisée comme première instruction d’un constructeur pour passer desvaleurs par défaut à un autre constructeur.

Par exemple, la classe �������"�<���� a trois constructeurs :• un prenant un paramètre de type primitif *���� ;• un prenant un paramètre de type primitif ������ ;• un prenant un paramètre de classe �������"�#���". Ce dernier cons-

tructeur convertit la chaîne de caractères reçue en paramètre en unevaleur de type primitif *���� avant de la stocker dans son champ.

Exemple

La classe ���������������#������ pourrait comporter un second construc-teur qui ne prendrait pas en paramètre le prix, de façon à le fixerultérieurement : �������#������� �������"�#���"��������!

%������ �������6��*!$9

3

Rappel du constructeur avecdeux paramètres en lui passantun prix nul.

ATTENTION La surcharge ne s’appliquepas au type de retour seul

Il est interdit de créer deux méthodes ayant desparamètres de même type et un type de valeurde retour différent. Par exemple, si les métho-des :������ �������������� �������"�#���"�!

et������ *��������������� �������"�#���"�!�

sont définies dans une classe, le compilateuraffichera cette erreur : �������A?A��������� �������"�#���"!���������B���*������ ��

C++ Valeur par défaut des paramètres

Il est impossible de donner en Java une valeur pardéfaut aux paramètres. Cette caractéristiquedu C++ peut être aisément remplacée grâce à lasurcharge des méthodes et des constructeurs. Pourvous simplifier la tâche, Java permet aux construc-teurs de s’appeler entre eux grâce à l’instruction��� ������!$.

ATTENTION Pas de type de retour devant un constructeur

Un constructeur ne peut être précédé par un type de retour (ceserait une méthode valide !). Si ���� ou un autre type de retour est ajouté involontairement, celapeut provoquer une erreur de compilation inattendue, comme danscet exemple où le compilateur affiche cette erreur :

��=�����������A/)A�������������B����B������A�����������=�������� �������"�#���"!�������A������������������=�����������������������=��������=�������(�����������������������=������� 7�������5����7!$

�����"��������������$����=������%�����������������"�#���"���$��--�=��C�"����C����D������������6���--�����C������������ E��������������=������� �������"�#���"���!��%�����������(���$��99���� ��=������%����������������������� �������"�#���"�&'���"!��%����--�F�������������������������������������--������������G���������H����C�1�����������������������=��������=�������(�����������������������=������� 7�������5����7!$��99

Page 57: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 45

Organiser les fichiers des classesL’organisation des fichiers d’un programme en cours de développementamène généralement à séparer les fichiers source, les fichiers compilés et lesfichiers exécutables dans plusieurs dossiers (ou répertoires).

L’arborescence d’un dossier de développement Java est souvent basée sur lessous-dossiers ��, ����, ���, ��� et �� .

Par ailleurs, la commande ���� requiert que chaque fichier ���� d’uneclasse appartenant à un paquetage soit rangé dans une hiérarchie de sous-dossiers correspondant à son paquetage, ce qui donne, pour les classes crééesjusqu’ici, l’arborescence représentée à la figure 3–6.

Par exemple, le chemin d’accès de la classe ��������������� ����������doit être :• ���>����>�����> �������������� sous Windows• ���-����-�����- �������������� sous Linux et Mac OS X.

De la même façon, la commande ����� n’est capable de retrouver une classecitée dans un fichier ����� (comme pour la classe ���������������#������dans le fichier 4��1 ����#�����������) que si le fichier ����� ou le fichier���� de cette classe figure dans des sous-dossiers correspondant au paque-tage de cette classe.

Figure 3–6 Organisation des dossiers de développement

Dossier Type de fichiers

�� Fichiers source (fichiers �����,images ou autres)

���� Classes compilées (fichiers ����)

��� Bibliothèques non standards etfichiers ���� des classes de votreprogramme

��� Documentation générée avec�������

�� Fichiers de commandes lançantvotre programme

ASTUCE Séparation des sources

La séparation des fichiers sources des fichiers com-pilés dans des dossiers différents simplifie la sau-vegarde de votre travail sur un autre support :comme les fichiers ���� peuvent être facile-ment recréés, la sauvegarde du dossier ����qui les contient est inutile.

C++/C# Organisation des dossiers des classes

L’arborescence des dossiers où sont enregistrés lesfichiers ����� et ���� de toute classe Javadoit correspondre à leur paquetage, équivalent desespaces de noms du C++ et de C#. Cette organisa-tion associée au fait que toute classe ������ doitêtre enregistrée dans un fichier ����� de mêmenom (aux majuscules/minuscules près), peut paraî-tre quelque peu compliquée au premier abord,même si elle est en fait très logique. Comprenezbien que cette contrainte permet aux développeursqui travaillent sur un même programme ou auxpersonnes qui en effectuent la maintenance deretrouver très facilement les fichiers des classes,sans avoir à lire aucune documentation. D’autreslangages, comme le C++ ou C#, vous laissent uneliberté totale pour organiser les fichiers source, àcharge alors aux développeurs de documentercette organisation et sa logique...

Dossiers à créer

Sous dossiers créés automatiquement

Page 58: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200446

Automatiser la compilation avec un fichier de commandesLe fichier de commandes ������� décrit ci-dessous permet de compiler lesclasses du dossier :�����2���, de les rassembler dans le fichier d’archive������� et de créer leur documentation javadoc (le fichier ��������� con-tient les mêmes commandes avec des caractères > à la place des caractères -) :

La commande ����� compile tous les fichiers ����� des sous-dossiers �� et��-���-����-��� avec les options suivantes :• ����-���� : crée les fichiers ���� dans le sous dossier de destination

���� (en créant les sous-dossiers des paquetages si nécessaires).• ������������-�� : utilise le sous-dossier �� comme racine des sources.

Notez que les classes ��������������� ���������� et ���������������#������ sont retrouvées et compilées par ����� grâce à cette option.

La commande ��� crée dans le sous-dossier ��� le fichier d’archive �������et y stocke tous les fichiers du dossier ���� avec les options suivantes :• ��*0 �-���-������� : crée le fichier ���-������� sans fichier Manifest.• �: �-���� � : change le dossier courant pour ����, puis zippe dans

le fichier d’archive tous les fichiers de ce dossier en sauvegardant leurchemin d’accès (ne pas oublier le point à la fin de la commande).

La commande ������� crée la documentation au format HTML des classes������ des paquetages �������������� et ������������ avec les optionssuivantes :• �� �-��� : crée la documentation dans le sous-dossier de destination ���.• ���������� �-�� : utilise le sous-dossier �� comme racine des sources.

Les commandes ��� et ������� sont citées ici pour information. Commeelles ne sont pas nécessaires pour exécuter une application, vous pouvez lesomettre ou les placer en commentaire en ajoutant, avant ces commandes, I�0sous Windows et J sous Linux et Mac OS X.

Utilisez de préférence des chemins relatifs : ici les dossiers ��, ����, ���et ��� sont exprimés relativement au dossier courant où le fichier de com-mandes ������� est exécuté (�- aurait pu d’ailleurs être omis). Ceci permetde déplacer le dossier racine :�����2��� sans avoir à changer les commandesde ce fichier.

FICHIER��������

�������������������-��������-�����X��-��-K��������-��-���-����-���-K�����

�������*0��-���-����������:��-����������������������������-��������-��������������������������������

B.A.-BA Fichier de commandes

Un fichier de commandes regroupe un ensemblede commandes à exécuter les unes après lesautres. Il vous est conseillé ici d’en créer un pouréviter de taper la ou les commandes qu’il contientà chaque fois que vous en avez besoin. Sous Win-dows, un fichier de commandes doit porter l’exten-sion ���� et peut être lancé en double-cliquantsur celui-ci. Pour éviter que la fenêtre de comman-des ne se ferme immédiatement après l’exécutiond’un fichier ���� lancé par un double-clic, ajou-tez-lui la commande ����. Sous Unix, un fichiertexte est rendu exécutable en exécutant la com-mande ����� @1 � ��.

ASTUCE Séparateur de dossier / et \

Sous Windows, les commandes Java acceptentd’utiliser comme séparateur de dossiers lesymbole - à la place du symbole >. De ce fait, lefichier ������� décrit ci-contre fonctionne aussisous Windows si vous le renommez ���������.

OUTILS IDE

Toutes les options des commandes Java décritesdans ces pages se retrouvent dans les options desIDE Java, ce qui vous simplifie la tâche mais nevous abstient pas d’en comprendre l’effet...

Page 59: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 47

B.A.-BA Dossiers . et ..

Sous Windows comme sous Unix, il existe deux dossiers particuliers symbolisés par un point (�)et un double point (��). Le dossier � représente le dossier courant, c’est-à-dire le dossier danslequel vous vous situez à un moment donné, et le dossier �� représente le dossier parent, c’est-à-dire le dossier dans lequel se situe le dossier courant. Voici dans une fenêtre de commandeWindows quelques exemples de commandes utilisant ces dossiers et leur commandeséquivalentes :

• :A> ������ �⇔�:A> �������:A> ��>�⇔�:A> �������:A> ���⇔�:A> ������

• :A> ������ ��⇔�:A> �������:A> ��>��⇔�:A> �������:A>

• :A> ���������L�����������>���L���>������>��>K�����⇔�:A> ���������L����������:A> ��>���L��:A> ��>����

� X :A> ��>��>K�����⇔�:A> ���������L�������������L���������>K�����⇔�:A> ��>���������L������������L����>�����K�����⇔�:A> ��>���������L����>�����K�����⇔�:A> ��>�����������L������������>���L������>��>K�����

En observant les six commandes équivalentes �����, remarquez que le dossier racine des sour-ces spécifié par l’option ���������� est égal par défaut au dossier courant. Si l’option ��n’est pas utilisée, les fichiers ���� sont enregistrés dans les mêmes dossiers que ceux desfichiers source auxquels ils correspondent. Notez aussi qu’il faut toujours donner à ����� lechemin des fichiers sources à compiler, car le dossier spécifié par l’option ���������� ne sertau compilateur que pour retrouver les classes qui s’utilisent mutuellement.

OUTILS Ant, le make de Java

Ant est l’outil de construction d’applications de la fondation Apache qui propose de nom-breux autres produits Java Open Source comme Tomcat ou Struts. Cet outil a pour but degérer les différentes opérations liées au développement d’un programme (compilation,tests, mise en production...) sous forme de cibles ou d’objectifs (targets en anglais) liés lesuns aux autres. La description de ces cibles s’effectue dans un fichier XML nommé pardéfaut ������1�� et dont la syntaxe est bien plus simple que celle de leurs lointains cou-sins, les fichiers ����*���.Par exemple, le fichier Ant suivant correspond à la commande ����� du fichier �������décrit précédemment :MN1��������(7)��7N�M�����������(7:�����2���7�������(7�7���*����(7�������7���M���"������(7�������7����������(7:���������7�����M�����������(7��7�������(7����7�-���M-���"���M-��������

VoirB http://ant.apache.orgetR Cahier du programmeur Java - Conception et déploiement J2EE, Jérôme Molière,

Eyrolles 2003

Page 60: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200448

Pour lancer la construction :• Sous Windows, ouvrez une fenêtre de commandes, déplacez-vous avec la

commande �� dans le dossier de ��������� puis exécutez la commande��������� ou plus simplement ������

• Sous Linux et Mac OS X, ouvrez une fenêtre de terminal, déplacez-vousavec la commande �� dans le dossier de ������� puis exécutez la com-mande �-��������

Exécuter une applicationLes fichiers ������������������ et 4��1 ����#�������� du dossier �� delancement des applications Java précédentes peuvent se servir de la com-mande ���� de deux manières différentes (les fichiers ��������������������et 4��1 ����#���������� contiennent les mêmes commandes avec des carac-tères > à la place des caractères -) :

La commande ���� appelle la méthode ��� de la classe passée en paramètre,précédée de son paquetage. L’option �������� est suivie du sous-dossier��-���� racine des classes ou du fichier d’archive ��-���-������� utilisécomme l’équivalent d’un dossier racine. L’option �������� est égale pardéfaut au contenu de la variable d’environnement :8�##4� O, ou au dossiercourant si cette variable n’est pas définie.

Simplifier l’écriture des classes avec importAvec les clauses ������, on peut éviter de citer le paquetage des classesdevant leur identificateur (par exemple, ���������� au lieu de��������������� ����������). Ces clauses se placent avant la déclarationde la première classe d’un fichier source et obéissent à la syntaxe suivante :

FICHIER bin/PrixTotalServices.sh

����������������-������������������4��1 ����#�������� ����������������-���-���������������������4��1 ����#������

ASTUCE Ne créez pas les sous-dossiers classes et doc

Comme l’option �� des commandes ����� et������� crée si nécessaire les sous-dossiers despaquetages dans le dossier de destination, ne créezvous-même que les dossiers à la racine du dossierde développement et les sous-dossiers de ��.

B.A.-BA classpath le chemin des classes

L’option �������� peut être utilisée avec lescommandes �����, ������� et ����. Utilisezcette option pour citer les fichiers d’archive debibliothèques non standards, en les séparant par $sous Windows et A sous Linux et Mac OS X.

JAVA Livrable final

Le fichier ���� contient tous les fichiers nécessai-res à l’application. Il est intéressant car c’est unlivrable plus simple à installer et à désinstallerqu’un ensemble de fichiers ����.

Import de la classe ��������������� ����������

B ���������������������� ����������$

Import des classes du paquetage ��������������

B ����������������������K$

Page 61: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

3 –

Créa

tion

de c

lass

es

© Groupe Eyrolles, 2004 49

La clause ������� �������"�K$ est implicite dans tous les fichiers �����.Toutes les classes ������ ou non d’un même paquetage peuvent faire appelles unes aux autres sans clause ������. Dans le cas de la clause ������ d’uneclasse, le compilateur Java vérifie l’existence de la classe importée et la com-pile. Pour chaque clause ������ d’un paquetage, le compilateur Java vérifie sile dossier correspondant existe. Les clauses ������ superflues ou redondantesne sont pas signalées par le compilateur.

Par l’exemple : afficher les unités restantes d’une télécarteL’application suivante affiche le nombre d’unités restantes sur une télécartedébitée de 3 unités et montre comment utiliser ������ pour alléger le codeJava d’un programme.

Pour vous servir de la classe ���������� du paquetage ��������������,vous pouvez :• utiliser ������� ��������������� ����������$ au début du fichier et

écrire ensuite� ���������� • ou bien utiliser ������ ���������������K$ au début du fichier et écrire

ensuite� ���������� • ou encore écrire ��������������� ���������� à chaque fois que vous

voulez utiliser la classe ����������.

C++/C# import ≈ using ≠ #include

L’équivalent de la clause Java ������ est ��"en C++ et C#. Ne confondez pas ������ avec ladirective J������ du C++, même si le compila-teur ����� effectue des vérifications sur lespaquetages et les classes importées.

EXEMPLE com/eteks/test/AfficherUnitesTelecarte.java�����"��������������$ Import de la classe ���������������

���������� et des classes du paquetage����1���".

���������������������� ����������$�����������1���"�K$

3

--���������������"�K$--���������������������K$�����**��������� ��������%������������������������ #���"�&'���"!��%

3 Clauses en commentaire car implicites.

���� ���������������������(���� ����������� !$ 3 Création d’une instance de ����������.

�������������������������� P!$ 3 La télécarte est débitée de 3 unités.

�����������I������(�����������"������� !$ De façon similaire à la classe �������"�<����, la classe �������"�=��"�� a unchamp de type �� et une méthode ��#���"capable de convertir cet entier en son texte.

����=��"�������������(����=��"��� ����I�����!$����#���"���1�������(�������������#���" !$

3

����#���"���1��I����(�7=�����������7������� ��1������!$����#���"����"��(���1��I���������� 7����>����?7!$

3 Construction du texte « Il vous reste xx unités ».

����23����4������0��"�5����" ���6����"�!$��99

3 Affichage du texte « Il vous reste 47 unités ».

B.A.-BA Classe pleinement qualifiée

Une classe précédée de son paquetage est ditepleinement qualifiée.

Page 62: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200450

Il faut toujours écrire une classe en la faisant précéder de son paquetage par-tout où il y a risque de confusion avec une autre classe utilisée dans le mêmefichier �����.

S’il y a risque de confusion, le compilateur affiche une erreur de ce type sivous ne précisez pas le paquetage :

En résumé...Ce chapitre vous a expliqué comment définir des classes Java avec leurschamps, leurs méthodes et leurs constructeurs. Les applications ont mis enpratique ces classes pour créer des objets et appeler leurs méthodes.

�������A)�A���*���������5����������"���6���������������Q��5�����������Q�������������������5�������������������������5�����$

Exemples

• ����������5��� et �����Q��5���• �������"�3����� et ��"���"�:3IR��3�����

Page 63: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

4Contrôle des traitements

avec les opérateurs, boucles et branchements

SOMMAIRE

B Opérateurs

B Instructions de branchement

B Boucles

MOTS-CLÉS

B CastB ConcaténationB ifB switchB whileB for

Après avoir étudié comment on peut organiser ses informations sous forme d’objets, on verra dans ce chapitre comment programmer un traitement avec quelques applications de calcul. La syntaxe des opérateurs et des instructions de contrôle de Java étant très proche de celle du langage C, les programmeurs C, C++ et C# s’y sentiront particulièrement à l’aise...

expressionInit

instructionOuBloc

A l'appel d'une instruction : break;continue;return ...;

exprIncrementation

exprBooleenne

true

false

Instruction suivante de la boucle

Sortie de la méthode

Page 64: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200452

Opérateurs à connaître Les opérateurs Java se répartissent en trois catégories :• les opérateurs arithmétiques utilisés pour calculer des expressions ;• les opérateurs de comparaison et les opérateurs logiques programmés

dans les conditions des instructions de branchement ;• les opérateurs d’affectation utilisés pour modifier la valeur d’une variable.

B.A.-BA Mais pourquoi de tels symboles ?

Les opérateurs et les instructions Java ont étérepris du C pour faciliter l’apprentissage des pro-grammeurs C/C++ à Java. Ce choix explique lessymboles inhabituels de certains opérateurs (� � |�...) et la complexité de la syntaxe de certaines ins-tructions (���).

Tableau 4–1 Opérateurs arithmétiques

Opérateur Expression Description

� �'��� � �'��� renvoie l’addition de �'��� et de ��� .

� �'��� � �'�����'����� ��

renvoie la soustraction de �'��� et de �'���.renvoie la valeur opposée de �'����� ��.

� �'��� � �'��� renvoie la multiplication de �'��� par �'���.

� �'��� � �'��� renvoie la division de �'��� par �'���, ou déclenche une exception de classe ���������������������������, si �'��� est nulle et la division s’opère sur des expressions entières.Si les expressions sont entières, la division est entière (� � donne ).

� �'��� � �'��� renvoie le reste de la division de �'��� par �'���, ou déclenche une exception de classe ���������������������������, si �'��� est nulle, et les expressions sont entières.

Tableau 4–2 Opérateurs de comparaison

Opérateur Expression Description

! �'��� ! �'��� renvoie ��" si �'��� est strictement inférieure à �'���.

# �'��� # �'��� renvoie ��" si �'��� est strictement supérieure à �'���.

!$ �'��� !$ �'��� renvoie ��" si �'��� est inférieure ou égale à �'���.

#$ �'��� #$ �'��� renvoie ��" si �'��� est supérieure ou égale à �'���.

$$�'��� $$ �'��� renvoie ��" si �'��� est égale à �'���.

Si �'��� et �'��� sont des références sur des objets, le résultat est ��" si les 2 références dési-gnent le même objet, ou si elles sont égales à �"��.

�$ �'��� �$ �'��� renvoie ��" si �'��� est différente de �'���.�'��� �$ �'��� � �%�'��� $$ �'���&

��'������ �+,����'���������� renvoie ��"si �+,�� désigne une instance de la classe ����#ou des classes dérivées de ����.Si �+,�� est égal à �"��, le résultat est toujours ���'.Si ���� est une interface, �+,�� ��'������ ���� renvoie ��" si la classe d’�+,��#implémente����.

Page 65: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 53

Tableau 4–3 Opérateurs logiques

Opérateur Expression Description

� ��'��-��% renvoie le complément logique de �'��-��%, c’est-à-dire ���' si �'��-��% est égale à ��", et inversement.

�� �'��-��%����'��-��%� renvoie le résultat d’un ET logique entre les opérandes. Si �'��-��%� est ���' alors �'��-��%�n’est pas évaluée, et ���' est renvoyé immédiatement.

(( �'��-��%�((�'��-��%� renvoie le résultat d’un OU logique entre les opérandes (le caractère ( s’obtient en activant AltGr + 6 sur PC et Alt + Shift + L sous Mac OS).Si �'��-��%� est ��" alors �'��-��%� n’est pas évaluée, et ��" est renvoyé immédiatement.

Table de vérité de l’opérateur ET Table de vérité de l’opérateur OU�� ��� ����� �� ��� �������� ��" ���' ��� ��" ��"

����� ���' ���' ����� ��" ���'

Tableau 4–4 Opérateurs d’affectation

Opérateur Expression Description

$ �����)� $ �'����� �� affecte à �����)� la valeur d’�'����� �� et renvoie cette valeur, ce qui permet d’enchaîner des affectations par exemple ���* $ ��� $+,

�$ �����)� �$ �'����� �� ������)� $ �����)� � �'����� ��

�$ �����)� �$ �'����� �� ������)� $ �����)� - �'����� ��

�$ �����)� �$ �'����� �� ������)� $ �����)� � �'����� ��

�$ �����)� �$ �'����� �� ������)� $ �����)� � �'����� ��

�$ �����)� �$ �'����� �� ������)� $ �����)� � �'����� ��

���������)�

�����)���

Opérateurs de pré ou post-incrémentation :• ajoute * à �����)�, et renvoie la nouvelle valeur de �����)�.�������)�������)� $ �����)� � *������)� �$ *

• ajoute * à �����)�, et renvoie la valeur de �����)� avant que celle-ci ne soit incrémentée.

���������)�

�����)���

Opérateurs de pré ou post-décrémentation :• retire * à �����)�, et renvoie la nouvelle valeur de �����)�.-������)�������)� $ �����)� - *������)� �$ *

• retire * à �����)�, et renvoie la valeur de �����)� avant que celle-ci ne soit décrémentée.

JAVA Opérateurs bit à bit

Il existe aussi les opérateurs . � ( / !! ## ### lesquels sont utilisés pour effectuer des opérations sur les bits d’un entier. Ils sont rarement utilisés.B http://www.commentcamarche.net/java/javaop.php3

Page 66: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200454

Conversions numériques avec l’opérateur de cast Partout où une donnée est recopiée dans une autre, le compilateur vérifie quele type de la donnée copiée est le même que celui de la donnée qui en reçoitla valeur. Cela peut survenir :• dans une affectation �����)� $ �'����� ��, où la valeur d’�'����� �� est

recopiée dans �����)�0 • lors du passage d’une expression en paramètre à une méthode �'�

%�'����� ��&, où la valeur d’�'����� �� est recopiée dans le paramètre de�'�,

• à l’appel ��"���'����� �� où la valeur d’�'����� �� est recopiée dans lavaleur de retour.

Si les types des deux données sont différents, une conversion (ou transty-page) est nécessaire pour les rendre identiques. Pour les valeurs de type pri-mitif numérique, on effectue cette conversion avec l’opérateur de cast :

convertit la valeur de �'����� �� dans le ���� donné.

JAVA Bloc d’instructions et expressions

Noté entre accolades 1 2, un bloc est un ensemble de déclarations de variables locales, d’ins-tructions (statements en anglais) et/ou d’autres blocs.Une instruction peut consister en :• l’appel à une méthode, la création d’un objet, ou une expression utilisant un opérateur d’affecta-

tion, suivis d’un point-virgule (,), ou encore

• une instruction de contrôle (��, '3����, 3���, ���, ��"��).

Une expression peut consister en :

• l’accès à une donnée (valeur littérale, variable locale, paramètre ou champ) ;

• l’appel à une méthode ;

• la création d’objet avec l’opérateur �3 ;

• une opération utilisant un opérateur sur d’autres expressions.

%����&�'����� ��

JAVA Conversion avec gain ou perte de précision

Quand la conversion entraîne un gain de précision, c’est-à-dire que le nouveau type de la don-née est capable de stocker plus de nombres que son type initial, il n’y pas de risque qu’un nom-bre soit tronqué. Il n’est alors pas obligatoire de citer l’opérateur de cast %����&, car le compi-lateur programme la conversion nécessaire automatiquement. C’est le cas par exemple pour laconversion d’un nombre de type )4�, capable de stocker un entier compris entre – 128 et 127,en type ���, lui-même capable de stocker un entier compris entre - 2 147 483 648 et2 147 483 647.Seules les conversions entraînant une perte possible de précision doivent être obligatoirement pro-grammées avec l’opérateur de cast %����&, sinon le compilateur affiche une erreur de ce type :5'�6�'������7���7��''�)���''������'�����"�878�")��9"��87�����

C++ Instructions sans effet de bord

Seule une expression Java avec effet de bord,comme l’appel à une méthode, la création d’unobjet ou une opération d’affectation, peut être uti-lisée isolément comme instruction. Ceci permet derepérer certaines erreurs d’écriture issues deCopier/Coller trop rapides comme l’instruction�$$+, qui n’a aucun effet.

C++ Casts automatiques

Les conversions automatiques entre types primitifssont moins nombreux en Java. Dès qu’il y a risquede perte en précision (����� en ���, ���� en)4�, par exemple), il vous faut programmer un��'� explicite.

ATTENTION Les conversions ont un coût

Les conversions numériques calculent la représen-tation binaire d’une donnée dans un type différent.Par exemple, l’expression %�����&* convertit lavaleur de type ��� s’écrivant +�+++++++* en sonéquivalent de type ����� s’écrivant +� ��+++++en mémoire.

Page 67: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 55

De même, dans une expression �'������'��� utilisant un opérateur binairenumérique, le compilateur vérifie que le type des deux expressions est bien lemême, car la JVM n’a à sa disposition que des opérateurs utilisant des opé-randes de même type (��� et ���, ���� et ����, ����� et ����� ou 8�")� et8�")�). Si les deux types sont différents, le compilateur convertit automati-quement l’opérande de moindre capacité pour effectuer le calcul.

Par l’exemple : conversion euro/franc françaisDans la classe suivante, on voit comment utiliser les opérateurs arithmétiqueset l’opérateur de cast pour programmer une conversion euro/franc français.

ATTENTION Une conversion numérique s’applique aux nombres

Une conversion numérique ne peut s’appliquerque d’un type primitif, numérique ou caractère()4� '���� ��� ���� ���� �����8�")�), vers un autre.

EXEMPLE com/eteks/outils/ConvertisseurEuro.java���:�������:'��"���',����6��''8�����'������;����"���������������'����")������''6������''"��"��1���������������������"��,�")���6������''"��"��%���������������"��&1���'�����������"��$����������"��,2

����<�������������"�����

�")����������=���������"��%&1��"�����'�����������"��,2����<�������������������������'����")����������=��������>����%&1������������>����?�������8�$���'�����������"���@�AABAC�,

������������6����>����?�������8�$�������>����?�������8��*++��+�A�,

3 Calcul de l’arrondi en centime de franc (+�A� estutilisé pour l’arrondi).

�����������6����>����D��'E�����$%����&�������6����>����?�������8�,�

3 Suppression des décimales en convertissantdans un type entier.

������������6����>�������E�����$�������6����>����D��'E�����,�������������6����>���������8�$�������6����>�������E������*++�,��"���������6����>���������8�,22

3 Conversion en ����� pour avoir un nombredécimal puis division par *++�

Page 68: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200456

La méthode ��=��������>���� de la classe �����:'��"���'�6������''"��"��convertit un montant exprimé en euro en franc français grâce aux opérateursarithmétiques et aux opérateurs de conversion. Notez que la conversion dutype ����� en type ���� � doit être explicite car elle peut entraîner une pertede précision tandis que la conversion du type ���� en type ����� � peut êtreimplicite car elle entraîne un gain de précision.

L’application de classe �����:'��'��6����'����"�� convertit un montanten franc français et teste différentes conversions numériques.

EXEMPLE com/eteks/test/ConversionEuro.java���:�������:'��'�,�����������:'��"���'�6������''"��"��,���''6����'����"��1�")���'��������8����%D�����FG���'&1'�����������*$H+,'����������� $ ++,

C# Directives checked/unchecked

Comme les directives ���:8 et "����:8de C# n’existent pas en Java, la vérification dedépassement de capacité sur des entiers doit êtreprogrammée avec des tests équivalents.

Toutes les opérateurs portant sur des entiers)4�, '����, ���� ou ��� renvoient un résul-tat de type ����

B ����������5����$�������*�������� ,

La conversion en type )4� est acceptée mais�������I4�, trop petit pour stocker H+ (= +�+*AH = *+*+*+*++), contient en fait�H (= +�AH = +*+*+*++ partie basse de+�+*AH).

B )4��������J���$%)4�&�������5����,6������''"��"���������''"�,

Une valeur passée en paramètre ou une valeurde retour peut être aussi convertie.

B �������''"�$�36������''"��"��%%�����&�������5����&,��������������>����$�������''"����=��������>����%&,

D��������=��������>����,D��������=������5����,

Ces instructions sont mises en commentaire carle compilateur les refuse : il n’est pas possible deconvertir un nombre de type primitif en typeobjet (de classe ����������D����� ou autre)avec un opérateur de cast (et inversement).

B �����=��������>����$%����������D�����&���������>����,�����=������5����$%����������D�����&�������5����,

>�����)��=��������>����$�3>����%���������>����&,���=��������>����$�)��=��������>�������D�����%&,

De façon similaire à la classe ����������>����, la classe ����������K���� a unchamp de type ��� et une méthode ��D�����capable de convertir cet entier en son texte.

B K�����)��=������5����$�3K����%�������5����&,���=������5����$�)��=������5�������D�����%&,

D������''���"��$���=������5�����������%LM" +��$L&,D������''��>����$���=��������>�����������%L>>L&,D������''��$�''���"���������%�''��>����&,

Affiche 340 € = 2230.25 FF B ������'3����NJ�����O���'��3=''��E�����%�"��0�''��&,22

Page 69: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 57

Priorité des opérateursLa priorité d’un opérateur sur un autre et son associativité déterminent dansquel ordre seront appliqués les opérateurs. Comme en mathématiques, uneopération est rendue prioritaire grâce à l’usage de parenthèses.

Les opérateurs figurant sur une même ligne ont la même priorité ; ils sontrangés ligne par ligne du plus prioritaire au moins prioritaire.

Par l’exemple : comparer la somme de montants convertisL’application suivante réutilise la classe �����:'��"���'�6������''"��"��pour vous montrer quelques cas d’utilisation de la priorité des opérateurs etde l’opérateur � appliqué aux chaînes de caractères. L’opérateur � de concaté-nation simplifiant grandement la construction des textes, il sera utilisé systé-matiquement dans la suite.

Opérateur Associativité Description

�%&FG�3 de gauche à droite Opérateurs primaires

������%��'�& de droite à gauche Opérateurs unaires

��� de gauche à droite Multiplication, division, reste

�� de gauche à droite Addition, soustraction

!!$##$��'������ de gauche à droite Comparaisons

$$�$ de gauche à droite Égalité, différence

�� de gauche à droite Opérateur ET

(( de gauche à droite Opérateur OU

P7 de gauche à droite Condition

$�$�$�$�$�$ de droite à gauche Affectation

ASTUCE Concaténation avec l’opérateur +

L’opérateur � peut être utilisé à la place de la méthode ������ pour concaténer deux chaînes decaractères. Si l’un des opérandes de l’opérateur � est une chaîne de caractères de type����������D�����, une concaténation est implicitement effectuée en transformant l’opérandequi n’est pas de type ����������D�����en chaîne de caractères. Ce raccourci de programma-tion peut être utilisé, que l’opérande à convertir soit situé à droite ou à gauche du �.

�.�� � �.��

� Concaténation implicite entre les deux opérandes��/����� ��.��

�.�� � ��/�����

C++/C# Surcharge des opérateurs

Pour éviter toute confusion à la lecture d’un pro-gramme, la surcharge des opérateurs n’existe pasen Java, mais l’opérateur + est autorisé pour sim-plifier les opérations de concaténation de chaînesde caractères.

Page 70: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200458

EXEMPLE com/eteks/test/ConversionSommeMontantsEuro.java���:�������:'��'�,�����������:'��"���'�6������''"��"��,���''6����'���D���=������'�"��1�")���'��������8����%D�����FG���'&18�")��������*$ � �,8�")�������� $ +��C,

L’opérateur de conversion est prioritaire sur lesopérateurs arithmétiques.

B ������������5����$%�����&%�������*�������� &,

L’opérateur �3 a la même priorité que l’opéra-teur �, ce qui permet d’appeler une méthode surun nouvel objet sans utiliser de parenthèses.

B ������������*>����$�36������''"��"��%%�����&�������*&���=��������>����%&,������������ >����$�36������''"��"��%%�����&������� &���=��������>����%&,������������5����>����$�36������''"��"��%�������5����&���=��������>����%&,

L’opérateur � permet de concaténer plus facile-ment des chaînes de caractères.

B D������''��$LQ�'���88"��������'�������'�M" +���"�L�LM"++���8���;���8�"�'����������L

M� est le code du retour à la ligne. B �L�M" +��7M�L,

La référence �''�� peut être réutilisée pourrécupérer le message concaténé.

B �''��$�''����������*�LM" +���L�������� �LM" +��'�M"++B���M"+++L��������5�����LM" +��M�L,�''��$�''����������*>�����L>>�L�������� >�����L>>'�8���M"++B���8L��������5����>�����L>>L,������'3����NJ�����O���'��3=''��E�����%�"��0�''��&,22

C++ Priorité de l’opérateur new

En Java, l’opérateur �3 a la même priorité que l’opérateur �, ce qui permet d’écrire directement�3 $%���� %&�������%&. En C++, il faudrait écrire (�3 $%���� %&&�#������%&,ce qui normalement ne se fait pas, car contrairement à Java, il faut garder trace de tout objetC++ créé dynamiquement pour le supprimer ensuite.

Figure 4–1 Application�����:'��'��6����'���D���=������'�"��

Page 71: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 59

Piloter le programme avec les instructions de contrôle : boucles et branchementsLes instructions de contrôle s’utilisent pour programmer des tests condition-nels et des boucles d’instructions à répéter plusieurs fois.

Tester et décider sur condition avec if et switchLes instructions de branchement �� et '3���� déterminent le traitement àeffectuer quand une condition est vérifiée ou non.

Syntaxe des instructions if et if else

Le résultat de l’expression testée �'��-��%����� doit être ��" ou ���'. ��0��&� ���&-%�... peut être une instruction unique ou un bloc de plusieursinstructions si nécessaire.

Syntaxe de l’instruction switch

��%�'��-��%�����& 3 Si l’expression �'��-��%����� est vraie,

����&� ���&-%�� ��� ����&� ���&-%�� ��� est exécuté.

��%�'��-��%�����& 3 Si l’expression �'��-��%����� est vraie,

����&� ���&-%�� ��� ����&� ���&-%�� ��� est exécuté

�' sinon,

����&� ���&-%�� !�&' ����&� ���&-%�� !�&' est exécuté.

'3����%�'����� ���&1

3 Test de l’expression �'����� ���.

��'���'����*7� 3 Si �'����� ��� est égale à ���'����*,

����&� ���$���)��:,

����&� ���$��� est exécuté.

��'���'���� 7� 3 Si �'����� ��� est égale à ���'���� ,

����&� ���$���)��:,

����&� ���$��� est exécuté.

���"��'��''��;�''���

8��"��7� ����&� ���*��1���&�)��:,2�

3 Si aucun cas ne correspond, ����&� ���*��1���&� est exécuté.

JAVA Expression conditionnelle sans if

L’opérateur ternaire P 7 peut éventuellement rem-placer une instruction ���'.�'��-��%P�'���7�'�� renvoie la valeur de �'��� si �'��-��% est ��",sinon la valeur de �'���.

�$�'��-��%P�'���7�'���,

� ��%�'��-��%&�$�'���,�'�$�'���,

C++ Condition de l’instruction if

En Java, la condition de l’instruction �� doit êtreobligatoirement une expression de type )�����.Une condition comme �� %��� $ +& où unsigne $ a été oublié provoque donc une erreur decompilation alors qu’en C++, vous obtiendriez aumieux un warning.

ATTENTIONswitch est limité aux tests de nombres

L’instruction '3���� ne permet de tester quedes valeurs numériques entières ou des caractè-res. La valeur qui suit chaque ��' doit êtreune constante ou une expression constante quin’utilise pas de variable. Si l’expression d’un des��' n’est pas une constante entière, vousdevez utiliser l’instruction ���'.

Page 72: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200460

'3���� branche le programme sur l’instruction ��' dont la constante estégale à la valeur de l’expression �'����� ��� � �. Si ce cas n’existe pas, ellebranche le programme sur 8��"�� � lorsque ce cas par défaut est cité.

L’instruction )��:, branche le programme sur l’instruction qui suit l’acco-lade fermante du '3���� �. Elle peut être remplacée par l’instruction ��"��,ou ��"�� ��%�&�, pour sortir de la méthode courante, ou être absente pourpasser au ��' suivant (pratique pour tester un ensemble de valeurs).

Par l’exemple : convertir un nombre en toutes lettresLa classe suivante met en œuvre les deux instructions �� et '3���� pour réa-liser la conversion en toutes lettres d’un nombre compris entre 0 et 99. On ydécouvre que les nombreuses exceptions de la langue française se traduisenten Java par de nombreuses conditions à vérifier.

CONVENTIONS case sans break ou return

Si vous ne terminez pas un ��' par une instruction )��: ou ��"��, signalez-le avec uncommentaire �� ��' 8 )��: ou �� ����' ����"�� pour que les relecteurs de votreprogramme comprennent que vous avez omis cette instruction sciemment.

'3����%�'����� ���&1��'���7����'8)��:��'���7 ����&� ���$����&�

)��:,���"��'��'���2

C# Différences d’utilisation de switch

La syntaxe de l’instruction '3���� de Java res-semble plus à celle du C++ qu’à celle de C# : vousne pouvez pas l’utiliser pour tester des chaînes decaractères et tout ��' avec au moins une instruc-tion ne doit pas forcément se terminer par une ins-truction )��: ou ��"�� avant le ��' suivant.

EXEMPLE com/eteks/outils/NombreEntier.java���:�������:'��"���',

La classe �����:'��"���'�?��)������mémorise un entier initialisé dans le construc-teur de la classe.

B �")������''?��)������1������������)�,��")���?��)������%����&1���'����)�$�,2�")��������?��)�%&1��"�����'����)�,2

����<��������)�����������"�'����''R��'��������'���+�BB����")���D���������������Q���'%&1��%���'����)�#$+�����'����)�!*++&�'3����%���'����)�&

Page 73: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 61

1��'+7��"��LSM"++B��L,��'*7��"��L"�L,��' 7��"��L8"�L,��' 7��"��L����'L,��'H7��"��L9"���L,��'A7��"��L���9L,��'@7��"��L'��L,��'C7��"��L'��L,��'�7��"��L�"��L,��'B7��"��L�"�L,��'*+7��"��L8��L,��'**7��"��L��SL,��'* 7��"��L8�"SL,��'* 7��"��L���SL,��'*H7��"��L9"����SL,��'*A7��"��L9"��SL,��'*@7��"��L'�SL,��' +7��"��L�����L,��' +7��"��L����L,��'H+7��"��L9"�����L,��'A+7��"��L���9"���L,��'@+7��"��L'������L,

3 Les ��' testent les cas remarquables pour ren-voyer directement le texte correspondant aunombre.

8��"��71��<�����8��8�S����8'"���;'

3 Le cas par défaut concatène les dizaines et lesunités en toutes lettres.

���8�S���$%���'����)��*+&�*+,� 3 La division entière supprime les unités.

���"���'$���'����)��*+,� 3 Les unités sont égales au reste de la division par 10.

��%8�S���$$C+((8�S���$$B+&1

3 Si la dizaine du nombre est 70 ou 90, on retire10 à la 8�S��� et on ajoute 10 aux "���'.

8�S����$*+, 3 Équivalent à 8�S��� $ 8�S��� � *+,

"���'�$*+,2

3 Équivalent à "���' $ "���' � *+,

��%8�S���$$�+&1��%"���'$$+&��"��L9"��������'L,�'��"��L9"��������L��3?��)������%"���'&�����������Q���'%&,2D�����8�S�����Q���'$�3?��)������%8�S���&�����������Q���'%&,�D�����"���'��Q���'$�3?��)������%"���'&�����������Q���'%&,

3 Les nombres avec une dizaine égale à 80 (ou 90)sont traités à part car ils comportent plusieursexceptions : il faut mettre un s pour 80 mais paspour les autres nombres, et contrairement auxautres nombres avec une unité (21, 31...), 81 et91 ne s’écrivent pas avec la conjonction �� pourséparer les dizaines de l’unité.

��%"���'$$*(("���'$$**&��"��8�S�����Q���'�L�L�"���'��Q���',��'��"��8�S�����Q���'�LL�"���'��Q���',�22�'

3 Si les unités sont égales à un ou onze, il fautajouter le texte et entre la dizaine et les unités.

��"�����'����)��L�M"++B������"��������8L,22

3 Cette méthode se limite aux nombres positifsinférieurs à 100.

Page 74: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200462

La classe �����:'��"���'�?��)������ mémorise un entier � convertibleen toutes lettres avec la méthode ����������Q���' s’il est plus petit que100 �. Si l’entier n’est pas un cas remarquable dont le texte peut être ren-voyé directement, il est converti en toutes lettres en calculant sa dizaine �et ses unités �. Le résultat est alors la concaténation du texte en toutes let-tres de ces deux nombres � � obtenus en réutilisant les cas remarquables dela même classe �.

L’application de classe �����:'��'��?��)�'��5�"�'Q���' convertit unensemble de nombres avec la classe �����:'��"���'�?��)������ et affichele résultat (figure 4–2).

EXEMPLE com/eteks/test/NombresEnToutesLettres.java���:�������:'��'�,�����������:'��"���'�?��)������,���''?��)�'��5�"�'Q���'1�")���'��������8����%D�����FG���'&1D������''��$LT"�9"'���)�'���"�'����'7L,?��)�������*A$�3?��)������%*A&,

�''�� �$ ���, est équivalent à �''�� $ �''�� � ���,

B �''���$LM�L��*A���?��)�%&�L7L��*A�����������Q���'%&,?��)������� $�3?��)������% &,�''���$LM�L�� ���?��)�%&�L7L�� �����������Q���'%&,?��)�������C*$�3?��)������%C*&,�''���$LM�L��C*���?��)�%&�L7L��C*�����������Q���'%&,

?��)��������+$�3?��)������%�+&,�''���$LM�L���+���?��)�%&�L7L���+�����������Q���'%&,?��)�������B�$�3?��)������%B�&,�''���$LM�L��B����?��)�%&�L7L��B������������Q���'%&,������'3����NJ�����O���'��3=''��E�����%�"��0�''��&,22

Figure 4–2 Application �����:'��'��?��)�'��5�"�'Q���'

Page 75: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 63

Répéter un traitement avec les boucles while, do et forLes instructions de contrôle 3���, 8� et ��� permettent de répéter un traite-ment un certain nombre de fois. Elles sont utilisées pour effectuer des cal-culs par itérations et pour énumérer des ensembles de valeurs ou d’objets.

À la différence d’une boucle 3���, l’instruction ou le bloc d’instructions ����&� ���&-%� d’une boucle 8� 3��� est exécuté au moins une fois,puisque �'����� ��-��%����� est vérifiée après la première exécution de ����&� ���&-%�.

3���%�'��-��%�����& 3 Tant que l’expression �'��-��%����� estvraie,

����&� ���&-%� ����&� ���&-%� est exécuté.

8�

����&� ���&-%� 3 ����&� ���&-%� est exécuté,

3���%�'��-��%�����&, tant que l’expression �'��-��%����� estvraie.

ATTENTION while n’est pas toujours suivi d’un point-virgule

Autant vous prévenir, car tout débutant en C, C++, C# ou Java se laisse piéger un jour oul’autre par le problème suivant : mettons que vous ayez écrit une instruction 8� 3��� dutype :

8� � ����&� ���&-%��3���%�'��-��%�����&,�

Après mûre réflexion, vous pensez qu’il n’y a pas de raison que les instructions ����&� ���&-%� de cette boucle soient exécutées au moins une fois, et vous décidezde transformer l’instruction 8� 3��� en instruction 3��� simple. Vous effacez laligne � et coupez/collez la ligne � sous la ligne � pour obtenir :

3���%�'��-��%�����&, ����&� ���&-%�

Si dans la précipitation, vous n’avez pas éliminé le point-virgule à la suite du 3���, votreprogramme sera quand même accepté par le compilateur car l’instruction vide notée ,existe en Java ! Vous obtiendrez alors une boucle qui ne fera rien tant que �'��-��%�����sera vraie puis les instructions ����&� ���&-%� seront exécutées de toute façon, sibien sûr la condition d’arrêt du 3��� permet à la boucle de se terminer malgré cette erreurd’inattention... En conclusion, faites attention à bien éliminer le , dans le cas présent. Demanière générale, si vous voulez utiliser sciemment l’instruction vide avec les boucles3��� ou ���, isolez-la sur une ligne seule pour que les relecteurs de votre programme nepensent pas que vous ayez pu faire ce type d’erreur.

JAVA N’oubliez pas les parenthèses

La parenthèse ouvrante qui suit les mots-clés��, '3����, 3��� et ��� est obligatoire (etbien sûr la parenthèse fermante correspon-dante).

Page 76: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200464

Pour ces trois instructions, le résultat de l’expression testée �'��-��%�����doit être ��" ou ���'. Le corps de la boucle ����&� ���&-%� peut êtreune instruction unique ou un bloc si plus d’une instruction sont nécessaireset peut éventuellement contenir les instructions suivantes :

Les possibilités d’utilisation de l’instruction ��� sont résumées par le dia-gramme 4-3.

���%�'����� ���� �,�'��-��%�����,�'������������ ��&

3 �'����� ���� � est exécuté puis tant quel’expression �'��-��%�����#est vraie,

����&� ���&-%� 3 ����&� ���&-%� et �'������������ ��#sont exécutés (dans cet ordre).

Instruction Effet

)��:, Sortie de la boucle courante.

������", Retour à l’évaluation de la condition du 3��� ou de l’instruction �'������������ �� du ���courant sans terminer ����&� ���&-%�.

��"��,�"��"����%�&�, Sortie de la boucle courante et de la méthode courante.

Figure 4–3 Diagramme d’exécution d’une boucle ���

JAVA Limiter la portée de l’indice de boucle

La première instruction du ��� �'����� ���� �,peut comporter la déclaration d’une ou plusieursvariables locales du même type, séparées par des vir-gules (0) ; la portée de ces variables est limitée auxexpressions de l’instruction ��� et à ����&� ���&-%�. La troisième instruction�'������������ �� peut elle aussi être unensemble d’instructions séparées par des virgules (0).À l’opposé, si vous avez besoin de la valeur finaled’une variable déclarée dans le ��� pour la suite, ilfaut la déclarer avant l’instruction ���.

C++ Variables déclarées par une instruction for

En Java, toutes les variables déclarées dans la pre-mière expression �'����� ���� � de l’instruc-tion ��� doivent être du même type. Notez aupassage que l’opérateur virgule (0) du C++n’existe pas en Java, excepté pour la première et latroisième expression du ���, et pour séparer ladéclaration de plusieurs variables de même type,comme ��� �0 4,.

C++ Condition des instructions while et for

Comme pour l’instruction ��, la condition d’arrêtdes instructions 3��� et ��� doit être obligatoi-rement une expression de type )�����.

ASTUCE Étiquettes ou labels

Notez la possibilité d’utiliser des étiquettes ou labelspour préciser au début de quel bloc d’instructionsrediriger un )��: ou un ������", ce qui est par-ticulièrement utile dans le cas de boucles imbri-quées. Vous pouvez ainsi « étiqueter » une boucleextérieure ��� en écrivant �� 2&����7��� puisécrire )��: �� 2&����, pour sortir de cetteboucle, même depuis une boucle imbriquée. Cettepratique se rencontre rarement.

expressionInit

instructionOuBloc

A l'appel d'une instruction : break;continue;return ...;

exprIncrementation

exprBooleenne

true

false

Instruction suivante de la boucle

Sortie de la méthode

Page 77: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 65

Par l’exemple : quelques calculs de probabilité classiquesLes calculs de probabilité sont utilisés dans de nombreuses applicationsprofessionnelles : économie, statistiques... La classe suivante vous montrecomment programmer les quatre calculs combinatoires les plus connus avecles trois instructions de boucle Java.

JAVA Expressions vides d’une instruction for

Il n’est pas obligatoire de renseigner chacune des expressions �'����� ���� �,�'��-��%����� ou �'������������ �� d’une instruction ���. Si �'��-��%����� estvide cela correspond à une condition toujours vraie. Par conséquent, l’instruction ��� suivante :

���%,,& ����&� ���&-%�

est équivalente à l’instruction 3��� suivante :

3���%��"& ����&� ���&-%�

CONVENTIONSNommage des indices de boucle

L’identificateur d’une variable locale utiliséecomme indice de boucle est généralement �, �,:, � ou �.

EXEMPLE com/eteks/outils/Probabilite.java���:�������:'��"���',�")������''O��)�)����1����<��������)�8R���������'��''�)�''��'�;�;�����������;�;���'���'������;�;���'�����$��%��*&�����%���� &�%����*&���")����������������'D��'<�������%�����0�����&1�����'"����$�-��*,

�����$�'"�����*,3���%�!$�&1�'"����$�'"������,�$��*,2��"���'"����,2����<��������)�8R���������'��''�)�'����;�;�����������;�;���'���'������;�;���'%��"�''����&���")����������������'���<�������%�����0�����&1�����'"����$*,

3 � indice de la boucle 3���.Tant que � est inférieur ou égal à �

Multiplier �'"���� par �augmenter � de 1.

�����$*,8��'"�����$�,3���%���!$�&,��"���'"����,2

3 � indice de la boucle 8�3���.

Multiplier �'"���� par �,tant que � incrémenté de * est inférieur ou égalà �.

Page 78: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200466

L’application ci-dessous utilise la classe �����:'��"���'�O��)�)���� précé-dente pour calculer et afficher quelques probabilités classiques.

����<��������)�8���"������'��''�)�'�����';�;���'8R"��'�)�8�;�;���'��O�$��$��%��*&�%�� &����� � �*���")����������"������'%�����&1�����'"����$*,

Pour � compris entre et �,multiplier �'"���� par �.

B ���%�����$ ,�!$�,���&�'"�����$�,��"���'"����,2

����<��������)�8���)����'��'��''�)�'�����';�;���'����;�;���'���'������;�;���'��6��$������$��%��*&�����%����*&������")����������)����'��'%�����0�����&1��"�����������'D��'<�������%�0�&����"������'%�&,22

EXEMPLE com/eteks/test/CalculProbabilites.java���:�������:'��'�,

�����������:'��"���'�O��)�)����,

���''6���"�O��)�)����'1�")���'��������8����%D�����FG���'&1

Création d’une instance de la classe �����:'��'��O��)�)���� pour appeler lesméthodes de calcul de probabilité.

B O��)�)�������)�)����$�3O��)�)����%&,�������)�6��)����'��' )��'$���)�)��������������'���<�������% 0 &,�������)�5���'���J�8�$���)�)��������������'D��'<�������% +0 &,�������)������'*++�$���)�)��������"������'%*+&,�������)�U����'Q���$���)�)��������)����'��'%HB0@&,

Construction d’un message affichant les valeurscalculées.

B D������''��$L?��)�8���)����'��'��''�)�'��� )��'7L����)�6��)����'��' )��'�LM�?��)�8����M"++B'8��'�R��8�L�L��� +����"��"8M"++B����7L����)�5���'���J�8��LM�?��)�8R�����M"++B'L�L���*+��"�"�'�"8M"++B����7L

Page 79: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

4 –

Cont

rôle

des

trai

tem

ents

ave

c le

s op

érat

eurs

, bou

cles

et b

ranc

hem

ents

© Groupe Eyrolles, 2004 67

Portée des variables locales et des paramètresUne variable locale ne peut pas utiliser le même identificateur qu’un para-mètre ou qu’une autre variable locale de même portée. Par exemple :

Même si les déclarations des deux variables locales �"�''���E*+ figurentdans des blocs imbriqués, ce programme provoque l’erreur de compilationsuivante :

����)������'*++��LM�?��)�8�����'��''�)�'8"����7L����)�U����'Q���,������'3����NJ�����O���'��3=''��E�����%�"��0�''��&,22

Figure 4–4 Application �����:'��'��6���"�O��)�)����'

���:�������:'��'�,���''6���"�O"�''���1�")�������"�''���E*+%����&1

����"�''���E*+, 3 Déclaration de �"�''���E*+

��%�!+&��"��+,�'1����"�''���E*+$*,

3 Si la valeur est négative, on renvoie zéro.

3 Erreur ! �"�''���E*+ est déjà déclarée.

���%����$�,�#+,���&�"�''���E*+�$*+,

3 Calcul de la puissance en multipliant � fois par10.Multiplication de �"�''���E*+ par 10.

��"���"�''���E*+,222

3 Après ���, � n’existe plus et pourrait être redé-clarée.

'��������:'��'��6���"�O"�''��������7*@7�"�''���E*+�'����848���8���"�''���E*+%���&����"�''���E*+$*,

C++ Utilisation des variables locales

En Java, une variable locale peut cacher un champmais pas un paramètre ou une autre variablelocale déclarée à l’extérieur de son bloc. Parailleurs, il est rappelé qu’une variable locale Javadoit être initialisée avant d’être utilisée dans uneexpression.

Page 80: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200468

En résumé…Ce chapitre vous a montré comment programmer des calculs et des traite-ments plus ou moins complexes dans les méthodes. Si votre traitementdevient long ou trop complexe n’hésitez pas à le décomposer en plusieursméthodes, il sera plus facile à comprendre...

CONVENTIONS Bonnes pratiques d’écriture autour des opérateurs et des instructions

Voici une liste de quelques conventions de programma-tion qui complète celles données sur les identificateurs :• Aérez l’écriture de vos formules avec un espace avant

et après chaque opérateur.• Utilisez une indentation constante en évitant les tabu-

lations.• Ne jamais écrire plusieurs instructions sur la même

ligne, du type :

ou pire :

Non seulement ce n’est pas clair mais cela ne peut êtreutilisé sous les débogueurs qui fonctionnent ligne parligne.

• Créez des variables locales pour les calculs coûteux etrépétitifs, notamment avec des multiplications ou divi-sions sur les types ����� et 8�")�.

• Une variable utilisée par une méthode pour stockerune valeur temporaire de calcul doit être déclaréecomme variable locale et non pas en tant que champsupplémentaire d’une classe.

Bien que les conventions suivantes soient prônées parSun Microsystems, elles ne sont pas appliquées dans cetouvrage (et aussi quelquefois en entreprise) :• Déclarez toute variable locale au début d’un bloc (et

pas juste avant d’en avoir besoin, méthode préféréeici).

• Toute instruction ��, 3���, 8� ou ��� doit être suivied’un bloc, même si ce bloc ne contient qu’une seuleinstruction.

• L’accolade ouvrante d’un bloc ne doit pas être isoléesur une ligne en respectant le modèle suivant :

B http://java.sun.com/docs/codeconv/

��%�#+&1�$����&%�$���% 2&��,2

��%�#+&1�$����&%�$���% 2&��,2X�'1�$�&���!���&%�$���% 2&��,2

��%�'��-��%�����&1 ����&� ���� ���

2

Page 81: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

5Réutilisationdes classes

SOMMAIRE

B Composition

B Héritage

B Polymorphisme

B Conversion de référence

B Redéfinition de méthode

B Méthode de classe

MOTS-CLÉS

B extendsB superB staticB final

Si le concept sur lequel repose une classe est clair et homogène, pourquoi ne pas le réutiliser comme brique de base pour concevoir d’autres classes ? Ce chapitre présente les différentes façons de réutiliser une classe, de l’enrichir, voire d’en altérer l’implémentation sans la modifier.

Instrument

Instrumentà cordes

Instrumentà vent

Guitare Violon Saxophone Flûte

Page 82: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200470

Réutiliser des classes existantes, qu’elles fassent partie de la bibliothèque Javaou qu’elles aient été créées par vous, est indispensable pour pouvoir déve-lopper de manière productive. La réutilisation s’exprime de plusieursmanières : une classe peut en référencer une autre grâce à la composition,reprendre les caractéristiques d’une autre grâce à l’héritage, ou modifierl’implémentation des méthodes d’une autre grâce au polymorphisme.

Réutiliser en composant : la relation « a un »La composition associe un objet à un autre objet, définissant une relationa un entre ces deux objets : un objet de la classe �������� peut par exemple« avoir » un objet de la classe ������.

En Java, cette relation s’utilise simplement en déclarant un champ de typeclasse :

Par l’exemple : une même adresse pour deux personnesCet exemple montre comment programmer les classes représentant l’adressed’une personne avec une relation de composition. La troisième classe metensuite en œuvre les deux premières dans une application.

��� ���$%������&� % ���������

DANS LA VRAIE VIE Compositionavec la classe java.lang.String

La classe � � �� ��������� est la classe le plussouvent utilisée en composition et permet de stoc-ker une information textuelle d’un objet, par exem-ple le champ �������� de la classe ������������������������.

EXEMPLE com/eteks/outils/Adresse.java �� ���������������������������� ����������

Champ mémorisant la rue et son numéro.Champ mémorisant le code postal.Champ mémorisant la ville d’une adresse.

B ����� ������������������� �������������� ������� ������������������������������������������������������� �������������������������������� ��������������������� �� �������� ����������������� ���������!������������������"�����������������������������!���������������#������ ����������������������������� ����!

Page 83: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 71

La classe précédente, �����������������������, est réutilisée par la classe������������������������� avec une relation de composition pour mémo-riser l’adresse d’une personne (une personne a une adresse) :

L’application de classe ���������������$��%���������&�������� utilise lesdeux classes précédentes et montre qu’il est possible de partager une mêmeinstance de la classe ����������������������� pour deux personnes.

������������������'���������������������������������!!

EXEMPLE com/eteks/outils/Personne.java �� ���������������������������� ������������

����� �������������������� ���������������������� ���������� ��������������������������������������������������������������������� �������������������� ���������!������������������(�����������������������������!�����������������������������������������������������!��)**���*�+��,����- ��������� ������������*)������������������������������ ������������������ ������ � ��������!��)**���*�"��������- �������������������������*)��������������������������������������������� ��������!!

3 Champ mémorisant le nom d’une personne.Champ mémorisant le prénom d’une personne.Champ mémorisant l’adresse d’une personne.

Page 84: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200472

Réutiliser en héritant : la relation « est un »Basés sur les classes et l’encapsulation, l’héritage et le polymorphisme sont lesdeux autres concepts introduits par la programmation objet. Les classes de laprogrammation objet formalisent des catégories d’objets. Une catégoriedonne parfois lieu à des sous-catégories, qui comptent une ou plusieurs carac-téristiques supplémentaires. C’est cette hiérarchie, obtenue entre catégories etsous-catégories, que l’on tente de reproduire en programmation objet grâce àl’héritage. L’héritage définit une relation est un entre deux classes, une sous-classe héritant de sa super-classe. Par exemple, une guitare pourrait êtrereprésentée sous forme d’un objet de classe .��� ��, sous-classe de la classe/����������#����, qui hériterait elle-même de la classe /���������.

EXEMPLE com/eteks/test/DeuxPersonnesUneAdresse.java �� ������������������

�����������������������*�

�� ���$��%���������&������������������� ��������� ����������01� ���������������������������2�

Création d’une instance de ������������������������� pour Thomas Durand.

B �����������2� ���3�����������4$�� �4��45��� �4������������� �����2�

Création d’une instance de �����������������������.

B ���� �����2� ���3��������46��������"�����4��76889��4��"/�4��

Affectation de son adresse à Thomas. B �����������2������������ �����2��

Création d’une autre instance de ������������������������� pour Sophie Martin.

B ��������������������:� ���3����������4+ ����4��4�����4��

Affectation directe de l’autre adresse avec unenouvelle instance.

B �����������:�������������3��������4;�������� �. ��4�����������������������������������<6;88��4�=(5=/�>4���

Plus tard... Sophie déménage chez Thomas etpartage donc son adresse.

B �����������:�������������������2���������������

Plus tard... ils voient plus grand et déménagenttous les deux.

B ����������� �����#������� ����������������3��������4?��������"�����4��76889��4��"/�4�������������2������������ �����#�������������������:������������ �����#��������

Et vous annoncent la nouvelle. Les référencesrenvoyées par �������2������������ et�������:������������ sont égales etdésignent le même objet.

B ����������� ������ ��������2����������������"�����@�4�A�88�8�4���������������������@��������:����������������'��������������������������� ���������������2�������������@�4����4�@��������:�������������������@�4�� �������� ����� ��� ��4�@� ������

Affiche Thomas et Sophie habitent maintenant au8, rue de Rennes, à PARIS.

B ����� � %��3����B=����� ������3+��� ��$� �����������������������!!

B.A.-BA Héritage

Le vocabulaire lié à l’héritage en programmationobjet fourmille de synonymes :• hériter = étendre = dériver = sous-classer• super-classe = classe de base = classe mère• sous-classe = classe dérivée = classe fille

Page 85: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 73

Définir une sous-classePour qu’une classe hérite d’une autre, on utilise le mot-clé �%���� suivi del’identificateur de la super-classe dont hérite une sous-classe. La super-classene se trouve pas nécessairement dans le même paquetage que la sous-classe.

Une sous-classe peut définir des champs ou des méthodes qui viennent alorss’ajouter à la liste de ceux de sa super-classe. Les champs et les méthodesaccessibles hérités de la super-classe peuvent être utilisés comme s’ils avaientété déclarés par la sous-classe elle-même. Une référence de la sous-classepeut donc être suivie des membres accessibles de sa classe ou des membreshérités de sa super-classe.

Initialisation en deux temps pour les objets d’une sous-classeLors de la création d’un objet, la partie qui dépend de sa super-classe est ini-tialisée en premier, avant celle qui dépend de sa propre classe. Si l’initialisa-tion de la super-classe requiert l’appel d’un constructeur avec paramètres, lepassage des valeurs à ce constructeur s’effectue dans le constructeur de laclasse dérivée avec comme première instruction �������������.

�� �������������������� �������#� ������))�#� �������C�����!�� �������#� �����%���������#� ������))�#� �������C���������C���� ����!

JAVA Restrictions d’accès aux membres hérités depuis une sous-classe

Un objet d’une sous-classe mémorise les champs de sa super-classe et ceux de sa classe.Même si une sous-classe reprend les caractéristiques de sa super-classe, des restrictionsd’accès aux champs et méthodes peuvent toujours s’appliquer entre elles. La sous-classen’a pas forcément accès à certains des champs et méthodes dont elle hérite :• Les membres ��� �� d’une super-classe restent inaccessibles depuis ses sous-classes.• Les membres friendly (sans modificateur d’accès) d’une super-classe sont accessibles

depuis les sous-classes qui appartiennent au même paquetage que la super-classe.• Les membres ������� d’une super-classe sont accessibles depuis n’importe quelle

sous-classe, quel que soit le paquetage de ces classes. Les membres ������� sontaccessibles aussi depuis toutes les classes d’un même paquetage, comme pour les mem-bres friendly.

• Les membres ����� d’une super-classe sont bien sûr accessibles depuis ses sous-classes.

Ne créez un lien d’héritage entre deux classes quesi une instance de la sous-classe peut être consi-dérée aussi comme une instance de sa super-classe par la relation est un. Parfois les relations decomposition et d’héritage s’utilisent dans la mêmeclasse. Par exemple, un camion transporteur devoiture est un véhicule et a des véhicules.

Page 86: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200474

Par l’exemple : alcoolisée ou non, choisissez votre boissonCet exemple montre comment programmer une classe qui représente uneboisson alcoolisée en héritant d’une super-classe de boisson.

EXEMPLE com/eteks/test/Boissons.java �� �������������������� ���D�������

Champ mémorisant le nom d’une boisson.Champ mémorisant le prix d’une boisson.

B ����� ������������������� ���,�� �����%�

��������D��������������������,�� ����%������������������ ����������������%� ���%���!������������������(������������������������������!��������,�� ��������%������������������������%���!!

La classe ���������������D����������������hérite de la classe ���������������D������.

B �� ���D������������������%�����D�������

Champ mémorisant le degré d’alcool d’une bois-son alcoolisée.

B ����� ��������������������������D�����������������������������,�� ����%��������������������

Initialisation de l’objet�D������. B �����������������%��

Initialisation de l’objet D����������������. B �������������������� ��������������!���������������$���������������������������������������������!!

�� ���D������������������ ��������� �����������01� �����������D����������� ���3�D��������4B���E�� ���4��;�,��

Création d’un objet de la super-classe ���������������D������. B

��������������� ��� ��������(������@�4�A�88�8�4����������������������@�����������%���@�4�A�:8 �4�

Affiche Jus d’orange à 3.0 €. B ����� � %��3����B=����� ������3+��� ��$� �������������� ������

Création d’un objet de la sous-classe ���������������D����������������.

B ����D�������������������������������� ���3�D������������������4�����4��<�6,��2?��

On peut appeler les méthodes ���(��,������% et ���$���������� avec ����.

B �������� ��� ���������(������@�4�4�@���������$��������������������������@�4A�88�8�A�88�8�4�@������������%���@�4�A�:8 �4�

Affiche Porto 18° à 9.5 €. B ����� � %��3����B=����� ������3+��� ��$� �������������� ��������!!

Page 87: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 75

L’application de classe ���������������D������� affiche les caractéristiquesd’une boisson � et d’une boisson alcoolisée �.

Les objets représentant les boissons sont de classes ���������������D������et ���������������D����������������, la classe D���������������� héritant dela classe D������.

C++ Héritage et chaînage des constructeurs

En Java, la super-classe d’une classe est précédée du mot-clé �%���� qui remplace lesymbole deux points (F) du C++. Comme l’héritage multiple n’existe pas en Java et qu’iln’est pas possible d’initialiser les champs à la déclaration d’un constructeur, la syntaxe uti-lisée pour chaîner les constructeurs est différente en Java et en C++. Pour information,voici l’équivalent en C++ du constructeur de la classe D���������������� décrit pageprécédente :

�D����������������FFD�������������������������������������������������������������������� ,�� �����%���������������������������������������������������������

� F�D��������������%����������������������������!

L’héritage se fait systématiquement de manière ����� en Java. L’héritage multiple duC++ peut être remplacé par la possibilité d’implémenter plusieurs interfaces dans uneclasse (notion abordée au chapitre 7 « Abstraction et interface »).

C# extends = : et super = base

Mis à part le symbole deux points (F) remplacépar le mot-clé �%���� et le mot-clé � �� rem-placé par ����, Java et C# utilisent la mêmesyntaxe pour l’héritage.

ATTENTION N’oubliez pas d’appeler super si nécessaire

Si aucun constructeur n’est défini dans la classe���������������D���������������� ou si vous oubliez l’appelau constructeur de la super-classe ���� ��������%��, le com-pilateur affiche cette erreur :

Le compilateur croit en fait que le constructeur de la sous-classecontient l’appel par défaut ���� ��� qui appelle le constructeursans paramètre de la super-classe ���������������D������,lequel n’existe pas.Selon qu’une super-classe a ou non un constructeur avec ou sansparamètre, ses sous-classes peuvent donc être obligées de définirun constructeur qui utilise l’instruction ����, ce que résume letableau ci-contre.

Notez au passage qu’une classe n’hérite pas des constructeurs desa super-classe : vous êtes donc obligé d’ajouter un constructeur àune classe si sa super-classe n’a pas de constructeur sans paramè-tre, même si c’est pour passer au constructeur de sa super-classedes valeurs par défaut ou lui repasser les mêmes valeurs.

���)���)�����)����)D��������� � F;:F�� ��������������G�����G������F�������������D������������� ����F��� ������������������D������� (avec recopie de la ligne 32) Super-classeB Constructeur par

défaut ou constructeur

sans paramètre

Constructeur(s)avec paramètre(s)

Sous-classe

Constructeur par défaut

Ok Interdit

Constructeur sans paramètre ou avec paramètre(s)

Ok(appel implicite à

�������)

Appel à �������������

Page 88: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200476

Réutiliser en implémentant différemment : le polymorphismeLe polymorphisme est la faculté d’une classe à prendre plusieurs formes. Siune classe et ses sous-classes implémentent différemment un même mes-sage, les objets des sous-classes prennent des formes différentes pour ce mes-sage du point de vue de leur super-classe.

Relation « est un » et conversion de référenceDe façon similaire aux conversions numériques, les conversions opérant surune référence utilisent la syntaxe �$%�������,������. Elles changent la classed’une référence sans transformer ni la valeur de cette référence ni l’objetqu’elle désigne. Elles sont autorisées à la compilation si la classe de conver-sion et la classe de la référence ont un lien d’héritage entre elles. Lors del’exécution, la JVM vérifie que la classe de conversion est effectivement cellede l’objet référencé ou une des super-classes de cet objet.

Par l’exemple : boisson et boisson alcoolisée, ne mélangez pas les genres...La classe ���������������D���������������� dérivant de la classe ���������������D������, voyons les conversions qu’il est possible d’effectuer sur desréférences de ces classes.

À RETENIR Les dessous du polymorphisme

Le polymorphisme est rendu possible grâce àl’héritage (relation est un) et à la redéfinitiondes méthodes.

ASTUCEConversion implicite, relation est un

La possibilité de désigner un objet d’une sous-classe par une référence relevant de sa super-classeest la traduction Java de la relation est un (lewhisky, boisson alcoolisée, est une boisson). Cetterelation est si logique que Java ne vous oblige pasà noter la classe de conversion entre parenthèsesdans le sens sous-classe vers super-classe :

�������� �3����G���������� ��D�������3����G�

EXEMPLE com/eteks/test/ConversionsReferencesBoisson.java �� ������������������������� � %��3����B=����� ����� ���#����������"�,�������D����������������� ��������� �����������01� �������

Création d’objets. B ����D�������� �� ���3�D��������4> �����A�88�<� ��4��2,������D�����������������3����G����������������� ���3�D������������������4H����G4��7�I,��I6��

Déclaration de références pour tester les possibi-lités des conversions.

B ����D�������������������D������������������������J���������D��������������/�������� �������������������������������������������

Compilation OK et exécution OK. B ������������ ��D�������3����G���

Affiche Whisky. B ����B=����� ������3+��� ��$� ���������������������(��������

Compilation OK et exécution OK. B �����������J����� ��D���������������������������

Compilation OK et exécution OK. B �����������J����� ��D������������������������/����������

Page 89: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 77

On peut donc :� Convertir une référence d’une classe vers sa super-classe (le whisky est uneboisson) et � appeler avec la référence boisson toutes les méthodes de laclasse ���������������D������ (mais pas les méthodes supplémentaires de laD����������������, classe effective de l’objet désigné).� Convertir une référence d’une classe vers sa sous-classe, si l’objet réfé-rencé est effectivement une instance de la sous-classe. Ici, l’objet désigné par������� est bien un objet de classe ���������������D����������������.� Convertir une référence d’une classe vers sa sous-classe si l’objet référencéest inconnu.En revanche, il n’est pas possible de :� Convertir une référence d’une classe vers sa sous-classe, si l’objet réfé-rencé n’est pas effectivement une instance de la sous-classe. Comme la plu-part du temps le compilateur ne peut pas déduire du contexte la classe effec-tive d’un objet à partir de sa référence, la vérification de la classe de l’objetest toujours reportée à l’exécution. Ici, l’objet désigné par � � n’étant pas unobjet de classe ���������������D����������������, la JVM déclenche uneexception � � �� ���#� ��# ��>%������ qui interrompt le cours du pro-gramme. Cette vérification évite au programme d’avoir un comportementimprévisible à l’appel de la méthode ���$���������� avec la référence�������J���� �, du type : quel serait le degré d’alcool de l’eau ?� Convertir une référence d’une classe vers une autre classe si les deuxclasses n’ont aucun lien d’héritage entre elles.

�����������J����� ��D������������������ ������������������� ��� ��������J��������(������@�4�4����������������������@��������J��������$�������������@�4A�88�84�������B=����� ������3+��� ��$� �������������� ����

3 Compilation OK mais erreur à l’exécution provo-quant une exception � � �� ���#� ��# ��>%������.

����))��������� ���������������������������� ������!!

3 Cette instruction est mise en commentaire carelle est refusée par le compilateur qui provoquel’erreur ���������������G��.

À RETENIR Méthodesaccessibles avec une référence

La classe d’une référence détermine les métho-des qu’il est possible d’appeler sur cette réfé-rence, même quand l’objet désigné est une ins-tance d’une sous-classe et compte en fait plusde méthodes.

C++/C# Limitations de l’opérateur de cast

En Java, l’opérateur de cast est limité aux typesnumériques et aux références. Contrairement auC++ et à C#, aucune conversion d’un objet en unautre objet ou en une valeur de type primitif n’estpossible par application d’un opérateur de cast.

C++ (Classe)obj ≈dynamic_cast<Classe &>(obj)

Du fait que le compilateur et la JVM effectuent desvérifications sur le bien-fondé d’une conversion deréférence, l’opérateur de cast de Java ressembleplus à l’opérateur G� ���K� �� du C++ qu’àson (trop) tolérant opérateur de cast simple.

REGARD DU DÉVELOPPEUR À quoi sert la conversion de références ?

Quel est l’intérêt d’utiliser une référence de classe���������������D������ pour désigner une instance de sasous-classe alors que vous aurez moins de méthodes à dis-position avec une telle référence ? Voici les deux cas prin-cipaux d’utilisation :• Passer en paramètre un objet d’une catégorie de classes

donnée – Par exemple, si vous créez une méthode G��dans une classe pour gérer le paiement d’une boisson,vous n’aurez besoin que de la méthode ������% de laclasse D������. En déclarant la méthode G�� avec unparamètre de classe D������, ��� G��(D������ �),

vous pourrez passer en paramètre un objet de classeD������, de classe D���������������� voir d’une autresous-classe de D������ qui n’existe pas encore.

• Créer un ensemble d’objets d’une catégorie de classesdonnée – Par exemple, un tableau de références declasse D������ vous permet de programmer un casier àbouteilles capable de mémoriser des objets de classeD������ ou de classe D����������������. Le prix ducasier peut alors être calculé en additionnant le prix dechaque boisson du tableau grâce à la méthode ������%,ce que vous verrez au prochain chapitre.

Page 90: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200478

Modifier l’implémentation d’une méthode avec la redéfinitionUne méthode non ��� �� d’une classe est redéfinie (overridden en anglais)quand elle est définie dans une classe et une sous-classe avec la même signa-ture, c’est-à-dire avec le même identificateur, le même type de retour, lemême nombre de paramètres, et le même type pour chacun des paramètres.

Par l’exemple : changer de messageLa méthode ,,����� de la classe ���������������+��� ������� � est redé-finie dans la classe ���������������+��� ��"���� �. Lors de l’exécution del’application, la méthode ,,����� appelée � � � est celle définie dans laclasse de l’objet qui reçoit le message et pas celle définie dans la classe de laréférence qui précède ,,�����.

EXEMPLE com/eteks/test/AfficherMessages.java �� ������������������������� � %��3����B=����� ����� ���+��� �������������������� ,,�����������������B=����� ������3+��� ��$� �����������4D�������L4����!!

ASTUCE Affichage de texte mis en forme

Si le texte du paramètre de ���3+��� ��$� ���commence par la balise M����N �, le texte estaffiché en utilisant le format HTML. Ici, le textecompris entre les balises M�N et M)�N (� commebold) est donc affiché en gras, suivi d’un retour à laligne (balise M��N) et du texte en italique comprisentre les balises M�N et M)�N.

Figure 5–1 Texte mis en forme

Sous-classe de ���������������+��� �������.

B �� ���+��� ��"������%�����+��� ��������������������� ,,�������������

Affiche un message différent de celui de sasuper-classe.

B ����B=����� ������3+��� ��$� ����������4M����NM�N'����B � �LM)�N4��������@�4M��NM�NO������ ������� �P�Q� �����M)�NM)����N4������!!�� ����,,�����+��� �������������� ��������� �����������01� �������

Instanciation des deux classes. B ����+��� ������������ ��� ���3�+��� ���������������+��� ��"��������� ��"����� ���3�+��� ��"��������

Affiche Bonjour. B �������� ��� ,,����������

Affiche Vive Java ! Le programmeur masqué. B �������� ��"����� ,,����������

Conversion de ���� ��"���� dans une réfé-rence de sa super-classe (���� ��"���� estconverti implicitement dans le type���������������+��� �������).

B �������� ��� ����� ��"�����

Affiche Vive Java ! Le programmeur masqué. B �������� ��� ,,������������!!

Page 91: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 79

L’appel à une méthode non ��� �� sur un objet s’effectue en Java au moyende la ligature dynamique, c’est-à-dire que la méthode effectivement appeléen’est pas déterminée statiquement à la compilation, mais dynamiquement àl’exécution en fonction de la classe effective de l’objet désigné (la classe quisuit l’opérateur ��3 au moment de la création de l’objet). Même si l’utilité dela ligature dynamique paraît limitée aux méthodes redéfinies d’un pro-gramme, Java l’utilise systématiquement pour « préparer le terrain » au casoù une sous-classe redéfinissant des méthodes serait développée plus tard...

De ce fait, la redéfinition est souvent utilisée dans une sous-classe pouraltérer une méthode d’une super-classe d’une bibliothèque. Par exemple, uneclasse d’applet hérite de la classe � � %��3����B���� et redéfinit la méthode���� pour spécifier les instructions à effectuer lors de l’initialisation d’uneapplet.

Modifier l’implémentation sans oublier la méthode redéfinieIl arrive quelquefois que pour implémenter une méthode d’une sous-classe,il faille appeler la méthode redéfinie de la super-classe. ������������comme������ appelant la méthode ���� de sa propre classe, il faut alors utiliser����������� pour appeler la méthode ���� de la super-classe.

ATTENTION Ne confondez pas surcharge et redéfinition

La surcharge n’est pas la redéfinition (les mots anglais overload et override portentquelquefois à confusion). La surcharge permet dans une classe ou une sous-classe d’utiliser le même identificateur pour une méthode si elle a des paramè-tres de types différents tandis que la redéfinition permet de changer l’implé-mentation d’une méthode d’une classe en la déclarant avec le même identifica-teur et des paramètres de même type dans une sous-classe.

Respectez donc bien l’orthographe de l’identificateur des méthodes que vousredéfinissez et les types de leurs paramètres. Si la déclaration de la nouvelleméthode a un identificateur ou des types de paramètres différents, elle neredéfinira pas celle de la super-classe, le compilateur ne vous signalera rien etfinalement la méthode appelée sera celle de la super-classe au lieu de celleque vous avez déclarée. En revanche, les identificateurs des paramètres n’ontpas d’importance et peuvent être différents de ceux de la méthode redéfinie.

redéfinir = to override = outrepasser = spécialiser = supplanter ≠ surcharger

C++/C# Toute méthode Java est virtuelle

Toutes les classes Java utilisent d’office le polymor-phisme et l’appel aux méthodes s’effectue systé-matiquement avec la ligature dynamique. Lesmots-clés ����� � et ������� du C++ etde C# n’existent pas en Java.

C++ Appel à une méthode redéfinie

À la notation �&���$%����FF�������� utili-sée en C++ pour appeler la méthode redéfinied’une super-classe correspond �������������en Java.

C# super = base

Le mot-clé � �� utilisé aussi en C# pour appeler laméthode redéfinie d’une super-classe est remplacépar ���� en Java.

Page 92: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200480

Par l’exemple : calculer les intérêts d’un compte épargneLa classe ���������������#���� permet de créer un compte en banque avecson identificateur et son solde. Sa sous-classe ���������������#����> ����redéfinit la méthode ������� de la classe ���������������#���� pour ren-voyer le solde original auquel sont ajoutés des intérêts.

EXEMPLE com/eteks/test/CalculInterets.java �� �������������������� ���#�����

Figure 5–2 Application ���������������# ����/�������

Champ mémorisant l’identifiant d’un compte.Champ mémorisant le solde d’un compte.

B ����� ���������������,� �������� ���,�� �������

��������#������������������,� ����,�� �����������������������,� ��� ������,� ����������������� �������!������������������/����,� ����������������������������,� �����!��������,�� �������������������������������������!!

#����> ���� hérite des champs ��� �������,� �� et ����.

B �� ���#����> ������%�����#������

Champ mémorisant le taux d’intérêt applicable.Champ mémorisant le nombre d’années d’épargne.

B ����� ���,�� ��� �%������ ������� ���������������#����> ������������������,� ����,�� ������������������������������,�� ��� �%�������������������,� ������������������� �%� �� �%���!��������������������������� ���������

Modification du champ ����� si le paramètreest positif ou nul.

B �����,�� ������N �8������������ ������ � ��������!������������������������������������������� ��������!�����������������5 �%����������������������� �%���!

Page 93: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 81

Réutiliser sans créer d’objet avec les méthodes de classeLe mot-clé �� ��� est utilisé comme modificateur d’une méthode ou d’unchamp pour indiquer, précisément, qu’il s’agit d’un champ ou d’uneméthode de classe. Contrairement aux champs et méthodes d’instancedécrits jusqu’ici, les champs et les méthodes de classe sont uniques pour uneclasse, et partagés entre toutes les instances de cette classe.

On utilise un champ de classe en le faisant précéder de l’identificateur de saclasse suivi d’un point ; de façon similaire, on appelle une méthode de classeen la faisant précéder de l’identificateur de sa classe suivi d’un point.

��������,�� ��������������

����,�� ������� ���������������� 3 Récupération du solde initial.

����,���������� �8����M������ ��������@@������������* �2,�@������� �%�������������������!!

3 Multiplication, autant de fois qu’il y a d’années,par �2 @�� �%�

�� ���# ����/������������������ ��������� ����������01� �����������#����������2� ���3�#������4�824��2888,��

3

Création d’une instance de ���������������#����.

����#����> ����������:����������:� ���3�#����> ������4><<4��2888,��8�2,�����������:�����������6��

3 Création d’une instance de ���������������#����> ����.

����#������� 3 Déclaration de la référence � de classe ����������������#����.�peut désigner des objets de classe ���������������#���� ou ���������������#����> ����.

��������������� ��� �4O- ������P����������� ����������F4�

������ ������2��������� ���@ �4A��A�:6 �������������A�88�84���������������@������/����,� �����@�4�F�4����������������@�������������@�4�A�:8 �4�

3 Affectation de la référence �����2 à � pourafficher le solde du 1er compte.

������ ������:��������� ���@ �4A��A�:6 �������������A�88�84���������������@������/����,� �����@�4�F�4����������������@�������������@�4�A�:8 �4������ � %��3����B=����� ������3+��� ��$� �������������� ������!!

3 Affectation de la référence �����: à � pourafficher le solde du 2e compte (�����: estconverti implicitement dans le type���������������#����).

À RETENIR Appel de méthode de classe

L’appel d’une méthode de classe respecte la syn-taxe suivante :$%�������������������

Bien que ce ne soit conseillé pour des raisons declarté, une méthode de classe peut être aussi appe-lée sur une référence. Notez qu’à l’intérieur de leurpropre classe, un champ ou une méthode de classepeuvent être utilisés sans que ne soit répété l’iden-tificateur de leur classe.

Page 94: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200482

Comme l’implémentation des méthodes de classe n’utilise pas l’état d’unobjet, il n’est pas utile d’instancier une classe pour appeler une de sesméthodes de classe.

Par exemple, la méthode ���3+��� ��$� ��� de la classe � � %��3����

B=����� �� est une méthode de classe que l’on peut appeler sans créer d’ins-tance de cette classe :

La portée des champs et des méthodes de classe est déterminée par lesmêmes modificateurs d’accès que pour les champs et méthodes d’instance(�����, �������, ��� �� ou absent). La durée de vie des champs de classes’étend de la première utilisation de leur classe à l’arrêt de la JVM.

Par l’exemple : afficher l’état d’un compteL’application suivante affiche les textes qui décrivent un compte de classe���������������#����, puis un de classe ���������������#����> ����,classes reprises de la section précédente.

� � %��3����B=����� ������3+��� ��$� �����������4D��������4��

EXEMPLE com/eteks/test/AfficherComptes.java �� ������������������������� � %��3����B=����� ������� ����,,�����#��������������� �������� ,,�����#������#���� �������

C++ Membres static

Les membres �� ��� d’une classe ont les mêmepropriétés en Java et en C++, mais s’utilisentdifféremment : en Java, un champ �� ��� estdéclaré et initialisé dans sa classe, et l’opérateurpoint (�) remplace l’opérateur FF du C++. En revanche, les variables locales �� ��� n’exis-tent pas en Java.

JAVA Suggestion

Les méthodes d’instance de la classe ��������������������� ������ (voir dans le chapitre pré-cédent la section « Répéter un traitement »)auraient pu être déclarées comme méthodes declasse avec le mot-clé �� ���. Ceci éviterait dansl’application de calcul de probabilités d’avoir à ins-tancier cette classe pour appeler ses méthodes.

Affichage d’un texte qui décrit le compte cons-truit avec les méthodes ���/����,� �� et�������.

B ������������ ��� �4��������������A�88�84�@������/����,� �����@�4�F�4�@�������������@�4�A�:8 �4�

�B=����� ������3+��� ��$� �������������� �������!

��������� ��������� ����������01� ������

Création d’une instance de ���������������#����.

B �#����������2� ���3�#�����4�824��2888,��

Création d’une instance de ���������������#����> ����.

B �#����> ����������:� ���3�#����> �����4><<4��2888,��8�2,��������:�����������6��

Appel de la méthode ,,�����#���� avec �����2�(équivalant à �,,�����#������� ,,�����#�����������2��).

B � ,,�����#�����������2����

Appel de la méthode ,,�����#���� avec �����: (la référence �����: est convertie implicitement dans le type ���������������#����).

B � ,,�����#�����������:�����!!

Page 95: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 83

Au lieu de construire, comme dans l’application précédente, le texte quidécrit un compte en répétant pour chaque compte les mêmes instructions, laclasse ����������������,,�����#����� définit la méthode de classe ,,�����#����, dont le rôle est de construire ce texte puis de l’afficher. Letype du paramètre de cette méthode est de classe ���������������#���� �,ce qui permet de lui passer des objets de classe ���������������#���� � ou���������������#����> ���� �. Notez que si la méthode ,,�����#����n’était pas déclarée �� ���, il ne serait pas possible de l’appeler à partir de laméthode � ��, elle aussi �� ���, sans créer une instance de la classe�,,�����#�����. Si vous omettez �� ��� à la déclaration de la méthode ,,�����#����, le compilateur vous signalera l’erreur suivante :

���)���)�����)����)�,,�����#������� � F2<F����R�� ���������� ,,�����#��������������������#������� ����������,�������,���� ��� ���������%��3���#���� �#��#%�#% 4��#��#��� ��$�����#3������565

JAVA 5.0 import static

La clause ����� �� ��� introduite dans Java 5.0 permet d’importer les membres�� ��� d’une classe. Cette fonctionnalité a pour but de simplifier l’écriture d’un pro-gramme Java en évitant de citer l’identificateur de la classe d’un membre �� ��� pour yfaire appel. Voici les modifications à apporter au fichier �,,�����#������� � (page 82), si vous utilisez la clause �������� ��� dans ce fichier :

• La clause � devient :

���������� ����� � %��3����B=����� ���*�

ou ���������� ����� � %��3����B=����� ������3+��� ��$� ����

• L’instruction � devient :

�����3+��� ��$� �������������� ����

POUR ALLER PLUS LOIN Initialisateur static

Un initialisateur �� ��� est un bloc défini auniveau d’une classe et précédé du mot-clé�� ���. Ce bloc d’instructions est exécuté aumoment du chargement d’une classe par la JVM.

�� ���#� ���5�������� ����))�/���� ��� ������� ������������))�/��������������������!��))����!

C# Constructeur static

Un constructeur �� ��� sans paramètre en C# estl’équivalent d’un initialisateur �� ��� Java.

ATTENTION Les méthodes de classes ne sont pas des méthodes d’instance

Les méthodes de classe se différencient clairement desméthodes d’instance :

• Une méthode de classe ne peut pas utiliser les champset les méthodes d’instance de sa classe, seules ou en lesprécédant de ���� (la référence ���� n’existe pas dansune méthode de classe).

• Une méthode de classe est précédée obligatoirementdu mot-clé �� ��� devant la définition de la méthode,autrement elle devient une méthode d’instance.

• Une méthode de classe n’utilise pas le mécanisme de laredéfinition : si une méthode de classe est définie avecle même identificateur et les mêmes types de paramè-

tres dans une classe et sa sous-classe, la méthode appe-lée sera celle de la classe qui préfixe la méthode.

• Une méthode de classe peut être appelée directementsans avoir à créer une instance de cette classe.

Limitez l’usage de ces méthodes car leur usage n’exploitepas les avantages du polymorphisme et regroupez-les sipossible dans des classes utilitaires. Notez qu’il serait toutà fait possible de créer un programme de type procéduralfondé essentiellement sur le recours à des méthodes declasses.

Page 96: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200484

Limiter la réutilisation avec finalLe mot-clé ,�� � est utilisé comme modificateur d’une classe, d’uneméthode, d’un champ, d’un paramètre ou d’une variable locale pour empê-cher leur modification.

Par exemple, la classe �����������������(�����>����� étudiée au chapitreprécédent ainsi que son champ ������ peuvent être déclarés ,�� � ainsi :

Si une référence est déclarée ,�� �, elle ne peut être modifiée mais leschamps non ,�� � de l’objet qu’elle désigne peuvent changer de valeur, parexemple :

Catégorie Effet du modificateur final

classe Une classe ,�� � ne peut être dérivée. Cette caractéristique estsurtout utilisée pour les classes immuables, comme la classe� � �� ���������, dont les instances ne peuvent pas être modi-fiées.

méthode Une méthode ,�� � ne peut être déclarée à nouveau dans unesous-classe, c’est-à-dire qu’une sous-classe ne peut redéfinir cetteméthode. Toutes les méthodes d’une classe ,�� � sont implicite-ment ,�� �.

champ, variable locale Une fois initialisés, un champ et une variable locale ,�� � ne peu-vent être modifiés.

paramètre Un paramètre ,�� � ne peut être modifié.

C++ Différences entre final et const

En étudiant le tableau ci-contre, remarquez que lesdifférentes subtilités d’utilisation du mot-clé �����en C++ n’ont pas toutes leur équivalent en Javaavec ,�� �. Le C++ n’a en revanche pas l’équiva-lent des classes et des méthodes ,�� � de Java.

C# final = sealed ou readonly

Voici une liste des mots-clés équivalant à ,�� �en C# (dans les cas où ils existent) :• Une classe �� �� ne peut être dérivée.• Un champ �� ���G ne peut être modifié une

fois initialisé.

�� ��������������������

,�� ���� ���(�����>������Le champ ,�� � est initialisé une seule fois

dans le constructeur. B ����� ���,�� �������������

Le reste est inchangé... ��))����!

�� ��������������������������������������������������� ���5����������J�� ������������ ��������� �����������01� �������

La variable �������J� ��$�� ������ est,�� � et ne peut être modifiée mais l’objetdésigné par �������J� ��$�� ������ peutêtre modifié !

B ����,�� �����������������J� ��$�� ������� ���������������������3����������4J� �����A�88�<� ������4��:?�26,��

�����������J� ��$�� �������������%��:<�66,��

L’objet désigné par �������J� ��$�� ������a un prix de 29.55 euros.

��!!

Page 97: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

5 –

Réut

ilisa

tion

des

class

es

© Groupe Eyrolles, 2004 85

Déclarer des constantesUn champ déclaré à la fois �� ��� et ,�� � est une constante avec une valeurunique dans toute la JVM. Généralement, les constantes sont les seulschamps déclarés ����� d’une classe.

Par l’exemple : tester le titre d’un contact L’application suivante teste � puis affiche � le titred’un contact choisi parmi l’une des constantes entières� � � déclarées dans la classe ���������������5�����

CONVENTIONS Nommage des constantes

L’identificateur des constantes est une suite d’un ou plusieurs mots en majuscules, séparéspar le caractère _ (par exemple : �"/="/5>K+�S��

EXEMPLE com/eteks/test/AfficherTitre.java �� ������������������

�� ���5������))�$C�� � ������������ ������������� ����,�� ������+=(�/>&" � �8������������ ����,�� ������+�$�+> � �2������������ ����,�� ������+�$>+=/�>OO>� �:���

!

�� ����,,�����5�������������� ��������� ���������01� ����������������#��� ��� �5�����+=(�/>&"������������� ��� ��45�����4�@������#��� ���@�4� �4�

��3�����������#��� ��������� ���5�����+=(�/>&"�F����� ���@ �4+�4����� ��

�� ���5�����+�$�+>�F����� ���@ �4+��4����� ��

�� ���5�����+�$>+=/�>OO>�F����� ���@ �4+����4����� ��

�!�))��,,������ ���#7#8#(��� � %��3����B=����� �������3+��� ��$� �������������� ������

�!!

C# static final = const ou static readonly

Selon qu’un champ constant a une valeur connue àl’avance ou non, C# propose les deux options sui-vantes équivalant aux mots-clés �� ��� ,�� �en Java :• Un champ ����� est une constante et doit être

initialisé à sa déclaration avec une expressionévaluable dès la compilation.

• Un champ �� ��� �� ���G laisse plus deliberté, car il peut être initialisé avec le résultatde l’appel à une méthode.

JAVA 5.0 enum pour déclarer un ensemble de constantes

Le mot-clé ���� introduit dans Java 5.0 permet d’énumérer une listehomogène de constantes, comme en C++ et en C#. Dans les faits,une énumération Java est une classe qui définit un ensemble de cons-tantes dont le type est la classe elle-même. Le langage Java a étéaussi enrichi pour permettre de tester les valeurs d’une énumérationavec l’instruction �3����, comme dans l’application ���������������>����� ����5���� adaptée de celle ci-contre.

�� ������������������

))�$C�� � �����E����C���C� ����

�����5������+=(�/>&"��+�$�+>��+�$>+=/�>OO>!�

�� ���>����� ����5�������������� ��������� ���������01� �������5����������#��� ��� �5�����+=(�/>&"������������� ��� �45�����4�@������#��� ���@�4� �4�

��3�����������#��� ������� ���+=(�/>&"�F

����� ���@ �4+�4����� ��

�� ���+�$�+>�F����� ���@ �4+��4����� ��

�� ���+�$>+=/�>OO>�F����� ���@ �4+����4����� ��

�!�))��,,������ ���#(�����9�#8#(��� � %��3����B=����� �������3+��� ��$� �������������� ����

�!!

Page 98: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200486

En résumé…Ce chapitre a passé en revue les différentes manières de réutiliser et d’archi-tecturer l’ensemble des classes d’une application. Maintenant que vous con-naissez les principes généraux de la programmation objet et leur mise enœuvre en Java, passons à la deuxième partie, qui explique comment utiliserles classes fondamentales de la bibliothèque Java.

REGARD DU DÉVELOPPEUR Architecture des classes

Lisibilité du code

• N’écrivez pas votre programme pour vous mais pour lesautres : comme un programme passe plus de temps enmaintenance qu’en phase de développement, les per-sonnes chargées d’en corriger les bogues et de le faireévoluer doivent vous comprendre. Même si vous main-tenez vous-même vos classes, votre mémoire n’est pasinfaillible et vous aurez tôt fait d’oublier les subtilitésde votre programme ! Ce principe doit vous guider tanten matière d’architecture que dans les choix d’identifi-cateurs clairs et respectant les conventions Java et dansles commentaires censés expliquer les parties de codecomplexes.

• Ayez bien à l’esprit l’adage Pourquoi faire compliquéquand on peut faire simple ? (KISS, Keep It Simple Stu-pid)… Pour garder une architecture simple, faites lemoins possible d’interdépendances entre classes et nemultipliez pas à l’avance les classes en prévision d’exten-sion future.

Composition ou héritage, que choisir ?

• Utilisez le sens littéral des relations a un et est un pourorienter votre choix entre la composition et l’héritage.

• Ne créez un lien d’héritage entre deux classes que si uneinstance de la sous-classe peut être considérée aussicomme une instance de sa super-classe par la relationest un. Par exemple, un monocycle n’est pas une roue,mais a une roue. Parfois, les relations de composition etd’héritage s’utilisent dans la même classe. Par exemple,un camion qui transporte des voitures est un véhicule eta des véhicules.

• Ne vous précipitez pas sur l’héritage : dans la pratique,la composition est plus souvent mise en œuvre quel’héritage.

Respectez les règles imposées par les frameworks !

• Une classe d’applet Swing doit hériter de la classe� � %��3����B����, et une classe de servlet de la

classe � � %�������������T���������. N’importequelle classe peut être utilisée comme application si elledéfinit la méthode ������ �� ���� ���� ���� � �� ����������01� ����.

Pensez d’abord objet !

• Une méthode de classe n’étant pas objet et ne pouvantêtre redéfinie, limitez l’usage de ce type de méthodesau minimum et regroupez-les si possible dans des clas-ses utilitaires.

Inspirez-vous des design patterns !

• Les design patterns regroupent un ensemble de modèlesde conception de classes pour répondre aux problèmesles plus courants rencontrés en programmation objet.Ils ont été identifiés initialement dans l’ouvrage Designpatterns - Elements of Reusable Object-Oriented Softwareécrit par Erich Gamma, Richard Helm, Ralph Johnson etJohn Vlissides, surnommés depuis la bande des quatre(gang of four). Parmi les plus connus et utilisés par lesclasses de la bibliothèque Java, on peut citer les designpatterns singleton, factory, iterator, observer.

Ne touchez pas au code des autres

• Si vous disposez du code source d’une classe (celle de labibliothèque standard Java par exemple), ne la modi-fiez pas pour y ajouter des fonctionnalités si vous n’enêtes pas l’auteur. Créez plutôt une sous-classe et ajou-tez-y les méthodes nécessaires à ces nouvelles fonction-nalité, en redéfinissant si nécessaire les méthodes dontvous voulez modifier l’implémentation.

• S’il vous faut ajouter des méthodes à une classe ,�� �(comme la classe � � �� ��������� dont vous ne pou-vez pas hériter), créez une nouvelle classe utilisant lacomposition avec la classe ,�� � en question ou définis-sant des méthodes de classe qui prennent en paramètreun objet de la classe ,�� �.

Page 99: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

6Les classes de base de la bibliothèque Java

SOMMAIRE

B Hiérarchie de classes depuis Object

B Chaînes de caractères

B JVM et système

B Dates et heures

B Tableaux

B Collections

MOTS-CLÉS

B ObjectB StringB SystemB Classe d’emballageB deprecatedB GregorianCalendarB ArrayListB TreeSetB HashMap

Manipulation des textes, des dates, calcul mathématique, gestion d’ensemble d’objets : les classes présentées dans ce chapitre illustrent les choix de modélisation objet proposés par les inventeurs de Java pour ces concepts fondamentaux. Ce sera aussi l’occasion de définir les classes de base utiles à la mise en œuvre du forum de discussion développé dans les chapitres suivants.

Page 100: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200488

La bibliothèque Java contient des classes qu’il faut absolument connaître,telle � � �� ���=����� sur laquelle repose toute la hiérarchie des classes Java,� � �� ��������� qui représente des chaînes de caractères, ou� � �� ����G���� utilisée pour communiquer avec la JVM. Outre ces classesincontournables, les classes utilitaires pour gérer la date, l’heure et lesensembles d’objets s’avèrent indispensables pour programmer des applica-tions.

La super-classe de toutes les classes : java.lang.ObjectJava utilise une hiérarchie unique pour toutes les classes et dont la classe� � �� ���=����� est la super-classe. Une classe simple hérite donc nécessai-rement de la classe � � �� ���=����� et de toutes ses méthodes, la relationd’héritage étant implicite : �� �� #� ���5��� équivaut à écrire�� �� #� ���5���� �%����� � � �� ���=�����. Les méthodes de la classe� � �� ���=����� le plus souvent utilisées et redéfinies sont les méthodes�P� ��, � ��#�� et ���������pour modifier l’implémentation proposée par laclasse � � �� ���=�����.

La méthode equals Cette méthode est souvent redéfinie dans une classe pour renvoyer ���� sideux objets distincts sont égaux en comparant les valeurs de leurs champs.La relation d’égalité définie entre deux objets doit être alors réflexive, com-mutative et transitive (voir la javadoc de la méthode �P� �� dans la classe� � �� ���=����� pour une description détaillée de ces relations). Parexemple, la classe � � �� ��������� redéfinit cette méthode pour déterminersi deux chaînes sont égales en comparant un à un leurs caractères.

La méthode hashCodeElle renvoie un code entier utilisé pour le stockage des objets dans les tablesde hash (� � ������T �����, � � ������5������, …). Pour deux références���2 et ���: désignant deux objets quelconques, la relation suivante doit êtrevérifiée :

������2��P� �������:���������������� ��������2�� ��#����� ����:�� ��#���������C� ��U������

C# java.lang.Object = System.Object = object

La classe � � �� ���=����� ou plus simple-ment =����� (attention au = majuscule) estl’équivalent en Java de la classe ������ de C#.

����������� ���P� ����������� � �� ���=������������������P� ��������D� renvoie ���� si������ �����D.

����������� ��#�����

Page 101: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 89

La méthode toStringElle renvoie une chaîne de caractères décrivant la classe de l’objet courantsuivi du caractère V et de la valeur en hexadécimal renvoyée par � ��#�� (parexemple �����������������5���� ���68V9 66, ).Cette méthode est souvent redéfinie dans une classe pour renvoyer un textedécrivant l’objet avec la valeur de ses champs. Quand l’un des opérandesd’une concaténation avec l’opérateur @ est un objet, cette méthode estappelée pour obtenir la forme textuelle de cet objet.

Forum : utilisateur du forum de discussionLa première classe du forum de discussion abordée dans cet ouvrage décritun utilisateur du forum. Représenté par une instance de la classe����������,�����&����� ����, chaque utilisateur a :• un pseudonyme et un mot de passe personnel qui lui permettent de

s’identifier pour participer au forum ;• une autorisation qui lui accorde les droits d’utilisateur ou de modérateur.

Un utilisateur identifié a le droit de poster des messages et de modifierses messages. Un modérateur a en outre le droit de modifier n’importequel message, qu’il en soit l’auteur ou non.

B.A.-BA Code de hash

Le code de hash renvoyé par la méthode � ��#�� est utilisé par certaines classes de collectioncomme � � ������T ����� et � � ������T ��+ pour classer un ensemble d’objets etoptimiser les recherches dans cet ensemble (voir la section « Les collections pour gérer desensembles d’objets » de ce chapitre). Une recherche dans ce type d’ensemble est comparable à ladémarche effectuée pour consulter un dictionnaire pourvu d’onglets pour chaque lettre de l’alpha-bet. Si vous cherchez le mot Java vous saisirez alors directement l’onglet J pour tomber sur le pre-mier mot commençant par J. Pour assurer une efficacité maximale à ce système de classement, lescodes de hash des objets doivent être répartis sur l’ensemble des entiers ���.

REGARD DU DÉVELOPPEUR Quand redéfinir les méthodes equals, hashCode et toString ?

Ces méthodes sont souvent redéfinies dans les classes de la bibliothèque Javacomme � � �� ���������, � � �� ���J�� �... et c’est en les utilisant que vouspercevrez mieux pourquoi les concepteurs de Java ont choisi de déclarer cesméthodes dans la classe � � �� ���=�����.La plupart du temps, les méthodes equals et hashCode sont redéfinies dansune classe pour comparer ses objets ou les retrouver dans un ensemble (voir laclasse com.eteks.forum.Utilisateur qui suit et l’application d’agenda au chapi-tre 7, « Abstraction et interface »).La méthode �������� renvoyant la forme textuelle d’un objet, la redéfinitionde cette méthode dans une classe est un des moyens les plus simples quandvous avez besoin d’afficher la valeur de ses objets (voir les classes����������,�����&����� ���� et ����������,�����+��� �� de ce chapitre).

ATTENTION Redéfinition de la méthode equals et de hashCode

Si une classe redéfinit la méthode �P� ��, elledoit aussi redéfinir � ��#�� et renvoyer lemême code pour deux objets égaux par laméthode �P� ��. La condition inverse n’estpas obligatoire : deux objets peuvent renvoyerun code de hash identique tout en étant diffé-rents par la méthode �P� ��.

������� � �� ���������������������

JAVA Autres méthodes de java.lang.Object

La classe � � �� ���=����� définit aussi lesméthodes suivantes moins souvent utilisées :

• ���#� �� renvoie une instance de la classe� � �� ���#� �� qui décrit la classe d’unobjet.

• 3 �� et ����,G sont utilisées pour la synchro-nisation des threads abordée au dernier chapitre.

• ����� crée une copie d’un objet.

• ,�� ��W� est redéfinie dans une classe pourdécrire les traitements spécifiques à effectuer àla destruction d’un objet par le ramasse-miettes.

Page 102: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200490

Ces informations correspondent aux champs �����G��, ���$�� ��� et ������ ���� de la classe &����� ����. Les valeurs de ces champs peuventêtre modifiées ou interrogées grâce à leurs accesseurs ������� et mutateurs������ correspondants.

FORUM com/eteks/forum/Utilisateur.java �� �������������,�����)**�*�&����� �������,����� �������������G�������������� ����*���������������������,�����P������������ ������C���*)

�������� ���&����� �����

Figure 6–1 Diagramme UML de la classe ����������,�����&����� ����

- pseudonyme : String - motDePasse : String - autorisation : String

+ Utilisateur(pseudonyme : String, motDePasse : String, autorisation : String) + isModerateur() : boolean + equals(obj : Object) : boolean + hashCode() : int + toString() : String

Utilisateur

com.eteks.forum

Déclaration des constantes représentant lesdroits possibles accordés à un utilisateur.

B ���������� ����,�� ���������+=$>"�5>&"�� �4+4������������� ����,�� ���������&5/O/��5>&"� �4&4�

Déclaration des champs mémorisant les informa-tions d’un utilisateur.

B ����� ���������������G�������� �������������$�� ��������� ���������� ������ �����

Constructeur. B ��������&����� ������������������G��������������$�� ��������������������������������� ������ ����������������������G��� ������G���������������$�� ���� ����$�� ������������� ������ ����� � ������ �������!������������������������G����������������������������G�����!���������������������G���������������G��������������������G��� ������G�����!������������������+��$�� ���������������������������$�� ������!���������������+��$�� ��������������$�� �������������������$�� ���� ����$�� ������!������������������������� ������������������������� ������ �������!

Méthode permettant de vérifier si cet utilisateurest un modérateur.

B ������������� ����+��� ���������������������+=$>"�5>&"��P� �������� ������ ��������!

Page 103: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 91

Cette classe déclare les deux constantes +=$>"�5>&" et &5/O/��5>&" � repré-sentant les autorisations qu’il est possible d’affecter au champ ������ ����avec le constructeur ou la méthode ���������� ���� de cette classe. Chaqueutilisateur ayant un pseudonyme unique, deux objets de classe����������,�����&����� ���� sont considérés comme identiques s’ils ont lemême pseudonyme. Cette caractéristique programmée ici dans la méthode�P� �� � est utile pour vérifier l’unicité du pseudonyme d’un utilisateur.Cette méthode redéfinit la méthode �P� �� de la classe � � �� ���=�����dont hérite implicitement la classe &����� ����. Son implémentation vérifieque l’objet en paramètre est bien une instance de la classe &����� ���� �avant de déterminer si deux utilisateurs sont égaux en comparant leur pseu-donyme �.

���������������������� ������������ ������ ����������������� ������ ����� � ������ �������!

��)**���*�"������������������������� ��������������������X������*������G�����*)

������������� ���P� ����=���������������������,������������G���L ������

3 Redéfinition de la méthode �P� �� de la classe� � �� ���=�����

�������,���������� ����,�&����� ��������������

3 Si l’objet en paramètre est une instance de laclasse ����������,�����&����� ����

��������&����� ����������� ����� ��&����� ����������������������������������G����P� ���������� ����������G������������!�����������, ������!

3 Conversion de ��� en une référence de����������,�����&����� ���� puis com-paraison de leur pseudonyme.

������������� ��#����������

3 Redéfinition de la méthode � ��#�� de laclasse � � �� ���=�����.

�����,������������G���L �����������������������������G���� ��#�������

3 Réutilisation du code de hash de la classe� � �� ���������.

��������������������������� ��#�������!

3 Si �����G�� n’est pas défini, le code de hashpar défaut est renvoyé.

������������������������������������,����+��� ������������������������������G���@�4��+�A�88�<� �����4�����������,������������G���L �����������������������������G���@�4��&����� �����4����������������������4&����� �������������4���!!

3 Redéfinition de la méthode �������� de laclasse � � �� ���=�����.

ATTENTION Type du paramètre d’equals

Si vous redéfinissez la méthode �P� ��, faitesattention à bien déclarer un paramètre declasse � � �� ���=����� même si voussavez pertinemment que seuls deux objets de lamême classe sont réellement comparables. Letype =����� du paramètre vous oblige du coupà utiliser l’opérateur ���� ����, pour vérifierpar sécurité sa classe avant de comparer effecti-vement les champs des objets.Si le paramètre d’�P� �� est déclaré commeétant d’une autre classe que � � �� ���=�����, la méthode ne redéfinit pas laméthode �P� �� de la classe =����� mais lasurcharge. Ce n’est pas interdit mais vous nepourrez pas profiter des fonctionnalités derecherche proposées par les classes de collec-tion.

Page 104: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200492

La méthode �P� �� étant redéfinie, la classe &����� ���� doit redéfinir aussila méthode � ��#�� � pour vérifier que deux utilisateurs égaux ont le mêmecode de hash si jamais cette classe est utilisée avec une table de hash. Laméthode �������� � est finalement redéfinie et renvoie un texte décrivant letype d’utilisateur et son pseudonyme.

L’application de classe ���������������#�� � ����&����� ����� montrecomment utiliser les méthodes �P� �� et �������� .

JAVA Appel d’equals dans equals

Ne soyez pas troublé par l’appel à �P� �� �dans l’implémentation de la méthode �P� �� dela classe &����� ����. La méthode �P� ��appelée n’est pas celle de la classe &����� ����,mais celle de la classe de l’objet désigné par lechamp �����G��, c’est-à-dire ici�� � �� ���������. La même remarque s’applique à l’appel à� ��#�� �.

EXEMPLE com/eteks/test/ComparaisonUtilisateurs.java �� ������������������

����������������,�����&����� �����

�� ���#�� � ����&����� ���������������� ��������� ����������01� �������

Création de trois utilisateurs B ����&����� ��������� ������� ���3�&����� ����������������4���� ����4��4 W���G4��&����� �����+=$>"�5>&"������&����� ����������� ����2� ���3�&����� �����������������4���� �4��4������4��&����� �����&5/O/��5>&"������&����� ����������� ����:� ���3�&����� �����������������4���� �4��4�����4��&����� �����&5/O/��5>&"��

Equivalent à 4D������ 4����� �������� �����������������

B ��������������� ��� �4D�������4�@����� �����

Si ���� ���� et ������ ����2 ne sont paségaux (notez le symbole L du non logique)...

B �����,��L���� ������P� ���������� ����2�������������� ���@ �4A�4�@����� �����@�4����4�@������� ����2�����������������@�4��������������� �������,,A�88�<�����4�

Déclaration de deux références de classe � � �� ���=����� désignant les utilisateurs égaux

B ����=������������� ������� ����2�������=�����������D� ������� ����:�

Si ������ et �����D sont égaux (�P� �� utili-sant la redéfinition, c’est la méthode de&����� ���� qui est effectivement appelée)...

B �����,����������P� ���������D�������������� ���@ �4A�4�@��������@�4����4�@������D�����������������@�4������A�88�<� �%4�

Création de deux boissons désignées par lesréférences de classe � � �� ���=�����.

B ����������� ���3�D��������4B���-�� ���4��;�,�������������D� ���3�D��������4B���-�� ���4��;�,��

Si ������ et �����D ne sont pas égaux... B �����,��L��������P� ���������D�������������� ���@ �4A�O�����%��������4�@��������@�4����4@������D�����������������@�4��������� ��A�88�<� �%4�

����� � %��3����B=����� ������3+��� ��$� ��������������� ������!!

Figure 6–2 Application ���������������#�� � ����&����� �����

Page 105: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 93

Cette application crée trois utilisateurs qui sont comparés entre eux en utili-sant la méthode �P� �� avec deux objets différents � puis avec des objetségaux �. Finalement, deux objets de classe ���������������D������ sontcréés � avec des valeurs identiques (voir la section « Réutiliser en héritant :la relation “ est un ” », page 72 du chapitre précédent). Ils sont comparésl’un à l’autre avec la méthode �P� �� � mais cette fois-ci ce sont deux objetsdifférents pour la méthode �P� �� même si les deux boissons mémorisent lesmêmes valeurs. La méthode �P� �� � n’ayant pas été redéfinie dans la classeD������, c’est la méthode �P� �� de � � �� ���=����� qui est appelée. Laméthode �P� �� de la classe =����� ne fait que comparer ������ et �����D àl’aide de l’opérateur .

Manipuler les chaînes de caractères (java.lang.String)Une instance de � � �� ��������� est une chaîne de caractères de type �� �dont le premier caractère a un indice égal à 8. Cette classe ,�� � contient dif-férentes catégories de méthodes d’instance et de classe pour manipuler leschaînes de caractères constantes.

Forum : outils de traitement pour les textes du forumLa classe �����������������=�����#� ��� définit les quatre méthodes�������O��������� ���������>�>�����������������>�T5+O et ���� ���.

POUR ALLER PLUS LOIN Classe java.lang.StringBuffer

Contrairement à un objet de classe ������, le texte mémorisé par un objet de classe� � �� ���������D�,,�� peut être modifié. Il est conseillé d’utiliser cette classe et sesméthodes ��, ������, �����... pour optimiser la construction d’une chaîne de caractè-res complexe et éviter la création d’objets intermédiaires de classe ������.

Figure 6–3 Diagramme UML de la classe ����������,�����=�����#� ���

À RETENIR Tout objet Java est un objet de classe Object

Toute classe héritant de � � �� ���=�����, ilest possible de convertir implicitement une réfé-rence de n’importe quelle classe en une référencede type � � �� ���=����� � �.

ATTENTION Utilisez equals pour comparer deux chaînes

La comparaison caractère à caractère de deux tex-tes s’effectue avec la méthode equals, pas avecl’opérateur == qui compare uniquement l’égalitéentre deux références.

JAVA 5.0 Classe java.lang.StringBuilder

Si vous n’avez pas besoin de partager une instancede � � �� ���������D�,,�� entre plusieursthreads, recourrez à la nouvelle classe� � �� ���������D����� pour augmenterles performances de votre programme, car lesméthodes de cette classe ne sont pas synchroni-sées.

+ limiterLongueur(chaine : String, int : max) : String+ convertirEnEntites(chaine : String) : String+ convertirEnHTML(chaine : String) : String+ remplacer(chaine : String, c : char, t : String) : String

OutilsChaine

com.eteks.outils

Page 106: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200494

Ces méthodes de classe créent un nouveau texte à partir de la chaîne enparamètre :• ��������������� renvoie un texte dont le nombre de caractères est limité

au paramètre � %. Si la chaîne en paramètre est trop longue, cetteméthode tronque son texte et lui ajoute les caractères de suite 0���1.L’interface utilisateur du forum utilise cette méthode pour limiter la lon-gueur des titres des fenêtres qui citent le sujet d’un message.

• ���������>�>������ renvoie une chaîne de caractères où tous les symbolesQ M E et 4 du texte en paramètre sont remplacés par leur entité HTML.Ces transformations sont nécessaires pour afficher correctement dans unnavigateur un texte comportant ces caractères.

• ���������>�T5+O renvoie une chaîne de caractères où tous les symbolesQ M E et 4 ont été remplacés par leur entité HTML et les retours à la lignepar la balise de retour à la ligne HTML M��N.

• ���� ��� est une méthode utilisée par les deux méthodes précédentespour remplacer dans une chaîne un caractère par un texte de plusieurscaractères.

REGARD DU DÉVELOPPEURSous-classer java.lang.String

Notez qu’il aurait été plus logique de déclarerles méthodes de la classe �����������������=�����#� ��� dans une sous-classede � � �� ���������. Ce n’est pas possiblecar cette classe est ,�� �.

C++/C# substring

Le second paramètre des méthodes ������ de laclasse C++ ��FF������ et ��������� de laclasse C# ������ représente un nombre de carac-tères, tandis que le second paramètre de laméthode ��������� de la classe � � �� ��������� est un indice.

API JAVA Méthodes les plus utiles de la classe java.lang.String

Description Méthode

Interrogation du nombre de caractères de la chaîne etdu caractère à un indice donné

��������������������������� ���� ������������%�

Comparaison avec d’autres chaînes ����������� ���P� ����� � �� ���=��������������������� ���P� ��/�����# ����� � �� ���������� ������������������������ ���� ���H������ � �� ������������,�%������������ �����H������ � �� ������������,,�%������������ ��� ������������������� �>%��

Recherche de caractères ou de sous chaînes (la valeurrenvoyée est l’indice du texte recherché dans cettechaîne ou -1 si la recherche a échoué)

�������������%=,����������������������%=,��������������,���/��%��������������%=,��� � �� ���������������������������������%=,��� � �� �������������������������,���/��%������������ ��/��%=,�������������������� ��/��%=,��� � �� ��������������������

Construction d’autres chaînes (sans modification decette chaîne)

������� � �� ������������O�3��# ������������ � �� ������������&��# ������������ � �� �������������� ��������������������� � �� ������������������������������/��%�������� � �� ������������������������������/��%��������/��%�������� � �� ������������� ������ ����#� ����� ����3#� ��������� � �� �����������������

Conversion de données d’un type primitif ou d’objetsen chaîne de caractères (ce sont ces méthodes declasses qui sont en fait appelées par l’opérateur + deconcaténation pour convertir un opérande en chaînede caractères)

�������� ����� � �� ����������� ���=,������� ������������ ����� � �� ����������� ���=,���� ������������ ����� � �� ����������� ���=,���������������� ����� � �� ����������� ���=,����������������� ����� � �� ����������� ���=,��,�� ��,��������� ����� � �� ����������� ���=,����������������� ����� � �� ����������� ���=,��� � �� ���=����������

Page 107: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 95

FORUM com/eteks/outils/OutilsChaine.java �� ���������������������������� ���=�����#� ���� Déclaration d’une constante pour les caractères

de suite.���������� ����,�� ���������#T�/(>K�&/5>� �4�0���14� 3

���������� ������������������O������������������ ���������� %����

3 Renvoie la chaîne limitée à � % caractères.

�����,���� �������������M �� %���������������� �����������������

3 Si la longueur de �� ��� est inférieure à � %,�� ��� est renvoyée telle quelle.

���������������>� ��� ��� ����� ��/��%=,�-�-�������������������������������� %�R�#T�/(>K�&/5>������������

3 Recherche du dernier blanc typographique dans�� ���, avant�� %.

�������,�������>� ��� �R2������������������ ��������������8��� %�R�#T�/(>K�&/5>��������������������������@�#T�/(>K�&/5>�

3 S’il n’y a pas d’espace avant � %, �� ��� estlimitée à � % caractères.

��������������������������� ���������������8�������>� ����@�#T�/(>K�&/5>�����!��!

3 Sinon �� ��� est coupée à l’indice de l’espace.

���������� ��������������������>�>����������������� ������������,���� ����L �����������

3 Convertit les caractères Q M E et 4 de �� ���en leur entité équivalente.

�������� ���� ����� ������� �����EQE���4Q ��4���������� ���� ����� ������� �����EME���4Q���4���������� ���� ����� ������� �����EAEE���4Q ���4���������� ���� ����� ������� �����E4E���4QP����4�������!������������� ������!

3 Remplacement des caractères Q M E 4 par leurentité &amp; &lt; &apos; &quot; .

���������� ��������������������>�T5+O����������� �������

3 Convertit les caractères Q M E 4 et retour à laligne de �� ��� en leur équivalent HTML.

�����,���� ����L ������������������� ���� ����������>�>���������� �����

�������� ���� ����� ������� �����-A�-��4M��N4������!������������� ������!

3 Remplacement des retours à la ligne par desbalises M��N.

���������� ��������������� ������������� ������� �����������������

3 Remplace les caractères � dans �� ��� par lachaîne �.

����,�������������#� ��� �������%=,�������������������#�L �R2���������������#� ��� �������%=,����������#�@�2���������� ���� ��� ��������������8�������#������������������@���@��� �������������������#�@�2��������������� ������!!

3 Boucle de recherche de tous les caractères cdans le texte �� ���.

3 Remplacement du caractère � trouvé à l’indice�����# en insérant le texte � dans �� ��� àla place de la lettre �.

Page 108: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200496

Communiquer avec la machine virtuelle (java.lang.System)La classe � � �� ����G���� permet d’accéder aux fonctionnalités de lamachine virtuelle Java au moyen de différents champs et méthodes de classe.

API JAVA Propriétés les plus utiles

Catégorie Propriétés

Propriétésutilisateur

������ ��������������������������������G������� ��� ��

Propriétés JVM � � ���������� � ������ � ��� ��� ���� � �������� � ����������

Propriétéssystème

���� ����������������� ���

Propriétésfichiers

,������ � ���� ����� � ����������� � ���

API JAVA Champs et méthodes les plus utiles de la classe java.lang.System

Description Champ

Le champ ��� est utilisé pour affi-cher un texte sur la sortie standard (fenêtre de commandes ou termi-nal).

Les méthodes ������ et ����de la classe � � ������������� �affichent le texte passé en paramè-tre, l’une avec retour à la ligne,l’autre sans.

�������� ����,�� ��� � ������������� �����

Description Méthode

Arrêt de la JVM. La méthode �%��doit être appelée pour quitter uneapplication Java aussitôt qu’ellefait appel à une classe Swing telleque � � %��3����B=����� ��.

�������� ���������%���������� ����

Temps écoulé depuis le 1er janvier1970 exprimé en milliseconde.

�������� ����������������5���+�������

Interrogation de la valeur d’unepropriété de la JVM.

�������� ����� � �� ����������������������G��� � �� ���������������G�

ATTENTION Affichage des lettres accentuées avec out

Les caractères Unicode accentués n’étant pas affichés correctement sur la sortie standard,��� est surtout pratique pour imprimer des textes au moment de la mise au point desapplications Java.Ce type de texte appelé aussi log est souvent utilisé pour suivre les différents points par les-quels passe un programme à l’exécution. Pour y recourir systématiquement, utilisez de pré-férence les classes du package � � ������������� dédié à la gestion des logs.

API JAVA Les autres classes en relation avec la JVM

Outre la classe � � �� ����G���, le paque-tage � � �� �� compte plusieurs classes quisont en relation étroite avec la JVM :• la classe � � �� ���#� ��, dont chaque

instance représente une classe chargée par laJVM (cette classe est abordée plus en détail àla fin du chapitre 8 sur les exceptions) ;

• la classe � � �� ���#� ��O� ��, utili-sée par la JVM pour charger les classes d’uneapplication ;

• la classe � � �� ���"������, dont l’uni-que instance représente la JVM elle-même(la classe �G���� y fait d’ailleurs appel pourplusieurs de ses méthodes) ;

• la classe � � �� ����������G+ � ���,utilisée par la JVM pour déterminer lesactions autorisées pour une application.

Page 109: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 97

Par l’exemple : ce que connaît la JVM de votre système…L’application de classe ������������������������B'+ construit un texte àpartir des principales propriétés renvoyées par la méthode ���������G de laclasse � � �� ����G����.

EXEMPLE com/eteks/test/ProprietesJVM.java �� �������������������� ������������B'+����������� ��������� ���������01� �������

ATTENTION Sécurité des applets

Par sécurité, certaines des propriétés de la JVMne peuvent pas être consultées dans le contexted’une applet (voir la section sur les applets à lafin du chapitre 10 « Interfaces utilisateur avecSwing »).

�������������%��� �4D�������4�@��G��������������G��4������ ��4�� 3 Construction d’un texte avec les propriétés de laJVM.

������%���@ �4A�A�:6�,�'��������� G�)� ���������4��������������@��G��������������G��4�����������G4��������������@�4)4�@��G��������������G��4������ ��� ��4��������%���@ �4A�A�:6�,�'�������������������������4��������������@��G��������������G��4���������4��������%���@ �4A�A�:6�,�'���������������� � �������4��������������@��G��������������G��4�������4��������%���@ �4A�A�:6�,�'������G��A�88�?����4��������������@��G��������������G��4���� ��4��������������@�4�4�@��G��������������G��4����������4��@�4��F4�

3 Le caractère \u25cf affiche un rond plein.

������%���@ �4A��A�:6 �&����������� � ��A�88�?���4��������������@��G��������������G�4,������ � ���4���������������@�4��������A�88�< � ��������������4�������%���@ �4A��A�:6 �&����������� � ��A�88�?���4��������������@��G��������������G�4 ����� � ���4���������������@�4��������A�88�< � ��������������4�������������� � ����O����� ��G��������������G��4������� � ���4��

3 Le caractère \u25aa affiche un carré plein.

�����,���� � ����O���������������N�2���������%���@ �4A��A�:6 �&������������ � ��A�88�?����������4�����������������%���@ �4A��A�:6 �&����������� � ��A�88�?���������4�

3 Construction d’un texte en fonction du nombrede caractères de �� � ����O����.

����,���������� �8����M��� � ����O����������������@@��������3�������� � ����O������� ����������������������� ���EA�E�F���%���@ �4AA��4������������������������ ����������� ���EA�E�F���%���@ �4AA��4������������������������ ��������!������%���@ �4��������������A�88�8�� ������4�������%���@ �4A�A�:6�,�'�����B'+�����������4��������������@��G��������������G�4� � ��������4��@�4�F�4�������%���@ �4A��A�:6 �>������� ��A�88�<�� �������������4��������������@��G��������������G�4� � �����4��������%���@ �4A��A�:6 �&������������ �� ���4��������������@��G��������������G��4� � ��� ��� ��4��

3 Transformation des caractères en leur code Javacorrespondant.

Page 110: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 200498

Comme le montrent les deux captures d’écran suivantes, les valeurs des pro-priétés varient d’un système d’exploitation à l’autre et d’un utilisateur àl’autre ; elles sont très utiles pour personnaliser l’installation d’un pro-gramme Java.

Effectuer des calculs mathématiques (java.lang.Math)La classe � � �� ���+ �� contient les constantes �/ et >, et des méthodes declasse utilisées pour le calcul scientifique.

������%���@ �4A��A�:6 �>���A�88�<����A�88�<�� ��4��������������@��G��������������G�4� � ������4��������%���@ �4�������������A�88�8�4��������������@��G��������������G��4� � ����������4��

Affichage dans la fenêtre de commande et dansune boîte de dialogue.

B �����G�������������������%��������� � %��3����B=����� ������3+��� ��$� �������������%���������G������%����8�����!!

ASTUCE Modifier une propriété

La valeur par défaut d’une propriété de la JVM peutêtre modifiée sans modification du programmegrâce à l’option R$����� /�/ ��%�&� de lacommande � � . Par exemple :� � �Y$������ �� ���X�������������������������B'+

Figure 6–4 Application ������������������������B'+ sous Windows XP & Mac OS X

API JAVA Méthodes de la classe java.lang.Math

Catégorie Méthodes

Calcul trigonométrique ��������� �� ���� ���� � �� � �:���$���������" � ��

Calcul logarithmique �����%

Calcul mathématique ����� %� ���,��������������������/>>>"�� ������3��P��

Calcul aléatoire � ���

JAVA 5.0 java.lang.Math enrichie

La classe � � �� ���+ �� dans Java 5.0 a étéenrichie de plusieurs méthodes comme ���28pour le logarithme en base 10, ����, ����, � ��pour le calcul hyperbolique ou ���� pour la racinecubique.

Page 111: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 99

Par l’exemple : quelques valeurs mathématiques remarquablesCette application utilise les constantes et les méthodes de la classe� � �� ���+ �� pour calculer et afficher le résultat de quelques formulesmathématiques connues.

Utiliser un type primitif sous forme d’objet avec les classes d’emballageLa bibliothèque Java a une classe d’emballage (wrapping class en anglais)pour chaque type primitif qui sert à mémoriser et manipuler une donnéed’un type primitif sous forme d’objet :• La classe � � �� ���D���� � pour les objets booléens.• La classe � � �� ���#� � ���� pour les objets caractères : cette classe

contient aussi un ensemble de méthodes de classe préfixées par �� pourtester le type d’un caractère (��O�����, ��$����, ��H����� ��...).

• Les classes d’emballage des types primitifs numériques qui dérivent de laclasse � � �� ���(����� : � � �� ���DG��, � � �� ��������, � � �� ���

/������, � � �� ���O���, � � �� ���J�� �, � � �� ���$�����.Chacune des classes d’emballage numérique définit les constantes +/(K'�O&>et +�SK'�O&>, décrivant les valeurs minimale et maximale du type primitifleur correspondant ; les classes J�� � et $����� définissent aussi les cons-tantes (>.�5/'>K/(J/(/5Z, �=�/5/'>K/(J/(/5Z et ( ( (Not a Number), quidécrivent l’infini négatif, l’infini positif et une valeur inconnue, par exemplele résultat de 8�)8�.

EXEMPLE com/eteks/test/ValeursMathematiques.java �� �������������������� ���' �����+ ���� ��P�������������� ��������� ����������01� �������

Figure 6–5 Application ���������������' �����+ ���� ��P���

�������������%��� �4A�8;�8� �4�@�+ ����/�@�4A�4�������%���@ �4�� �4�@�+ ���>�@�4A�4�������������������I� �+ ��������+ ����/�)�I���������%���@ �4�����A�8;�8�)�I�� �4�@���������I�@�4A�4������������ ����$�:���:� �+ ����P����:���)�:��

3 Le caractère Unicode de la lettre grecque pi est\u03c0.

������%���@ �4A�::2 �:�)�:� �4�@�� ����$�:���:�@�4A�4��������������(������$�>� �+ ��������+ ���>��������%���@ �4������� �4�@����(������$�>������ � %��3����B=����� ������3+��� ��$� �������������%����

3 Le caractère Unicode du symbole de la racinecarrée est \u221a.

�����G������%���8����!!

3 Arrêt de la JVM.

API JAVA Méthodes de la classe java.lang.Number

La classe � � �� ���(�����, super-classe detoutes les classes d’emballage numérique, contientles six méthodes �G��' ���, �����' ���,���' ���, ����' ���, ,�� �' ��� et�����' ���. Chacune d’elle renvoie la valeurmémorisée par l’objet dans le type primitif qui cor-respond à son identificateur.

Page 112: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004100

Par ailleurs, chacune des classes d’emballage numérique contient uneméthode de classe préfixée par ��� souvent utilisée pour convertir lenombre d’une chaîne de caractères dans son type primitif numérique sansqu’il faille créer un objet de sa classe. Par exemple, la méthode de classe ���O��� de la classe � � �� ���O��� renvoie la valeur de type ���� corres-pondant au nombre du texte qui lui est passé en paramètre.

Par l’exemple : calculer les mensualités d’un empruntCet exemple montre comment convertir avec les méthodes préfixées par ��� des classes d’emballage des valeurs numériques saisies sous forme detexte. Ces valeurs sont utilisées pour calculer les mensualités d’un empruntgrâce à la formule mathématique suivante :

appliquée dans la méthode de classe � ������+���� ���� de la classe�����������������>����� ci-dessous.

JAVA 5.0 Autoboxing et auto-unboxing

La création d’une instance d’une classe d’emballage à partir d’une valeur du type primitif cor-respondant est simplifiée avec Java 5.0 grâce à l’autoboxing (littéralement mise en boîte auto-matique). Cette fonctionnalité évite d’écrire explicitement l’appel à ��3�$%������+�%%�4�pour créer un objet d’une classe d’emballage. Par exemple, l’instruction :/�������W���� �8�

sera automatiquement traduite par le compilateur en l’instruction :/�������W���� ���3�/�������8��

Symétriquement, l’auto-unboxing évite de faire appel explicitement à la méthode d’uneclasse d’emballage qui renvoie la valeur de type primitif stockée par un objet de ce type. Parexemple, l’instruction :����%� �W����

sera automatiquement traduite par le compilateur en l’instruction :����%� �W�������' ������

ATTENTION Les classes d’emballages sont immuables

Toutes les classes d’emballage étant immuableset ,�� �, il faut créer d’autres classes si vousvoulez stocker dans un objet une donnée d’untype primitif dont la valeur peut être modifiéepar la suite.

A RETENIR Utilisation des classes d’emballage

Les classes d’emballage sont utilisées principale-ment dans les circonstances suivantes :• les conversions de chaînes de caractères en une

valeur de type primitif numérique ;• les tests de valeurs particulières d’un type primi-

tif ;• la gestion d’ensembles d’objets numériques,

comme par exemple pour les boules de Loto,gérées dans la classe �����������������O��� (voir à la fin du chapitre « Abstraction etinterface »).

EXEMPLE com/eteks/outils/Emprunt.java �� ��������������������

�������� ���>������

Calcule le montant des mensualités d’unemprunt.

B ���������� ����������� ������+���� ������������ �%�������������������������������+���� ������������� �� �������������������� ����� �� �� ��*�� �%������������������������)��2�R�+ ����3��2�@�� �%��R��+���� �������

Suppression des décimales superflues. B �����������+ ������������� �����*�288��)�288����!!

Page 113: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 101

La méthode � ������+���� ���� de la classe �����������������>����� estappelée � dans l’application suivante qui calcule les mensualités et les inté-rêts d’un emprunt à partir d’un capital, d’un taux d’intérêt et d’une duréesaisis par l’utilisateur.

La saisie de chacune des valeurs � � � est effectuée avec la méthode declasse ���3/���$� ��� de la classe � � %��3����B=����� �� : cette méthodeaffiche une boîte de dialogue de saisie textuelle avec le texte passé en para-mètre comme commentaire puis renvoie le texte saisi.

Chaque chaîne de caractères est ensuite convertie en valeur numérique grâceaux méthodes de classe ���$����� �, ���J�� � � et ���/�� � afin depouvoir calculer les mensualités � et les intérêts .

EXEMPLE com/eteks/test/CalculateurEmprunt.java �� ������������������������� � %��3����B=����� ��������������������������>�������� ���# ���� ����>���������������� ��������� ����������01� �������

Figure 6–6 Application ���������������# ���� ����>�����

�������������%��# �� �� �B=����� ������3/���$� ����������������������������������4# �� ��������A�88�<�F4���������������%��5 �%� �B=����� ������3/���$� �������������������������������45 �%�-���A�88�<�A�88� ������[��F4���������������%��(�������� �B=����� ������3/���$� �����������������������������������4$��A�88�<������ ��A�88�<����F4��

3 Saisie du capital emprunté, du taux d’intérêt etde la durée de l’emprunt.

����������� �� �� �$������ ���$��������%��# �� ���������,�� ��� �%� �J�� �� ���J�� ����%��5 �%��)�288�,�)�2:,�������������+���� ����� �/������� ���/�����%��(���������*�2:���

3 Appel des méthodes ������ qui convertis-sent les valeurs saisies.

��������������� ����� �>������� ������+���� ������� �%������������������������������������������+���� ������� �� ���������������������� ������ �����*���+���� �����R�� �� ���

3 Calcul des mensualités et des intérêts.

��������������� ��� �4��������� �� ��������A�88�<���4����������������������@���%��# �� ��@�4�A�:8 �4���������������������@�4�����4�@���%��(��������@�4� ��A�88�<��4���������������������@�4�A�88�8����� �%�-���A�88�<�A�88� ����4���������������������@���%��5 �%�@�4�[��4���������������������@�4A���������� ���A�88�<�����������4����������������������@������ �����@�4�A�:8 �4���������������������@�4���������A�88�<����������A�88,���� �4���������������������@����������@�4�A�:8 �4�����B=����� ������3+��� ��$� �������������� ����

3 Construction d’un message d’information.

�����G������%����8����!!

DANS LA VRAIE VIE Interface utilisateur de CalculateurEmprunt

La classe �������������������>�����,décrite à la fin du chapitre 10, « Interfaces utilisa-teur avec Swing », reprend le principe de cetteapplication avec une interface utilisateur plus adé-quate, tout en réglant les erreurs qui peuvent sur-venir ici quand l’utilisateur saisit des valeurs incor-rectes (texte laissé vide ou nombre incorrectementformé).

Page 114: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004102

REGARD DU DÉVELOPPEUR Limitations des types float et double

Les types primitifs ����� et ���� sont ceux qui permet-tent d’effectuer de façon optimale des calculs sur desnombres décimaux, mais dans certaines limites qu’il fautconnaître. Comme un microprocesseur manipule desinformations binaires, il effectue tous les calculs sur desnombres en base 2 plutôt qu’en base 10. Pour les nom-bres entiers, ceci ne pose aucun problème : comme toutentier en base 10 a son équivalent exact en base 2 etinversement, les nombres entiers sont toujours traitéssans erreur par le microprocesseur, dans la limite dunombre de bits fixés par chaque type entier (32 bits pourle type ���, ce qui permet de stocker des nombres com-pris entre -231 et 231-1).

La représentation en mémoire d’un nombre décimal detype ����� (sur 32 bits) ou ���� (sur 64 bits) est quantà elle décomposée en trois parties selon la normeIEEE 754 : 1 bit pour son signe, 8 ou 11 bits pour sonexposant et 23 ou 52 bits pour ses chiffres significatifsappelés aussi mantisse. L’exposant est un nombre entiertandis que la mantisse est un nombre décimal en base 2,ce qui veut dire que chaque bit de la mantisse repré-sente un multiplicateur d’une puissance inverse de 2. Parexemple, 0,625 se décompose en 0,5+0,125 ou1x2-1+ 0x2-2+ 1x2-3.

À la différence des nombres entiers, tout nombre déci-mal en base 10 n’a pas toujours son équivalent exact enbase 2 sur un nombre fini de bits. Par exemple, 0,8 sedécompose en 0,5+0,25+0,03125+0,015625+... ou1x2-1+ 1x2-2+ 0x2-3+ 0x2-4+1x2-5+1x2-6+... et ainsi desuite avec une décomposition infinie. 0,8 n’a donc pasd’équivalent exact en binaire, autant dans le type �����que dans le type ����, même si ce dernier est plus pré-cis. Si vous faites de nombreux calculs avec de tels nom-bres, les erreurs d’approximation risquent de s’accumu-ler, ce qui rend le résultat du calcul partiellement faux.

Par exemple, si dans l’application de classe �������������� �������������, vous choisissezdes valeurs de 1 000 € pour le capital, d’un an pour ladurée et de 5 % pour le taux, vous obtiendrez des men-sualités de 85,61 € et un coût de crédit de27,319999999999936 € au lieu de la valeur exacte85,61x12–1 000=27,32 €.

POUR ALLER PLUS LOIN java.math.BigDecimal

Bien que les erreurs de calcul avec les types ����� et���� soient souvent infimes, il y a certains domaines,comme celui de la finance, où aucune erreur n’est tolé-rée, la précision primant sur la vitesse de calcul.

Pour ce type d’application, il vaut mieux manipuler lesnombres décimaux grâce à la classe�������������� ���� sous-classe de �������������� ;à la différence du type ����, une instance de cetteclasse représente un nombre décimal de façon exactesans aucune limite en taille ; les opérations mathémati-ques se font alors grâce aux méthodes ���, ����� �,��������, �����... de cette classe.

Par exemple, le calcul des intérêts dans l’applicationde classe �������������� ������������� pourraitêtre réalisé ainsi avec la classe �������������� ����(attention au paquetage ��������� de cette classe) :

Remarquez d’après cet exemple que le nombre de déci-males peut être limité si nécessaire grâce au paramètre� �� disponible dans certaines méthodes, et que lacréation d’un objet ���� ���� s’effectue souvent à par-tir du texte du nombre pour éviter les approximationsdes types ����� et ����.

C# java.math.BigDecimal ≈ decimal

La classe �������������� ���� correspond au type C#� ���� et à sa classe d’emballage ������� ����, maisce type de nombre n’a aucune limite en Java.

���� ��������������� � ������!�

����"����� �����#��������$

������� ��#%&����� �����'()��*+,-.*)/$0

���� ������������!�

�������������� � �����

�������������#�"����� �����#� ��,���$$

�������������#�"����� �����#12%1$$

���������� �#�"����� �����#� ��������$$0

Page 115: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 103

Gérer la date et l’heureLa gestion des dates est indispensable dans la plupart des applications, parexemple pour mémoriser une date de naissance ou garder trace du momentoù une opération a été effectuée.

Mémoriser la date et l’heure (java.util.Date)La classe ������������� représente un instant exprimé en milliseconde,dont la valeur 0 correspond au 1er janvier 1970. On utilise surtout le cons-tructeur sans paramètre de cette classe, qui initialise la date au moment pré-sent.

La classe �������������, disponible depuis le JDK 1.0, n’a pas été initialementconçue pour gérer les conversions internationales des dates. Pendant le dévelop-pement du JDK 1.1, Sun a décidé de « désapprouver » (to deprecate en anglais)les méthodes ��3��, ��3��... de cette classe (au lieu de la modifier) et a crééles classes ������ ����������.����� et ����������4�������������� pour yajouter les fonctionnalités manquantes.

Afficher la date et l’heure (java.text.DateFormat)La classe ������ �����.����� et sa sous-classe ������ ����������.�����permettent de convertir une date au format texte utilisé dans la langue del’utilisateur pour afficher cette date. La procédure de conversion se dérouleen deux étapes :1 Obtention d’une instance de ������ �����.����� en appelant l’une des

méthodes de classe suivantes :– �����5����� pour utiliser le format jour, mois et année,– ��6��5����� pour utiliser le format heures, minutes et secondes,– �����6��5����� pour utiliser le format jour, mois, année, heures,

minutes et secondes.

API JAVA Méthodes de la classe java.util.Date

Les méthodes de cette classe appartiennent à deux catégories :• Les méthodes ��3��, ��3��, ��7����, ��7����…, pour interroger et modifier

l’année, le mois, le jour, les heures, les minutes et les secondes d’une instance de��������������

• Les méthodes ��6�� et ��6�� pour interroger et modifier l’instant stocké par unobjet de cette classe.

• Les méthodes pour comparer des dates entre elles :������ �����������#��������������"��$������ ������������#��������������"��$������ ����� �����6��#����������(� ����$������ �������8�����#����������(� ����$

B.A.-BA deprecated

La bibliothèque standard Java 1.4 compte 18 clas-ses et 281 méthodes désapprouvées pour des rai-sons diverses : elles sont signalées dans la docu-mentation sur les API Java par le mot deprecatedsuivi d’une suggestion de remplacement. Le faitqu’une classe ou une méthode soit notée��� ��� n’empêche pas de l’utiliser dans unprogramme mais entraîne l’affichage du messagesuivant lors de la compilation avertissant qu’uneAPI désapprouvée a été utilisée :���9��� : ��:���:���:�����; �������������������������� ����,/5�

Quand un tel message s’affiche, il est conseillé deremplacer l’API désapprouvée par la solution sug-gérée. Toutefois, comme Sun assure jusqu’à main-tenant la compatibilité ascendante des classesJava, vous pouvez ne pas tenir compte de l’avertis-sement dans certains cas.

Page 116: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004104

Ces méthodes prennent en paramètres les constantes .)--, -(�4, 7��5)7ou �+('6 de la classe ������ �����.����� pour spécifier le style de laconversion.

2 Appel de la méthode ������ avec l’instance de ������ �����.����� obte-nue en lui passant en paramètre une instance de ������������� à convertir.

Forum : message du forumL’autre classe primordiale pour le forum de discussion décrit un messageposté dans le forum. Représenté par une instance de la classe �������������7����, chaque message mémorise les informationssuivantes :• le pseudonyme de son auteur ;• la date et l’heure du moment où le message a été créé ;• le sujet du message. Le forum est organisé sous forme d’un ensemble de

sujets que peuvent créer les utilisateurs identifiés ; • le texte du message.

POUR ALLER PLUS LOIN Changer de langue et de fuseau horaire

La langue utilisée pour les conversions de dates peut être modifiée par programme de deuxfaçons :

• soit en spécifiant une langue avec le paramètre de classe ����������-� �� des méthodes�����5����� de la classe ������ �����.�����, les langues les plus communesétant représentées sous forme de constantes de la classe -� �� (par exemple-� �����4-5�+) ;

• soit avec la méthode de classe �������� de la classe ����������-� ��, pour modi-fier la langue utilisée par défaut pour toutes les conversions de date ou de nombre.

Le fuseau horaire utilisé pour les conversions de dates peut être modifié en appelant la méthode��6��<�� sur un objet de classe ������ �����.����� ou grâce à la méthode declasse �������� de la classe ����������6��<��.

B.A.-BA Sujet d’un message

Un sujet est un texte court représentant un thèmeou une question sous lequel sont regroupés unmessage et ses réponses.

Figure 6–7Diagramme UML de la classe �������������7����

- auteur : String - dateCreation : Date - sujet : String - texte : String

- formatDate : DateFormat - formatHeure : DateFormat

Message

com.eteks.forum

+ Message(auteur : Utilisateur, sujet : String, texte : String) + setAuteur(auteur : Utilisateur) + estEcritPar(auteur : Utilisateur) : boolean + toString() : String

Page 117: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 105

Ces informations correspondent aux champs �����, ����������, ���� et� � de la classe 7����. La valeur de ces champs peut être modifiée ouinterrogée grâce à leurs accesseurs ������et mutateurs ����� respectifs.

FORUM com/eteks/forum/Message.java�� ���� ������������0��������������������0������������� �����.�����0:==�=�7���������������� ����������&���������&������ ��=������������ ��������=:����� � �����7����>

���������������������0��������������������������!��"�����#$0����������������������0����������������� �0

3 Déclaration des champs mémorisant les informa-tions d’un message.

������ �7�����#)���������������&������������&��������������������������� �$��>�������#������?!�����$�����������������!���������/�������#$0���������������!�����0���������� ���!�� �0��@������ ����������,����#$��>��������������������0��@������ ��������,����#������������$��>���������������!������0��@

3 Constructeur

������ ��������,�����#)���������������$��>���������������!���������/�������#$0��@

3 Seul le pseudonyme de l’utilisateur est mémo-risé.

������ ���������� ���/���#)���������������$����>���������������������8�����#��������/�������#$$0��@������ ������������������#�������$��>��������������������!����0��@������ �����������������#$��>�������������������������0��@

3 Méthode permettant de vérifier si un utilisateurest l’auteur de ce message.

Page 118: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004106

La date de création d’un message correspond au moment où une instance de �������������7���� est créée. Le champ ���������� est donc initialiséavec un nouvel objet de la classe ������������� �. Ce champ est utiliséavec la classe ������ �����.����� � pour créer la description textuelled’un message renvoyée par la méthode �������� �. Notez aussi que seul lepseudonyme de l’auteur � est mémorisé par la classe 7���� ; chaque utili-sateur du forum ayant un pseudonyme, cette information est suffisante pouridentifier l’auteur d’un message � et simplifie la gestion des messages dansla base de données (voir le chapitre 11, « Connexion à la base de donnéesavec JDBC »).

������ ������������#�����������$��>�������#�����!!�����$����������������!�����0������

Suppression des espaces superflus au début et àla fin du sujet.

B ����������������!�����������#$0��@������ ��������������#$��>�������������������0��@������ ��������6 �#�������� �$��>�������#� ��!!�����$������������ ��!�����0������

Suppression des espaces superflus au début et àla fin du texte.

B ������������ ��!�� �������#$0��@

������ ����������6 �#$��>���������������� �0��@

Champs de classe utilisés pour mettre en formeles dates.

B �������������� ����.�����������������!����������������.�����������5����� �#���.������7��5)7$0���������������� ����.������������+���!����������������.��������6��5����� �#���.�������+('6$0������ �����������������#$��>����������1��1�A������������A�1���1�����������A������������������#���������������$�������������A�1�B�CCC�1�A�������+���������#���������������$�����������A�1B������9�1�A���������������������A�1B�1�A������� �0��@@

La méthode �������� est redéfinie pour ren-voyer une description textuelle d’un message.

B

POUR ALLER PLUS LOIN Format personnalisé de dates

La classe ������ ����������.�����,sous-classe de ������ �����.�����, per-met de spécifier des formats personnalisés pourconvertir une date en texte, grâce à des codes quireprésentent les minutes, les heures, le jour, lemois, l’année... Par exemple, l’objet renvoyé par�"� ��������.�����#1��D77D����1$permet de formater une date sous la forme dutexte 1E2D2%D%CCF1.

Page 119: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 107

L’application de classe �����������,��� ��7����.���� affiche un mes-sage en appelant implicitement sa méthode ��������.

Fixer et manipuler la date et l’heure (java.util.GregorianCalendar)La classe ����������4��������������, sous-classe de �����������������,représente une date et une heure du calendrier grégorien (calendrier occi-dental). Cette classe dispose de plusieurs constructeurs pour initialiser uneinstance soit au moment présent, soit à une date et une heure données.

Par l’exemple : bon anniversaire !L’application de classe ��������������,��������� montre commentutiliser les méthodes �� et �� de la classe ����������4��������������pour calculer des durées.

Une fois que vous avez saisi votre date d’anniversaire �, cette applicationaffiche :• soit un message vous souhaitant Bon anniversaire si votre anniversaire est

aujourd’hui �,• soit un message affichant le nombre de jours d’ici votre prochain anniver-

saire, le calcul prenant en compte les années bissextiles.

EXEMPLE com/eteks/test/AfficherMessageForum.java�� ���� ����������0������� �������������=0 �����,��� ��7����.����>������ ������ ����������#������GH�����$��>

����)�������������������!��"�)����������#������1��������1&�1�I���1&�)����������7(��',6�)'$0

3 Création d’un utilisateur.

����7�����������!��"�7�����#��������&�1������1&������1��������B�CCC�����&� ����������B�CCJ�B�CCJ�������� 1������A�1���� ���������������8��������������B�CCJ������1$0

3 Création d’un message.

�������� ��"����K(�����/������"7����������#����&������$0���������� ���#C$0��@@

3 Affichage du message.

Figure 6–8 Application �����������,��� ��7����.����

Figure 6–9 Application ��������������,���������

Page 120: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004108

EXEMPLE com/eteks/test/BonAnniversaire.java�� ���� ����������0������������� �����.�����0�����������������4��������������0��������������������0����������� ��"����K(�����/��0

��������,���������>������ ������ ����������#������GH�����$��>�

API JAVA Méthodes de la classe java.util.GregorianCalendar

Les méthodes de ����������4�������������� sont simi-laires à celles de la classe �������������.• Les méthodes �� et �� de la classe����������4�������� ������� remplacent les métho-des ��� ��� ��3��, ��3��& ��7����,��7����…, de la classe ������������� :

������ ��������������#��� ����$������ ���������������#��� ����&���� ����$

Leur paramètre ���� est l’une des constantes : �',, 3�,', 7(�6+, �,6�, L��M*(.*3�,', L��M*(.*7(�6+,�,3*(.*3�,', �,3*(.*7(�6+, �,3*(.*L��M,�,3*(.*L��M*5�*7(�6+, +()'*(.*�,3, +()', ,7*/7,<(��*(..��6, ��6*(..��6, 75�)6�, ���(��, 75--5���(��de la classe �����������������.

Chacune de ces constantes est utilisée pour interrogerou modifier l’information correspondante d’une ins-tance de ����������4��������������.

• La méthode ��6�� renvoie une instance de la classe������������� qui peut être utilisée avec la classe������ �����.����� pour convertir une date entexte :

������ �����������������������6��#$

• Méthodes pour comparer des dates entre elles :������ �����������#����������(� ��"��$������ ������������#����������(� ��"��$������ �������8�����#����������(� ����$

Saisie de la date d’anniversaire. B ��������������!�K(�����/������"5����������#��������������������1�����N�����������#��:��$�91$0��

Extraction du jour et du mois. B ������������ ������!�������� (�#N:N$0�������������������!�������������#C&����� �����$0�������������������!�������������#���� ������A�2$0

Création d’un objet ����������4�������������� à la date d’aujourd’hui.

B ����4��������������������������!��"�4���������������#$0

Création d’un objet ����������4�������������� à la date d’anniversaire.Attention ! l’indice du mois débute à 0 (0 pourjanvier, 1 pour février...).

B ����4�������������������������0���������������!��"�4��������������#��������������������������������������#4���������������3�,'$&�������������������������5���������5��#�������$�D�2&�������������������������5���������5��#�������$$0����������������0

Page 121: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 109

��������������'������!���������������������������#4����������������,3*(.*3�,'$�����������D��������������#4����������������,3*(.*3�,'$0�������#�����'������!!�C$������������!�1���������������?10������������>

3 Calcul de la différence de jours entre les deuxdates.

���������#���������������#����������$$������>���������������������#4���������������3�,'&�������������������������#4���������������3�,'$�A�2$0��������4������������������ ����E2� ���!�������������"�4���������������#���������������������������#4���������������3�,'$&��������������4�������������������7��'&�E2$0�������������'������!����������������������#4����������������,3*(.*3�,'$��������A�#��� ����E2� �����#4����������������,3*(.*3�,'$��������D��������������#4����������������,3*(.*3�,'$$0������@

3 Si l’anniversaire est déjà passé, la date du pro-chain anniversaire est l’an prochain. Pour pren-dre en compte les années bissextiles, le nombrede jours qui restent avant cette date est calculéen additionnant le nombre de jours jusqu’auprochain 31 décembre de cette année avec lenuméro d’ordre du jour de l’anniversaire l’annéeprochaine.

���������.������������K����!�����������������������.�����������5����� #���.������.)--$0�������������,����������!��������������6��#$0�������������� ����,����������!��������������������������K����������#���,���������$0

3 Mise en forme de la date au format complet (parexemple, lundi 12 mai 2003).

������������!�1O�����������������������1�����������������A������'������A�1������1����������������A�1B���1�A�� ����,���������0����@����K(�����/������"7����������#����&������$0

���������� ���#C$0��@@

3 Arrêt de la JVM.

Testez vos connaissances linguistiques !

Java est capable de convertir une date dans un grand nombre de langues. Sans modifier le pro-gramme, vous pouvez choisir la langue par défaut de l’utilisateur grâce à l’optionD������������!���:��4&� de la commande ���� ; ���:��4&� représente une lan-gue codée sur deux lettres selon la norme ISO 639. Par exemple, la commande suivante afficherala date d’anniversaire en allemand :�����P������������!�� ��������������,���������

Voici quelques-uns des codes ISO 639 reconnus par Java : ��, �, �, ��, �, �, ��, �, ��,��, I�, ��. Amusez-vous à les tester !

JAVA 5.0 Prise en charge du vietnamien

La prise en charge du vietnamien a été ajoutée àJava 5.0 (code ISO 639 : ��).

Page 122: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004110

Les tableaux pour gérer des ensembles d’élémentsUn tableau (array en anglais) est le type d’objet le plus simple à programmerpour gérer un ensemble d’éléments :• Les éléments d’un tableau sont tous du même type.• Ces éléments peuvent être des données de type primitif ou des références

d’une classe donnée.• La taille d’un tableau est déterminée lors de sa création et ne peut être

modifiée par la suite. Chaque tableau a un champ ���������� conte-nant sa taille.

• La position d’un élément dans un tableau est déterminée avec un indiceentier.

• L’indice du premier élément d’un tableau est toujours 0 et l’indice du der-nier élément d’un tableau est le nombre d’éléments du tableau moins 1.

• La JVM vérifie à l’exécution que les indices utilisés pour accéder à un élé-ment figurent bien dans l’intervalle autorisé et que le type d’un objet àstocker est compatible avec le type du tableau.

Déclarer et créer un tableauVoici comment se déclare une référence ����������� de type tableau :

�����%����� peut être un type primitif ou une classe. �����%����� �� peut êtreutilisé aussi comme type de paramètre ou comme type de retour d’uneméthode retournant un tableau. Comme toute référence, une référence detype tableau peut être égale à ��� ou désigner un objet tableau.

On peut effectuer la création et l’initialisation d’un objet tableau de trois façons :1 Lors de la déclaration du tableau si les valeurs initiales des éléments à

stocker sont connues. La liste de ces valeurs est citée entre accoladesaprès l’opérateur �.

Exemple

2 À tout moment, en utilisant l’opérateur � et la taille voulue du tableau.Les éléments sont alors initialisés avec leur valeur par défaut (� pour leséléments de type numérique ou caractère, ���� pour les éléments de type����� et ��� pour les éléments de type objet). Un tableau peut avoirune taille nulle, ce qui correspond à un ensemble vide.

�����%��������������������

������������������������������ ��!�����������!"#$������������%�����&#'&��&()&��&(�&"#

À RETENIR Tableau Java

Un tableau Java est un objet qui mémorise unensemble de valeurs contiguës en mémoire, aux-quelles on accède grâce à un indice entier com-pris entre 0 et le nombre d’éléments moins un.Un tableau qui contient des valeurs de type pri-mitif, comme le tableau �����������,stocke directement ses valeurs les unes après lesautres, tandis que celui qui contient des objets,comme le tableau ����%�, stocke les référen-ces sur ses objets.

Figure 6–10Organisation en mémoire des tableaux

C# Position des crochets

Java laisse la liberté de placer les crochets ��avantou après l’dentificateur du tableau, contrairementà C# où les crochets �� doivent précéder l’identifi-cateur du tableau.

ATTENTION Tableau de références

La création d’un tableau de type objet negénère pas d’objet pour chaque élément dutableau, mais uniquement des références initia-lisées à ��� par défaut.

0

";)"

1

2

smileys

":("

":o"

10

1

2

nombresPremiers

2

3

53

4

5

7

11

136

7 17

Page 123: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 111

Exemple

3 À tout moment, en utilisant l’opérateur � et une liste entre accolades devaleurs. Cette notation est très pratique pour passer un tableau en paramè-tre à une méthode sans qu’il faille créer une variable locale pour ce tableau.

Exemple

Utiliser un tableauUne fois que l’on a créé un objet tableau, pour consulter ou modifier un élé-ment on utilise son indice dans le tableau.

Exemple

En tant qu’objet Java, un tableau hérite de la classe *�+�,���,-�*�� et detoutes ses méthodes. La méthode ��� d’un tableau est notamment redé-finie pour retourner une copie du tableau. En revanche, la méthode .����n’est pas redéfinie pour comparer le contenu de deux tableaux et la méthode��$���� n’affiche pas la liste des valeurs.

Exemple

Ici, ��est égal à ����.

La JVM vérifie lors de l’exécution si les tableaux sont manipuléscorrectement :• Si l’indice utilisé pour accéder à un élément d’un tableau n’est pas com-

pris entre 0 et la taille du tableau moins 1, une exception de classe*�+�,���,/���%012-��-�3��1��2����� est déclenchée.

�������������4����������������� �#$���������2��#55�,,,�������������#�2�������$������������#

� �������6���7�7#� �������-���7�7#$�����������$�����)������������������ �����������6������-������6������-"'#

���4�������������,�8�# 3 Mémorise �,�8� dans le deuxième élément de���4�����.

�2�������������%�����# 3 Mémorise le 3e smiley dans le premier texte.

�����������������������������#��������9��1���������������������������,��� �:���#�

3 �������� vaut 1.����9��1 vaut 17.

���������;������������ ������� ����"#����������6�������)�����'���;�����,����)'#�������������;�����,.�����)����6��'#�

À RETENIR Vérification des opérations autorisées sur un tableau

Les opérations auxquelles un tableau est soumissont vérifiées lors de l’exécution par la machine vir-tuelle Java.

Page 124: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004112

• Si la taille requise pour un nouveau tableau est négative, une exception declasse *�+�,���,4����+/���%$�<�2����� est déclenchée.

• Si vous tentez de stocker dans un tableau un objet dont le type estincompatible avec le type du tableau, une exception*�+�,���,/���%$����2����� est déclenchée.

Forum : générer le mot de passe d’un utilisateurLa méthode ��� de la classe ���,�=�,������,>��?���� renvoie un motde passe de 6 caractères généré aléatoirement. Chacun de ces caractères eststocké dans un tableau de � �� � et est choisi au hasard avec la méthode��1�� de la classe *�+����,>�� � parmi un ensemble de caractères auto-risés �. Finalement, ce tableau est transformé en chaîne de caractères grâceau constructeur adéquat de la classe *�+�,���,$���� �. La méthode ���est utilisée pour attribuer un mot de passe aux utilisateurs du forum aumoment de leur inscription.

Par l’exemple : afficher les jours fériés de l’annéeDans l’exemple suivant, on crée un tableau mémorisant un ensemble d’ins-tances de *�+�,����,9������@��1�� correspondant aux jours fériésmobiles français. Ce tableau est utilisé pour décompter le nombre de joursfériés hors week-end d’une année saisie par l’utilisateur.

FORUM com/eteks/outils/MotDePasse.java���=������,�=�,������#�������������>��?�����������������������������A-49B�BCD>04���E#���������������������$�����@/C/@6�C�$D/@@��6�$���������������������������&���1�� �*=����.����+�2%<����8 E!FG&#

��5HH����H�@�I�����+�������1�������II�I���I�������,����H5�����������������$���������)'���

Figure 6–11 Diagramme UML de la classe ���,�=�,�����,>��?����

+ creer() : String

MotDePasse

com.eteks.outils

Création d’un tableau de A-49B�BCD>04 carac-tères.

B ����� ���������?���������� ����A-49B�BCD>04�#��

Chaque caractère du tableau... B ��������)��������#���J����?����,��� #��KK'�����

... est choisi aléatoirement dans l’ensemble descaractères acceptés dans un mot de passe.

B �������������/���������������������)��')>�� ,��1��)'�H�@/C/@6�C�$D/@@��6�$,��� )''#�����������?�����������������������@/C/@6�C�$D/@@��6�$,� ��/�)����/������'#������"

Renvoi d’une chaîne générée à partir du tableaude caractères.

B �����������$�����)���?����'#����""

Page 125: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 113

EXEMPLE com/eteks/test/JoursFeries.java���=������,�=�,���#�������*�+�,�2�,?��L�����#�������*�+�,����,9������@��1��#�������*�+�2,����,M-������#������M����L���������������������+��1����)$�����������'���

����$������2�/���M-������,� ��0���?�����)���������������������������&/N���G��� �� N���G�(&'#�����������0���,����0��)�2�/'#

����9������@��1���*����L���>������������������9������@��1��)���9������@��1��,M/4B/CO���'���������9������@��1��)���9������@��1��,>/O���'���������9������@��1��)���9������@��1��,>/O��F'���������9������@��1��)���9������@��1��,MBAO���8'���������9������@��1��)���9������@��1��,/B9B$6��� '���������9������@��1��)���9������@��1��,4-;�>3�C���'���������9������@��1��)���9������@��1��,4-;�>3�C����'���������9������@��1��)���9������@��1��,?�@�>3�C��� '"#

3 Tableau initialisé avec les jours fériés mobiles.Quand c’est possible, utilisez de préférence lesconstantes de la classe 9������@��1��qui représentent les mois ; votre code serad’autant plus clair que les valeurs entières aux-quelles elles correspondent ont une base 0(0 pour janvier, 1 pour février...).

����$�����*����L�2����&M������N���G��N���G����2��(&������������������������K�&NN�� ���A�1��1��N����.��&������������������������K�&NN�� ���M�1��1��P������&������������������������K�&NN�� ���A�1��1����N����8�&#����$�����*����>��������&M������N���G��N���G���������(&#

3 Texte des jours fériés fixes.

����?��L������������M���������������������������?��L�����,��?��0����)?��L�����,LBAA'#�����������M����L���Q���R=�1����#

��������)��������#���J�*����L���>�����,��� #��KK'�����������9������@��1���*������*����L���>���������#

3 Pour chaque jour férié mobile...

������*����>������K��&NN�� ���&�����������������������K�������M���,�������)*���,��6��)''#

3 Ajout du jour mis en forme à la liste des joursfériés mobiles.

���������)�*���,��)9������@��1��,?/OD-LDR��S'������������T��9������@��1��,$/6BC?/O�����������UU�*���,��)9������@��1��,?/OD-LDR��S'������������T��9������@��1��,$B4?/O'�������������M����L���Q���R=�1KK#����"����$�������������&�@��1�������N���!����1��*����&���������������������K�&��N���G��N���G��1�&�K�����������������������K�&�)&�K�����M����L���Q���R=�1����������������������K�&�*����� �����=�1'�(&���������������������K�&N&�K�*����L�2����������������������K�&N&�K�*����>�����#����M-������,� ��>����?�����)����������'#����$%���,2��)�'#��""

3 Décompte des jours hors week-end.

Figure 6–12 Application ���,�=�,����,M����L��� pour l’année 2003

Page 126: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004114

Tableau multidimensionnelOn accède à un élément d’un tableau multidimensionnel par le biais de plu-sieurs indices. Les tableaux bidimensionnels sont par exemple utilisés pourmémoriser en informatique les matrices mathématiques. Java permet decréer un objet tableau multidimensionnel de trois façons :1 Lors de la déclaration du tableau avec la liste des valeurs initiales citées

entre accolades imbriquées.

Exemple

2 À tout moment, en utilisant l’opérateur � et la taille dans chaquedimension du tableau. Les éléments sont alors initialisés avec leur valeurpar défaut.

Exemple

3 Par étapes, en créant le tableau principal puis ses sous-tableaux.

Exemple

JAVA 5.0 Boucle itérative

Java 5.0 permet de simplifier la syntaxe de l’instruction ��� pour énumérer un à un les élé-ments d’un tableau. Ainsi, la boucle ��� utilisée dans l’application���,�=�,���,M����L��� (page précédente) peut être remplacée par :

����)9������@��1���*����(�*����L���>�����'���*����>������K��&NN�� ���&�������������������K�������M���,�������)*���,��6��)''#��55�,,,"�

Cette boucle signifie « pour chaque élément *��� de l’ensemble *����L���>����� ».

1����������������01���������������"����������"����������""#

��������������?������#����?�����������������������#

����������������������������� ����#����)��������#���J�������������,��� #��KK'

��55�@�I�����17������1�������������������������������������K���#

C# Tableaux [,]

Il n’existe pas en Java l’équivalent des tableaux multidimensionnels C# déclarés avec ��� donttous les éléments sont rangés dans une seule zone mémoire.

À RETENIR Tableaux multidimensionnels

Java manipule les tableaux multidimensionnelscomme des tableaux de tableaux ; chaque sous-tableau peut avoir une taille différente si néces-saire. Voici comment s’organise en mémoire untriangle de Pascal de quatre lignes déclaréainsi :���������������������������"���������"������������"���������������""#

Figure 6–13 Organisation en mémoire d’un tableau multidimensionnel

0

1

2

trianglePascal

3

1

1 1

1 2 1

1 3 13

Page 127: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 115

Manipuler les tableaux avec java.util.ArraysLa classe *�+�,����,/���%� contient un ensemble de méthodes de classe quipermettent d’effectuer des traitements sur les tableaux de type primitif ou detype objet : • .���� compare les éléments de deux tableaux ; • ���� remplit tout ou partie d’un tableau avec une valeur donnée ; • ���� trie les éléments d’un tableau dans l’ordre ascendant ; • ����%$��� renvoie l’indice du premier élément égal à une valeur dans

un tableau trié.

API JAVA Copie de tableaux

La méthode pour copier des éléments d’un tableau dans un autre est dans la classe*�+�,���,$%��� :��������������+��1�����%���%)-�*�� ������� �������������������������������������-�*�� 1������ 1��������� ��� '

JAVA 5.0 Liste d’arguments variable

Une liste d’arguments variable est une fonctionnalité de Java 5.0 qui permet à uneméthode de recevoir en dernier paramètre un nombre variable de valeurs (zéro ou plus).Une telle liste est déclarée en précédant le dernier paramètre du symbole ,,,, ce paramè-tre étant en fait un tableau. Exemple :

���=������,�=�,���#������/11�����/������;���������������������������11�����)���2�����,,,����'�����������)��������#���J����,��� #��KK'������2�K���������#���������2#��"����������������+��1����)*�+�,���,$������������'�������$%���,���,�����)&�K�K�K8�&������������������������K��11�����)���������8''#��""

C# Manipulation des tableaux

La classe $%���,/���% de C# correspond à laclasse *�+�,����,/���%� en Java et pas à laclasse *�+�,���,�����,/���% utiliséepour les opérations de réflexion sur les tableaux(manipulation des tableaux avec des méthodes).

Page 128: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004116

Par l’exemple : trier les paramètres d’une applicationAvant de voir comment s’utilise le tableau de chaînes en paramètre de ���,rappelons les termes de la déclaration de la méthode ��� d’une application.

L’application de classe ���,�=�,���,6��>��� trie les mots reçus en para-mètre et affiche la liste de ces mots triés. Le tri du tableau ���� reçu par laméthode ��� est effectué par la méthode ����)-�*�� �� ���' de la classe*�+�,����,/���%�. La référence ���� de type $���� �� est donc convertieimplicitement en une référence de type -�*�� ��. Plus généralement, la syn-taxe )$%�������'����6����� permet de convertir une référence de typetableau ; cette conversion est acceptée si la classe des éléments du tableaupeut être convertie dans la classe de conversion.

La commande suivante exécutée dans le sous-dossier �� du dossier de déve-loppement affiche le résultat de la figure 6-15 :

Figure 6–14Signification de la déclaration

de la méthode ���

main a un modificateur d'accès public

main est une méthode de classe ( main est appelée par la JVM sans créer d'instance de la classe)

main ne renvoie pas de valeur

main reçoit en paramètre un tableau de chaînes de caractères contenant les arguments de la ligne de commande

public static void main (String [] args)

EXEMPLE com/eteks/test/TriMots.java���=������,�=�,���#�������*�+�,����,/���%�#�������*�+�2,����,M-������#������6��>������5HH���H�6������� �V��1�������W���������1����������������H������ ����I�������1������,�B����������(����H�*�+�����,�=�,���,6��>�������������������,,,���H5����������������+��1�����)$������������'���

����55�6���1�������1������������/���%�,�����)����'#

����55�/���� ���1����������I�����M-������,� ��>����?������)���������'#

����$%���,2���)�'#��""

*�+��:�������� �,,5����������,�=�,���,6��>����*�+����������

JAVA Tableaux de longueur nulle

Java permet de créer des tableaux vides comme�� �� ������;�1 � �"#. Le champ��� d’un tel tableau est égal à 0. Si aucunargument n’est passé à la méthode ��� d’uneapplication, ���� est un tableau vide.

ASTUCE Tableau en paramètre de showMessageDialog

Si l’objet en paramètre de la méthode� ��>����?����� est un tableau, cetteméthode affiche les éléments du tableau les unsen dessous des autres.

C++ Arguments de main

En Java, le premier élément du tableau d’argu-ments de la méthode ��� est celui qui suit laclasse exécutée dans la commande *�+�.

Figure 6–15 Application ���,�=�,���,6��>���

Page 129: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 117

Les collections pour gérer des ensembles d’objetsLes tableaux sont inadéquats pour gérer une quantité importante d’informa-tions du même type quand leur nombre n’est pas connu à l’avance. Parexemple, le nombre de messages postés dans un sujet du forum n’étant paslimité, il existe des solutions plus simples que les tableaux pour stocker cesmessages.

Le package *�+�,���� contient plusieurs classes de collection utilisées pourgérer un ensemble d’éléments de type objet et résoudre les limitations inhé-rentes aux tableaux. Chaque classe est prévue pour gérer un ensemble avecdes caractéristiques différentes :• Les ensembles gérés par les classes *�+�,����,/���%A��� et *�+�,����,

A�=1A��� peuvent contenir des éléments égaux. Chaque élémentmémorisé ayant une position déterminée, ces classes ressemblent auxtableaux Java mais ne sont pas limitées en taille.

• Les ensembles gérés par les classes *�+�,����,Q�� $� et *�+�,����,6�$�ne peuvent pas contenir des éléments égaux. La classe *�+�,����,6�$�stocke les éléments de son ensemble dans l’ordre ascendant.

• Les ensembles gérés par les classes *�+�,����,Q�� >�� et *�+�,����,6�>�� utilisent une clé pour accéder aux éléments au lieu d’un indiceentier. La classe *�+�,����,6�>�� stocke les éléments de son ensembledans l’ordre ascendant des clés.

B.A.-BA Clés ou indices ?

Suivant l’ensemble d’objets, chaque élément estassocié soit à un indice qui donne son numérod’ordre, soit à une clé qui l’identifie de manièreunique. Par exemple, la clé associée à un utilisateurdu forum pourrait être son pseudonyme.

API JAVA Classes de collection Java 1.0

Les classes de collection décrites ici sont présentesdepuis la version 1.2 de Java. Les classes*�+�,����,;���� et *�+�,����,Q�� ����disponibles depuis la version 1.0 de Java ont desfonctionnalités équivalentes à celles des classes*�+�,����,/���%A��� et*�+�,����,Q�� >��. Ces deux classes, commeleur sous-classe *�+�,����,$���= (utilisée pourcréer une pile d’objets) et*�+�,����,�������� (utilisée pour créer uneliste de propriétés avec leur valeur comme cellesde la classe *�+�,���,$%���), sont toujoursmises en œuvre dans de nombreux programmes etdans certaines classes de la bibliothèque standard.

REGARD DU DÉVELOPPEUR Tableaux vs collections

Les tableaux Java sont simples d’utilisation mais ont cer-taines limitations gênantes dans certains cas :• Les tableaux ne sont pas redimensionnables.• L’insertion d’un élément au milieu d’un tableau oblige à

déplacer tous les éléments qui suivent.

• La recherche d’un élément dans un grand tableau estlongue s’il n’est pas trié.

• Les indices pour accéder aux éléments d’un tableau doi-vent être entiers.

Aucune des classes de collection n’est limitée en taille.Chacune résout de façon optimale certaines des autreslimitations des tableaux :

• La classe *�+�,����,/���%A��� est idéale pour ajouter à lasuite les uns des autres des éléments dans un ensembleordonné.

• La classe *�+�,����,A�=1A��� est idéale pour insérer denombreux éléments au milieu d’un ensemble ordonné.

• La classe *�+�,����,Q�� $� est idéale pour gérer unensemble dont chaque élément doit être unique. Elle amé-liore aussi les performances de recherche d’un élément.

• La classe *�+�,����,6�$� est idéale pour gérer unensemble trié d’objets uniques.

• La classe *�+�,����,Q�� >�� est idéale pour accéder auxéléments d’un ensemble grâce à une clé.

• La classe *�+�,����,6�>�� est idéale pour gérer unensemble d’éléments trié dans l’ordre de leur clé d’accès.

Les tableaux étant typés (grâce au type des élémentsdonné lors de leur déclaration), plus simples à program-mer et moins gourmands en mémoire, ils sont néanmoinstrès souvent utilisés notamment pour les ensembles dontla taille est connue à l’avance.

Page 130: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004118

Listes ordonnées d’objets (java.util.ArrayList et java.util.LinkedList)Ces deux classes gèrent des ensembles ordonnés d’éléments accessibles parleur indice. La classe *�+�,����,/���%A��� mémorise ses éléments dans untableau Java. Si ce tableau interne est trop petit lors de l’ajout d’un nouvelélément à la collection, il est automatiquement remplacé par un nouveautableau, plus grand, initialisé avec les références de l’ancien tableau. La classe*�+�,����,A�=1A��� mémorise ses éléments avec une liste doublementchaînée, ce qui permet d’insérer plus rapidement un élément dans la collec-tion, mais ralentit l’accès à un élément par son indice.

Figure 6–16 Organisation en mémoire d’instances des classes *�+�,����,/���%A���et *�+�,����,A�=1A����mémorisant chacune 3 objets

B.A.-BA Liste chaînée

Comme le montre la figure 6-16, chaque élémentd’une liste chaînée est mémorisé par un objet inter-médiaire appelé chaînon et lié à ses chaînons pré-cédent et suivant (d’où le nom de liste doublementchaînée). Comme une instance de*�+�,����,A�=1A��� ne mémorise que laréférence du chaînon de tête, l’accès aux autreséléments de la liste s’effectue séquentiellementgrâce aux liens entre les chaînons. L’insertion d’unélément dans une liste chaînée s’effectue en créantun nouveau chaînon puis en affectant les valeursde quatre liens précédents et suivants. Commel’insertion d’un élément dans un tableau nécessitede décaler tous les éléments qui suivent, cette opé-ration est plus rapide avec une liste chaînée sil’ensemble comporte beaucoup d’éléments.

API JAVA Principales méthodes des classes java.util.ArrayList et java.util.LinkedList

Les méthodes de ces classes effectuent des opérations similaires à celles qui peuvent être réalisées avec un tableau.

Description Méthode

Ajout d’une référence à la collection soit à un indice donné,soit en fin de liste

�������+��1��11)����12��*�+�,���,-�*�����*'��������������11)*�+�,���,-�*�����*'

Suppression de tout ou partie des éléments de la collection �������+��1�����)'�������*�+�,���,-�*������+)����12'����������������+)*�+�,���,-�*�����*'

Interrogation et modification d’un élément de la collection àun indice donné

�������*�+�,���,-�*�����)����12'�������*�+�,���,-�*�����)����12��*�+�,���,-�*�����*'

Recherche d’un élément dans la collection, en utilisant laméthode equals pour comparer les objets

������������)*�+�,���,-�*�����*'�����������12-�)*�+�,���,-�*�����*'��������������012-�)*�+�,���,-�*�����*'

Taille de la collection ������������<)'

Itérateur pour énumérer les éléments de la collection �������*�+�,����,0��������������)'

Récupération des éléments de la collection dans un tableau �������*�+�,���,-�*��������/���%�)*�+�,���,-�*�������'

Page 131: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 119

Par l’exemple : casier à bouteilles ou cave à vin ?Les applications suivantes calculent et affichent toutes les deux la valeur d’unmême ensemble de boissons : la classe ���������������� ��������� �utilise un tableau de taille fixe représentant un casier à bouteilles ; la classe�������������������� � utilise une instance de ����������� ����� pourcette cave à vin capable de s’agrandir sans limite.

EXEMPLE com/eteks/test/CasierBouteilles.java EXEMPLE com/eteks/test/CaveAVin.java���������������������

���� �������������������� ����������� �����������!����"�������������#������$%� ���&'�� �(��!����))� *������#+��������#��"���������������#��,����������$-%��.�/-0�1(�����������"� #�����,������������������������$-�� #����-0�2�3.0�41(�����))� *������#+������� �#��5�"��������������&'����� �,�����������&5'�����))��..���������#��"�������������������� �&6'�,��#���������� �&4'�,��#������))����7��������2������������#�

����))�������#��2�"���������#���� #��������.� �$������,�2����8,�9���::(���������� �&�'�,�"� #���������))��..���������#�����2��������������� �&7'�,����������$-������#��-0�1(�����))�����������..��;����#��� ���#������ ����))����#�����" ��#��������" �����.������ ���,�6����������������" ��,�6�����.� �$������,�6����8����� ������;���::(����!������))������"�������������������� �<���#�������))� *.* �����#������������������))�,=� ��"�����#������� ����������������"�����,����� �&�'��������.�$"�����/,�����(��������� ���:,�"�������� ��$(�����������������������" �::�����>����������� ����;��?����@������$����0������-����� �#������ �-:�� ���:-�A�16�-������:-A�-:������" ��:�-�������" �-(�����%����������$6(���>>

������������������������� ������������� ���������� �������������������� �����������������!����"�������������#������$%� ���&'�� �(��!����))� *������#+��������#��"���������������#��,����������$-%��.�/-0�1(�����������"� #�����,������������������������$-�� #����-0�2�3.0�41(�����))� *������#+�������"����������*����� ���������������,������ ������$(�����))�������#��"�����#�����������B������������������##�$�#�(���������������##�$�#�(�����))����7��������2��������������#���������������##�$����(���������������##�$����(�����))�������#��2�"���������#���� #��������.� �$������,�2����8,�9���::(����������������##�$"� #����(�����))��..���������#�����2�����������������������$70����������$-������#�-0�1((�����))�����������..��;����#��� ���#������ ����))����#�����" ��#�����������*����#�����.������ ���,�6������������������#��,�6�����.� �$������,�6����8�����������C�$(���::(����!������))��+����"��������������� ��+���� ���������))�<�����"����,=����� ����#�����������))� *.* ������������������������������"����,$�����(������������$�(��������.�$"�����/,�����(��������� ���:,�"�������� ��$(�������������������������#�::�����>����������� ����;��?����@������$����0������-����� �#����������D�-:�� ���:-�A�16�-������:�-A�-�:��������#��:�-���������#�-(�����%����������$6(���>>

Page 132: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004120

Ensembles d’objets uniques (java.util.HashSet et java.util.TreeSet) Ces deux classes gèrent des ensembles d’éléments différents les uns desautres. La méthode �<��� est utilisée pour comparer les éléments. La classe����������E�;%�� mémorise ses éléments dans un ordre quelconque avecune table de hash – la référence ���� peut être utilisée. La classe����������F ��%�� mémorise ses éléments dans l’ordre ascendant avec unarbre, pour maintenir plus rapidement le tri des éléments stockés.

Dictionnaires d’objets (java.util.HashMap et java.util.TreeMap)Ces deux classes gèrent des ensembles d’éléments accessibles par une clé corres-pondant (map en anglais) à un élément. Ces classes mémorisent en fait unensemble d’entrées (entries) associant une clé et son élément (key-value). L’accèspar clé dans une collection est comparable à l’accès par indice dans un tableau :

ATTENTION Classe java.util.HashSet et méthode hashCode

Si la classe des objets stockés par une instancede ����������E�;%�� redéfinit la méthode�<���, il faut redéfinir aussi la méthode;�;�#� dans cette classe pour que ce typede collection fonctionne correctement.

API JAVA Principales méthodes des classes java.util.HashSet et java.util.TreeSet

La classe ����������F ��%�� contient aussi les méthodes .� � et ���, renvoyant le plus petit et le plus grand élément d’une collection.L’accès aux éléments de ces classes s’effectue séquentiellement grâce à un itérateur de type ����������G�� ��� renvoyé par leur méthode ��� ��� .La mise en œuvre de l’interface G�� ��� et de ces classes est abordée au chapitre suivant « Abstraction et interface ».

Description Méthode

Ajout d’une référence à la collection si l’objet n’est pas déjà dans la collection ��"����"��������##$�����������"������"�(

Suppression de tout ou partie des éléments de la collection ��"�������#����� $(��"����"������� �����$�����������"������"�(

Recherche d’un élément dans la collection, en utilisant la méthode equals pourcomparer les objets

��"����"��������������$�����������"������"�(

Taille de la collection ��"���������C�$(

Itérateur pour énumérer les éléments de la collection ��"��������������G�� ��� ���� ��� $(

Accès par indice Accès par clé

Chaque indice du tableau est unique Chaque clé de la collection est unique

Un élément peut être mémorisé plusieurs fois à des indices différents

Un élément peut être mémorisé plusieurs fois avec des clés différentes

Tableau �����+%� de type�����������"�����&'

Collection �����+%� de classe����������� �����

ou ���������������#���

Collection �����+%� de classe����������E�;?��

ou ����������F ��?��

�����+%�&�' renvoie l’élément d’indice �dans �����+%�

�����+%�����$�( renvoie l’élémentd’indice � dans �����+%�

�����+%�����$���( renvoie l’élément de clé ���de �����+%�

�����+%�&�' , ���� affecte ��� à l’élé-ment d’indice �

�����+%����$�0� ���(� affecte ��� àl’élément d’indice �

�����+%�����$���0����(� affecte ��� à l’élémentde clé ���

Page 133: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 121

Comme les clés peuvent être des chaînes de caractères, des instances desclasses d’emballage ou d’autres classes, les classes ����������E�;?�� et����������F ��?�� permettent d’accéder à ces ensembles d’éléments demanière plus élaborée qu’avec un indice entier.

La classe ����������E�;?�� mémorise ses entrées dans un ordre quelconquetandis que la classe ����������F ��?�� mémorise ses entrées dans l’ordreascendant des clés avec un arbre, pour maintenir plus rapidement le tri deséléments stockés.

Par l’exemple : organiser les définitions d’un glossaire On utilise souvent les classes ����������E�;?�� et ����������F ��?�� pourprogrammer des dictionnaires. Chaque définition est associée à un ou plu-sieurs termes (quand il y a des synonymes) qui sont utilisés comme clé derecherche.

JAVA Unicité des clés

Comme les clés sont des objets, leur unicité estvérifiée par les classes ����������E�;?�� et����������F ��?�� grâce à la méthode�<��� sur les clés. Par ailleurs, la classe����������E�;?�� fait appel à la méthode;�;�#� des clés pour optimiser l’organisationdes entrées de la collection.

API JAVA Principales méthodes des classes java.util.HashMap et java.util.TreeMap

Description Méthode

Interrogation et modification d’un élément donné de la collection avecune clé donnée

��"���������������"��������$�����������"��������(��"���������������"��������$�����������"��������0���������������������������������������"����������(

Suppression de tout ou partie des éléments de la collection ��"�������#����� $(��"���������������"����� �����$�����������"��������(

Recherche d’un élément dans la collection par sa clé ou sa valeur. Cesméthodes utilisent la méthode equals pour comparer key aux clés ouvalue aux valeurs de la collection.

��"����"��������������H��$�����������"��������(��"����"�������������������$�����������"����������(

Taille de la collection ��"���������C�$(

Ensemble des clés et des éléments de la collection ��"��������������%������%��$(��"�����������������������������$(

Figure 6–17 Application �������������I���� �

Définition trouvée Définition non trouvée

Page 134: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004122

EXEMPLE com/eteks/test/Glossaire.java

������������������������� ������������E�;?������� �������������������� ��������I���� �!����"�������������#�����$%� ���&'�� �(��!

Déclaration de quelques définitions. B ����%� ����#�.�������G�������,��������-�"����� A�66�5A�66�5�A�66�6��� �� �#+���������-�����%� ����#�.�����������������,��������-G�������#+����������A�66�5 ����-�������:�-�������"���#+A�66�5�A�66�5�����-�����%� ����#�.�������%������,��������-����;A�66�5 ������#+������� �������-�

Remplissage du glossaire. B ����E�;?�������� ��,�����E�;?���$(���������� ������$-�������-0�#�.�������G������(���������� ������$-����������-0�#�.����������������(�

��&�0%���� et %����#�/� �/� ont la même définition.

B ��������� ������$-�������-0�#�.�������%�����(���������� ������$-�����#A�66�5 ��A�66�5�-0��������������������#�.�������%�����(������;����$� ��(����!

Saisie de la recherche. B ������%� ���� ��;� �;��,�������� ����;��G����@������$��������������������������������������-J����;� �;�CK����L-(�

Si l’utilisateur choisit Annuler, la variable ��;� �;� est égal à ����.

�������.�$ ��;� �;��,,�����(��������%����������$6(�

Recherche de la définition convertie en minuscu-les.

B ������%� ����#�.��������,����������$%� ���(����� ������$ ��;� �;�������� ��$((�

Affichage avec des icônes différentes selon lerésultat de la recherche. Cette forme de laméthode ;��?����@����� prend deuxparamètres supplémentaires : un texte pour letitre de la boîte de dialogue et une des cinqconstantes MNN�NO?M%%�IM, GPQ�N?�FG�PO?M%%�IM,R�NPGPIO?M%%�IM, JSM%FG�PO?M%%�IM, ��GPO?M%%�IMde la classe ������� ��� pour l’icône visuali-sée.

B �������.�$#�.��������/,�����(��������������� ����;��?����@�����$����0���������������� ��;� �;��:�-�D�-�:�#�.�������0����������������-NA�66�5������#����� ��;� �;�-0����������������������� ����GPQ�N?�FG�PO?M%%�IM(������������������������� ����;��?����@�����$����0���������������� ��;� �;��:�-�����#A�66�5.���-0����������������-NA�66�5������#����� ��;� �;�-0����������������������� ����R�NPGPIO?M%%�IM(�����>

��>>

Page 135: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

6 –

Les

class

es d

e ba

se d

e la

bib

lioth

èque

Java

© Groupe Eyrolles, 2004 123

En résumé…Ce chapitre vous a présenté un ensemble d’applications mettant en œuvre lesclasses fondamentales de Java. Il est essentiel de les connaître car c’est àpartir de ces classes Java que vous programmerez les classes qui formeront lecœur de vos applications dans le monde de l’entreprise.

JAVA 5.0 Généricité

La généricité équivalant au �������� C++ est probablement la fonctionnalitéla plus demandée dans Java depuis son origine. Intégrée à Java 5.0, la généri-cité est utilisée par les classes de collection pour laisser le choix au program-meur de spécifier une classe différente de �����������"���� comme classe deséléments stockés. La classe des éléments est spécifiée entre les symboles 8 et =qui suivent la classe de collection ; par exemple, � �����8G����� = repré-sente une collection de classe ����������� ����� dans laquelle seuls desobjets de classe ����������G����� pourront être ajoutés. La généricité simpli-fie alors la consultation des éléments d’une collection en évitant de faire appelà l’opérateur de cast.

Voici les modifications à apporter aux classes �������������������� et�������������I���� � pour utiliser les collections génériques :

• Pour l’ensemble �������� déclaré ainsi :

��� �����8�����=����������,������ �����8�����=�$(�

l’instruction pour récupérer le ième élément peut être simplifiée ainsi :

��������"�����,�������������$�(�

• Pour l’ensemble ����� � déclaré ainsi (pour la classe E�;?��, il faut spéci-fier la classe des clés et celle des éléments) :

��E�;?��8%� ���0%� ���=������ ��,�����E�;?��8%� ���0%� ���=�$(��

l’instruction pour récupérer l’élément de clé ��;� �;� peut être simplifiéeainsi :

��%� ����#�.��������,������ �����$ ��;� �;�������� ��$((�

Les collections génériques peuvent aussi être utilisées avec une boucle itéra-tive pour énumérer un à un les éléments d’un ensemble. La boucle .� de laclasse �������������������� se simplifie donc ainsi :

��.� �$������"�����D���������(�����.�$"�����/,�����(������� ���:,�"�������� ��$(���������������������#�::�

cette boucle signifiant « pour chaque élément "���� de l’ensemble�������� ».

B http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

ATTENTION Warning généricité

Comme l’utilisation de la généricité par les classesde collection permet de mieux contrôler la classed’un ensemble d’éléments, il est fortement con-seillé d’y recourir pour que le compilateur puissevérifier la cohérence de vos ensembles. De ce fait,le compilateur du JDK 1.5 signale par des avertisse-ments (;��� �4�) tout ajout d’éléments à unecollection déclarée sans la classe de ses élémentsentre les symboles 8�=. Le détail de ces avertisse-ments qui s’obtient avec la nouvelle option −T���� de ����� avertit le développeur par unmessage du type :�� ����D� &���;����#'� ���;����#� ��������##$M(��������"� ��.��;�� ������������������ �����Si vous voulez que le compilateur ignore ce typed’avertissement, ajoutez l’optionKT����!K���;����#>à ����� ; si vous souhaitez ne pas utiliser les nou-velles fonctionnalités de Java 5.0 et générer desfichiers compatibles avec Java 1.4 (comme c’est lecas pour les exemples de cet ouvrage), utilisezalors l’option K�� ���4�2.

Page 136: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à
Page 137: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

7Abstraction et interface

SOMMAIRE

B Classes abstraites

B Interface

B Implémentation

B Tri d’objets

B Énumération

B Encapsulation

MOTS-CLÉS

B abstractB implementsB iteratorB CollectionsB TriB Comparable

Les classes abstraites et les interfaces sont l’aboutissement d’une bonne conception objet. Même s’il paraît difficile de bien cerner la portée d’utilisation de cette surcouche d’abstraction du langage Java, nous allons voir dans ce chapitre comment mettre en œuvre ces concepts largement utilisés par la bibliothèque Java.

Page 138: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004126

Créer des classes abstraites pour les concepts abstraitsDans la hiérarchie des classes, la super-classe représente souvent un conceptabstrait, par exemple une figure, un véhicule ou une œuvre. Les objets decette classe ne sont pas créés parce que leur existence n’aurait pas de sens ouparce que certaines méthodes de la classe ne peuvent pas être implémentéespar manque d’informations. C’est pour répondre à ce cas de figure que l’onutilise le mot-clé �"� ��� comme modificateur de classe et de méthodesd’instance.

Une classe déclarée �"� ��� ne peut pas être instanciée. Elle définit souventdes méthodes �"� ��� qui, n’ayant pas d’implémentation, sont suivies d’unpoint-virgule (�) à la place d’un bloc entre !�>. Une sous-classe ne peut êtreinstanciée que si elle redéfinit toutes les méthodes �"� ��� de sa super-classe en les implémentant dans un bloc entre !�> à la place du �.

Par l’exemple : comparer les surfaces de différentes figuresLa surface d’une figure géométrique se calcule différemment selon qu’ils’agit d’un rectangle, d’un cercle ou d’un triangle. La classe abstraite���������������Q��� � suivante permet néanmoins d’exprimer le conceptde figure avec sa surface en y déclarant la méthode abstraite ���%� .���.

JAVA Classe abstraite et polymorphisme

On utilise toujours une classe abstraite avec lepolymorphisme : la relation est un permet à uneréférence d’une classe �"� ��� de désigner uneinstance de ses sous-classes non �"� ���.L’appel d’une méthode �"� ��� sur une telleréférence provoquera lors de l’exécution l’appel dela méthode redéfinie dans la sous-classe.

DANS LA VRAIE VIE Classe abstraite squelette

Une classe abstraite peut faire office aussi de« squelette » : ce type de classe définit tous leschamps et les méthodes communs dont ses sous-classes auront besoin. La classe�����������"� ���%��, super-classe de����������E�;%�� et ����������F ��%��,est un exemple de ce type de classe

C++ Classes et méthodes abstraites

Les méthodes �"� ��� Java sont l’équivalentdes méthodes virtuelles pures du C++ (reconnais-sables par la syntaxe , 6 placée en fin de déclara-tion d’une méthode). Notez qu’il est possible enJava de déclarer une classe �"� ��� qui ne con-tient aucune méthode �"� ���. EXEMPLE com/eteks/outils/Figure.java

�����������������������)UU�U�Q��� ����������������� ��������� .����������*���U�#��������K������U)��"�����"� ��������Q��� �!

Champ mémorisant la couleur d’une figure,information commune à toutes les figures.

B ��� ������%� ���������� �����"����Q��� ��$%� ���������� (��!�����;�������� �,������� ���>��)UU���U�N����������� .����#��������.��� ������U)

Une sous-classe de Q��� � doit redéfinir���%� .��� pour renvoyer sa surface selon letype de figure qu’elle représente.

B ����"�����"� ����.��������%� .���$(���)UU���U�N���������������� �������� .����#��������.��� �����U)

����"����%� ������%� ����$(��!

Page 139: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 127

Les deux classes �������������N��������� et �������������� ��� déri-vent de ���������������Q��� � et comportent des champs supplémentairescaractéristiques du type de figure qu’elles représentent, ce qui permetd’implémenter leur méthode ���%� .���. L’application de la classe����������������� ����Q��� � instancie ces deux classes pour comparerdeux à deux les surfaces de deux rectangles et d’un cercle, et afficher un mes-sage en conséquence.

���� ��� ��-Q��� ��-�:��;�������� �:�-�$-�:����%� .���$(������������:�-��A�66"1(-���>>

3 Le texte renvoyé dépend de l’implémentation dela méthode� ���%� .���� programmée dansles sous-classes de�Q��� �.

EXEMPLE com/eteks/test/ComparaisonFigures.java������������������������� �����������������Q��� ��

����N��������������#�Q��� �!

3 Sous-classe non abstraite de Q��� �.

��� ������.������������ ���� ������.������� ��� �����"����N���������$%� ���������� 0�.������������ 0�.������� ��� (��!������� �$������ (������;��������� �,�������� ������;���� ��� ��,��� ��� ���>

3 Champs mémorisant la longueur et la largeurd’un rectangle.

����"����.��������%� .����$(��!���� ��� ���;��������� �U��;���� ��� ���>>

3 Implémentation de la méthode abstraite de lasuper-classe Q��� � avec le calcul de la surfaced’un rectangle.

����� ���������#�Q��� �!

3 Autre sous-classe non abstraite de Q��� �.

��� ������.����� ���������"����� ����$%� ���������� 0�.����� ����(��!������� �$������ (������;�� �����,� �������>

3 Champ mémorisant le rayon d’un cercle.

����"����.��������%� .����$(��!���� ��� ��$.����(?��;� G�U��;�� �����U��;�� �������>>

3 Implémentation de la méthode abstraite de lasuper-classe Q��� � avec le calcul de la surfaced’un cercle.

�������� ����Q��� �!����"�������������#������$%� ���&'�� �(��!

3 Application de test des classes de figure.

Page 140: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004128

Si la méthode ���%� .���$( a été oubliée dans la classe�������������N��������, le compilateur affiche une erreur exprimantqu’une sous-classe doit être déclarée �"� ��� si elle n’implémente pas toutesles méthodes �"� ��� dont elle hérite :

Si une telle erreur survient, soit vous ajoutez �"� ��� à la classe�������������N�������� et elle ne pourra pas être instanciée, soit vousimplémentez la méthode ���%� .���$( dans la classe �������������

N��������.

Séparer l’interface de l’implémentationUne interface Java est une entité distincte d’une classe qui contient une listede méthodes abstraites que doit implémenter une classe pour rendre un ser-vice. Très présentes dans la bibliothèque Java, les interfaces sont mises enœuvre principalement dans deux situations :• pour spécifier la liste des méthodes que vous pouvez utiliser sur un objet

de la bibliothèque Java ;• pour spécifier les méthodes que vous devez implémenter dans vos classes

pour utiliser une fonctionnalité de la bibliothèque Java.

Instanciation de deux rectangles et d’un cercle. B ����N���������� ��������������,�����N���������$-�����-0�160�46(�����N���������� ��������N�����,�����N���������$- ����-0�10�4�3.(������ ���������� ������������,������ ����$-"���-0�3(�

Affichage des figures les plus grandes. Les réfé-rences� �������������, ��������N����et �� �������� sont converties implicitementdans la classe �������������Q��� �.

B �����..��;� �� ��I ��#��$ �������������0� ��������N����(������..��;� �� ��I ��#��$ ��������N����0��� �������(�����%����������$6(���>

Affiche un message qui décrit quelle est la plusgrande des deux figures .4 et .1.

B ����"�������������#��..��;� �� ��I ��#��$Q��� ��.40�Q��� ��.1(��!����%� ����������

Appel des méthodes ���%� .���� implémen-tées dans les sous-classes. L’implémentation decette méthode existe forcément car lesréférences .4 et .1 ne peuvent désigner que desobjets dont la classe est une sous-classe nonabstraite de Q��� �.

B �����.�$.4����%� .����$(�=�.1����%� .����$((������������,�.4�:�-��������� ��#�<���-�:�.1��������������������,�.1�:�-��������� ��#�<���-�:�.4����������������������� ����;��?����@������$����0������(���>>

La méthode ���%� .���$( de la classe���������������Q��� � n’est pas implé-mentée dans la classe �������������N��������, ce qui rend cette classe�"� ���.

B �)���)����)���)���� ����Q��� ������D3D��������������N���������;���#�"��#���� �#��"� ��������#�������#�.�������%� .���$(�������������������Q��� ��3���#���� �#��#%�#% 4��#�5

À RETENIR Héritage de méthodes abstraites

Une classe qui hérite d’une méthode �"� ���doit soit être déclarée �"� ���, soit implémen-ter cette méthode.

B.A.-BA Interface

Pour vous aider à débuter avec le concept d’inter-face, imaginez qu’une interface est une sorte declasse �"� ��� dont toutes les méthodes sontimplicitement �"� ��� et pour laquelle lesmots-clés ���� .��� et ��������� rempla-cent �"� ������� et �����#.

Page 141: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 129

Définir une interface

Une interface se déclare comme une classe en faisant précéder son identifi-cateur du mot-clé ���� .���.

Un fichier ����� peut contenir plusieurs classes et plusieurs interfaces maisune seule classe ou une seule interface peut être déclarée ��"��� et doit porterle même nom que le fichier. Comme pour les classes, le modificateur d’accès(�� � ���&�)�� d’une interface est soit ��"���, soit absent (friendly). Uneinterface peut dériver d’une ou plusieurs autres interfaces en utilisant le mot-clé �����#.

Chaque déclaration d’interface est suivie d’un bloc entre accolades !� > oùsont définis ses champs et méthodes :• Tous les champs d’une interface sont des constantes dont les modifica-

teurs sont implicitement ��"����������.����.• Toutes les méthodes d’une interface utilisent implicitement des modifi-

cateurs ��"�����"� ��� et sont suivies d’un point-virgule (�).

À RETENIR Interface Java vs interface objet

Les interfaces Java appliquent le principe de distinction entrel’interface et l’implémentation d’un objet en les séparant endeux entités distinctes. Le tableau suivant fait le parallèle entre

les concepts généraux de la programmation objet et leur mise enœuvre en Java avec les interfaces.

Programmation objet Programmation Java avec interfaces

L’interface d’un objet spécifie la liste de ses messages. Une interface Java définit un ensemble de déclarations de méthodes.

L’implémentation d’un objet est la programmation de ses messagesavec ses données et ses traitements.

L’implémentation est la programmation des méthodes d’une classequi implémente une interface, avec ses champs et ses instructions.

Un objet a une interface et une implémentation. Un objet est une instance d’une classe qui implémente une interface.

�����������������������

(�� � ���&�)������� .����G��� .���F��!��))�@*��� ������#���;�������#���*�;�#����))�#���+���� .�������������������G��� .���F��>

3 Déclaration d’une interface.

(�� � ���&�)������� .����G��� .���@� ��������������������������������������#�G��� .���F��!��))�;��������*�;�#������*������ ����))�#���+���� .�������������������G��� .���@� ����>

3 Déclaration d’une interface dérivant d’une super-interface.

CONVENTIONS Nommage des interfaces

L’identificateur d’une interface est une suited’un ou de plusieurs mots en minuscules, dontchaque lettre initiale est en majuscule ; il utiliseparfois un adjectif qualificatif se terminant par�"�� pour exprimer une capacité.

C++ Interface Java

Comme toutes les méthodes d’une interface Javasont implicitement abstraites, une interface peutêtre vue comme l’équivalent d’une classe C++ quine déclare que des méthodes virtuelles pures.

Page 142: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004130

Par l’exemple : donner un prix à un objetL’interface ��������������� ����� montre comment représenter le faitqu’un objet payant a un prix. Ce prix est obtenu ici grâce à la méthode��� ��.

Implémenter une interfaceIl est impossible d’instancier une interface mais par contre, il est possibled’instancier une classe qui implémente une interface. Pour qu’une classeimplémente une interface, il faut faire suivre la déclaration de cette classe dumot-clé ��������� et de l’identificateur de l’interface. Une telle classe peutêtre instanciée uniquement si elle implémente toutes les méthodes de l’inter-face en les définissant dans un bloc entre !�> à la place du point-virgule (�).

EXEMPLE com/eteks/outils/Payant.java�������������������������"�������� .���� �����!

��� �� est implicitement ��"��� et�"� ���.

B ��.�������� ���$(�>

C# implements = :

La liste des interfaces implémentées par une classedoit figurer après le mot-clé ���������, quiremplace en Java le symbole D utilisé en C# pourspécifier la super-classe d’une classe et/ou lesinterfaces implémentées par cette classe.

���������������������

Classe implémentant une interface. B �������F����������������������������G��� .���F��!��))�;��������*�;�#��#�������������F����))��������*����������#���*�;�#��#���V���� .����G��� .���F��>

����%��� ���!��))�;��������*�;�#��#�����������������������%��� ���>

Classe dérivant d’une autre et implémentant uneinterface.

B ����%�����������#�%��� ����������������������������������������������G��� .���F��!��))�;��������*�;�#������*������ ��#����������%��������))��������*����������#���*�;�#��#���V���� .����G��� .���F��>

JAVA Implémentation de plusieurs interfaces

Une classe peut implémenter plusieurs interfaces, qui doivent être séparées par des virgules,mais ne peut hériter que d’une super-classe.

C++ Héritage multiple

L’implémentation de plusieurs interfaces par uneclasse en Java peut être une solution de remplace-ment de l’héritage multiple du C++.

Page 143: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 131

Par l’exemple : implémenter le prix d’un objetL’interface ��������������� ����� et sa méthode ��� �� peuvent êtreimplémentées par les classes ������������������ et ���������������%� ���� définies dans les chapitres précédents en ajoutant à leur déclaration���������, suivi de cette interface.

EXEMPLE com/eteks/outils/Service.java (modifié) EXEMPLE com/eteks/test/Boissons.java (modifié)�����������������������

��"��������%� ��������������� �����!��))������))���� ����������;���*0��������������))�����*������#*�B�����*�;�#����� ��>

������������������������� ����������������� �������������������������� �����!��))������))���� ����������;���*0��������������))�����*������#*�B�����*�;�#����� ��>

ATTENTION Modificateur d’accès d’une méthode redéfinie

En cas de redéfinition, une méthode ne peut être précédée d’un modificateur plus restictif quecelui de la méthode redéfinie, l’ordre du plus restrictif au moins restrictif étant � �����,friendly, � ������# et ��"���. Comme cette règle s’applique aussi aux méthodes provenantd’une interface, n’oubliez pas d’écrire explicitement le modificateur d’accès ��"��� de cesméthodes au moment de les implémenter dans une classe.

REGARD DU DÉVELOPPEUR Interfaces de la bibliothèque Java

La bibliothèque standard Java 1.4 compte plus de 1000interfaces qui sont utilisées pour remplir divers rôles :

• Spécifier la liste des méthodes que doit implémenterune classe pour être utilisable dans un contexte donné.Par exemple, une classe implémente l’interface��������������������������� et la méthode������ � .� ��# pour décrire les instructions à exécuteraprès avoir cliqué sur un bouton Swing.

• Utiliser les méthodes d’une référence de type interfacesans se soucier des détails d’implémentation. Par exem-ple, la référence d’interface ����������G�� ��� ren-voyée par la méthode ��� ��� des classes de collec-tions permet d’énumérer les éléments d’une collectionquelle que soit la collection.

• Faciliter la création de plug-ins ou de drivers dont lesservices sont spécifiés grâce à une ou plusieurs interfa-ces. La séparation entre interfaces et classes laisse la

possibilité à chaque éditeur d’implémenter les interfa-ces du driver dans des classes différentes pour assurer leservice attendu. Par exemple, le paquetage �����<�spécifie un ensemble d’interfaces que les classes d’undriver JDBC doivent implémenter. Chaque éditeur debases de données fournit l’implémentation d’un driverJDBC qui ne s’interface qu’avec son produit. Si un pro-grammeur n’utilise que le paquetage �����<� sans sesoucier des classes d’une implémentation particulièred’un driver JDBC, son application pourra alors êtreadaptée très facilement d’une base de données à uneautre en changeant simplement de driver JDBC.

• Créer des catégories de classes sans lien d’héritage entreelles, grâce à des interfaces qui ne définissent aucuneméthode. Par exemple, l’interface ���������������"��est implémentée par une classe pour indiquer qu’uneinstance de cette classe peut être clonée.

Page 144: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004132

Utilisation des interfacesVoyons maintenant ce qu’il est possible de faire avec une classe qui implé-mente une interface Java.

Conversion de référence, suite et finJava permet de déclarer des références de type interface (par exemple �����������#��) et d’utiliser la relation est un entre une interface et les classesimplémentant une interface (par exemple une ����� est un objet �����, un%� ���� est un objet �����).

Cette relation permet d’opérer des conversions sur une référence pour passerd’un type classe à un type interface, ou inversement. Lors de l’exécution, laJVM vérifie :• Si l’interface de conversion est implémentée par la classe de l’objet réfé-

rencé, quand une conversion de type interface est appliquée à une réfé-rence de type classe (par exemple $ �����(��� ����).

• Si la classe de conversion est effectivement la classe de l’objet référencé,quand une conversion de type classe est appliquée à une référence de typeinterface (par exemple $�����(������#�).

Par l’exemple : boisson ou service, tout se paieL’application de classe ����������������� ���N�.� ���� ����� montreles conversions autorisées et interdites avec une référence de type interface��������������� �����.

EXEMPLE com/eteks/test/ConversionsReferencesPayant.java������������������������� �����������������U����� �������������������� ������������ ���N�.� ���� �����!����"�������������#������$����������%� ����&'�� �(��!

����%� ����� ����,�����%� �����$-@A�66�5����� -0�43�3.(�������������� �����,�����������$-���#+� ����-0�1(���������������������;����,��������������������$���������������������������������������-R;���-0�9�2.0�23(�

����))����� ����#�� *.* �����#����������������))��� ������������� .����

Déclaration d’une référence de type interface B ���� ������������#��

Compilation OK et exécution OK. B ����������#��,�$ �����( ������

Compilation OK et exécution OK. B ����������#��,��;������

Page 145: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 133

Comme les classes ������������������ et ���������������%� ����

implémentent l’interface ��������������� �����, il est possible de : • Convertir explicitement � ou implicitement � une référence de type

classe vers le type interface si la classe de la référence ou une de ses super-classes implémente l’interface de conversion (le repas et le whisky sontpayants). Avec la référence ������#�, on peut appeler la méthode del’interface ��������������� ����� � et les méthodes de la classe�����������"���� (mais pas les méthodes de �������������

��������������, classe effective de l’objet).• Convertir une référence de type classe vers le type interface � si la classe

de l’objet référencé implémente l’interface de conversion. Lors de l’exé-cution, la classe de l’objet référencé implémente bien l’interface������������� �����.

• Convertir une référence de type interface vers une référence de typeclasse � si l’objet référencé est effectivement une instance de cette classe.Lors de l’exécution, l’objet désigné par ������#�1 est bien un objet declasse ������������������.

����������� ����;��?����@�����$����0�- ���#�����������#��D�-�������������������������:�������#����� ���$(�:�-�A�16��-(���

3 Affiche Prix de la commande : 7.4 €.

�����"������"����,���� ����� 3 Toute référence peut être convertie vers la classe�����������"����.

����������#��,�$ �����(�"������ 3 Compilation OK et exécution OK.

����������#��,�$ �����(�����"�����$(���

����))����� ����#�� *.* �����#����������� .��������))��� ������������������ ������������#�1�,���� �����

3 Compilation OK mais erreur à l’exécution provo-quant une exception ��������������M��������.

����������"�����,�$�����(������#�1��� 3 Compilation OK et exécution OK.

����%� ������ �����,�$%� ����(������#�1�����>>

3 Compilation OK mais erreur à l’exécution provoquant une exception ��������������M��������.

À RETENIR Référence de type interface

Une référence de type interface désigne un objet dont la classe implémente cette interfaceou est égale à ����. Une telle référence peut être utilisée des façons suivantes :• Elle permet d’appeler n’importe quelle méthode de son interface et de la classe�����������"����.

• L’objet qu’elle désigne peut être stocké dans un tableau du même type.• Elle peut être convertie en une référence de classe �����������"���� pour stocker

l’objet qu’elle désigne dans une collection de la bibliothèque Java.• Elle peut être convertie dans la classe de l’objet qu’elle désigne pour appeler n’importe

quelle méthode de cette classe.

JAVA Opérateur instanceof

L’opérateur ��������. peut servir aussi à véri-fier qu’un objet est une instance d’une classe quiimplémente (directement ou par héritage) uneinterface donnée.Par exemple, l’expression ��� �������������.���������������� ����� est égale à � ��.En fait, l’expression �+, ��������. ���� ren-voie � �� si �+, est différent de ���� et si la con-version (����)�+, est acceptée à l’exécution, que���� soit une classe ou une interface.

C# instanceof ≈ is

L’équivalent de l’opérateur � de C# est��������. en Java, mais cet opérateur ne peutservir en Java qu’à tester le type d’un objet.

Page 146: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004134

En revanche, il n’est pas possible de :• Convertir une référence de type classe vers le type interface � si la classe

de l’objet référencé n’implémente pas l’interface de conversion. Lors del’exécution, l’objet n’implémente pas l’interface ������������� �����.

• Convertir une référence de type interface vers une référence de typeclasse � si l’objet référencé n’est pas effectivement une instance de cetteclasse. Lors de l’exécution, l’objet désigné par ������#�1 n’est pas unobjet de classe ���������������%� ����.

Par l’exemple : l’addition s’il vous plaît !Sachant qu’un produit payant a un prix, la classe ���������������

F�����@���� montre qu’il est possible de mémoriser un ensemble d’objetspayants dans une collection et d’en calculer le prix total.

JAVA 5.0 Interface de constantes

Les constantes déclarées dans une interface sont plus pratiques à utiliser que si elles sontdéclarées dans une classe : il suffit qu’une classe implémente une telle interface pour lesutiliser directement sans les préfixer par leur interface (comme si elle héritait de ces cons-tantes). Par exemple, les constantes de l’interface ��������������� �� ���suivante :

�������������������������"�������� .����������� �� ���!��))�@*��� ������#����������������� NG�NGFMO?�T����,�46�������� NG�NGFMO?GP����,�6�������� NG�NGFMO@MQ�SF�,�3�>

sont utilisables directement dans la classe suivante :

���������������������������F��;������������������� �� ���!��� ����������� �� ����,� NG�NGFMO@MQ�SF���))���>

Cette fonctionnalité des interfaces est utilisée par certaines interfaces de la bibliothèqueJava : observez par exemple le nombre impressionnant de classes qui implémentent l’inter-face �����������%���������� en consultant sa javadoc. Mais cette pratique estdécouragée car une interface a pour but essentiel de définir les méthodes du service qu’ellereprésente. Les possibilités dans Java 5.0 d’importer les champs ����� d’une classe oud’utiliser des énumérations (voir la fin du chapitre 5) permettent d’obtenir la même simpli-fication plus « proprement ».

Page 147: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 135

La classe ���������������F�����@���� enregistre un ensemble d’objetscommandés, ajoutés ligne après ligne. Comme chaque commande doitimplémenter l’interface ��������������� �����, il est possible d’obtenir leprix total de ces commandes en ajoutant leur prix.

L’application suivante crée un ticket de caisse �, y ajoute un ensemble delignes de commandes � et affiche le total du ticket �.

EXEMPLE com/eteks/outils/TicketDeCaisse.java��������������������������� ������������� ������)UU�U������*�� ������������"���#��������#��B����� ��U)��"��������F�����@����!��� ������� ������������,������ ������$(���)UU���U������������������#��������#��B��������������U)����"�������#������� ������$ �����������(��!

�����;���������##$�����(���>��)UU���U�N���������������#��� ���#��������#��#���������������U)����"����.�������� ��F�����$(��!����.������ ���,�6�����.� �$������,�6����8��;���������C�$(���::(����!

3 Ajoute l’objet ����� à la collection �����.

������ ������������,�$ �����(�;������������$�(�������� ���:,���������� ��$(�����>���� ��� ��� �����>>

3 Conversion de la référence de classe �"���� àl’indice �, en référence de type �����.

EXEMPLE com/eteks/test/CalculPrixTotal.java������������������������� �����������������U����� �������������������� ������������� ��F����!

����"�������������#�����$%� ���&'�� �(��!

JAVA 5.0 Généricité et interface

Abordée à la fin du chapitre précédent, lagénéricité laisse le choix au programmeur despécifier une classe ou une interface commetype des éléments stockés dans une collec-tion. Avec Java 5.0, la variable �����ci-contre peut donc être déclarée ainsi :

� �����8 �����=�������,������� �����8 �����=�$(�

ce qui permet de simplifier la boucle .� dela méthode ��� ��F���� ainsi :

.� �$ ������������D������(��� ���:,���������� ��$(�

������������� �����,�����������$-���#V� ����-0�1(������������;����,��������������������$-R;���-0�9�2.0�23(�����%� ����� �����,�����%� �����$-@A�66���� -0�11�3.(�

3 Création d’objets payants.

Page 148: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004136

Remarquez au passage que même si les classes ����� et %� ���� n’ont pasde lien d’héritage entre elles, l’interface ����� permet de montrer qu’ellesont une caractéristique commune – en l’occurrence la méthode ��� ��.C’est l’un des avantages offerts par les interfaces Java : elles permettent despécifier les méthodes disponibles dans une classe sans imposer de liend’héritage avec une autre classe.

Implémenter l’interface java.lang.Comparable pour comparer deux objetsUne classe implémente l’unique méthode ��������� �F��$�����������"�����"�( de l’interface �������������� �"�� pour comparer un objet de cetteclasse avec un autre. À la différence de la méthode �<���, cette méthodedoit renvoyer une valeur entière établissant un ordre entre l’objet courantdésigné par �;� et l’objet en paramètre :• Si l’objet courant et l’objet comparé sont égaux, la valeur renvoyée doit être 0.• Si l’objet courant est plus petit, la valeur renvoyée doit être négative.• Si l’objet courant est plus grand, la valeur renvoyée doit être positive.

Par l’exemple : gérer l’ordre chronologique d’événementsLa classe ���������������M������������# �� mémorise la date et la des-cription d’un événement de calendrier. Cette classe implémente l’interface�������������� �"�� pour trier un ensemble d’événements dans l’ordrechronologique puis dans l’ordre alphabétique des descriptions pour des évé-nements de même date.

Création d’une instance de ���������������F�����@���� pour calculer letotal.

B ����F�����@������������,�����F�����@�����$(�������������������� ������$��� ����(�������������������� ������$�;���(������������������ ������$ ���(������������������ ������$ ���(�Interrogation du prix total du ticket calculé en

fonction des lignes ajoutées.B ����.������ ��F�����,����������� ��F����$(�

Affiche Total : 54.4 €. B ����������� ����;��?����@�����$����0��������-F�����D�-�:�� ��F�����:�-�A�16��-(�������%����������$6(���>>

EXEMPLE com/eteks/outils/EvenementCalendrier.java��������������������������� ������������@�������� ������������@���Q� ����

)UU��U�����#+�������������������#�����������#�� ���������U)

API JAVA Classes d’objets comparables

Les méthodes de tri de la bibliothèque Java trientdans l’ordre croissant un ensemble d’objets quiimplémentent l’interface �������������� �"��en appelant la méthode ����� �F� implémentéepar ces objets. De nombreuses classes implémentent cette inter-face comme les classes d’emballage numériques����������G����� , ����������@��"��...mais aussi les classes ����������%� ���,����������@���, ��������;����@������...Par exemple, ����� �F� est appelée par laméthode � � de ����������� �� pour trierdans l’ordre alphabétique les arguments de l’appli-cation de classe �������������F �?��,abordée au chapitre précédent.

Page 149: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 137

��"��������M������������# �� ��������������� �"��!��� ������@������#������� ������%� ����#�� �������

3 La classe M������������# �� implémentel’interface �������������� �"��.

��� ������������@���Q� ����.� ����,�������������@���Q� �������@���F���G������$@���Q� ����QS��0�������������������������������������������@���Q� ����%E�NF(�

3 Instanciation d’un objet de classe ����������@���Q� ��� utilisé pour la mise en forme dedates.

����"����M������������# �� �$@����#���0�%� ����#�� ������(��!�����;��#�����������,�#���������;��#�� �������,�#�� ���������>����"����@�������@����$(��!���� ��� ���;��#������>����"����%� �������@�� �������$(��!���� ��� ���;��#�� ���������>

����"������������� �F��$�"������"�(����!����M������������# �� �����������,�$M������������# �� (�"��

3 Implémentation de la méthode ����� �F� del’interface �������������� �"��.

����������� �@����,��;��#��������� �F��$����������#���(������.�$��� �@����/,�6(������ ��� ����� �@����

3 Utilisation de la comparaison de la classe����������@��� pour procéder à une compa-raison dans l’ordre chronologique.

�������������� ��� ���;��#�� ������������ �F�G��� ������������������������$����������#�� ������(���>

3 Si les dates des événements sont égales, la com-paraison s’effectue sur les descriptions sans tenircompte de la casse.

����"����"��������<����$�"������"�(����!�����.�$�"����������.�M������������# �� (����!������M������������# �� �����������,�$M������������# �� (�"�������� ��� ���;��#�����<����$����������#���(���������������WW��;��#�� ��������<���G��� ��������������������$����������#�� ������(�������>������������� ��� ��.������>

3 Redéfinition de la méthode �<��� de la classe�����������"����. Deux événements sontégaux s’ils ont la même date et la même descrip-tion.

����"��������;�;�#��$(����!���� ��� ���;��#����;�;�#�$(�:��;��#�� �������;�;�#�$(���>

3 Redéfinition de la méthode ;�;�#� de laclasse �����������"����.

����"����%� ������%� ����$(��!���� ��� ��.� ����.� ����$�;��#���(�:�-�D�-�:��;��#�� ���������>>

3 Redéfinition de la méthode ��%� ��� de laclasse �����������"����, pour renvoyer untexte de la forme date hh:mm : description.

Page 150: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004138

Cette classe redéfinit la méthode �<��� � en considérant que deux objetsde classe M������������# �� sont égaux s’ils ont la même date � et lamême description �. Pour tenir compte de cette relation d’égalité, laméthode ;�;�#� � est redéfinie en renvoyant le même code si deux événe-ments de calendrier sont égaux. La méthode ����� �F� � tient compte del’ordre chronologique entre deux événements et de l’ordre alphabétique deleur description en faisant appel aux méthodes ����� �F� de la classe����������@���, puis ����� �F�G��� ��� de la classe ����������%� ��� pourobtenir cet ordre.L’application de classe �����������������#� présentée dans la section sui-vante opère un tri chronologique sur des événements.

Énumérer les éléments d’une collection avec l’interface java.util.IteratorCette interface permet d’énumérer les éléments d’une collection. Une réfé-rence de ce type est renvoyée par la méthode ��� ��� des classes����������� �����, ���������������#���, ����������E�;%�� et ����������F ��%��. Elle compte les trois méthodes suivantes :

On utilise de façon typique les méthodes ;�P��� et ���� dans une boucle�;��� ou .� de la forme :

À RETENIR Type du paramètre de compareTo

Comme pour la méthode �<���, le paramètre de la méthode ����� �F� est une réfé-rence de type �����������"����, ce qui permet aux fonctionnalités de tri de la bibliothè-que Java de traiter tout ensemble d’objets comparables, quelle que soit leur classe. Notezqu’il n’est pas habituel de tester dans l’implémentation de ����� �F� la classe duparamètre : il est normal de renvoyer .��� pour �<��� si l’objet en paramètre n’est pasde la même classe (un événement n’est pas égal à une date par exemple) ; mais que pour-rait renvoyer ����� �F� si l’objet en paramètre n’est pas un événement du calendrier ? Cecas de figure peut arriver dans la situation anormale où un tri est effectué sur un ensembled’objets de classes différentes. Cette erreur se traduira ici par le déclenchement d’uneexception ��������������M�������� qui permettra au programmeur de repéreret corriger son erreur, sujet abordé au prochain chapitre.

��"����"�������;�P���$(��"���������������"���������$(��"�������#� �����$(

API JAVA Interface java.util.Enumeration

L’interface ����������G�� ��� décrite ici estapparue avec les classes de collection de Java 1.2.Vous pourrez rencontrer aussi l’interface����������M���� ����� datant de Java 1.0,qui s’utilise avec les classes ��������������� et ����������E�;��"��. Ses méthodes;�?� �M������ et ����M������ ont exac-tement le même rôle que les méthodes ;�P���et ���� de l’interface G�� ��� .

����������G�� ��� ����,��%%�� ������ ��� $(�

Tant qu’il y a encore des éléments à énumérer... B �;����$���;�P���$((!

...donne-moi le suivant dans l’énumération. B ���"������"��,��������$(���))�F ���������������+�"�����"��>

Page 151: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 139

Par l’exemple : trier les événements d’un agenda dans l’ordre chronologiqueVoyons comment utiliser la classe ����������F ��%�� pour trier et énumérerdes objets implémentant l’interface �������������� �"��.L’application de classe �����������������#� affiche dans l’ordre chronolo-gique les trois événements � � � d’un agenda. Les événements de classe���������������M������������# �� sont mémorisés dans cet ordre grâceà une collection de classe ����������F ��%�� �. La boucle �;��� � construitle texte affiché en concaténant � ligne après ligne le texte renvoyé par laméthode ��%� ��� de chaque événement.

EXEMPLE com/eteks/test/Agenda.java������������������������� �����������������M������������# �� ����� ������������U�

Figure 7–1 Application �����������������#�

��������#�!����"�������������#�����$%� ���&'�� �(��!

����F ��%�������#��,�����F ��%���$(�����������#���##�$����M������������# �� �$����I ��� �������#� �$����������16620�I ��� �������#� ��F��MN0�45(����F���$(0�����������-������ �� ����� �-((�����������#���##�$����M������������# �� �$����I ��� �������#� �$��������16620�I ��� �������#� �%M FM?�MN0�40�X0�76(����F���$(0��������-N��� A�66�5������� �-((�����������#���##�$����M������������# �� �$����I ��� �������#� �$��������16620�I ��� �������#� �%M FM?�MN0�40�X0�76(����F���$(0���������-�� �����-((���

3 Création d’un agenda trié avec trois événe-ments, dont deux sont à la même date.

����%� ��������������,�--�

����G�� ��� ����,�����#����� ��� $(������;����$���;�P���$((��

3 Énumération des événements en utilisant un ité-rateur.

����������������:,��������$(�:�-A�-������������������������� ����;��?����@������$����0����������(�����%����������$6(���>>

3 L’événement est converti en texte avec��%� ���.

JAVA Enumération avec for

L’instruction .� est souvent utilisée à la place de l’instruction �;��� pour programmer uneénumération. Ici, les instructions :G�� ��� ����,�����#����� ��� $(��;����$���;�P���$((�������������:,��������$(�:�-A�-�

peuvent s’écrire ainsi :.� �$G�� ��� ����,�����#����� ��� $(�����;�P���$(��(�������������:,��������$(�:�-A�-�

la troisième expression du .� étant alors vide.

Page 152: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004140

JAVA 5.0 Énumération et boucle itérative

Les boucles itératives disponibles avec Java 5.0 permettent de simplifier l’énumération decette application ainsi :

.� �$�"���������������D�����#�(�������������:,�����������:�-A�-�

Dans cette boucle itérative, le type �"���� de la variable locale ��������� suffit pourfaire appel implicitement à la méthode ��%� ��� redéfinie dans la classe���������������M������������# �� .En faisant appel à la généricité de Java 5.0, vous pouvez aussi préciser la classe des objetsstockés dans l’ensemble ����#� �, en déclarant cette variable ainsi :

F ��%��8M������������# �� =�����#��,������F ��%��8M������������# �� �=$(�

Le type d’objet énuméré dans la boucle itérative précédente peut alors être précisé ainsi :

.� �$M������������# �� �����������D�����#�(������������:,�����������:�-A�-�

REGARD DU DÉVELOPPEUR Comparaison homogène des objets

La classe ����������F ��%�� fait appel à la méthode ����� �F� pour détermi-ner si un objet est déjà présent dans l’ensemble ����#� et pour trier cetensemble. L’application fonctionnera donc parfaitement si les méthodes�<��� et ;�;�#� sont omises dans la classe���������������M������������# �� . �<��� et ;�;�#� ne sont utiliséesensemble que si l’ensemble ����#� est de classe ����������E�;%�� ; il estnéanmoins conseillé de les implémenter pour qu’un autre programme, ayantrecours à une classe de collection différente de ����������F ��%�� pour gérerdes événements de calendrier, puisse fonctionner correctement sans avoir àmodifier la classe M������������# �� .D’après cet exemple, vous pouvez vous apercevoir que la conception d’uneclasse n’est pas toujours aisée : faut-il systématiquement redéfinir �<��� et;�;�#� et/ou implémenter l’interface ���� �"�� dans une classe, alors quevous n’aurez pas besoin de certaines des fonctionnalités des classes de collec-tions qui y font appel ? Sans vous pousser à concevoir des classes réutilisablesdans tous les domaines, voici quelques règles qui vous aideront à maintenirl’homogénéité de chacune de vos classes pour les opérations de comparaison :

• Si vous redéfinissez la méthode �<��� dans une classe, redéfinissez-y aussila méthode ;�;�#�.

• Si vous implémentez l’interface �������������� �"�� dans une classe,redéfinissez-y en conséquence les méthodes �<��� et ;�;�#�. Program-mez les méthodes �<��� et ����� �F� de telle façon que deux objets com-parés avec ces méthodes soient égaux dans les mêmes conditions. D’après laclasse M������������# �� , remarquez que la programmation qui endécoule est assez différente dans ces méthodes.

C# Boucle itérative = foreach

Les boucles itératives ajoutées à Java 5.0 sontl’équivalent des boucles .� ���; de C#, le mot-clé �� étant remplacé en Java par le symbole D.

Page 153: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 141

Encapsuler pour protéger le type des objets d’une collectionToutes les classes de collection mémorisent des références de classe�����������"����, ce qui permet de stocker des éléments de n’importe quelleclasse dans une même collection. Cette caractéristique autorise le mélange,dans un même ensemble, des objets de classes sans aucun lien, ce qui peutcacher des erreurs de logique. Pour éviter ce genre d’erreur, la solution la plussimple est d’encapsuler la collection dans une classe dédiée à un ensembled’objets d’un type donné, ce que font les classes ���������������

F�����@���� et ���������.� ���M���"��S�������� Q� ��.

Forum : gérer un ensemble d’utilisateursLa classe ���������.� ���M���"��S�������� Q� �� qui suit encapsule unecollection de classe ����������E�;%�� pour gérer l’ensemble des utilisateursqui participent à un même moment au module de messagerie instantanée duforum (chat).

Figure 7–2 Diagramme UML de la classe ���������.� ���M���"��S�������� Q� ��

JAVA 5.0 Généricité

En permettant de spécifier la classe des objetsgérés par une collection, la généricité prise encharge dans Java 5.0 est une solution élégantepour créer des ensembles où ne pourront êtreajoutés que des objets de cette classe ou de sessous-classes.

- utilisateurs : HashSet

+ ajouter(utilisateur : Utilisateur) + supprimer(utilisateur : Utilisateur) + contient(utilisateur : Utilisateur) : boolean + iterator() : Iterator

EnsembleUtilisateursForum

com.eteks.forum

FORUM com/eteks/forum/EnsembleUtilisateursForum.java�����������������.� ������� ������������U�)UU�U�M���"���#+��������� �#��.� ������#���;����U)��"��������M���"��S�������� Q� ��!

��� ������E�;%������������ �,�����E�;%���$(��� 3 Création d’une collection de classe����������E�;%��.

����"�������#������� �$S�������� ���������� (����!�����.�$��������� �/,�����(�������;����������� ��##�$��������� (���>

3 Ajoute un utilisateur à cet ensemble.

Page 154: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004142

La classe ���������.� ���M���"��S�������� Q� �� délègue la gestion del’ensemble des utilisateurs à la collection ��������� �. Le choix de laclasse ����������E�;%�� garantit que chaque utilisateur ne sera présentqu’une fois dans cet ensemble, même si plusieurs ajouts du même utilisateursont tentés. Comme la classe M���"��S�������� Q� �� ne doit manipulerque des utilisateurs, le paramètre des méthodes ������ �, ��� ��� � et�������� � est de type ���������.� ���S�������� et la méthode��� ��� � permet de les énumérer. L’implémentation de ces méthodes nefait qu’appeler les méthodes similaires de la collection ��������� .

Manipuler les collections avec la classe java.util.CollectionsLa classe ������������������� (à ne pas confondre avec l’interface�������������������) contient un ensemble de méthodes de classe utilespour les classes de collection :• ��� et ��� renvoient l’élément le plus petit ou le plus grand d’une collection.• Les méthodes préfixées par ����#�.��"�� renvoient une instance de la

collection dont l’ensemble des éléments ne peut être modifié.

Supprime un utilisateur de cet ensemble. B ����"�������#���� ��� �$S�������� ���������� (����!�����;����������� � �����$��������� (���>

Renvoie � �� si l’utilisateur en paramètreappartient à cet ensemble.

B ����"����"����������������$S�������� ���������� (����!���� ��� ���;����������� ��������$��������� (���>

Renvoie un itérateur pour permettre d’énumérerles utilisateurs de cet ensemble.

B ����"����G�� ��� ���� ��� �$(����!���� ��� ���;����������� ���� ��� $(���>>

POUR ALLER PLUS LOIN Ensemble trié dans l’ordre alphabétique

En l’état, la classe ���������.� ���M���"��S�������� Q� �� mémorise unensemble d’utilisateurs dans un ordre indéterminé. Pour que cet ensemble soit trié dansl’ordre alphabétique des pseudonymes des utilisateurs, remplacez tout d’abord la classe����������E�;%�� � par ����������F ��%��. Ensuite, pour assurer le tri des utilisa-teurs, vous aurez le choix entre :• implémenter l’interface �������������� �"�� dans la classe ���������.� ���S�������� ;

• ou créer une classe qui implémente l’interface �������������� ��� et passer uneinstance de cette classe au constructeur de la classe F ��%��. La méthode��� ����� �$�"���� �"�40 �"���� �"�1( de cette interface sera implémentéepour comparer deux à deux les utilisateurs reçus en paramètres.

Page 155: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 143

• Les méthodes préfixées par ���; ���C�# renvoient une instance de lacollection dont l’accès aux éléments est synchronisé quand elle est utiliséedans plusieurs tâches ou threads simultanément.

• Les méthodes suivantes s’appliquent aux classes implémentant l’interface������������� telles que les classes ����������� ����� et ���������������#��� :– .��� et ��������� remplacent les éléments d’une collection par une

référence donnée.– ���� effectue une copie des éléments d’une collection dans une autre.– ;�..�� mélange les éléments d’une collection dans un ordre aléatoire.– ��� permute les positions de deux éléments d’une collection.– � � trie les éléments d’une collection dans l’ordre ascendant.– "��� �%�� �; renvoie l’indice du premier élément égal à un objet dans

une collection triée.

C++ java.util.Collections ≈ algorithm

Les méthodes ����� de la classe������������������� correspondent auxfonctions du header C++ ���� ��;�.

API JAVA Interfaces de collection

La hiérarchie des classes de collection du paquetage ���������est basée sur un ensemble d’interfaces et de classes squelettes. Lediagramme de classes de la figure 7-3 présente les interfaces fonda-mentales implémentées par les classes de collection étudiées danscet ouvrage (les lignes pleines y représentent un lien d’héritage etles lignes pointillées un lien d’implémentation entre une classe etune interface).

Comprendre cette organisation est fondamental pour utiliser laclasse �������������������. En effet, les paramètres et lesvaleurs de retour des méthodes de cette classe ont pour type l’unedes interfaces �������������������, �������������,����������%��, ����������?��... La possibilité d’utiliser telleou telle méthode de la classe ��������� s’effectue donc enfonction des interfaces implémentées par chaque classe de collec-tion. Par exemple, vous pouvez passer en paramètre à la méthode.��� une instance de � ����� ou de �����#��� puisque cetteméthode requiert en paramètre une collection de type�������������.

Figure 7–3 Hiérarchie des interfaces et des classes de collection

Collection

List

Set

Map HashMap

ArrayList

HashSet

TreeSet

TreeMap

LinkedList

SortedSet

SortedMap

Page 156: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004144

Par l’exemple : quels numéros mettre dans ma grille de loto aujourd’hui ?La méthode de classe � �� F� ��� de la classe ������������������� qui suitsimule le tirage du loto en mélangeant aléatoirement une collection d’entiersreprésentant les 49 boules du loto, dont les 6 premiers sont renvoyés.Comme il n’existe pas de moyen simple de mélanger les éléments d’untableau d’entiers, on fait plutôt appel à la méthode ;�..�� � de la classe������������������� pour mélanger une collection de classe����������� ����� � qui contient 49 instances de ����������G����� �. Ilest en effet possible de passer une instance de la classe ����������� �����en paramètre à la méthode ;�..��, car cette classe implémente l’interface������������� requise comme type de paramètre. Le tirage final s’obtienten créant une sous-liste des 6 premiers éléments de la collection grâce à saméthode �"��� �. Cette méthode a pour type de retour l’interface������������� indiquant qu’elle renvoie une collection dont la classe implé-mente cette interface. Les nombreuses méthodes de ������������� sontsuffisantes pour manipuler la sous-liste renvoyée, ce qui permet de choisircette interface comme type de retour de la méthode � �� F� ���.

L’application suivante affiche dans une grille de loto les 6 numéros tirés aléa-toirement par la méthode � �� F� ��� � de la classe �������������������.La présentation sous forme de grille est obtenue en mettant à profit la mise enforme HTML utilisée par la méthode ;��?����@����� , quand un textedébutant par la balise 8;���= � lui est passé en paramètre.

EXEMPLE com/eteks/outils/Loto.java��������������������������� ������������U���"������������!��)UU���U�N����������������#��Y����" ���� ��������� ������#�����U��������"���#�����" ������ ����� ��4����25����U)����"��������������� �� F� ����$(��!

ASTUCE Optimisation de la classe java.util.ArrayList

Les instructions nécessaires à l’agrandissementdu tableau interne d’une instance de����������� ����� sont relativementcoûteuses en temps. Pour éviter de faire appel àces opérations chaque fois qu’un élément y estajouté, cette classe utilise en fait un tableaud’une capacité au moins égale au nombre d’élé-ments effectivement stockés, ce qui permet dene l’agrandir que lorsque c’est nécessaire. Lesméthodes ��� �������� et � ��F�%�C�de la classe � ����� vous permettent d’uti-liser de façon optimale cette capacité, ainsi queson constructeur prenant en paramètre la capa-cité initiale voulue. Comme on sait que la col-lection "�������� contiendra au moins49 objets, la méthode � �� F� ��� utilise icicette optimisation à la création de la collection"�������� �.

Création d’une collection des 49 entiers de1 à 49.

B ����� ������"���������,������ ������$25(�������.� �$������,�4����8,�25���::(������"����������##�$����G����� �$�((���

Mélange aléatoire de la collection"��������.

B ��������������;�..��$"��������(���

Extraction des 6 premiers entiers de la collectiondans une sous-liste.

B ���� ��� ��"����������"���$60�Y(�����>>

Page 157: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 145

Cette grille est construite à l’aide d’un tableau HTML � de 10 lignes � par5 colonnes et le nombre de chaque cellule est affiché en gras � s’il appar-tient au tirage ou sinon, en gris �.

EXEMPLE com/eteks/test/GrilleLoto.java������������������������� �������������������������� �������������������� �������������������� ������"��������I ��������!����"�������������#������$%� ���&'�� �(��!

Figure 7–4 Application �������������I ��������

B.A.-BA Tableau HTML

Un tableau HTML est construit avec les trois balises8��"��=, 8� = et 8�#= imbriquées les unes dans lesautres pour décrire ligne par ligne le texte de chaquecellule. Par exemple, le tableau ci-contre est codé enHTML comme ceci :8��"���"� #� ,-4-=��8� =�8�#=�8)�#=�8�#=�8)�#=�8)� =��8� =�8�#=48)�#=�8�#=18)�#=�8)� =��8� =�8�#=78)�#=�8�#=28)�#=�8)� =8��"��=Par défaut, les tableaux sont dessinés sans bord, d’oùl’attribut "� #� �ajouté ici à la balise 8��"��=.

���������� ��������,������� �� F� ����$(��� 3 Obtention d’un tirage de 6 nombres.

����%� ����� ���������,�-8;���=8��"���"� #� ,V4V=-�������.� �$����������,�6��������8�46�������::(������!

3 Construction d’un tableau HTML (balise8��"��=) qui représente une grille de loto.

������� ���������:,�-8� =-�������.� �$������������,�6����������8�3���������::(�������!������������"�����,�������:�$��������U�46(�

3 Ajout d’une ligne au tableau HTML(balise 8� =).

��������� ���������:,�-8�#=8.�����C�,V:1V=-����������.�$"�����=�6(

3 Ajout d’une cellule à la ligne (balise 8�#=), dontle texte est agrandi.

�����������.�$�� ����������������$����G����� �$"����(((�������������� ���������:,�-8"=-�:�"�����:�-8)"=-����������������

3 Si la boule appartient au tirage, le nombre estaffiché en gras.

������������� ���������:,�-8.�������� ,V� ��V=-�:�"�������������������������������:�-8).���=-���

3 Sinon, le nombre est affiché en gris.

��������� ���������:,�-8).���=8)�#=-�������>

3 Fin de la cellule (balise 8)�#=(�

������� ���������:,�-8)� =-�����>

3 Fin de la ligne (balise 8)� =(�

Page 158: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004146

La méthode ������� est appelée ici sur la collection �� ������� pourvérifier si un nombre appartient au tirage. Cette méthode compare l’objetpassé en paramètre avec les objets d’une collection grâce à leur méthode�<���, ce qui permet de lui passer un objet temporaire de classe����������G����� (cette classe redéfinit �<��� en comparant l’entiermémorisé par une instance avec celui d’une autre instance de sa classe).

Fin du tableau (balise 8)��"��=). B ����� ���������:,�-8)��"��=8);���=-�

Affichage du tableau HTML dans une boîte dedialogue de titre %��� et sans icône.

B ����������� ����;��?����@������$����0�� ��������0����������������������-����-0�������� ���� ��GPO?M%%�IM(�� ����%����������$6(���>>

JAVA 5.0 Autoboxing et généricité

La fonctionnalité d’autoboxing ajoutée à Java 5.0 permet de simplifier la création des objetsde classe ��������������� � de cet exemple, en évitant d’écrire explicitementl’appel à �� ������. Ainsi, l’instruction � :

����������������� �����������

peut s’écrire tout simplement :

������������������

De même, l’expression :

������������������� ��������������

peut être remplacée par :

�����������������������

La généricité introduite avec Java 5.0 permet aussi de préciser la classe des objets stockéspar une interface de collection. La méthode ����������� peut donc spécifier qu’elle ren-verra une liste d’entiers en l’écrivant ainsi :

������������������������������������������� ���������������������!��� ����� ������������"#����$���������!�%�����!�"#���&&�������������������������'�����������(�$$����������������������������������������)*�+��,

Page 159: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

7 –

Abst

ract

ion

et in

terfa

ce

© Groupe Eyrolles, 2004 147

REGARD DU DÉVELOPPEUR C# versus Java

Globalement, on peut voir le langage C# comme uneévolution du langage Java, qui apporte quelques nuan-ces « esthétiques » sur certains mots-clés (comme pour���� en C# équivalent de ����� en Java) et quelquesdifférences de syntaxe décrites tout au long de cetouvrage. Toutefois, la comparaison dans le détail deces deux langages donne aussi l’impression que les con-cepteurs de C# ont fait beaucoup de concessions auxdéveloppeurs C++, au risque probable de rendre unprogramme C# plus complexe à maintenir et moinsrobuste. Voici quelques-unes des fonctionnalités de C#qui resteront longtemps sujettes à caution en Java :• Dans le mode ����$� (non sûr) du C#, vous pouvez

manipuler des pointeurs avec tous les risques inhé-rents, et contrôler la gestion de la mémoire grâce à$�-�� et ���.�����.

• C# vous laisse le choix d’utiliser ou non le polymor-phisme sur une méthode grâce aux mots-clés ������et ��������.

• C# permet de surcharger les opérateurs & / 0 1 && //2 3 4 5 6 7 �� �� et l’opérateur de cast. Même si cettefonctionnalité est intéressante pour simplifier la pro-grammation des calculs sur les nombres complexes etdu calcul matriciel, elle n’est pas apparue en Javapour éviter toute confusion que peut entraîner unemauvaise utilisation de cette fonctionnalité.

• Il est possible en C# de créer des synonymes d’uneclasse ou d’un espace de noms avec le mot-clé �����.

• C# permet de passer des arguments par valeur ou parréférence grâce aux mots-clés ��$ et ��.

• C# vous laisse une liberté totale d’organisation desfichiers source.

Pour un développeur Java, l’existence du« concurrent » C# a néanmoins un double intérêt :d’abord, elle prouve à ceux qui en douteraient encoreque Sun Microsystems a fait les bons choix lors de laconception de Java puisque Microsoft a repris lesgrands principes de Java dans C# (machine virtuelle,ramasse-miettes, langage objet fortement typé prochedu C++).

Ensuite, l’existence de C# a provoqué une réactionpositive des concepteurs de Java puisque ceux-ci ontdécidé d’intégrer dans Java 5.0 certaines fonctionnali-tés très demandées et intégrées au C#, parmilesquelles :

• les énumérations de constantes avec ���8 ;

• �8���� ���� pour éviter d’écrire systématique-ment l’identificateur d’une classe devant l’un de sesmembres ���� ;

• les listes d’arguments variables ;

• l’autoboxing pour faciliter la création d’une ins-tance de classe d’emballage à partir d’une valeur detype primitif ;

• la généricité et les boucles itératives pour simplifierla gestion des éléments d’un tableau ou d’unecollection ;

• la possibilité d’ajouter des métadonnées (metadata)ou des annotations à une classe.

Finalement, n’oubliez pas que C# et Java ne se résumentpas à des langages, car ils sont indissociables de leur trèsriche bibliothèque, indispensable pour le développe-ment d’une application. À peu de choses près, vousretrouverez dans la bibliothèque .NET de C# commedans la bibliothèque Java, des classes qui assurent lesmêmes fonctionnalités, mais la plupart du temps sousdes noms différents.

Page 160: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004148

En résumé…Ce chapitre vous a montré les possibilités des classes abstraites et des inter-faces Java. Retenez avant tout l’attitude à adopter en présence d’uneméthode de la bibliothèque Java qui manipule une interface Java :• Si la méthode renvoie un objet de type interface (comme ������ qui

renvoie un objet de type �������������� ou ������ qui renvoie unobjet de type ������������), utilisez les méthodes de cette interfacecomme si elles étaient celles d’une classe.

• Si la méthode prend en paramètre un objet de type interface (comme laméthode ��������������� abordée dans le chapitre 10 consacré àSwing), vous devez utiliser ou créer une classe qui implémente l’interfacerequise et ses méthodes puis lui passer en paramètre une instance de cetteclasse.

À mesure que vous utiliserez les classes abstraites et les interfaces de labibliothèque Java, vous en comprendrez mieux l’intérêt et les mécanismes.Vous pourrez alors envisager de créer vos propres interfaces.

Page 161: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

8Gestion des erreurs avec les exceptions

SOMMAIRE

B Pile d’exécution

B Intercepter une exception

B Déclencher une exception

B Exceptions contrôlées /non contrôlées

B Gérer une exception contrôlée

MOTS-CLÉS

B tryB catchB throwB finallyB throwsB ThrowableB RuntimeExceptionB ErrorB ExceptionB printStackTraceB réflexion

Les exceptions permettent de séparer la logique d’un traitement des erreurs qu’il peut générer. À l’usage, vous découvrirez que l’intégration des exceptions à Java facilite la mise au point de vosprogrammes, notamment grâce à leur diagnostic.

package com.eteks.test;

import javax.swing.JOptionPane;

class CalculFactorielle { public static void main (String [] args) {

try { String s = JOptionPane.showInputDialog("Entrez un nombre :"); long n = Long.parseLong (s); long factN = Calcul.factorielle (n); JOptionPane.showMessageDialog (null, n + "! = " + factN); }

catch (NumberFormatException ex) { JOptionPane.showMessageDialog (null, ex.getMessage () + " n'est pas un entier"); }

catch (IllegalArgumentException ex) { JOptionPane.showMessageDialog (null, ex.getMessage ()); } } }

Page 162: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004150

La gestion des erreurs et leur détection sont gérées en Java avec des objetsspéciaux appelés exceptions. Les exceptions sont utilisées systématiquementen Java autant par la JVM pour vous signaler clairement les erreurs et lesbogues que vous avez oubliés de traiter, que pour créer des programmes dequalité prenant en compte les erreurs dues, par exemple, à des problèmesd’accès aux fichiers ou au réseau.

La pile d’exécution, organisation et fonctionnementDans un programme Java, l’organisation en mémoire des données manipu-lées varie selon la catégorie de données. Les objets et leurs champs sontstockés dans une zone dite tas (heap en anglais) symbolisant la zone mémoireoù la mémoire est prise pour créer les objets. Les variables locales et les para-mètres de méthode sont stockés dans une zone nommée pile d’exécution(stack en anglais) symbolisant une zone mémoire organisée comme une pileLIFO. Chaque tâche ou thread d’un programme a sa propre pile d’exécu-tion.

La pile d’exécution mémorise non seulement les variables locales et les para-mètres mais aussi d’autres informations utiles dans le contexte d’uneméthode : valeur de (��, valeur de retour et point de retour dans la méthodeappelante. Le regroupement de ces informations dans une pile LIFO pré-sente les avantages suivants :• accélère l’exécution des programmes car les instructions pour empiler,

désempiler et utiliser des éléments d’une pile sont généralement câbléesdans les microprocesseurs ;

• simplifie l’encapsulation des informations de la méthode ;• autorise les appels récursifs à une méthode, c’est-à-dire que la méthode

peut s’appeler elle-même ;• permet à la JVM de restituer l’enchaînement des appels de méthodes

quand une exception est déclenchée.

Par l’exemple : calculer une factorielleL’application définie ci-contre permet de calculer la factorielle d’un nombresaisi par l’utilisateur. Ce calcul est effectué par la méthode récursive$��������� de la classe ��8���.�����'�����, afin que vous puissiezobserver le fonctionnement de la pile d’exécution au moment de son appel.

B.A.-BA Pile LIFO

Une pile LIFO (Last In First Out ou dernier entré -premier sorti) gère un ensemble de données où lesdernières données qui lui sont ajoutées sont lespremières à en ressortir, de façon comparable àl’utilisation normale d’une pile d’assiettes.

B.A.-BA Factorielle et récursivité

La factorielle d’un nombre entier �, notée �0, estégale à la multiplication entre eux de tous lesentiers compris entre % et �, c’est-à-dire� �0 ! � - �� / %� - ��� - 9 - %�

D’après cette formule, la factorielle d’un nombre �supérieur à % est aussi égale à la multiplication de� par la factorielle de �� / %�, soit :

�0 ! � - �� / %�0

L’utilisation de la récursivité permet de program-mer directement cette formule, comme le montrela méthode $��������� de la classe��8���.�����'�����

Page 163: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 151

% ���.������8���.�����

9 �8��������-�� ����:;����<����

=

" ������'�����>���������

? �

+ �������������������8�����@�����AB������

C ���

D ����@�������!������

# ������

%) �����

%% ��������!�:;����<�����(� ���E�������FG���H������8����IF�� 3 Saisie d’un texte avec une boîte de dialogue.

%9 �������$����0!������ 3 � est égal à ���� si l’utilisateur opte pour Annuler.

%= �������

%" ���������������!�������������������� 3 Conversion du texte saisi en nombre.

%? �������������$��J�!�'������$�������������� 3 Calcul de la factorielle.

%+ ��������:;����<�����(� K������E�����������* 3 Affichage du résultat.

%C ��������������������������������������&�F0�!�F�&�$��J��

%D ������,

%# ����,

9) ���� (�������0!�������

9% ��,

99 ,

9=

9" ������'�����

9? �

9+ ��322

9C ���2�L����������$��������������*

9D ���2�������M���-����/�%��-����/�9��-�����-�9�-�%

9# ���23

=) �������������������$������������������

=% ���

=9 �����$�����!�%� 3 Condition d’arrêt.

== ������������%�

=" ��������

=? ��������������2�$�������������/�%�� 3 Appel récursif à $���������.

=+ ��,

=C ,

Page 164: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004152

Si l’utilisateur saisit la valeur 3 lors de l’exécution de cette application, l’appelde la méthode $��������� ligne 15 provoquera une évolution de la piled’exécution qui peut être symbolisée ainsi :

À chaque appel de la méthode $��������� � � � sont empilés la valeurdu paramètre � reçu par cette méthode et le point de retour où le programmedevra reprendre son cours, une fois terminée l’exécution de cette méthode.Les appels récursifs à la méthode $��������� provoquent l’empilage (push)successif des différents états de cette méthode jusqu’à ce que la conditiond’arrêt � �! % soit atteinte. Les valeurs renvoyées par les appels à la méthode$��������� � � � sont alors utilisées l’une après l’autre pour effectuer lesmultiplications avec les différentes valeurs de � en pile. Finalement, lerésultat + est stocké dans la variable $��J.

Figure 8–1 Évolution de la pile d’exécution

factorielle(3) push main:15 push 3

factorielle(2) push factorielle:35 push 2

factorielle(1) push factorielle:35 push 1

return 1 pop push 1

return 2*1 pop push 2

return 3*2 pop push 6

paramètre n = 3

factorielleligne 35

factorielleligne 35

paramètre n = 1

"3"

paramètre n = 3

factorielleligne 35

paramètre n = 2

"3"

point de retour main ligne 15

paramètre n = 3

"3"

variable locale s =

variable localen = 3

"3"

paramètre args =

paramètre n = 3

factorielleligne 35

"3"

valeur retour = 1

paramètre n = 3

"3"

valeur retour = 2

variable locale s =

variable localen = 3

variable locale factN = 6

"3"

paramètre args =

valeur retour = 6

variable locale factN = ?

paramètre n = 2

paramètre n = 2

point de retour main ligne 15

point de retour main ligne 15

point de retour main ligne 15

point de retour main ligne 15

variable locale s =

variable localen = 3

paramètre args =

variable locale factN = ?

variable locale s =

variable localen = 3

paramètre args =

variable locale factN = ?

variable locale s =

variable localen = 3

paramètre args =

variable locale factN = ?

variable locale s =

variable localen = 3

paramètre args =

variable locale factN = ?

variable locale s =

variable localen = 3

paramètre args =

variable locale factN = ?

Page 165: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 153

Gérer les exceptionsQuand une erreur imprévue survient lors de l’exécution d’un programmeJava, la JVM crée une exception qui représente le diagnostic de cette erreur.

Par défaut, la JVM affiche dans la fenêtre de commandes un diagnostic telque :

où $%�����'��� �� est la classe de l’exception déclenchée suite à l’erreur, et(����4��'��� �� son message associé. Ce texte est suivi de la trace de la piled’exécution qui décrit l’enchaînement des appels de méthodes dans la piled’exécution au moment de l’erreur, du plus récent au plus ancien.

Quand l’information est disponible dans le fichier ������ de la classe d’uneméthode, chaque méthode de cette liste est suivie entre parenthèses du nomde son fichier source ����� et de la ligne où la méthode précédente dans laliste a été appelée.

Même un programme simple peut cacher des erreursEn apparence sans erreur, l’exécution de l’application de classe����� ����������������������� peut en fait provoquer plusieurs erreurs.

1 Classe non trouvée

Cette exception est déclenchée quand la JVM ne parvient pas à charger lefichier de la classe indiquée parce que la classe ne figure pas dans le dossierattendu (option ���������� incorrecte par exemple).

2 Conversion du texte en nombre impossible

Cette exception est déclenchée suite à la saisie d’un texte qui ne peut pas êtreconverti en nombre par la méthode �������� de la classe �������������appelée ligne 14 (���� n’est pas un nombre entier).

�������������������������$%�����'��� �� �(����4��'��� ���

�����������������������������������!�����"�#�������� �����������������

�����������������������������������!�$�������������� ���������������� ������������������������!�$���������������#�%����&�����'������������������������������!�$������������������� ()*���������������������������'�������� (�+*���������������������������'�������� (,-* ����������� ���������������������������'��������������������� �(* �

API JAVA Classes d’exception de la bibliothèque standard

Toutes les classes d’exception dérivent de la classe����������.��/�$��. La bibliothèque stan-dard de Java 1.4 définit à elle seule 358 classesd’exceptions différentes, chacune d’elles corres-pondant à une catégorie d’erreur particulière !

À RETENIR Utilisez le diagnostic d’exception pour trouver une erreur

La lecture de la trace de la pile d’exécution affi-chée par la JVM permet de localiser tant laméthode où est survenue une erreur, quel’enchaînement des méthodes qui l’ont provo-quée. Afin de corriger plus rapidement leserreurs provoquées par votre programme,apprenez à décrypter le diagnostic d’exceptionque vous affiche la JVM en adoptant la démar-che suivante :• Repérez la classe de l’exception et son mes-

sage pour déterminer la catégorie de l’erreuret sa raison �.

• Cherchez en partant du haut de la trace lapremière classe dont vous êtes l’auteur �.

• Repérez dans cette ligne le fichier source etle numéro de ligne où est survenue l’excep-tion.

• Si cette ligne est précédée d’une autre lignequi débute par ��, repérez dans cette lignela méthode qui a provoqué une exception etsa classe �.

• Lisez la documentation javadoc de cetteméthode pour obtenir une description descas où elle peut déclencher une exception dela classe indiquée.

Page 166: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004154

3 Débordement de la pile d’exécution

Cette exception est déclenchée suite au calcul de la factorielle d’un nombretrop grand, par exemple 100 000. À chaque appel de la méthode#���������, la JVM prend dans la pile d’exécution un peu de mémoirequ’elle libère en quittant la méthode. L’appel récursif ligne 35 de la méthode#��������� provoque lors de l’exécution autant d’appels imbriqués que lavaleur du paramètre de #���������. La mémoire utilisée par ces appelsrécursifs ne commence à être libérée qu’au moment où la condition d’arrêtde la méthode #��������� est atteinte, c’est-à-dire quand son paramètrevaut 1. Si le paramètre initial est trop grand, la pile d’exécution provoque undébordement de pile (stack overflow en anglais) avant d’atteindre la conditiond’arrêt parce qu’elle n’a plus de place pour stocker un énième appel.

Intercepter une exception avec try catchLes erreurs d’exécution sont en général dues soit à une erreur de logiquedans les instructions d’une méthode qui doivent alors être modifiées, soit àune programmation qui n’a pas traité certains cas exceptionnels. Pour ce quiest des cas exceptionnels non traités, le programmeur peut modifier son pro-gramme de deux façons.La première consiste à ajouter des tests afin que le cas exceptionnel ne seprésente plus. Dans la classe ����� �����������������������, on peutopérer aux changements nécessaires au contrôle de la saisie soit en rempla-çant ��/%����"���� par un appel à une autre méthode n’autorisant que lasaisie de chiffres, soit en testant si les caractères saisis sont tous des chiffresavant l’appel à ��������.La seconde consiste à intercepter l’exception qu’une méthode déclenche avecune instruction ��0������ respectant la syntaxe suivante :

�����������������������������������&��� 1���#�/�������������������� ��������������#���������'��������������������� +,*���������������� ��������������#���������'��������������������� +,*���������������� ��������������#���������'��������������������� +,*�����������

ATTENTIONLimitez l’utilisation de la récursivité

La récursivité offre le moyen le plus simple pourprogrammer certains algorithmes issus des sui-tes et séries mathématiques. Mais utilisez depréférence une boucle /���� ou #� quandc’est possible car c’est plus rapide que l’appeld’une méthode, sans compter qu’un tour deboucle ne risque pas de provoquer de déborde-ment de la pile d’exécution dans les cas limites.Par exemple, la méthode #��������� pour-rait être « dérécursivée » ainsi :

��$����������������#���������'�����*2���������������3��4��#��'������3�-4���53��4��66*�������������73��4�����������������48

C++ try catch

Les instructions ��0 ����� de Java et du C++ont des syntaxes très proches à quelques nuancesprès : en Java, dans chaque �����, le type del’exception déclarée doit être une classe d’excep-tion et suivi de la déclaration d’une référence dési-gnant l’exception, même si cette référence n’estpas utilisée.

Essayer... B ��02

... d’exécuter �����&� ������ �������&� ������8

Si l’exception de classe $%�����'��� ��a été déclenchée lors de l’exécution de�����&� ������,

B ������'$%�����'��� �����*2

�����&� ���$�� est exécuté. B �������&� ���$��8

Page 167: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 155

Le bloc de l’instruction ��0 encadre les instructions �����&� ������ àessayer. Ce bloc est suivi d’un ou plusieurs blocs �����, chacun spécifiant laclasse d’exception $%�����'��� �� qu’il est capable d’intercepter. Quand uneexception est déclenchée par une instruction du bloc ��0, la JVM recherchele bloc ����� de même classe que celle de l’exception. Si ce bloc ����� existe :1 L’exception est interceptée par le bloc �����. La référence �� désigne

l’exception.2 Les instructions du bloc ����� sont exécutées.3 Les instructions suivant l’instruction ��0������ sont exécutées en oubliant

celles qui suivent l’instruction qui a provoqué l’exception dans le bloc ��0.

La référence désignant l’exception (ici ��) peut être un quelconque identifi-cateur dès lors qu’il diffère des variables locales et des paramètres de laméthode courante.

Par l’exemple : vérifier les erreurs de saisieL’application suivante reprend l’application de classe ����� �������

���������������� définie au début du chapitre pour éviter les erreurs au casoù l’utilisateur saisit un texte qui n’est pas un nombre entier.

REGARD DU DÉVELOPPEUR Quel traitement programmer dans un bloc try ?

Comme le bloc qui suit ��0 peut contenirune ou plusieurs instruction(s), la questionportant sur ce qu’il faut programmer dans untel bloc se pose souvent. Pour y répondre,basez-vous sur le fait que les instructionsd’un bloc ��0� doivent représenter un essaicohérent. Par exemple, la logique de l’appli-cation ci-dessous permet à l’utilisateur decalculer la factorielle d’un nombre saisi parses soins, et ceci autant de fois qu’il le désire.S’il essaie de calculer la factorielle d’autrechose qu’un nombre entier, l’application doitl’avertir de son erreur, mais n’a pas de raisonde s’arrêter pour autant. Ainsi, les instruc-tions du bloc ��0 ci-dessous essaient de cal-culer la factorielle d’un nombre, et ce traite-ment est inclus dans une instruction� /���� répétant cet essai, qu’il ait réussiou non.

EXEMPLE com/eteks/test/CalculAvecTryCatch.java��� ��������� ������4������������/����91����:���4������������;���.�0�����2����$�������������������'&������<=�����*��2����&��������3�����4�������������0������2����������3�91����:������/%����"�����'������>�����$��� �*4���������#�'��?3�����*��������2

����������������3��������������'�*4��������������#���!�3��������#����������'�*4����������91����:������/@������"����'����A����������������������������������������6��?�3���6�#���!*4��������8������8������������'!�$�����������������*������2

3 La conversion du texte saisi en nombre peutdéclencher une exception de classe ����������!�$��������������.

��������91����:������/@������"�����'����A����������������������6����B������������������*4������8����/�����'��?3�����*4��88

3 Affichage d’un message pour avertir l’utilisateurde son erreur de saisie.

Page 168: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004156

Si une exception est déclenchée dans la méthode ��������, l’application declasse ����� �������������;���.�0����� l’intercepte dans le bloc�����'!�$����������������*. L’exécution se poursuit ensuite sur l’ins-truction /����.

Déclencher une exception avec throwC’est l’instruction ���/ suivie d’une instance d’une classe d’exception quipermet de déclencher une exception. Cette instruction utilisée dans uneméthode ou dans un constructeur provoque l’arrêt de la méthode ou duconstructeur courant sans retourner de valeur. La JVM remonte alors dans lapile d’exécution à la recherche de la première méthode munie d’un bloc����� capable d’intercepter l’exception déclenchée. S’il n’existe aucune ins-truction ��0������ à même de traiter cette classe d’exception, la JVM arrêtela tâche courante et affiche dans la fenêtre de commandes le diagnostic del’exception.

Par l’exemple : surveiller les cas limitesL’erreur de débordement de pile qui peut survenir lors de l’exécution del’application de classe ����� ����������������������� (comme avecl’application de classe ����� �������������;���.�0�����) est plutôt uneerreur de logique car la méthode #��������� ne doit pas provoquer d’erreurdans la JVM. Les exceptions de classe ����������&��� 1���#�/����,comme toutes celles d’une classe dérivant de la classe ��������������, sontrarement interceptées. Elles sont déclenchées suite à une grave erreur dans lefonctionnement de la JVM.

Par ailleurs, #��������� devrait refuser un nombre négatif en paramètre ouun nombre supérieur à 20, une donnée de type ��� ne pouvant stocker unnombre plus grand que ����@;CDE;�F� (= 9223372036854775807). La solu-tion la plus élégante consiste à déclencher une exception dans la méthode#��������� pour chacun des cas limites.

La classe d’exception ����������%������;�������������� utilisée pour lesparamètres incorrects d’une méthode convient pour les cas limites posés parla méthode #���������, laquelle peut être modifiée ainsi :

EXEMPLE com/eteks/test/CalculFactorielle.java (corrigé)��� ��������� ������4������������/����91����:���4GG�"H#��������������������������������������������H�������������2��G77���7�I���������#��������������A����7�������J�����'��K��*���'��K�-*���������-����

C++/C# Différences d’utilisation de throw

En Java, l’instruction ���/ doit être obligatoire-ment suivie d’une référence qui désigne une ins-tance d’une classe d’exception. L’instruction���/4 du C++ et de C# utilisée pour déclencherà nouveau une exception interceptée dans un bloc����� est remplacée en Java par l’instruction���/ �'4, �' étant la référence de l’exceptiondéclarée dans le �����.

Page 169: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 157

Bien qu’après changement, la méthode #��������� continue à déclencherune exception à l’exécution si n < 0 ou n > 20, l’exception est maintenantplus claire pour l’utilisateur de cette méthode et la compatibilité ascendantea été maintenue :

��7�L���������%������;��������������������5�������M�-���7G����$���������������#����������'�����*��2

3 Balise ������ signalant la classe d’exceptionque peut déclencher la méthode.

�����#�'��5���NN���M�-�*���������/���/�%������;���������������'��6������������*4

3 Vérification des cas limites.

�����#�'��53��*��������������4��������

3 Condition d’arrêt.

���������������7�#����������'��K��*4��88

3 Appel récursif à factorielle.

�����������������������������������%������;�������������� �-�������������������������� ��������������#���������'��������������������� ++*���������������� �������������;���.�0���������'������;���.�0���������� �O*

POUR ALLER PLUS LOIN assert

Une assertion est une instruction qui teste la validité d’une condition, grâce à l’une desdeux syntaxes suivantes :

��������'��-��%�����4��������'��-��%������ ������4�4

Si le résultat de l’expression �'��-��%����� est égal à #����, cette instruction déclenchealors une exception de classe ����������;�����������. À la différence d’une instruc-tion �# '��� � ��* ���/ �'4 une assertion n’est vérifiée que si l’optionK���$����������� (ou K��) est utilisée au lancement de la commande ����. Les asser-tions sont utilisées généralement au moment de la mise au point d’un programme pourvérifier les conditions d’entrée et de sortie d’une méthode. Par exemple, l’instruction :

�#�'��5���NN���M�-�*�����/���/�%������;���������������'��6������������*4

peut s’écrire ainsi avec l’assertion suivante :

���������M3���PP���53�-�� ���6������������4

B http://java.sun.com/j2se/1.4/docs/guide/lang/assert.html

Page 170: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004158

L’application de classe ����� �������������;���.�0�����.�����������

traite enfin les exceptions ����������!�$�������������� et ����������%������;��������������.

EXEMPLE com/eteks/test/CalculAvecTryCatchTouteException.java��� ��������� ������4������������/����91����:���4������������;���.�0�����.�����������2����$�������������������'&������<=�����*��2����&��������3�����4�������������0������2����������3�91����:������/%����"�����'������>�����$��� �*4���������#�'��?3�����*��������2

La conversion du texte saisi en nombre peutdéclencher une exception de classe ����������!�$��������������. B ����������������3��������������'�*4

L’appel à #��������� peut déclencher uneexception de classe �����������%������;��������������.

B ��������������#���!�3��������#����������'�*4

����������91����:������/@������"�����'����A�������������������������������������������6��?�3���6�#���!*4��������8������8������������'!�$�����������������*������2

Affichage d’un message pour avertir l’utilisateurde son erreur de saisie.

B ��������91����:������/@������"�����'����A�������������������������������������������6����Q������������������*4������8������������'%������;�����������������*������2

Affichage du message de l’exception. B ��������91����:������/@������"�����'����A�������@�������'**4������8����/�����'��?3�����*4��88

JAVA Ordre des catch

Les blocs ����� qui traitent les cas particuliers doivent être cités avant ceux qui s’occupentdes cas généraux : concrètement, si les classes d’exceptions de deux blocs ����� ont desrelations d’héritage, le bloc ����� spécifiant la sous-classe doit être cité avant le bloc����� spécifiant la super-classe.Si, dans l’exemple précédent, vous intervertissez l’ordre des deux blocs �����, le compila-teur affichera cette erreur :���G�G��� �G����G������;���.�0�����.���������������� -R ��������������������!�$�������������������������0�$����������������������'!�$�����������������*Il est aussi possible de ne programmer qu’un seul ������'%������;����������������*, car la classe ����������%������;�������������� est la super-classe de����������!�$��������������.

C++ Equivalent Java de catch (...)

Comme ����������.��/�$�� est la super-classe de toutes les classes d’exception, l’équiva-lent du ����� '���* du C++ est, en Java :

������'.��/�$�� ��*

Page 171: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 159

Décrire un traitement final avec finallyUne instruction ��0� ����� peut être suivie d’un bloc #�����0 contenant lesinstructions qu’il faut toujours exécuter, après qu’une partie ou toutes les ins-tructions du bloc ��0 ont été exécutées. Par exemple, un bloc ��0 qui traitedes accès à un fichier (ouverture, écriture) est généralement suivi d’un bloc#�����0 fermant le fichier. Le fichier sera ainsi finalement fermé, qu’uneexception ait été déclenchée ou non dans le bloc ��0.

Par l’exemple : finally, demander confirmation pour continuerDans l’application suivante, quelles que soient les erreurs provoquées, oupas, à chaque tentative de calcul, le bloc #�����0 est exécuté pour demander àl’utilisateur confirmation pour continuer.

C++ Pas de finally en C++

La notion de bloc #�����0 qui définit les instruc-tions à exécuter quelle que soit l’issue d’un bloc��0 n’existe pas en C++, mais a été reprise en C#.

EXEMPLE com/eteks/test/CalculAvecTryCatchFinally.java��� ��������� ������4������������/����91����:���4������������;���.�0�����������02����$�������������������'&������<=�����*��2

����&������������3������������#����������4��������������4����&��������3�����4�������������0�������2����������3�91����:������/%����"�����'����A�����������������������������>�����$��� �A������A����������������������91����:����1SD�;!���D1:.%1!*4���������#�'��?3�����*��������2

3 Titre des boîtes de dialogue.

La conversion du texte saisi en nombre peutdéclencher une exception de classe ����������!�$��������������.����������������3��������������'�*4 3

��������������#���!�3��������#����������'�*4�����������91����:������/@������"�����'����A�������������������������������������������6��?�3���6�#���!*4��������8������8������������'!�$�����������������*������2

3 L’appel à factorielle peut déclencher une excep-tion de classe����������%������;��������������.

��������91����:������/@������"�����'����A��������������������6����Q������������������A����������������������A�91����:�����II1ID@�&&;T�*4������8������������'%������;�����������������*������2

3 Affichage d’un message d’erreur avec l’icôneadéquate.

��������91����:������/@������"�����'����A�������@�������'*A����������������������������������A�91����:�����II1ID@�&&;T�*4������8

3 Affichage d’un message d’erreur avec l’icôneadéquate.

Page 172: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004160

Catégories d’exceptions JavaLes classes ��������������, ������������������ et� ����������

I�������������, sous-classes de ����������.��/�$��, définissent des caté-gories d’exceptions différentes.

Exceptions non contrôléesLes sous-classes de �������������� et de ����������I������������� nesont pas contrôlées par le compilateur : si une exception de cette catégorieest déclenchée lors de l’exécution, soit vous l’avez prévue et traitée avec uneinstruction ��0� �����, soit la JVM affiche le diagnostic correspondant etvous corrigez votre programme. Le compilateur ne vous oblige donc pas àtraiter toutes les instructions de vos classes dans des instructions ��0������en prévision de toutes les exceptions non contrôlées qui pourraient êtredéclenchées ; ce serait fastidieux et inutile dans la plupart des cas.

Le tableau 8–1 présente les sous-classes de ����������I������������� quisont le plus fréquemment utilisées.

Exceptions contrôléesLes classes dérivées de ������������������, différentes de ����������

I������������� et ses sous-classes, sont des classes d’exceptions contrôlées(checked en anglais). Une méthode utilise le mot-clé ���/� pour déclarer laliste des classes d’exceptions contrôlées qu’elle est susceptible de déclencher :

������#�����0�������2

Demande de confirmation pour quitter. Laméthode ��/��#��"���� prend en der-nier paramètre une constante représentant lesboutons qui doivent apparaître dans la boîte dedialogue (ici, U�&D!1D1:.%1! pour 1�� et!�) et renvoie une constante qui représente lechoix de l’utilisateur (ici U�&D1:.%1! ou!1D1:.%1!).

B ���������������3�91����:������/��#��"�����'����A�����������������������E���>K����V�������W�A��������������������������A�91����:����U�&D!1D1:.%1!*4������8����/�����'�������33�91����:����!1D1:.%1!*4����&0���������'�*4��88

REGARD DU DÉVELOPPEUR Comment traiter une erreur de lien ?

Les exceptions dont la classe dérive de�������������� sont généralementdéclenchées par la JVM suite à un problèmerencontré à l’utilisation d’une classe ou sur laJVM elle-même. Parmi celles-ci, toutes lessous-classes de ������������� �������,comme ����������!�����"�#��������ou ����������!&���@��������, repré-sentent les erreurs déclenchées quand le lienavec une classe est impossible (classe ouméthode inexistante, fichier ������ cor-rompu...). Ces erreurs surviennent le plus sou-vent quand la JVM continue à utiliser unancien fichier ������ d’une classe qui a étémodifiée entre temps. Si une telle erreur sur-vient, vérifiez les trois points suivants etrecompilez la classe si nécessaire :• Les dates du fichier ������ et du fichier

source �����.• L’unicité du fichier ������ : peut-être

avez-vous changé votre arborescence dedéveloppement et laissé d’anciens fichiers������ utilisés par inadvertance ?

• Le dossier ou le fichier ���� de provenancedu fichier ������ en vérifiant l’ordre desdossiers et des fichiers ���� spécifiés dansl’option K��������� et/ou dans la variabled’environnement ��;&&:;.X.

Throwable

Error

RuntimeException

Exception

Page 173: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 161

Le compilateur vérifie que les exceptions contrôlées susceptibles d’êtredéclenchées dans vos classes sont bien prises en compte, vous laissant lechoix soit d’intercepter une exception contrôlée dans un bloc �����, soit delaisser se propager une exception contrôlée dans la pile d’exécution en ajou-tant la classe de l’exception à la clause ���/� d’une méthode.

Les classes d’exceptions contrôlées le plus fréquemment utilisées sontdéclenchées par les méthodes d’entrée/sortie. Ces opérations provoquantquelquefois des erreurs, le compilateur vous contraint ainsi à tenir comptesystématiquement de ces exceptions pour rendre vos classes plus robustes dèsleur conception :• �������%1�������� et ses sous-classes pour les erreurs d’entrée/sortie

sur les fichiers et le réseau.• ������V��&Y��������� et ses sous-classes pour les erreurs avec une base

de données.• ��������������&�������������� pour les erreurs avec les servlets.

��� ��������� ������4

������������;���@����������������������2����$�������������'*����/��$%�����'��� ��$�����%����2�����GG�%�������������������$��������H���������������������������GG�����Z�H�������������$%�����'��� ��$�����%����88

C++/C# Exceptions contrôlées

La notion d’exceptions contrôlées est propre àJava et n’existe ni en C++ ni en C#. La clause���/ '�����'��� ��* utilisée en C++pour spécifier les types d’exception déclenchéspar une fonction ou une méthode ressemble àla clause ���/� de Java mais n’a pas le mêmerôle. En C++, la clause ���/ spécifie la listedes seuls types d’exception qu’une fonctionpeut déclencher ; en Java, la clause ���/�sert à spécifier les classes d’exceptions contrô-lées que l’appelant à une méthode doit prendreen compte.

Tableau 8–1 Les sous-classes de ����������I������������� le plus fréquemment utilisées

Sous-classe Description

����������;���������������� Division entière par zéro.

��������������������������� Conversion d’une référence dans un type incompatible.

����������%������;�������������� Valeur refusée en paramètre d’une méthode.

������������!�$�������������� Sous-classe de la précédente utilisée par les méthodes �������� des classes d’emballage numériques si une chaîne de caractères n’est pas convertible dans son type primitif correspondant.

����������%������&������������ État d’un objet n’autorisant pas l’appel d’une méthode.

����������%����1��1#[������������ Valeur d’indice en dehors des limites autorisées.

������������;���0%����1��1#[������������ Sous-classe utilisée pour les indices de tableaux.

������������&�����%����1��1#[������������ Sous-classe utilisée pour les indices dans les chaînes de caractères.

����������!���:������������� Appel d’une méthode ou utilisation d’un champ avec une référence ����.

����������&������0�������� Violation de sécurité.

����������F���������1��������������� Opération non supportée par une méthode.

Page 174: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004162

Manipuler une classe à l’exécution avec la réflexionLa classe ��������������� et celles du paquetage ������������#���� sont desclasses relatives à la réflexion : elles permettent d’utiliser dynamiquement uneclasse dont l’identificateur ou celui d’un de ses membres n’est déterminé qu’àl’exécution. Pour ne pas provoquer d’erreur dans la JVM, les méthodes desclasses de réflexion contrôlent la validité des opérations demandées commele ferait le compilateur �����, et déclenchent pour les opérations invalidesdes exceptions contrôlées qu’il vous faut donc prendre en compte au momentde l’écriture de votre programme.

La réflexion est le plus souvent utilisée pour créer un objet à partir d’unechaîne de caractères qui décrit sa classe. Comme l’opérateur ��/ ne peut êtresuivi d’un objet de classe ����������&�����, il faut appeler à la place les deuxméthodes suivantes de la classe ��������������� :1 La méthode de classe #�!�� en lui passant en paramètre une chaîne de

caractères qui contient l’identificateur de la classe recherchée avec sonpaquetage. #�!�� provoque le chargement par la JVM de la classe enparamètre si elle n’a pas encore été utilisée et renvoie l’instance de laclasse ��������������� qui représente cette classe.

2 La méthode ��/%������� sur l’instance de la classe ��������������� ren-voyée par #�!��. Cette méthode crée puis renvoie un objet de la classecorrespondante.

Les deux méthodes #�!�� et ��/%������� s’utilisent conjointement ainsi :

Comme l’objet désigné par ������������ contient a priori n’importe queltexte, les méthodes #�!�� et ��/%������� doivent effectuer à l’exécution lesmêmes vérifications que celles faites par ����� à la compilation d’une ins-truction ��/. Pour ne pas provoquer d’erreur dans la JVM, ces deuxméthodes vérifient :1 si la classe donnée par ������������ existe ;2 si elle est accessible (si elle est ��$���, ou friendly et de même paquetage

que celui de la classe en cours) ;3 si elle n’est pas une classe �$������ ou une interface ;4 si elle a un constructeur accessible sans paramètre.Si une des erreurs précédentes est détectée, les méthodes #�!�� et��/%������� déclenchent une exception d’une des classes suivantes pour vouslaisser prendre les mesures appropriées à l’aide un bloc ����� :

À RETENIR Classe java.lang.Class

Chaque classe ou interface Java chargée par laJVM est représentée en mémoire par une instancede ���������������. La méthode d’instance�������� définie dans la classe ����������1$���� peut être aussi appelée sur tout objet exis-tant pour obtenir l’instance de ��������������� qui représente la classe de cet objet.

&�������������������3������������"����4GG�!�������������� ���/�����\������������GG��B������#���������B����������A������Q���GG����]���V���������������������#�������1$�����$��3���/��������������'*4

&�������������������3������������"����4

������������1$����3�������#�!���'������������*4

1$�����$��3��������1$������/%��������'*4

Page 175: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 163

• ���������������!������������� : classe inexistante ou non trouvéedans le ��������� ;

• ����������%������;������������� : classe inaccessible ;• ����������%������������������� : classe non instantiable (classe

�$������, interface ou classe sans constructeur accessible n’ayant aucunparamètre).

Comme ces trois classes sont des classes d’exceptions contrôlées, les méthodes#�!�� et ��/%������� de la classe ��������������� sont déclarées ainsi :

et tout programme Java qui utilise ces deux méthodes doit prendre encompte ces exceptions, même quand vous savez pertinemment qu’aucune deces exceptions ne sera jamais déclenchée.

Par l’exemple : créer un objet à partir d’une classe choisie à l’exécution

L’application suivante crée un objet à partir d’une chaîne de caractères saisiepar l’utilisateur grâce aux méthodes #�!�� et ��/%�������. L’objet créé estfinalement affiché grâce à la méthode ��/@������"����.

��$���������������������������#�!��'����������&����� �����!��*������������������������������������������/�����������������!���������������$��������������1$�������/%�������'*����/������������%�������������������A�������������������������������������������������������%������;�������������

EXEMPLE com/eteks/test/CreerObjetClasse.java��� ��������� ������4������������/����91����:���4�����������1$���������2����$�������������������'&�����<=�����*��2

Figure 8–2 Application ����� ������������1$���������

����&�������������3�91����:������/%����"����'�������� �*4�������0����2

3 Saisie de la classe.

������1$�����$����3�������#�!��'������*���/%��������'*4 3 Création d’un objet à partir de la classe saisie.

������91����:������/@������"����'����A�$���*4����8

3 Affichage de l’objet créé.

����������'�����!����������������*����2������91����:������/@������"����'����A��������������������������6��������6����B�����������*4����8

3 Exception contrôlée déclenchée si la classen’existe pas ou si elle est introuvable.

����������'%������;����������������*����2������91����:������/@������"����'����A��������������������������6��������6����B���������������$���*4����8

3 Exception contrôlée déclenchée si la classe n’estpas ��$��� ou si elle est friendly mais d’unpaquetage différent de ����� ������.

Page 176: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004164

La classe ��������������� contient de nombreuses autres méthodes qui per-mettent d’interroger les différentes caractéristiques d’une classe ou d’uneinterface comme le résume le tableau suivant.

Exception contrôlée déclenchée si la classe estabstraite ou si elle n’a pas de constructeuraccessible.

B ����������'%����������������������*����2������91����:������/@������"����'����A��������������������������6��������6��������$����������B������������������6�������������������������$������������^����)����*4����8����&0���������'�*4��88

ATTENTION Une exception contrôlée doit être prise en compte

Si vous ne traitez pas une exception contrôlée en oubliant par exemple ici l’un des blocs �����,le compilateur affiche un message vous rappelant que la classe d’une exception contrôlée doitêtre interceptée (caught en anglais) ou déclarée avec ���/� dans la liste des exceptions de laméthode appelante comme étant susceptible d’être déclenchée (thrown) :�G���G�G��� �G����G�����1$�������������� �( �����������������������������������!�������������4�����$����������������������$�����/�������1$�����$����3�������#�!��'������*���/%�������'*4

API JAVA showMessageDialog

La méthode ��/@������"���� appelle laméthode �&����� sur l’objet qui lui est passé enparamètre pour l’afficher, sauf si cet objet est uneinstance d’une classe de composant Swing,comme �������/����9[���� ; dans ce cas,cette méthode affiche directement le composanten question.

API JAVA Autres méthodes de la classe java.lang.Class relatives à la réflexion

Les classes ������������#��������������, ������������#���������� et ������������#�����@���� contiennent toutes les méthodesnécessaires à la création d’un objet, la manipulation d’un champ et l’appel d’une méthode.

Description Méthode

Interrogation de l’identificateur de cette classe avec son paquetage, de sa super-classe et des interfaces qu’elle implémente

��$����&���������!���'*��$�������������&����������'*��$����������<=����%����#�����'*

Interrogation des constructeurs, des champs et des méthodes disponibles et accessibles dans cette classe

��$����������������#���������������<=��������������'*��$����������������#�����������<=����������'*��$����������������#�����@�����<=����@�����'*

Interrogation d’un constructeur particulier de cette classe

��$����������������#�����������������������������'���������������<= ��������.0���*��������/������������!&���@������������

Interrogation d’un champ particulier de cette classe ��$����������������#��������������������'����������&����� #����!��*�������/������������!&����������������

Interrogation d’une méthode particulière de cette classe

��$����������������#�����@��������@������'����������&����� ����!��A���������������� <= ��������.0���*�������/������������!&���@������������

Page 177: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

8 –

Gest

ion

des

erre

urs

avec

les

exce

ptio

ns

© Groupe Eyrolles, 2004 165

Par l’exemple : trouver les constructeurs et les méthodes d’une classe

L’application suivante affiche les constructeurs et les méthodes accessiblesd’une classe saisie par l’utilisateur.

EXEMPLE com/eteks/test/AfficherConstructeursMethodesClasse.java�������������� ��� ������������� ������������������� ����������� �������� ���� � ��� �!����"���� �������� �����#$�����%&���� '��!

����$��������� ��(������������ ��)����*����#+��� ��,+'�������-����!

3 Saisie du nom de la classe.

��������� �"������ ��(���� ���.��#��� �'� 3 Obtention de l’objet représentant la classe sai-sie.

����������������� ���� ���*����#����/����������"������ ������� ������ #'/���������+�� �������� � ��+�0���� �/�������������1�).2�3$$�43'�

3 Affichage des constructeurs ��"��� de laclasse.

����������������� ���� ���*����#����/�"������ ��������� #'/���������+�5�66�7�� � � ��+�0���� �/�������������1�).2�3$$�43'�����8

3 Affichage des méthodes ��"��� de la classe.

����������#��� .�9�� 3����������'����!����������������� ���� ���*����#����/����������+1����� ��+�0���� ��0�+��:��� ����� +'�����8����$- ��������#6'���88

3 Exception contrôlée déclenchée si la classen’existe pas ou si elle est introuvable.

ASTUCE Utilisation du mot-clé class

Le mot-clé ��� peut être aussi utilisé en Java à la suite d’une classe ou d’un type primitif pourobtenir l’objet de classe ������������� qui représente une classe ou un type primitif. Ainsi,l’expression :

������ ����� �$����������

est équivalente à :

��� ���.���#+������ ����� �$������+'

Comme l’existence de la classe citée avant ���� peut être vérifiée dès la compilation, cettesyntaxe est pratique pour obtenir une instance de ������������� sans être obligé de pro-grammer une instruction ��-������.

C# Classe.class = typeof(Classe)

La classe C# $- ���;-�� est équivalente à la classe Java ������������� et l’opérateur�-��� a le même effet que ���� .

ATTENTION Ne laissez pas de bloc catch vide

Si vous ne savez pas comment traiter uneexception ou si vous voulez programmer sontraitement plus tard, appelez au moins laméthode �����$����;���� sur l’exceptioninterceptée, par exemple avec :��������$����;���� #'�.

Comme cette méthode affiche dans la fenêtrede commandes le diagnostic de l’exception,vous aurez au moins une trace à l’écransignalant l’exception en cas de comporte-ment erratique de votre programme.

Page 178: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004166

Créer une classe d’exceptionSi aucune classe d’exception de la bibliothèque standard ne correspond auxexceptions que vous voulez déclencher dans une méthode, vous pouvez créerune nouvelle classe d’exception. Celle-ci doit dériver :• soit de la classe ����������3������� pour créer une classe d’exception

contrôlée ;• soit de la classe ����������<�����3������� pour créer un classe d’excep-

tion non contrôlée ;• soit d’une des sous-classes de ����������3������� ou� ����������

<�����3�������.

En résumé…L’intégration complète des exceptions à Java est un progrès qui assure unemeilleure qualité à vos programmes. Vous aurez à les utiliser dans deux cir-constances : • pour détecter les erreurs pendant la phase de mise au point de votre pro-

gramme Java. La JVM affiche la trace de la pile d’excécution, qu’il fautapprendre à décoder pour trouver où se situe l’erreur ;

• pour prévoir les traitements d’erreur d’un programme en utilisant l’ins-truction ��-� �����. Le compilateur vous contraint même à prendre encompte les exceptions contrôlées qui sont citées par la clause ���� de ladéclaration d’une méthode. Les exemples des prochains chapitres vousmontreront en particulier les différentes façons de traiter les exceptionscontrôlées susceptibles d’être déclenchées par les méthodes d’accès auxfichiers et aux bases de données.

REGARD DU DÉVELOPPEUR Que choisir ?

Le choix entre déclencher une exception contrôlée ou non est fonction des cir-constances d’utilisation de la méthode déclenchant l’exception. Ce choixn’obéit pas à une règle absolue mais tient compte généralement des critèressuivants :• Une exception contrôlée est déclenchée par une méthode dont le bon fonc-

tionnement dépend d’une saisie correcte de l’utilisateur, ou qui a unepotentialité de dysfonctionnement indépendante de la JVM, comme pourles entrées/sorties.

• Une exception non contrôlée est déclenchée par une méthode en réponse àla programmation d’un appel dans une situation incorrecte (mauvais para-mètre, état incohérent…).

JAVA Classe d’exception

Presque toutes les classes d’exceptions de labibliothèque standard sont définies de lafaçon suivante :

��� ���� �3�������������� ��&���$%�����'��� ��!����"������� �3�������#'���!��8����"������� �3�������#�����$������� '��!���� ����#� '���88

Ces classes qui ne définissent aucuneméthode supplémentaire caractérisent enfait les différentes catégories d’exceptions.Vos propres classes d’exception peuventreprendre ce schéma simple ou avoir leurspropres méthodes si besoin est.

Page 179: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

9Lecture et écriture de fichiers

SOMMAIRE

B Accès au système de fichiers

B Flux de données

B Filtrer un flux de données

B Compter les lignes de code

B Fichiers de configuration

MOTS-CLÉS

B java.ioB FileB InputStreamB OutputStreamB ReaderB WriterB IOExceptionB FilterReaderB BufferedReaderBasée sur un modèle d’accès aux données sous forme de flux,

l’architecture des classes du paquetage ������ permet de lire et d’écrire de façon similaire dans un fichier ou dans d’autres sources de données. L’application développée dans ce chapitre vous montre comment organiser une application capable de compter le nombre de lignes hors commentaires d’un ensemble de fichiers Java.

Instance deFileInputStream

011001001001...

Instance deBufferedInputStream

01…

2047

Instance deDataInputStream

nombre de type short

readShort read read

Page 180: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004168

Explorer le système de fichiers (java.io.File)L’accès à l’organisation du système de fichiers local s’effectue grâce à la classe�������9���. Une instance de cette classe représente le chemin d’accès à undossier ou un fichier particulier et permet d’effectuer des opérations surcelui-ci (autorisation d’accès en lecture/écriture, liste des fichiers d’un dos-sier...). La description des chemins d’accès (séparateurs, description des dis-ques...) utilisée par le constructeur et les méthodes de cette classe utilisent lesconventions du système sur lequel est exécutée la JVM.

La classe �������9��� contient les constantes ������� représentant leséparateur de noms (égal à 5 sous Windows et = sous Unix), et ����$�������représentant le séparateur de chemins (égal à � sous Windows et , sousUnix).

Les méthodes �� �9��� de cette classe permettent d’obtenir le contenu d’undossier. Parmi celles-ci, la méthode �������9���%& �� �9��� #�������

9���9����� ������' permet de filtrer la liste des fichiers renvoyés. Elle prend enparamètre l’instance d’une classe qui implémente l’interface �������9���9�����.L’unique méthode de cette interface "���� ������#�������9��� �������'

doit être implémentée dans cette classe pour accepter ou refuser dans la liste ren-voyée par �� �9��� le fichier reçu en paramètre.

ATTENTION Sécurité des applets

Les méthodes de la classe �������9��� sontsusceptibles de déclencher une exception declasse ����������$������-3������� si,comme dans le contexte d’une applet, le ges-tionnaire de sécurité actif restreint l’accès ausystème de fichiers.

B.A.-BA Chemin absolu/chemin canonique

Le chemin canonique renvoyé par la méthode��������������� est un chemin absolu danslequel les dossiers � et �� ont été supprimés. Parexemple, l’expression suivante renverra la chaîne+�,5;� �5"��� �"��+ :��� 9��� #+�,5;� �5"��5��5"��� �"��+'����������������#'

API JAVA Méthodes les plus utiles de la classe java.io.File

La classe �������9��� redéfinit aussi les méthodes �>��� , �� �� � et implémente l’interface ���������������"��.

Description Méthode

Distinction entre dossier et fichier ��"����"������ *������-#'��"����"������ 9���#'

Autorisations sur un fichier ou un dossier ��"����"��������<�� #'��"����"��������?����#'��"����"������ @� ��#'��"����"�������� � #'

Création, renommage et suppression d’un fichier ou d’un dossier

��"����"������ ��#'��"����"�����������.��9���#'��"����"����������;#�������9��� � �'��"����"����� �����#'

Recherche du nom du fichier ou du dossier, de son chemin d’accès absolu et du chemin d’accès de son dossier parent

��"��������������$���������.��#'��"��������������$����������" ��������#'��"��������������$���������������������#'��"��������������$���������������#'

Recherche des dossiers à la racine du système et du contenu d’un dossier

��"���� �������������9���%&��� �<� #'��"�����������9���%&��� �9��� #'��"�����������9���%&��� �9��� #�������9���9����� ������'

Page 181: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 169

Par l’exemple : rechercher les fichiers dans un dossier et ses sous-dossiersLa méthode de classe ��������9������ * ��� de la classe������ ����� ������ 9������ suivante recherche dans un dossier et sessous-dossiers les fichiers qui portent une certaine extension.

EXEMPLE com/eteks/outils/OutilsFichier.java�������������� ����� ����������������;���$���������������A���"������� ������ 9������!��=AA���A�<����������������������� ��� � �������� � �� �������A���� �� � � � B ��� ����A=����"���� ������9����%&���������9������ * ����#$������ ���/�������������������������������������������������$����������� ��'��!

JAVA Chemins relatifs

Si le dossier ou le fichier passé en paramètre auconstructeur de la classe �������9��� est unchemin relatif, la recherche est effectuée relative-ment au dossier courant mémorisé par la propriétésystème � ��� ��.

����9����������(�����9����# ���'� 3 Création d’une instance de �������9��� cor-respondant au dossier en paramètre.

�������#���C��������� � #'��������DD�C������� *������-#''���������������)�������������3��������# ����0�+�������+'�

3 Si le dossier n’existe pas ou si c’est un fichier,déclenchement d’une exception.

����;���$���������� ;��� �(�����;���$��#'�������������9������ * ����#������� ;��� /������/������ ��'� 3

Recherche récursive des fichiers à partir du dos-sier.

����9����%&�������� �(�����9����%������� ;��� � �E�#'&������������ ;��� ������-#������� '������������������� ���8

3 Recopie des fichiers trouvés dans un tableau demême dimension.

���������� �������� ���������9������ * ����#;���$���������� /�����������������������������������������������9���������* ���/�����������������������������������������������$����������� ��'

3 Méthode ������� surchargeant la méthodeprécédente.

��!����9����%&������ �(������* ������ �9��� #'��������#������(�6����F������ ����������00'

3

Rec.herche des sous-dossiers et des fichiers de�����* ���.

���������#����� �%�&�� *������-#'' 3 Si le chemin est un dossier...

����������������9������ * ����#������� /������ �%�&/������ ��'� 3 ...recherche récursive des fichiers à partir de cesous-dossier

�������� �����#����� �%�&����.��#'��� ?���#����� ��''��������������� �� �#����� �%�&'���88

3 ...sinon ajout du fichier d’extension voulue àl’ensemble.

Page 182: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004170

La méthode ������� ��������9������ * ��� est un bon exemple d’utilisa-tion de la récursivité et permet d’obtenir un programme plus simple. Il n’y aaucun danger de débordement de pile car le nombre d’appels récursifs à cetteméthode est limité au nombre de niveaux de sous-dossiers.

L’application suivante demande à l’utilisateur de saisir un dossier derecherche et une extension, et affiche la liste des fichiers correspondants ren-voyés par la méthode ��������9������ * ��� de la classe précédente.

Lire et écrire des données sous forme de fluxEn observant la hiérarchie des classes du paquetage ������, vous serez sansdoute étonné par le grand nombre de classes dévolues à la gestion desentrées-sorties. Leur organisation relève pourtant d’une logique assezsimple. Une fois que vous aurez cerné les différentes façons d’accéder à unesource de données, vous verrez que toutes les classes qui dérivent des classes�������)����$����, �������������$����, �������<�� �� et �������?�����s’utilisent de manière intuitive.

POUR ALLER PLUS LOIN Expressions régulières

Le paquetage ��������������� et un ensemble de méthodes ajoutées à la classe����������$����� dans Java 1.4, comme "���� ����� (����������$����� �����),permettent d’effectuer des recherches dans des chaînes grâce à des expressions régulières. Uneexpression régulière est une chaîne qui décrit un modèle (pattern) ou une famille de textes àl’aide de caractères spéciaux tels que A, G ou 0 pour les plus utilisés. Une expression régulièrepourrait par exemple être utilisée dans la méthode ������ pour rechercher les fichiers qui res-pectent une certaine syntaxe.B http://www.loribel.com/info/memento/regex.html

�������������� ��� ������������� ����� ������ 9������������������ ����������������������������9������� �<��������9������ !����"���� �������� ����#$�����%&���� '��!

Saisie du dossier et de l’extension des fichiersrecherchés.

B ����$������ ����(������������ ��)����*����#����������������������������������������+* ���� ������������,+'�����$����������� ���(������������ ��)����*����#+3���� ���,+'�����9����%&�������� �(������ 9���������������9������ * ������������������������������������������������# ���/������ ��'�

Affiche la liste des fichiers trouvés. B ��������������� ���� ���*����#����/�������� '�����$- �������#6'���88

Page 183: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 171

Mode d’accès aux donnéesComme la plupart des langages informatiques, Java permet d’accéder auxdonnées d’un fichier ou d’une autre source, soit sous la forme d’un flux con-tinu d’informations (stream en anglais), soit dans un ordre quelconque.

Mode d’accès par flux de donnéesLe mode d’accès par flux de données permet de lire ou d’écrire de façonsimilaire des données en provenance ou à destination de différentes sourcesde données comme :• un fichier (classes préfixées par 9���) ;• un tableau d’octets (classes préfixées par H-������-) ;• un tableau de caractères (classes préfixées par ��������-) ;• une chaîne de caractères (classes préfixées par $�����) ;• un pipeline (classes préfixées par ���� ) ;• l’entrée et les sorties standards (champs ����� ��, ��� et �� de la classe

����������$- ��) ; • les sources de données accessibles via un serveur Internet (classes du

paquetage ��������).

Figure 9–1 Hiérarchie des classes de sources de données du paquetage ������

InputStream

FileInputStream

PipedInputStream

ByteArrayInputStream

OutputStream

FileOutputStream

PipedOutputStream

ByteArrayOutputStream

Reader

FileReader

PipedReader

CharArrayReader

Writer

FileWriter

PipedWriter

CharArrayWriter

StringReader StringWriter

RandomAccesFile

B.A.-BA Flux de données

Le mode d’accès par flux de données permet delire ou d’écrire des données du début à la fin d’unfichier, sans possibilité de revenir en arrière.Comme pour l’accès à des informations diffuséesen direct à la radio ou à la télévision, vous deveztraiter au fur et à mesure les informations déli-vrées sous forme de flux de données.

B.A.-BA Pipeline

Les classes préfixées par ���� sont utilisées pourcommuniquer des informations entre deux tâchesou threads à travers un pipeline, toute donnéeécrite d’un côté du pipeline par un thread étantalors automatiquement reçue à l’autre bout par unsecond thread en cours de lecture.

Page 184: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004172

Afin d’interpréter correctement l’encodage des données de type caractère sinécessaire, Java distingue quatre grandes familles de classes :• Les classes qui se terminent par <�� �� ou ?����� sont des sous-classes de

�������<�� �� et �������?����� utilisées pour lire ou écrire des chaînesde caractères.

• Les classes qui se terminent par )����$���� ou ������$��� sont dessous-classes de �������)����$���� et �������������$���� utiliséespour lire ou écrire des informations binaires.

Mode d’accès aléatoireLe mode d’accès aléatoire (random access) permet d’accéder aux données dansn’importe quel ordre. Vous pouvez à tout moment aller en avant ou enarrière pour lire ou écrire une partie des données. Ce mode d’accès est com-parable à celui utilisé pour la mémoire vive (Random Access Memory elleaussi). Il est moins utilisé en Java car certaines sources de données, commeles pipelines ou les sources de données accessibles via un serveur Internet, nepeuvent supporter ce mode d’accès. La classe �������<�� ���� 9���permet de lire et d’écrire dans un fichier dans ce mode d’accès.

Lecture avec les flux de donnéesL’accès en lecture à un flux de données s’effectue grâce aux sous-classes de�������)����$���� et �������<�� ��. Les méthodes de ces deux classesabstraites spécifient les traitements qu’il est possible d’effectuer sur un fluxde données en lecture.

B.A.-BA Encodage des caractères

Comme les systèmes n’utilisent pas tous lesmêmes codes pour représenter chaque lettreaccentuée, Java tient compte de l’encodage utilisésur le système en cours pour interpréter correcte-ment en Unicode chaque caractère d’une sourcede données texte.

REGARD DU DÉVELOPPEUR Pourquoi une telle architecture ?

L’organisation des classes d’accès aux flux dedonnées retenue en Java permet de program-mer les traitements d’accès à un flux de don-nées sans avoir à tenir compte de sa prove-nance ou de sa destination. Les méthodesdes super-classes �������)����$���� et�������<�� �� suffisent pour lire les don-nées d’un flux, tandis que les méthodes desclasses �������������$���� et�������?����� suffisent pour écrire dansun flux de données.

API JAVA Principales méthodes des classes java.io.InputStream et java.io.Reader

Description Classe �������)����$���� Classe �������<�� ��

Lecture d’une donnée (renvoie l’octet ou le caractère lu, ou -Isi la fin du flux est atteinte)

��"����������� #' ��"����������� #'

Lecture dans le tableau en paramètre de "������������ don-nées maximum (renvoie le nombre d’octets ou de caractères lus, ou BI si la fin du flux est atteinte)

��"����������� #"-��%& "�����' ��"����������� #����%& "�����'

Lecture dans le tableau en paramètre de ������ données maximum, en remplissant le tableau à partir de l’indice �� �� (renvoie le nombre d’octets ou de caractères lus, ou BI si la fin du flux est atteinte)

��"����������� #"-��%& "�����/������������������� �� ��/�������������������� ������'

��"����������� #����%& "�����/������������������� �� ��/������������������� ������'

Données disponibles ��"��������������"��#' ��"����"�������� -#'

Fermeture du flux de données ��"������ ��� �#' ��"������ ��� �#'

Page 185: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 173

Ces méthodes sont implémentées dans les sous-classes de �������)����$���� et�������<�� �� pour effectuer le traitement adéquat en fonction de la source duflux de données ; par exemple, la méthode ��� de la classe �������9���<�� ��est implémentée pour lire des caractères en provenance d’un fichier.

Pour accéder à une source de données et lire les informations qu’elle con-tient, il faut donc :1 Choisir la classe qui correspond à la source de données et au type de don-

nées qu’elle contient (binaires ou caractères), par exemple, la classe�������9���<�� �� pour lire les caractères d’un fichier.

2 Créer une instance de cette classe pour initialiser l’accès à la source dedonnées, en passant en paramètre à son constructeur une valeur qui cor-respond au type de source de données, comme le chemin d’un fichierpour la classe �������9���<�� ��.

3 Appeler l’une des méthodes ��� sur cette instance pour lire ses données.4 Appeler la méthode �� � sur cette instance une fois la lecture terminée.

Contrôler les erreurs sur un flux de données avec les exceptionsChaque instruction d’accès à un flux de données (ouverture, lecture ou écri-ture, et fermeture) est susceptible d’échouer pour des raisons diverses commel’interdiction d’accéder à un fichier ou une erreur de disque plein, et les cons-tructeurs et les méthodes des classes décrites ici sont presque tous susceptiblesde déclencher une exception dont la super-classe est �������)�3�������.

API JAVA Constructeurs des classes de lecture de flux de données

L’accès à des donées sur un serveur Web s’effectue quant à lui, grâce à la méthode �������)����$���� ���$����#' de la classe���������J<1, sujet abordé au chapire 12 « Programmation Web avec les servlets, JSP et JavaBeans ».

Source de données Classe Paramètre du constructeur

Fichier texte �������9���<�� �� Une instance de ����������$����� ou de �������9���correspondant au chemin du fichier à lireFichier binaire �������9���)����$����

Tableau d’octets �������H-������-)����$���� Tableau d’octets de type "-�� %&

Tableau de caractères ���������������-<�� �� Tableau d’octets de type ���� %&

Chaîne de caractères �������$�����<�� �� Une instance de ����������$�����

Pipeline texte ����������� <�� �� Aucun paramètre ou l’émetteur du pipeline texte, instance de ����������� ?�����

Pipeline binaire ����������� )����$���� Aucun paramètre ou l’émetteur du pipeline binaire, instance de ����������� ������$����

Page 186: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004174

Comme cette classe est celle d’une exception contrôlée, vous devez donc pro-grammer la ou les instruction(s) d’accès au flux de données dans un bloc ��-suivi du bloc ����� capable de traiter cette classe d’exception, ce qui vousamènera généralement à un programme qui respecte le modèle suivant :

Remarquez que la variable ����1������ doit être déclarée � en dehors dubloc ��- pour pouvoir être utilisée dans le bloc ������- �. Le fait de l’initia-liser à ���� permet de détecter si le flux de données a bien été ouvert,

$%�����������&���&������������1�������(����������-�!�

Instruction d’ouverture du flux de données. B ������1�������(�������&�$%�����������&���&��������#������'�����==�)� ������� � ���������� � ��������� � ������� �� ��K� 8�

Exception déclenchée en cas d’erreur d’accès auflux de données à l’ouverture ou pendant la lec-ture.

B ������#�������)�3����������'!���==�)� ������� ��K������� ������� � L���M ��������� �� ��K� 8

Finalement... B ������-!�����-���!

Si le flux de données a été ouvert... B �������#����1�������C(�����'��

...fermeture du flux de données. B ����������1��������� �#'���8��������#�������)�3����������'��!����==�)� ������� ��K������L������� ����������� ������� �� ��K� ��8�8

REGARD DU DÉVELOPPEUR Exceptions contrôlées et try catch

Ne voyez pas ce style de programmation comme une contrainte mais plutôtcomme une garantie de plus grande robustesse de vos classes. Les langagescomme le C++ ou C# n’ont pas la notion d’exception contrôlée et vous laissent lechoix de programmer l’instruction ��- �����, si vous en avez envie. Toutprogrammeur C++ ou C# qui choisit de faire l’économie du traitement desexceptions peut donc ignorer les erreurs susceptibles de survenir dans son pro-gramme, et créer une application qui fonctionnera correctement... jusqu’aujour où par exemple, le disque dur sera plein ! D’autre part, n’oubliez pas quel’instruction ��- ����� a été conçue initialement pour séparer clairement lesinstructions d’un traitement de celles capables de traiter ses erreurs, pour évi-ter de programmer à la suite de chaque instruction un contrôle vérifiant si elles’est bien déroulée. En comparant le traitement des erreurs d’un programmeécrit en Java avec celui d’un programme écrit en C, langage qui ne reconnaîtpas les exceptions, vous verrez que l’instruction ��- ����� offre un gain declarté incontestable.

Page 187: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 175

����1������ n’étant pas modifiée si l’instruction d’ouverture du flux de don-nées échoue �.

Ce modèle s’applique à toutes les sources de données auxquelles vous accédezsous forme de flux, même celles en mémoire qui ne sont pas censées provo-quer d’exceptions. Le bloc ������- permet d’assurer que le flux de donnéessera bien fermé une fois ouvert, qu’une exception ait été déclenchée ou non.

Par l’exemple : compter le nombre d’occurrences d’un caractère dans un fichierL’application suivante recherche dans un fichier texte saisi par l’utilisateur lenombre d’occurrences d’un caractère (le nombre de fois qu’il apparaît dans cefichier).

ATTENTION Fermeture des fichiers

Même si les flux de données non clos sont bienfermés quand l’objet qui les représente est récu-péré par le ramasse-miettes, prenez l’habitudede fermer un flux de données quand vous n’enavez plus besoin.

EXEMPLE com/eteks/outils/CalculOccurrencesCaractere.java�������������� ��� ������������� ����������������������������A���� ����������������� ���������!����"���� �������� ����#$�����%&���� '��!����<�� �������9�������(������������-����!

������$�����������9�������(������������ ��)����*����#+9�������,+'����������������������(������������ ��)����*����#��������������������������������������+������5�66�N���,+'�������#6'�

3 Saisie du fichier et du caractère recherché.

����������9�������(�����9���<�� ��#�����9������'�������������������� �(�6��������������������� �������!

3 Ouverture du fichier saisi.

����������(�����9���������� #'��������������#��((����������'��������������������� 00�������8

3 Lire un caractère...

������������#��C(�BI'��� 3 ...tant que la fin du fichier n’est pas atteinte.

����������������� ���� ���*����#����/���������+:+�0�����������0�+:�����5�66�7�+����������0���������� �0�+��� � �� �+�0������9������'�����8����������#)�3����������'�����!����������������� ���� ���*����#����/���'�����8����������-�����!

3 Affichage du résultat de la recherche.

Page 188: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004176

Écriture avec les flux de donnéesL’écriture sur un flux de données est très similaire à la lecture d’un flux dedonnées : elle s’effectue grâce aux sous-classes de �������������$���� et�������?�����. Les méthodes de ces deux classes abstraites spécifient lestraitements qu’il est possible d’effectuer sur un flux de données en écriture.

��������-�������!

Fermeture du fichier s’il a été ouvert. B �����������#����9�������C(�����'��������������9��������� �#'�������8������������#�������)�3����������'������!����������������$����;����#'�������8����8����$- �������#6'���88

Figure 9–2 Application de classe ������ ��� ������������������ ���������

ATTENTION Entier renvoyé par la méthode read

Le type de la valeur renvoyée par la méthode ��� #' � de lecture d’un flux est de type ��� etnon de type "-�� pour les flux binaires ou ���� pour les flux de caractères, comme cela semble-rait plus logique. La valeur renvoyée représente en fait, soit la donnée lue, soit la valeur -I detype ��� si la fin du flux est atteinte. Pour effectuer un test correct dans la condition d’arrêt de laboucle de lecture �, il faut conserver la valeur lue dans une variable de type ��� � et sinécessaire, ne convertir cette valeur en type "-�� ou ���� qu’au moment du traitement sur lavaleur lue �.

Page 189: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 177

Pour écrire un flux de données, il faut donc :1 Choisir la classe qui correspond à la destination des données et au type

de données envoyées (binaires ou caractères), par exemple, la classe������������� � pour écrire des caractères dans un fichier.

2 Créer une instance de cette classe pour initialiser l’accès à la destinationdes données, en passant en paramètre à son constructeur une valeur quicorrespond au type de la destination, comme le chemin d’un fichier pourla classe ������������� �.

3 Appeler l’une des méthodes ��� sur cette instance pour écrire les données.4 Appeler la méthode ��� sur cette instance une fois l’écriture terminée.

API JAVA Principales méthodes des classes java.io.OutputStream et java.io.Writer

Description Classe ���������� �� � ��� Classe ����������� �

Écriture d’une donnée ou d’un tableau de données (binaires ou caractères)

�������������� ��� ��

�������������� ��� �� ������

�������������� �� �� ��

�������������� ��������!�� ���! � ��

�������������� �� ���� ������

Écriture des données en tampon �������������� �� �������������� ��

Fermeture du flux de données ���������������� ����������������

API JAVA Constructeurs des classes d’écriture de flux de données

Destination Classe Paramètre du constructeur

Fichier texte ������������� � Une instance de �������!�� ���! ou de ���������� correspondant au chemin du fichier à écrireFichier binaire ������������ �� � ���

Tableau d’octets ��������"� #������ �� � ��� Aucun paramètre ou la taille initiale du tampon

Tableau de caractères ��������$ ��#������� � Aucun paramètre ou la taille initiale du tampon

Chaîne de caractères ��������� ���!��� � Aucun paramètre ou la taille initiale du tampon

Pipeline texte ��������%������ � Aucun paramètre ou le récepteur du pipeline texte, ins-tance de ��������%���&���

Pipeline binaire ��������%����� �� � ��� Aucun paramètre ou le récepteur du pipeline binaire, instance de ��������%���'��� � ���

Page 190: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004178

Les constructeurs des classes ������������� � et ������������ �� � ���créent le fichier reçu en paramètre s’il n’existe pas, ou écrasent ce fichier s’ilexiste déjà. Ces deux classes ont aussi des constructeurs avec un second para-mètre booléen ����� : si ����� est égal à ��, ces constructeurs n’écrasentpas un fichier existant mais ouvrent ce fichier pour y écrire à la fin.

Les classes ��������"� #������ �� � ���, ��������$ ��#������� � et��������� ���!��� � sont en fait des tampons (buffers en anglais) d’octetsou de caractères qui se remplissent à chaque appel à la méthode ��� . Leurméthode respective �"� #����, �$ ��#���� et �� ���! permet d’obtenirles octets ou les caractères mémorisés.

Filtrage des données d’un fluxL’architecture des classes du paquetage ������� est très pratique d’utilisationcar elle permet par exemple de créer des méthodes de traitement qui peuventaccéder à n’importe quelle source de données grâce à une référence de classe��������'��� � ��� en paramètre. Mais les méthodes de cette classe et destrois autres super-classes de flux de données ont un intérêt limité : elle per-mettent de lire ou d’écrire un ou plusieurs octet(s) ou caractère(s), mais neproposent pas certains des traitements les plus classiques sur les données,comme la lecture de texte ligne par ligne, ou le traitement des données d’untype primitif autre que �� ou � ��. Ces traitements sont proposés par uneseconde catégorie de classes qui dérivent aussi de ces classes : les classes defiltrage du paquetage �������.

Similairement aux classes de gestion de flux de données, l’identificateurd’une classe de filtrage est construit avec le type de flux de données qu’ellepeut filtrer en lecture ou en écriture, précédé par le type de filtre appliqué àce flux :• filtre gérant la sérialisation d’objets (classes préfixées par ���� ) ;• filtre gérant un tampon en mémoire sur le flux (classes préfixées par

"�����) ;• filtre gérant les données binaires d’un type primitif autre que �� (classes

préfixées par (� �) ;• filtre gérant l’écriture de données au format texte dans un flux (classes

préfixées par %��� ) ;• filtre gérant les retours en arrière pendant la lecture d’un flux (classes pré-

fixées par %�� ���)) ;• filtre gérant l’encodage des caractères des flux de données binaires (clas-

ses ��������'��� � ���&��� et ���������� �� � ������ �) ;• filtre gérant la compression et la décompression des données d’un flux

(classes préfixées par *��, +*'% et ,�� dans les paquetages ������ ��-�� et������ �����).

B.A.-BA Sérialisation et interface java.io.Serializable

La sérialisation permet d’écrire et de lire un objet surun flux de données. Un objet Java ne peut être séria-lisé que si sa classe et les classes des objets qu’ilmémorise (directement ou indirectement) implémen-tent l’interface �������������-��. Cetteinterface qui ne contient aucune méthode permetd’autoriser la sérialisation des objets d’une classe ;elle est implémentée par toutes les classes d’embal-lage, la classe �������!�� ���!, les classesrelatives à la gestion des dates et les classes de col-lection.

B.A.-BA Mémoire tampon

La mémoire tampon des classes préfixées par"����� est un tableau interne utilisé pour opti-miser l’accès à certaines sources de donnéescomme les fichiers. Au lieu de lire ou d’écrire unedonnée octet par octet, les filtres de ce type lisentou écrivent des données bloc par bloc en utilisantcette mémoire tampon.

Page 191: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 179

Chaque constructeur des classes de filtres prend en paramètre un flux dedonnées sur lequel est appliqué un filtre. Ce paramètre est de la même classeque le suffixe d’une classe de filtre (à l’exception des classes��������'��� � ���&��� et ���������� �� � ������ �, qui prennent enparamètre un flux de classe ��������'��� � ��� ou ���������� �� � ���).Par exemple, le constructeur de la classe ��������(� �'��� � ��� prend enparamètre un flux de données de classe ��������'��� � ���. Comme la con-version de référence vous permet de lui passer une instance de n’importequelle sous-classe de ��������'��� � ���, vous pourrez utiliser cette classepour lire des données binaires à partir de n’importe quelle source de donnéeset même cumuler les filtres les uns derrière les autres.

Figure 9–3 Hiérarchie des classes de filtrage de données du paquetage �������

InputStream OutputStream

Reader Writer

ObjectInputStream

FilterInputStream

BufferedInputStream

DataInputStream

PushbackInputStream

ObjectOutputStream

FilterOutputStream

BufferedOutputStream

DataOutputStream

PrintStream

InputStreamReader

FilterReader

PushbackReader

BufferedReader

LineNumberReader

OutputStreamWriter

FilterWriter

BufferedWriter

PrintWriter

Page 192: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004180

L’extrait de code de la figure 9-4 montre par exemple comment cumulerdeux filtres pour lire un nombre de type � �� à partir d’un fichier, dontl’accès est optimisé avec une mémoire tampon. L’appel à la méthode���� �� � sur l’instance de ��������(� �'��� � ��� va provoquer parenchaînement deux appels à la méthode ��� � sur l’instance de��������"�����'��� � ��� pour lire les deux octets du nombre et un appelà la méthode ��� � sur l’instance de ����������'��� � ��� pour remplirle tampon à partir du fichier.

Comme les classes de filtres ont principalement pour but de fournir desfonctionnalités supplémentaires sur la lecture ou l’écriture de données d’unflux, elles définissent pour la plupart un ensemble de méthodes en complé-ment de celles de leur classe de base.

Par exemple, la méthode ��� ���� de la classe ��������

���� �� �� � ��� sérialise un objet en écrivant dans le flux de sortie toutesles valeurs de ses champs ainsi que celles des champs des objets qu’il mémo-rise. Ceci permet ensuite de recréer en un seul appel à ������� �le mêmeobjet à la lecture du flux de données filtré avec une instance de������������ '��� � ���.

Figure 9–4 Enchaînement de filtres sur un flux de données

InputStream fluxLecture = new FileInputStream(cheminFichier);

InputStream fluxAvecTampon = new BufferedInputStream(fluxLecture);

DataInputStream fluxDonnees = new DataInputStream(fluxAvecTampon);

short nombre = fluxDonnees.readShort(); // etc...

Instance de FileInputStream

011001001001...

Fichier contenant desinformations

binaires

Instance de BufferedInputStream

01…

2047

Mémoire tampon de 2048 octets

Instance de DataInputStream

2 octets d'un short

nombre de type short

readShort�

read�

read

POUR ALLER PLUS LOIN Contrôler la sérialisation d’un objet

La façon dont un objet est écrit ou lu par sérialisa-tion peut être éventuellement modifié en ajoutantles méthodes ��� ���� et ������� à saclasse (voir la javadoc de la classe ������������ �� �� � ��� pour plus d’informa-tions).

Page 193: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 181

API JAVA Principales méthodes des classes de filtres

Les méthodes de lecture des classes ������������ '��� � ��� et ��������(� �'��� � ��� déclenchent une exception de classe��������.��./�� ��� si la fin du flux est atteinte.

Description Classe Méthode

Lecture d’un objet sérialisé ou d’une valeur de type primitif

������������ '��� � ��� �������������!����� �������� �����������������"������������� ������$ ������������ ����"� ��

...et ainsi de suite pour tous les types primitifs

Sérialisation d’un objet ou écriture d’une valeur de type primitif

������������ �� �� � ��� ����� ���� ��� ���� ��������!����� ������������������ "���������� ����������������� $ ����� ����������������� "� ��� ���

...et ainsi de suite pour tous les types primitifs

Lecture d’une valeur de type primitif ��������(� �'��� � ��� ���������������"������������� ������$ ������������ ����"� ��

...et ainsi de suite pour tous les types primitifs

Écriture d’une valeur de type primitif ��������(� ��� �� � ��� �������������� "���������� ����������������� $ ����� ����������������� "� ��� ���

...et ainsi de suite pour tous les types primitifs

Lecture d’une ligne (renvoie �� à la fin du flux)

��������"�����&��� �������������!�� ���!����0����

Écriture d’un retour à la ligne ��������"�������� � �������������0����

Écriture de données au format texte (aucune de ces méthodes ne déclen-che d’exception)

��������%��� � ���

��������%��� ��� �

���������������� ��������!�� ���!�������������������� ��������!����� �������������������� �������������������������� �� ���������������������� ��� ����

...et ainsi de suite pour les types ��!, ��� et ����+ les mêmes méthodes avec ���� � au lieu de ����

Manipulation du numéro de ligne ��������0��1����&��� �������� �! 0��1������������������ 0��1������� ��1�����

Page 194: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004182

Par l’exemple : éliminer les commentaires d’un programme JavaEn utilisant la logique des filtres, vous pouvez créer et utiliser vos propres fil-tres sur des flux de données en créant une sous-classe d’une des classes���������� �'��� � ���, ���������� ��� �� � ���, ���������� �&���

ou ���������� ���� �, puis en redéfinissant ses méthodes ��� ou ��� .La classe suivante permet de filtrer un flux de données en éliminant lescommentaires 22 et 23 32 du texte lu :

JAVA 5.0 Pour les nostalgiques de printf

Dans Java 5.0, plusieurs méthodes ont été ajoutées aux classes existantes pour construiredes textes de la même façon qu’avec les fonctions ���� � du langage C. Les plus utilessont la méthode ���� � de la classe ��������%��� � ��� (classe du champ �� de�������!���� �) et la méthode de classe ����� de la classe �������!�� ���!.Comme pour ���� � et ����� � en C, elles prennent en paramètre une chaîne de forma-tage suivie de la liste des valeurs à formater. La syntaxe à utiliser pour la chaîne de forma-tage est décrite dans la documentation de la nouvelle classe ������ ������� �, àlaquelle ces méthodes font appel. Exemple :

���)�!����� )�� � 4�����%����� �!5��������� � ��������������������!�� ���!������!����5������ ������� �!�6�784������ ������6�94��������� ���� � �6������� �!�2�788��3�����4����22�#���� ��7<#��#�#8#7=�7������� ���� ����� ���:;�;;���;��;��;�<�:=������������� �!=�����=�:6:=���� � �4��>>

Java 5.0 comporte aussi la nouvelle classe ������ �������� utilisée pour lire des don-nées formatées à partir de l’entrée standard ou de toute autre source de données.

EXEMPLE com/eteks/outils/FiltreCommentaires.java���)�!����� )���� ��4����� ���������34233�3�$������ ��� � ����������� �����23� �22��?�����/�������� @����32������������� �$���� �����/ ������ �&���5

Champ utilisé pour mémoriser le caractère quisuit le caractère barre oblique /.

B ������� ��� ������ ������� �6�A74������� �� � ���� ���&.B�C&D#D0#D0'+1.�6���������������� ��! %���� ��:�������� ��:��� ��# �8�4

Constructeur repassant le flux en entrée à lasuper-classe ���������� �&���.

B ���������� �$���� ������&������/0� �����5������������/0� ���4��>

Page 195: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 183

���������� �������� �����'�./�� �����5������ ��4

3 Redéfinition de la méthode ��� éliminant lescommentaires des caractères renvoyés.

�������� �������� ������� �66�A7���������6�����������4����������5��������6� �������� ������� 4������ �������� ������� �6�A74����>

3 Récupération du caractère suivant.

����������66�?2?�����������5�������� ������ ������� �6�����������4��������� � ������� ������� �������5������������?2?�E���6������$���� ������ ��� ���4����������������������)4������������?3?�E���6������$���� ������ . �����4����������������������)4

3 Si le caractère est une barre oblique, lecture ettest du caractère suivant.

������������ ��E� �������� ������� �6������ ������� 4����������������������)4������>����>������� �����4��>

3 Si les deux caractères lus ne sont pas le débutd’un commentaire, le caractère suivant estmémorisé pour le prochain appel à ���.

���������� ������ ����������=��� ����� =��� ��! ������������������������������������������ �����'�./�� �����5

3 Redéfinition de la méthode ��� utilisant untableau de caractères.

������ ���6������4 3 Lecture du prochain caractère.

����������66�A7�������� ����A74

3 Si la fin est atteinte, on renvoie A7.

������ ���6����� 4����������5�������������FF��6��� ����4��������6������4����>����� �����G��! �HH���I6�A7�4

3 Remplissage du tableau à partir de l’indice���� .

����� ������A����� 4��>������� ��� ������$���� ������ ��� ���� �����'�./�� �����5

3 Renvoie le nombre de caractères lus.

������ ��4��������������6�����������4����� �����I6�A7�HH���I6�&.B�C&D#D0#D0'+1.�4����� �����4��>������� ��� ������$���� ������ . ������ �����'�./�� �����5������ ��4

3 Lecture de tous les caractères jusqu’au premiercaractère de retour à la ligne.

Page 196: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004184

Les méthodes ���, �����$���� ������ ��� , �����$���� ������ . ��ne traitent pas dans un bloc �� �� � les exceptions de classe��������'�./�� ��� que peuvent déclencher les appels à ���. Si une erreursurvient, ces méthodes laisseront se propager l’exception lancée dans la piled’exécution, ce qui est exprimé par la clause ���� qui suit leur déclaration.

L’application suivante utilise la classe de filtres ���� )���� ���

�� �$���� ���� pour supprimer les commentaires d’un fichier textechoisi par l’utilisateur. Le résultat est sauvegardé dans un second fichier.

Lecture de tous les caractères jusqu’auxcaractères 32.

B ����������5������������������6�����������4������� �����I6�A7�HH���I6�?3?�4��������6�����������4����>����� �����I6�A7�HH���I6�?2?�4����� ��������������4��>>

EXEMPLE com/eteks/test/SuppressionCommentairesFichier.java���)�!����� )�� � 4����� ����� )���� ����� �$���� ����4����� �����/�����!�,�� ���%��4����� ���������34���������������$���� ������� ��5��������� � �������������� ���!�����!����5����&������/0� ���6���4������� ����/.��� ���6���4���� ������5

Saisie du fichier à filtrer. B ������� ���!�� ������ ���6�,�� ���%���� ��'��� (���!�����������������:��� ���J�888��� ���E:�4

Saisie du fichier de sauvegarde du filtrage avecproposition d’un nom par défaut.

B ������� ���!�� ������ ������!����6�,�� ���%���� ��'��� (���!�����������������:��� ���������!����E:=�� ������ ���F�:� / :�4

Ouverture des fichiers dont l’accès est optimiséavec une mémoire tampon. Le filtre sur les com-mentaires est appliqué sur le fichier en lecture.

B ��������/0� ����6������ �$���� ��������������������������������"�����&�����������������������������������&������ ������ �����4��������/.��� ���6����"�������� ����������������������������������� ���� ������ ������!�����4

Recopie filtrée du contenu du fichier en lecturedans le fichier en écriture.

B ������������� ���6���/0� ��������4���������������I6�A74��������������6���/0� �������������������/.��� ������ ���4����>

Page 197: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 185

Par l’exemple : compter les lignes de code d’un ensemble de fichiers JavaLa dernière application de ce chapitre utilise la classe ���� )���� ����� �$���� ���� et la méthode de la classe � �� ���� ���(����� de laclasse ���� )���� ����� ����� �� pour compter le nombre de lignes decode d’un ensemble de fichiers Java, hors lignes vides et lignes de commen-taires.

������ � ��'�./�� ����/�����5������,�� ���%���� ��K���!(���!���=�/�4����>�������������5������ ��������5

��������������/.��� ���I6����������������/.��� ��������4��������������/0� ���I6����������������/0� ��������4������>�������� � ����������'�./�� ����/�������5��������/����� � ��)B�����4������>����>������� ��/� �8�4��>>

3 Fermeture des fichiers.

ASTUCE Réutiliser le résultat d’une affectation

Comme en Java une affectation est une expression qui renvoie la valeur affectée à la variable, laboucle ��� � de lecture caractère par caractère est souvent programmée ainsi :��� ��� �4����6���/0� ����������I6�A74������/.��� ������ ���4

EXEMPLE com/eteks/test/CalculLignesDeCode.java���)�!����� )�� � 4����� ����� )���� ���34����� �����/�����!�,�� ���%��4����� ���������34�����$���0�!��($��5��������� � �������������� ���!�����!����5���� ������5

B.A.-BA Métrique

Le nombre de lignes de code d’un programme per-met d’avoir un ordre d’idée sur sa taille. Ce métriqueest un indicateur parmi d’autres, qui aide à mesurerla complexité et la qualité d’un programme.

Figure 9–5 Application ���� )�� � �$���0�!��($��

Page 198: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004186

Le filtre de classe ��������"�����&��� est utilisé ici deux fois à chaquelecture d’un fichier : • une première fois sur l’instance de la classe ����������&��� � pour

optimiser l’accès au disque avec une mémoire tampon ;• la seconde fois en aval du filtre sur les commentaires � pour lire ligne

par ligne le fichier grâce à la méthode ���0�� que propose la classe��������"�����&���.

Saisie du dossier des fichiers recherchés. B ������� ���!��������6�,�� ���%���� ��'��� (���!������������������������������������:(���������� �� �E:�4

Recherche des fichiers ����� dans le dossiersaisi.

B ��������������� ����6��� ����� ���� �� ���� ���(���������������������������������������������������������=�:�����:�4

Décompte du nombre de lignes de code pourchaque fichier.

B �������� ������0�!��$��B� ��6�84������������� ���6�84���G���� �����! 4��FF��������������0�!��$��B� ��F6����� �0�!��($������ �������4

Affichage d’un message résumant le nombre delignes de code trouvées.

B ������,�� ���%���� ��K���!(���!���=���������������0�!��$��B� ��F�:��!����������������:�����������F���� �����! �F�:���� ������������������J�:�����������F����������������! $�������%� ������������F�:J�� �����!�������� ������ �����:�4����>������ � ��'�./�� ����/�����5������,�� ���%���� ��K���!(���!���=�/�4����>������� ��/� �8�4��>

Renvoie le nombre de lignes de code du fichieren paramètre.

B ��������� � ����� ����� �0�!��($������� ������ ������������������������������������������������� �����'�./�� �����5����"�����&������/0� ���6���4����� ��������5�������� ������0�!��$���6�84

Ouverture du fichier avec un filtre sur les com-mentaires.

B ��������/0� ���6����"�����&��������������������������������� �$���� ��������������������������������"�����&�������������������������������������&������ ������ ������4

Lecture ligne par ligne du fichier. B ������������ ���!��!��6���/0� ������0����4������������!��I6���4������������!��6���/0� ������0�����

Incrémentation du nombre de lignes si la lignelue sans espace de début et de fin n’est pas vide.

B �������������!�� �������! ���L�8����������������0�!��$��FF4������� ���������0�!��$��4����>���������������5

Fermeture du fichier, qu’une exception survienneou non.

B ������������/0� ���I6��������������/0� ��������4����>��>>

Page 199: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

9 –

Lect

ure

et é

critu

re d

e fic

hier

s

© Groupe Eyrolles, 2004 187

L’utilisation de �� ����� � � dans la méthode ���� �0�!��($�� permetd’assurer finalement la fermeture du fichier ouvert, que cette méthode pro-voque des erreurs à l’exécution ou non. Si une exception est déclenchée, lebloc ����� sera exécuté, puis l’exception sera propagée dans la pile d’exécu-tion jusqu’au premier �� � capable de l’intercepter, la méthode���� �0�!��($�� ne renvoyant pas de valeur dans ce cas.

Configurer une applicationJava offre différents moyens pour personnaliser une application en fonctiondes préférences ou de la langue de l’utilisateur, sans avoir à écrire plusieursversions de ses classes. Toutes les informations personnalisables s’obtiennentalors indirectement à partir de fichiers de configuration qui contiennent unensemble de couples (clé, valeur), chaque clé choisie à l’avance permettant deretrouver la valeur qui lui est associée.

Fichiers de traductionLes textes, comme les messages ou les titres, qui ont besoin d’être traduitssont mémorisés dans des fichiers ������ �� citant chaque couple(clé,valeur) en les séparant par un signe 6 : ����!"�����6"�����.

Le simple fait de nommer ces fichiers en fonction de la langue des textesqu’ils contiennent, permet à la classe ������ ��&�����"��� de lire lefichier qui correspond à la langue de l’utilisateur en cours.

Par exemple, voici les instructions à programmer pour récupérer la chaîne declé ����!"����� à partir d’un fichier ������ �� préfixé par ����!� :

Si vous créez un fichier ����!�D�������� �� qui contient la valeur de laclé ����!"����� en français :� ����!"�����6"�����, la variable����!"����� désignera la chaîne :"�����: pour tout utilisateur fran-cophone. Si vous voulez que cette variable désigne par défaut :����: pourles utilisateurs non francophones, il suffit de fournir un fichier par défaut����!������� �� qui décrit la valeur de la clé ����!"����� :����!"�����6����.

Ce système permet de fournir les traductions des textes d’une applicationdans différentes langues, mais aussi d’ajouter aisément la prise en charge denouvelles langues à une application existante. Pour décrire la version alle-mande de la valeur de la clé ����!"�����, il suffit de créer le fichier����!�D������� �� contenant ����!"�����6�������.

&�����"���������6�&�����"����! "����:����!�:�4� ���!�����!"������6������! � ���!�:����!"�����:�4

À RETENIR Filtres avec mémoire tampon

Accédez aux fichiers aussi souvent que possibleavec une mémoire tampon grâce aux classes de fil-tres préfixées par "�����. Ce filtre optimisefranchement la vitesse d’accès au disque : dansl’application de classe ���� )�� � �$���0�!��($��, la seule présence de cefiltre permet d’obtenir une application deux à troisfois plus rapide !

POUR ALLER PLUS LOIN Classe java.util.Properties

La classe ������ ��%���� �� permet ausside manipuler un ensemble de propriétés textuellessous forme de couples (clé, valeur). La lecture etl’enregistrement d’un ensemble de propriétés dansun fichier, ou un autre type de flux, s’effectue aveccette classe grâce aux méthodes ��� et � ��.

Page 200: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004188

Les fichiers ������ �� lus avec la classe à la classe &�����"��� doiventêtre rangés dans un des dossiers ou des fichiers ���� du ������ de la JVM.

Fichiers de préférencesLes informations relatives à chaque utilisateur, comme les options qu’il a choi-sies dans une application, sont mémorisées dans des fichiers de préférencespropres à chaque système d’exploitation. Les méthodes préfixées par ! et �� de la classe ������ �������%������ s’utilisent pour lire et écrire lesvaleurs de chaque couple (clé, valeur) de ces fichiers. Pour éviter les conflitsentre clés de même nom dans différentes applications, cette classe proposede manipuler un ensemble de préférences relativement à un paquetage. Cecis’exprime par la méthode de classe ���1�����%��)�! ��������!�$��� ��,recommandée pour obtenir une instance de la classe %������. Parexemple, l’instruction suivante récupère les préférences de l’utilisateur rela-tives au paquetage ���� )�� � de la classe ���� )�� � �1���!� �� :

La lecture et la modification de la préférence de clé ��!#���� du paque-tage ���� )�� � se font alors simplement ainsi :

Le second paramètre des méthodes ! représente la valeur par défaut de lapréférence recherchée.

En résumé...Ce chapitre vous a présenté les classes qui permettent de lire, d’écrire et defiltrer les informations de flux de données. Retenez que l’utilisation judi-cieuse de l’héritage par les classes d’entrée/sortie de la bibliothèque Java offreun moyen simple et unifié d’accès aux données, que celles-ci proviennentd’un fichier, d’un serveur sur Internet ou d’autres sources de données.

%��������������B� �6���%����������1�����%��)�!������ )�� � �1���!� ��������4

22�0� ���������M�M������!#����� ���!���!#�����6����������B� �! �:��!#����:=: �E22����!��!���2:�4

22��������?��������������!#�����6���,�� ���%���� ��'��� (���!�:%�!��?������E:=���!#�����422�K������� ����������M�M������!#�����������B� ��� �:��!#����:=���!#�����4

B.A.-BA Préférences

Chaque système stocke les préférences à sa façon :base de registres sous Windows, fichiers XML sousLinux et fichiers ���� du dossier de préférencessous Mac OS X.

SOUS WINDOWS Accéder à toute la base de registres

La classe ������ ������%������ nepermet d’accéder qu’aux préférences des program-mes Java dans la base de registres de Windows. Sivous désirez accéder à toute la base de registres,vous devrez passer par des solutions tiercescomme JNIRegistry.B http://www.trustice.com/java/jnireg/

Page 201: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

10Interfaces utilisateur avec Swing

SOMMAIRE

B Index visuel des composants Swing

B Mise en page des composants

B Gestion événementielle

B Création d’applets

MOTS-CLÉS

B SwingB layoutB JPanelB ActionEventB listenerB JTableB JApplet

Les composants Swing permettent de créer des interfaces utilisateur évoluées et interactives. Nous allons voir comment les disposer dans une fenêtre et les coupler à des traitements, aussi bien pour des applications que pour des applets.

Bouton Nouveau tirage

Événement d’action

Listener du bouton

Système de gestion

événementiel

Page 202: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004190

Composants d’interface utilisateurLe paquetage ��������� contient les classes utilisées pour construire uneinterface utilisateur graphique.

Une interface utilisateur Swing est un assemblage de composants (compo-nents en anglais) affichés dans une fenêtre ou un autre type de conteneur(container). L’utilisateur actionne ces composants pour piloter un pro-gramme. Nous présentons figure 10-1 l’ensemble des composants et descontainers disponibles dans la bibliothèque standard Java. Les deux imagesfigurant au centre sont les captures d’écran de l’application « Carnetd’adresses » et de l’applet « Calcul d’emprunt » qui sont l’une et l’autre déve-loppées dans ce chapitre.

B.A.-BA Interface objet vs interface utilisateur

L’interface d’un objet expose la liste des méthodesqu’un programmeur peut appeler, comme nousl’avons vu dans les chapitres précédents ; l’inter-face utilisateur d’une application expose à l’écrandes composants qu’un utilisateur actionne pourpiloter l’application. On parle aussi bien d’interfaceutilisateur que d’interface homme-machine (IHM),et en anglais, GUI (Graphical User Interface).

Figure 10–1 Composants et conteneurs de Swing

Utilisation

Composants arbre et tableau

Classe

JTree Arbre hiérarchique

JTable Tableau capable d'afficher différents types de données éditables ou non

Conteneurs intermédiaires

Utilisation

JToolBar Barre d'outil dockable (peut se décrocher et se raccrocher)

JTabbedPane Panneau à onglets

JSplitPane Panneau partagé verticalement ou horizontalement

JScrollPane Panneau à ascenseurs

JLayeredPane Panneau multicouche

JDesktopPane Panneau des fenêtres internes MDI

JRootPane Panneau principal d'une fenêtre

JPanel Panneau vide utilisé pour la mise en page des composants à l'écran

Composants de menus

Utilisation

JMenuBar Barre de menu

JMenu Menu

JMenuItem Elément de menu

JCheckBoxMenuItem Elément de menu coché

JRadioButtonMenuItem Elément de menu radio

JPopupMenu Menu contextuel

Composants de présentation

Classe UtilisationJLabel Label (texte brut ou mis en forme

si le texte commence par la balise <html>) ou icône

JToolTip Info bulle affichée au survol d’un composant.

JSeparator Séparateur

JProgressBar Barre de progression

JFrame Fenêtre avec barre de titre et bords

JWindow Fenêtre sans décoration utilisée pour l'écran d'accueil d'une application

JDialog Boîte de dialogue modale (bloquant l'application) ou non modale

JInternalFrame Fenêtre interne d'une application MDI(Multiple Document Interface)

JApplet Applet Swing intégrée à un navigateur Internet

Boîtes de dialogues standards

Utilisation

JColorChooser Dialogue de choix de couleur

JFileChooser Dialogue de choix de fichier

JOptionPane Dialogues standards (message, confirmation, saisie simple)

Composants de saisie

Classe Utilisation

JTextField Champ de saisie simple

JPasswordField Champ de saisie pour les mots de passe

JTextArea Champ de saisie multiligne

JFormattedTextField Champ de saisie pour les nombres et les dates (Java 1.4)

JEditorPane Texte formaté (HTML ou RTF)

JTextPane Texte avec feuille de styles de mise en forme

Composants de choix

JButton Bouton

JCheckBox Boîte à cocher

JRadioButton Bouton radio

JList Liste de valeurs

JComboBox Choix dans une liste déroulante

JSpinner Toupie -/+ (Java 1.4)

JSlider Choix de valeur avec glissière

JScrollBar Ascenseur

Classe Utilisation

Classe Classe

Classe Utilisation

Classe

Conteneurs fenêtres

Page 203: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 191

Mise en page des composants avec les layoutsPour faciliter la portabilité et la traduction d’une application Java, la positionet les dimensions des composants Swing ne sont pas spécifiées en coordon-nées pixel, mais plutôt grâce à des positions logiques spatiales (par exempleen haut, à droite, dans la première cellule d’une grille...).

Chaque conteneur détermine la position et les dimensions des composantsqu’il contient grâce à son gestionnaire de mise en page associé (layout enanglais), chaque classe de gestionnaire respectant une règle de mise en pagedéfinie à l’avance. Bien que le gestionnaire par défaut des classes des fenêtres et des boîtes dedialogue convienne quelquefois, il est souvent nécessaire de changer le ges-tionnaire de leur panneau intérieur, grâce à la méthode �� ����� . Le layoutpassé en paramètre à cette méthode est généralement une instance d’une desclasses ��������� , ����������� ou �������� du paquetage ������� . Une fois le layout du panneau intérieur d’une fenêtre déterminé, chacun descomposants est ajouté à ce panneau au moyen d’une des méthodes ��� de lasuper-classe des conteneurs ������� ��� ���.

Agencer les composants les uns à la suite des autres (java.awt.FlowLayout)La classe ������� ���������� dispose les composants du conteneur qui luiest associé les uns derrière les autres, à leur taille optimale (preferred).Chaque composant est ajouté à son conteneur avec la méthode ���. Si leconteneur n’est pas assez large, les composants sont mis sur plusieurs lignes.

Figure 10–2 Évolution de la disposition des composants d’un conteneur utilisant un layout de classe ������� ����������

B.A.-BA Taille « optimale » d’un composant

La mise en page des composants d’un conteneur est calculée par le gestionnaire (layout) enfonction des dimensions optimales des composants. Ce calcul est fait pour chaque composantpour garantir qu’il est correctement dimensionné. La taille obtenue est renvoyée par la méthode�� ������������, en pixels, et varie d’un composant à l’autre. Par exemple, le calcul de lataille d’un label se fait en fonction de la longueur du texte qu’il contient et de la police de carac-tères utilisée ; dans le cas d’un champ de saisie, c’est le nombre de colonnes spécifié lors de sacréation qui est déterminant.

ASTUCE SwingSet2, la démo incontournable

La démo SwingSet2 fournie avec le JDK offre unbon aperçu des vastes possibilités de Swing. Ellefigure dans le sous-dossier �������������� du dossier d’installation du JDK. SousMac OS X, elle doit se situer dans le dossier �!�����"���#���"����$����$�������� si vous avez installé les outils dedéveloppement fournis avec le système. Double-cli-quez simplement sur le fichier ����� ����pour lancer la démo car ce fichier ���� contient lefichier manifeste %#&'()*��%'*)�#�&�%� préci-sant la classe de l’application à lancer.

JAVA Hiérarchie des classes : Swing et AWT

Les classes Swing sont toutes basées sur les classes������� ����"�� et ������� ��� ���qui datent de la première version de composantsgraphiques de Java AWT (Abstract Window Toolkit).Bien qu’AWT ne soit pas obsolète, il vaut mieuxconstruire une interface utilisateur avec les compo-sants Swing, bien mieux dotés en fonctionnalités.

ATTENTION Affichage des composants

Il ne suffit pas de créer un objet d’une classe decomposant Swing pour qu’il apparaisse àl’écran. Si un composant que vous avez créén’apparaît pas à l’écran comme prévu, vérifiezqu’il a bien été ajouté à sa fenêtre.

Page 204: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004192

Par l’exemple : afficher des champs de saisie et leurs labelsL’application de classe ����� �+�� �� ��������������%� !������ crée unefenêtre utilisant un layout de classe ������� ���������� qui aligne les com-posants sur la gauche du panneau intérieur de la fenêtre.

Quatre composants sont ajoutés à la fenêtre dans l’ordre de leur apparition àl’écran �. Par défaut, une fenêtre n’a pas de taille (seule la barre de titreapparaît) ; la méthode "��+ est donc ensuite appelée � pour calculer la taillepréférée de la fenêtre avant qu’elle ne soit affichée �.

EXEMPLE com/eteks/test/SaisiePseudonymeMotDePasse.java"��+���,����� �+�� �� -�"�� ,����������.-�"�� ,������� �.-�����,�������������%� !������/,,"�0��,� � �,���,��1� ��,23,����4,,/

Création d’une fenêtre de titre Identification. B ,,,,$�����,��� ��,5,��,$�����,16)�� ��� �64-

Récupération du panneau intérieur de la fenêtre. B ,,,,�� ���,"����,5,��� ����� �� � ���14-

Utilisation d’un gestionnaire de layout��������� avec un écart de 5 pixels entre lescomposants alignés sur la gauche.

B ,,,,"������� ����� ,1��,��������� ,1��������� ��#�&7,87,844-

Ajout de 2 labels, d’un champ de saisie et d’unchamp de mot de passe de 10 colonnes au pan-neau intérieur.

B ,,,,"��������,1��,$��0��,16���������,9644-,�,,,,"��������,1��,$&�� ����,1:;44-,,,,"��������,1��,$��0��,16%� ,��,"����,9644-,,,,"��������,1��,$������������,1:;44-

Calcul de la taille préférée de la fenêtre en fonc-tion de son contenu.

B ,,,,��� ���"��+14-,�

Changement de l’opération de fermeture pardéfaut pour quitter l’application.

B ,,,,��� ����� !����� �����<"��� �,1$������#=)&><*>��<�#4-

Affichage de la fenêtre. B ,,,,��� ����� ?�0��,1 ���4-,�,,@@

JAVA Actions liées à l’icône de fermeture d’une fenêtre

Le comportement d’une fenêtre lors d’un clic sur son icône de fermeture est déterminé parla méthode �� !����� �����<"��� �. Cette méthode prend en paramètre l’une desquatre constantes suivantes de la classe ����������$����� : A)!#><*>��<�# (pourmasquer la fenêtre), !)��<�#><*>��<�# (pour détruire la fenêtre),!<>*<&A)*�><*>��<�# (pour ne rien faire), #=)&><*>��<�# (pour quitter l’application).Dans notre exemple, l’action #=)&><*>��<�# est choisie pour programmer simplementl’arrêt de l’application lors de la fermeture de la fenêtre.

JAVA 5.0 Appel de add

Java 5.0 permet d’ajouter un composant à unefenêtre en appelant directement la méthode ���sur une instance de ����������$�����.

ATTENTION Une fenêtre n’est pas modale

Ne programmez par l’instruction ��� ����� 1;4- après l’appel ��� ����B��14-.Cela provoquerait l’arrêt immédiat de l’applica-tion sans afficher la fenêtre car le programmene se bloque pas si l’on appelle la méthode�B�� avec une instance de����������$�����.

Page 205: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 193

Disposer les composants dans une grille (java.awt.GridLayout)La classe ������� ��������� dispose les composants du conteneur qui luiest associé dans un tableau où toutes les cellules ont les mêmes dimensions.Chaque composant est ajouté à son conteneur avec la méthode ��� qui rem-plit ce tableau ligne par ligne (dans le même sens que celui de l’écriture).

Par l’exemple : interface utilisateur d’un clavier de calculatriceL’application de classe ����� �+�� �� �������������� ��� crée une fenêtreutilisant un gestionnaire de classe ������� ��������� , qui divise le panneauintérieur de la fenêtre en 4 lignes et 4 colonnes de même largeur et de mêmehauteur. À chaque cellule est ajouté un bouton pour représenter un clavier decalculatrice.

Notez qu’il est possible de cliquer sur les boutons mais que cela n’a aucuneffet : aucun traitement n’est associé par défaut à une instance de����������$�� �.

Figure 10–3 Évolution de la disposition des composants d’un conteneur utilisant un layout de classe ������� ���������

Ordre d’affichage des composants

Remarquez bien l’ordre dans lequel sont ajoutés lesboutons avec la méthode ��� dans l’application declasse ����� �+�� �� �������������� ���pour obtenir le résultat de la figure 10-3.

La gestion du clic sur un bouton est traitée dans lasection « Interagir avec l’utilisateur grâce auxévénements », page 203.

EXEMPLE com/eteks/test/ClavierCalculatrice.java"��+���,����� �+�� �� -

�"�� ,����������.-�"�� ,������� �.-

�����,������������� ���/,,"�0��,� � �,���,��1� ��,23,����4,,/

,,,,$�����,��� ��,5,��,$�����,16������64- 3 Création d’une fenêtre ayant pour titre Clavier.

,,,,�� ���,"����,5,��� ����� �� � ���14- 3 Récupération du panneau intérieur de la fenêtre.

,,,,"������� ����� ,1��,�������� ,1C7,C7,:7,:44-

,,,,"��������,1��,$�� �,16D644-,,,,"��������,1��,$�� �,16E644-,,,,"��������,1��,$�� �,16F644-,,,,"��������,1��,$�� �,16�644-

3 Utilisation d’un gestionnaire de layout�������� de 4 lignes par 4 colonnes avec unécart d’un pixel entre les composants.

3 Ajout de boutons pour former un clavier de cal-culatrice.

Page 206: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004194

Placer les composants aux bords du conteneur (java.awt.BorderLayout)La classe ������� ������������ divise l’espace du conteneur qui lui estassocié en 5 cellules, une à chaque bord et une au centre. Chacune des cel-lules peut contenir, ou non, un composant, et un seul.

Chaque composant est ajouté à son conteneur avec la méthode ��� prenanten second paramètre une des constantes ����������� �*<G&A, ����������� ��<H&A, ����������� �I#�&, ����������� �#'�& ou ����������� ��#*&#G, repré-sentant la cellule où sera placé ce composant. Quelle que soit la taille duconteneur, les distances de chacun de ses composants au bord du conteneursont déterminées en fonction de sa largeur ou de sa hauteur « préférée » enrespectant le schéma de la figure 10-4.

,,,,"��������,1��,$�� �,16C644-,,,,"��������,1��,$�� �,168644-,,,,"��������,1��,$�� �,16J644-

Le caractère Unicode du symbole de division ÷est KL�;;�DK.

B ,,,,"��������,1��,$�� �,16L�;;�D644-,,,,"��������,1��,$�� �,16:644-,,,,"��������,1��,$�� �,16 644-,,,,"��������,1��,$�� �,16M644-,,,,"��������,1��,$�� �,16�644-,,,,"��������,1��,$�� �,16;644-,,,,"��������,1��,$�� �,167644-,,,,"��������,1��,$�� �,16N644-,,,,"��������,1��,$�� �,16(644-

Calcul de la taille préférée de la fenêtre en fonc-tion de son contenu.

B ,,,,��� ���"��+14-,,,,��� ����� !����� �����<"��� �,1$������#=)&><*>��<�#4-

Affichage de la fenêtre. B ,,,,��� ����� ?�0��,1 ���4-,,@@

Figure 10–4 Utilisation des tailles préférées avec un layout de classe ������� ������������

API JAVA Layout par défaut des fenêtres

Les classes ����������$�����, ����������$!���� et ����������$'""�� utilisent par défaut un layout de classe������� ������������ .

ASTUCE Cellule par défaut

La cellule par défaut du layout de classe������� ������������ est celle au centre.Ainsi, l’instruction :

"��������1���"��� 4-

est équivalente à :"��������1���"��� 7

����������� ��#*&#G4-

hauteur préférée

hauteur préférée

largeur préférée

BorderLayout.NORTH

BorderLayout.SOUTH

BorderLayout.CENTER BorderLayout.EASTBorderLayout.WEST

largeur préférée

Page 207: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 195

Par l’exemple : interface utilisateur d’un éditeur de textesUn conteneur étant aussi, par héritage, un composant, on peut aussi ajouterau panneau d’une fenêtre certains conteneurs : barres d’outils, panneaux avecascenseurs, panneaux à onglets…

L’application de classe ����� �+�� �� �#� ���&�� � utilise cette possibilitépour construire l’interface utilisateur d’un éditeur de textes.

Figure 10–5 Évolution de la taille des composants d’un container utilisant un layout de classe ������� ������������

EXEMPLE com/eteks/test/EditeurTexte.java"��+���,����� �+�� �� -

�"�� ,����������.-�"�� ,������� �.-�"�� ,����� �+���� ����B������G��������-

�����,#� ���&�� �/,,"�0��,� � �,���,��1� ��,23,����4,,/

,,,,$&������,�� ��,5,��,$&������,14-,�,,,,�B������G��������,�B������,5,,,,,,,,��,�B������G��������,16� ���0���� ����"B����������64-,,,,�� ������,1��,$�� �,1�B��������� )��16*��:J���6444-

3 Création d’une barre d’outils utilisant les icônesNouveau / Couper / Copier / Coller.

,,,,�� ��������"��� ��,14-,,,,�� ������,1��,$�� �,1�B��������� )��16�� :J���6444-,,,,�� ������,1��,$�� �,1�B��������� )��16��"�:J���6444-,,,,�� ������,1��,$�� �,1�B��������� )��16��� �:J���6444-

3 Ajout d’un séparateur dans la barre d’outils.

,,,,$�����,��� ��,5,��,$�����,16#� ���64-,,,,�� ���,"����,5,��� ����� �� � ���14-

3 Création d’une fenêtre ayant pour titre Editeur etrécupération de son panneau intérieur.

,,,,"������� ����� ,1��,����������� ,1 7, 44- 3 Utilisation d’un gestionnaire de layout����������� avec un écart de 2 pixels entreles composants.

,,,,"��������,1�� ��7,����������� �*<G&A4-,� 3 Ajout en haut de la barre d’outils.

Page 208: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004196

Cette application dispose ces trois composants avec un layout de classe������� ������������ pour obtenir une configuration typique des applica-tions d’édition (éditeur de textes, tableur, logiciel de dessin) : une barred’outils en haut �, une barre d’état en bas �, le reste de l’espace de lafenêtre étant dédié au composant d’édition �.

Pour charger les images des boutons de la barre d’outils �, l’application pré-cédente utilise la classe ����� �+���� ����B������G�������� qui permet deretrouver le fichier d’une icône ou d’une image relativement au chemind’accès des classes spécifié par l’option O�����"� B de la commande ����.

La méthode �� )�� de cette classe interroge l’instance de ��������������qui correspond à la classe ����� �+���� ����B������G��������. La méthode�� G������� de cet objet permet de référencer n’importe quel fichier d’image

Ajout au centre d’une zone de saisie de taillepréférée 10 lignes × 50 colonnes.

B ,,,,"��������,1��,$���������,1��,$&�� '���,1:;7,8;447,,,,,,,,,,,,,,,,,����������� ��#*&#G4-,�

Ajout en bas d’un label d’état avec un bord. B ,,,,$��0��,� � ,5,��,$��0��,16,'""��� �,�L�;;�F����L�;;�F�64-,,,,� � ��� ������,1��������� �������� �������������������144-,,,,"��������,1� � 7,����������� ��<H&A4-,�

Calcul de la taille préférée de la fenêtre en fonc-tion de son contenu.

B ,,,,��� ���"��+14-,,,,��� ����� !����� �����<"��� �,1$������#=)&><*>��<�#4-

Affichage de la fenêtre. B ,,,,��� ����� ?�0��,1 ���4-,,@@

ASTUCE Panneau à ascenseurs

Certains composants comme les champs de saisiemultilignes ou les tableaux doivent être placésdans un panneau à ascenseurs pour pouvoir fairedéfiler les informations qu’ils contiennent. On yprocède simplement en créant une instance de����������$��������� avec le composantà faire défiler en paramètre, puis en ajoutant cepanneau au conteneur �. Par défaut, un panneauà ascenseurs ne fait apparaître les ascenseurs dedéfilement qu’en cas de besoin.

EXEMPLE com/eteks/outils/ChargeurRessource.javaCalcul de la taille préférée de la fenêtre en fonc-tion de son contenu.

B "��+���,����� �+���� ��-

�"�� ,����������)����)��-

�..,.,�B������,��,����������,���� ���,��,�����"� B�,.�"�0��,�����,�B������G��������/,,"��� �,� ��,0���-

Constructeur initialisant un chargeur de ressour-ces avec 0��� comme chemin relatif des res-sources.

B ,,"�0��,�B������G��������,1� ��,0���4,,/,,,, B��0���,5,0���-,,@

Renvoie l’icône du fichier �� relatif à la base. B ,,"�0��,)����)��,�� )��,1� ��,��4,,/

,,,,�����,������,5,�� �����14-,,,,�� ��,��,)����)��,1��������� G�������1 B��0���,N,��44-

,,@@

Page 209: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 197

situé dans le même contexte que le fichier �B������G��������������. Cefichier d’image est ensuite passé en paramètre au constructeur de la classe)����)�� : ce dernier se charge de lire le fichier de l’image pour obtenir uneicône que l’on peut afficher dans un bouton.

Mise en page évoluée par combinaison de layoutsLes trois layouts précédents sont souvent insuffisants pour mettre en pageun ensemble complexe de composants dans une fenêtre ou une boîte de dia-logue. Au lieu d’utiliser un seul layout pour le panneau intérieur, on résout ceproblème en décomposant l’ensemble des composants en plusieurs sous-ensembles ayant des caractéristiques géométriques communes (alignement,taille...). Les composants d’un sous-ensemble sont mis en page avec le layoutqui correspond le mieux à leurs caractéristiques géométriques, et sont ajoutésà un panneau intermédiaire vide de classe ����������$���� qui utilise celayout. Chaque instance de $���� étant elle-même un composant, on cons-truit donc le panneau intérieur d’une fenêtre en lui ajoutant les panneaux

ASTUCE Organisation des fichiers d’icônes

Les icônes de la barre d’outils sont disponibles en téléchargement à l’adresse :B http://java.sun.com/developer/techDocs/hi/repository/Ce sont des images extraites du sous-dossier ���0���� ����"B��������� dans le fichier d’archive �����(:>;����.La classe ����� �+���� ����B������G�������� chargeant ces images comme s’il s’agissait de classes, la JVM les cherche dans son�����"� B, vous laissant le choix :• soit d’extraire les images du fichier �����(:>;���� nécessaires au programme dans le sous-dossier ������� de votre dossier de développement ;• soit de déplacer le fichier �����(:>;���� dans le sous-dossier �0 de votre dossier de développement et d’ajouter le chemin d’accès à ce

fichier dans l’option (�����"� B de la commande ����.

Sous Windows, le fichier #� ���&�� ��0� contient alors l’une ou l’autre des instructions :

Sous Linux et Mac OS X, le fichier #� ���&�� ���B contient alors l’une ou l’autre des instructions :

La seconde solution simplifie les mises à jour de votre programme quand une bibliothèque qu’il utilise évolue : il suffit de recopier le nouveaufichier ���� dans le dossier �0. Vous pouvez aussi utiliser cette méthode pour lire les fichiers de vos propres images et les fichiers de configu-ration de votre application. Ce système facilite l’installation d’une application car ces fichiers de ressources peuvent être intégrés au fichierd’archive ���� de votre application.

����,(�����"� B,��L�������-��L�0L�����(:>;����,����� �+�� �� �#� ���&�� �����,(�����"� B,��L�0L �� ����-��L�0L�����(:>;����,����� �+�� �� �#� ���&�� �

����,(�����"� B,����������9����0������(:>;����,����� �+�� �� �#� ���&�� �����,(�����"� B,����0� �� ����9����0������(:>;����,����� �+�� �� �#� ���&�� �

Page 210: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004198

intermédiaires et leurs composants. Même si, au premier abord, cettedécomposition géométrique en sous-panneaux est quelque peu compliquée àconcevoir à partir du dessin d’un écran, elle doit être votre premier recourspour obtenir des interfaces utilisateurs bien proportionnées.

Par l’exemple : panneau de saisie des coordonnées d’un contactLa classe ����� �+���� ���������� �� , sous-classe de ����������$����,met en page dans son propre panneau un ensemble de composants utilisés poursaisir les coordonnées d’un contact (titre, nom, prénom, adresse). L’adresse d’uncontact est saisie dans un champ de saisie multilignes de classe����������$&�� '���. Ce champ est placé sous les autres composants pourpouvoir occuper tout la largeur du panneau (voir figure 10-6).

Le panneau de saisie d’un contact utilise un layout de classe ����������� auquel sont ajoutés les composants suivants :• À l’ouest (gauche) sont placés les labels regroupés dans un panneau utili-

sant un layout de classe �������� .• Au centre sont placés la liste déroulante du titre et les deux champs de

saisie du nom et du prénom dans un panneau utilisant un layout de classe�������� . Notez que la grille est décomposée en quatre cellules dont ladernière n’est pas utilisée afin que les champs de saisie soient positionnésen regard de leurs labels.

• Au sud (bas) est placé un champ de saisie multilignes dans un panneau àascenseurs.

POUR ALLER PLUS LOIN Autres classes de layout

Les classes de layout que l’on vient de décriresont suffisantes pour faire face à la plupart descas que l’on pourrait rencontrer en combinantdes panneaux avec des layouts différents. Vouspouvez aussi utiliser :• La classe ������������������ , pour

aligner horizontalement ou verticalementdes composants.

• La classe ������� ������������ 7 laplus riche en fonctionnalités, mais plus com-pliquée à utiliser. Elle utilise une mise enpage ressemblant à celle d’un tableau HTMLavec notamment la possibilité de spécifierl’étendue horizontale et verticale d’une cel-lule (l’équivalent des attributs ����"� et����"� de la balise HTML �).

• Toute autre classe implémentant l’interface������� ������ %�����.

Vous pouvez éventuellement n’utiliser aucunlayout en passant ��� à la méthode�� ����� puis placer chacun des compo-sants aux coordonnées de votre choix avec leurméthode �� �����.

REGARD DU DÉVELOPPEUR Utilisation des layouts

Voici quelques conseils qui devraient vous faciliter la miseen page d’un panneau avec les layouts :• Utilisez le nombre de colonnes et de lignes des compo-

sants de saisie textuelle pour leur donner une taille pré-férée correcte.

• Souvenez-vous qu’un panneau intermédiaire contenantdes composants est lui-même un composant dont lataille préférée dépend du layout utilisé pour mettre enpage ses composants.

• Mettez dans la cellule ����������� ��#*&#G d’un layout������� ������������ un composant qui peut êtreredimensionné en largeur et en hauteur (zone d’éditiond’une fenêtre, composants inclus dans une instance de����������$���������).

• Utilisez les paramètres des constructeurs des layouts quispécifient les espacements horizontal B��" et vertical���" entre les composants pour aérer votre interfaceutilisateur.

• Appelez la méthode �� G����0��1�����4 sur une fenê-tre ou une boîte de dialogue qui ne doit pas être redi-mensionnée.

• Ne vous souciez pas des problèmes de traduction et deportage d’une IHM : la taille préférée des composantsest calculée en fonction de la longueur de leur texte ets’adapte au look and feel en cours (par exemple, unbouton est beaucoup plus grand sous Mac OS X quesous Windows). Au final, les layouts calculent correcte-ment les dimensions préférées d’une fenêtre lors del’appel de la méthode "��+.

• Utilisez des identificateurs explicites et clairs pour nom-mer les panneaux intermédiaires d’IHM complexes.

Un grand nombre d’IDE permettent de créer de façoninteractive une IHM Swing par simple glisser-déposer descomposants dans une fenêtre. Ces environnements accélè-rent le développement en générant automatiquement lecode Java permettant de construire une interface utilisa-teur mais vous devez tout de même savoir utiliser le méca-nisme des layouts.

Page 211: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 199

Figure 10–6Mise en page du panneau de saisie d’un contact

BorderLayout.SOUTHBorderLayout.SOUTH

BorderLayout.CENTER

BorderLayout.CENTER

BorderLayout.WEST

BorderLayout.WEST

Panneau principal BorderLayoutBorderLayout

Panneau labels GridLayout(4,1)GridLayout(4,1)

Panneau saisies GridLayout(4,1)GridLayout(4,1)

EXEMPLE com/eteks/outils/PanneauContact.java"��+���,����� �+���� ��-�"�� ,������� �.-�"�� ,����������.-�..,.,�����,��,����,�K�,�����,.�,"�0��,�����,������� �� ,�� ���,$����/

,,"��� �,���,� � �,� ��,23,&)&G#�,5,/6%�67,6%��67,6%����6@- 3 Textes affichés par le composant de choix.

,,"��� �,$���0����,����& ��,5,��,$���0����,1&)&G#�4-,,"��� �,$&�� ����,����*��,5,��,$&�� ����,1:;4-,,"��� �,$&�� ����,���������,5,��,$&�� ����,1:;4-,,"��� �,$&�� '���,����'������,5,��,$&�� '���,1C7, ;4-

3 Création des composants de saisie.

,,"�0��,������� �� ,14,,/

3 Constructeur.

,,,,$����,"������0���,5,��,$����,1��,�������� ,1C7,:7,87,844-,,,,"������0�������,1��,$��0��,16& ��,9644-,,,,"������0�������,1��,$��0��,16*��,9644-,,,,"������0�������,1��,$��0��,16��L�;;�F��,9644-,,,,"������0�������,1��,$��0��,16'������,9644-

3 Création d’un panneau utilisant un layout�������� de 4 lignes par 1 colonne avec unécart de 5 pixels entre les composants.

,,,,$����,"��������,5,��,$����,1��,�������� ,1C7,:7,87,844-,,,,"������������,1 B������& ��4-,,,,"������������,1 B������*��4-,,,,"������������,1 B�����������4-

3 Création d’un panneau utilisant un layout�������� de 4 lignes par 1 colonne avec unécart de 5 pixels entre les composants.

,,,,�� ����� ,1��,����������� ,187,844-,,,,���,1"������0���7,����������� �I#�&4-,,,,���,1"��������7,����������� ��#*&#G4-,,,,���,1��,$���������,1����'������47,����������� ��<H&A4-,,@

3 Utilisation sur le panneau courant d’un gestion-naire de layout ����������� avec un écartde 5 pixels entre les composants puis ajout dessous-panneaux et du champ de saisie multili-gnes dans un panneau à ascenseurs.

,,"�0��,� ��,�� & ��,14,,/,,,,�� ��,1� ��4 B������& ����� ����� ��) ��,14-,,@

3 Méthode renvoyant le titre choisi.

Page 212: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004200

Ce panneau de saisie est mis en œuvre dans l’application de classe����� �+�� �� ������� �� avec la méthode � � �,�B�������!���� dela classe ����������$<" ����. Cette méthode affiche le panneau passéen paramètre à sa taille préférée dans une boîte de dialogue modale, avec lesboutons de confirmation ou d’annulation Ok /Annuler, puis renvoie unevaleur correspondant au choix Ok ou Annuler de l’utilisateur. Il est particuliè-rement intéressant de l’utiliser ; elle évite en effet :• de créer les deux boutons Ok /Annuler dans la langue de l’utilisateur et de

les mettre en page (sachant que ces boutons doivent apparaître selon unordre et un alignement différents sous Windows et Mac OS X !) ;

• de gérer la fermeture de la boîte de dialogue.

Méthode renvoyant le nom saisi. B ,,"�0��,� ��,�� *��,14,,/,,,,�� ��, B������*����� &�� ,14-,,@

Méthode renvoyant le prénom saisi. B ,,"�0��,� ��,�� �����,14,,/,,,,�� ��, B�������������� &�� ,14-,,@

Méthode renvoyant l’adresse saisie. B ,,"�0��,� ��,�� '������,14,,/,,,,�� ��, B������'��������� &�� ,14-,,@@

EXEMPLE com/eteks/test/SaisieContact.java"��+���,����� �+�� �� -

�"�� ,����������.-�"�� ,����� �+���� ���������� �� -

�����,������ �� /,,"�0��,� � �,���,��1� ��,23,����4,,/

Création d’une instance du panneau de contact. B ,,,,������� �� ,"����,5,��,������� �� 14-

Affichage du panneau par une boîte de dialoguede confirmation avec les boutons Ok /Annuler.

B ,,,, ,��"���,5,$<" ������B�������!����1���7,"����7,,,,,,,,,,,,,,,,,,,,,,,6�� �� 67,$<" �����<P>�'*�#�><�&)<*7,,,,,,,,,,,,,,,,,,,,,,,$<" �������')*>%#��'�#4-

Si l’utilisateur a confirmé sa saisie en cliquantsur Ok, un message est affiché qui résume lesvaleurs saisies dans le panneau de contact.

B ,,,,�,1��"���,55,$<" �����<P><�&)<*4,,,,,,$<" ������B��%������!����1���7,6�� �� ,9L6,,,,,,,,,N,"������� & ��14,N,6,6,,,,,,,,,N,"������� �����14,N,6,6,N,"������� *��14,,,,,,,,,N,6L6,N,"������� '������144-

Arrêt de la JVM. B ,,,,��� ����� ,1;4-,,@@

Page 213: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 201

À chaque système son look and feelTous les conteneurs et composants affichés à l’intérieur d’une fenêtre oud’une boîte de dialogue (hormis les bords et la barre de titre) sont dessinéspar la bibliothèque Swing. Cette architecture permet :• de simuler chaque composant sur le système où fonctionne la JVM avec

son apparence et son comportement (look and feel) habituels ;• de créer de nouveaux look and feel comme le « Java look & feel » ;• de changer de look à chaud quand un programme est déjà lancé grâce à la

méthode de classe �� ���+'����� de la classe ����������H)%�����.

Le look and feel d’une application peut aussi être choisi lors du lancementd’une application en ajoutant l’option O!���������� ���5%����:��>)��!��%à la commande ����. Cette option modifie la valeur de la propriété système���������� ��� qui représente la classe de look and feel utilisée par défautpar Swing. Les classes de look and feel les plus connues sont :• ����������"������ ���%� �����+'����� pour le look and feel Java,• ����������������"����������I�������+'����� pour Windows,• ����������������"������ ��%� ����+'����� pour Motif – sous

Unix et autres systèmes XWindow,• �""�������'Q�����+'����� pour Mac OS X (avec Java 1.4).

Figure 10–7 Application ����� �+�� �� ������� ��

sous Windows et Mac OS X

ASTUCE Choisir le look and feel du système

L’instruction suivante permet d’utiliser le look andfeel du système d’exploitation en cours :

����������� ������������������������������� �����������������������

JAVA 5.0 Look and feel Ocean

L’aspect du look and feel Java s’est modernisé dansJava 5.0 et s’appelle maintenant Ocean.

Page 214: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004202

Java Look & Feel Windows Look & Feel

Mac OS X Look & Feel Motif Look & Feel

Figure 10–8 Différents look and feel avec une même application

JAVA 5.0 Performances de Swing

Toute application Swing requiert une durée de lancement relativement longue et uneassez grande quantité de mémoire (comptez au moins 15 Mo). Ces contre-performancessont essentiellement dues à l’architecture ouverte de Swing, qui nécessite le chargement denombreuses classes. Le partage de classe (Class Data Sharing) a été notamment ajouté àJava 5.0 pour corriger ces deux inconvénients (voir aussi la fin du chapitre 2).

SOUS WINDOWS Changerle look-and-feel de Java par défaut

Toutes les captures d’écran de cet ouvrage qui ontété faites sous Windows ont été réalisées en ajou-tant l’option :����� ����!�"����!#� X$���"�%�&��� ��'��!� ������ X( ����� �����������

à la commande %�&� afin d’utiliser le look de Win-dows en lieu et place de celui de Java positionnépar défaut sur ce système d’exploitation. Le lookand feel de Windows XP est reconnu par les ver-sions de Java supérieures à 1.4.2.

SOUS MAC OS XIntégrer la barre de menu à sa place

Le look and feel positionné par défaut sousMac OS X est bien Aqua, celui du système, mais enrevanche les barres de menus restent intégrées pardéfaut aux fenêtres ouvertes par Java. Pour inté-grer les barres de menus au menu, en haut del’écran, ajoutez l’option :

���''����!"���$������")�#�"��

à la commande %�&�.Apple fournit aussi des outils qui permettent demieux intégrer une application Java au système,notamment en autorisant le démarrage par dou-ble-clic sur une icône.

B http://developer.apple.com/documentation/Java/

Page 215: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 203

Interagir avec l’utilisateur grâce aux événementsAprès avoir étudié comment placer des composants à l’écran, voyons commentprogrammer leur comportement quand l’utilisateur actionne ces composants.

ÉvénementsL’utilisateur d’un programme interagit avec les composants Swing à l’écrangrâce aux périphériques, comme la souris ou le clavier. Ces interactions sontregroupées par le système sous forme d’événements (events en anglais) dedeux catégories :• Les événements primaires, provoqués par un périphérique de

l’ordinateur : événements souris (enfoncement /relâchement d’un boutonde la souris, déplacement du pointeur de la souris) et événements clavier(enfoncement /relâchement d’une touche du clavier).

• Les événements composites, qui sont créés par le système de gestion évé-nementiel suite à un enchaînement d’événements primaires sur un com-posant (double-clic, choix d’un menu...) ou sur un conteneur (redimen-sionnement, fermeture d’une fenêtre...).

Être à l’écoute des événements en implémentant un listenerLe système adresse à chaque composant Swing les événements qui le concer-nent. Pour exécuter un traitement en réaction à un événement reçu par uncomposant, il faut :• écrire les instructions de ce traitement dans une classe implémentant

l’interface listener associée à l’événement ;• créer une instance de cette classe de listener ;• appeler la méthode ��� ����� adéquate du composant en lui passant

en paramètre l’instance du listener.

Événements clavier

Événements souris

Système de gestion

événementiel

Figure 10–9Gestion événementielle

C# listener et delegate

Les délégués en C# correspondent aux listenersJava. La déclaration �������� du C# permet despécifier les types de la valeur de retour et desparamètres qu’une méthode doit respecter pourêtre rappelée quand un événement survient. EnJava, ce type de méthode est spécifié dans uneinterface de type listener que vous devez implé-menter dans une classe de listener.

Page 216: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004204

En Java, l’interface « d’écoute » (listener) le plus souvent implémentée est%�&�����&����$� �� �����. Son unique méthode �$� ��*�!���� estimplémentée avec le traitement à exécuter en réponse à une action de l’utili-sateur sur un composant. Cet événement composite de classe%�&�����&����$� ��+&��� est émis par le système quand, par exemple,l’utilisateur clique sur un bouton.

Par l’exemple : quelle heure est-il ?La classe $����������� �����,�"� présentée ci-après implémentel’interface %�&�����&����$� �� ����� pour afficher l’heure dans uneboîte de dialogue. L’application de classe $������������!! $-�,�"� créeun bouton et une instance de cette classe de listener, puis appelle la méthode����$� �� ����� sur le bouton en passant le listener en paramètre, pourqu’il soit lié au bouton. Grâce à ce lien, la méthode �$� ��*�!���� du lis-tener, qui affiche l’heure courante, sera appelée à chaque clic sur le bouton.

C++ listener et pointeur sur fonction

Les listeners sont un bon exemple pour montrercomment programmer en Java l’équivalent descallbacks du C++ en se passant des pointeurs surfonction, absents de Java. Une fonction utiliséecomme callback devient ici une méthode dont ladéclaration est spécifiée par l’interface qu’implé-mente sa classe.

EXEMPLE com/eteks/test/AfficherHeure.java'�$�����$������������ �'���%�&�.�� ��/� �'���%�&�"� ������ �'���%�&���.�����������$����� �����,�"�� �'��������%�&�����&����$� �� �����0��'"1� $�&� ���$� ��*�!������%�&�����&����$� ��+&�����&���0�

Création d’un texte avec les heures:minutes:secondes du moment.

B ������ ���-�"��#�������������������2 ��������$���!����������������������34'� ��*����-���������� �������"��5�6�������6�7�-�"�����88$������!! $-�,�"�0��'"1� $����� $�&� ���� ���� ��9:�������0�

Création d’un bouton lié à une instance de$����������� �����,�"�

B ����3)"�����1�"���,�"��#�����3)"������6;"�����-�"�����< ��=6������%�&�����&����$� �� �������$� ��)�"����#������������������������������������������� �����,�"���������1�"���,�"�����$� �� �������$� ��)�"�����

Affichage du bouton dans une fenêtre non redi-mensionnable.

B ����3�����!������#�����3������6,�"�6������!���������������*�����������1�"���,�"�������!��������>�� ?�1���!����������!�����'�$��������!����������!�"�������4'��� ����3����+@�2A4�A� 4�+������!��������B � 1�����"�����88

Page 217: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 205

Quand l’utilisateur clique sur le bouton Quelle heure est-il ? �, le système degestion événementiel crée un événement de classe %�&�����&���

�$� ��+&��� �. Cet événement est transmis à l’instance de la classe%�&�.�� ��3)"���� � qui correspond au bouton affiché dans la fenêtre. Lebouton appelle alors la méthode �$� ��*�!���� � de l’instance de$����������� �����,�"� qui lui est liée pour exécuter son traitement �.Pour les autres classes de composants, un événement d’action est émis enfonction de leur logique d’utilisation :• Pour les composants de classes %�&�.�� ��3�-�$�)�. et

%�&�.�� ��3>�� �)"����, un événement d’action est émis quand l’utili-sateur clique sur la boîte à cocher ou le bouton radio.

• Pour les composants de classe %�&�.�� ��3���"���� et des autres classesde menu, un événement d’action est émis quand l’utilisateur choisit unmenu (avec la souris ou un raccourci clavier).

• Pour les composants de classe %�&�.�� ��32�.�� ���, un événementd’action est émis quand l’utilisateur appuie sur la touche Entrée du cla-vier dans le champ de saisie.

• Pour les composants de classe %�&�.�� ��3���1�)�., un événementd’action est émis quand l’utilisateur choisit un élément de la liste.

Utiliser les classes anonymes pour implémenter un listenerUne classe anonyme sert à écrire une sous-classe « à usage unique », c’est-à-dire qui n’est instanciée qu’à un seul endroit du programme – comme c’estsouvent le cas pour un événement d’action. L’unique instruction d’une classeanonyme :1 crée une instance de la classe ;2 déclare sa super-classe ou l’interface qu’elle implémente ;3 redéfinit avec l’implémentation voulue les méthodes de sa super-classe

ou de l’interface implémentée.

Instance de la classe javax.swing.JButton

de la fenêtre

Événement d'action de classe java.awt.event.

ActionEvent

Instance de la classe com.eteks.test.ListenerHeure

liée au bouton

Système de gestion

événementiel

Figure 10–10Déclenchement d’un événement d’action

JAVA Et les autres événements ?

Les classes d’événement et les interfaces liste-ner associées aux autres types d’événementsutilisent la même logique d’implémentation. Ilest facile de les identifier, car elles appartien-nent aux paquetages %�&�����&��� ou%�&�.�� ���&��� et se terminent respec-tivement par le suffixe +&��� et �����. Envoici quelques-unes :• La classe %�&�����&�����"��+&���

décrit les événements souris et est associée àl’interface%�&�����&�����"�� �����.

• La classe %�&�����&���C��+&��� décritles événements clavier et est associée àl’interface %�&�����&���C�� �����.

• La classe %�&�����&���( ����+&���décrit les événements d’une fenêtre et estassociée à l’interface %�&�����&���( ���� �����.

Page 218: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004206

Par l’exemple : générer des tirages de loto Les deux applications de cet exemple affichent le résultat d’un tirage de lotoà chaque clic sur un bouton, mais l’une d’elle recourt à une classe anonymepour implémenter le listener.• La classe $�����������2 ��� �������������������� utilise la classe

$�������������"&��"2 ��� comme listener. Le label du tirage mis àjour dans la méthode �$� ��*�!���� est désigné par le champ ��1�� ���initialisé dans le constructeur de la classe ��"&��"2 ���.

• La classe $�����������2 ��� ����&�$������������� utilise une classeanonyme comme listener. Le label du tirage mis à jour dans la méthode�$� ��*�!���� est désigné par la variable locale ��1�� ���, qui doit êtredéclarée ! ���.

La classe $��������"� �� ��� que ces classes utilisent pour effectuer untirage de loto est définie à la fin du chapitre 7, « Abstraction et interface ».

Figure 10–11 Nouveau tirage de loto

ATTENTION Variables locales et paramètres final

Toute variable locale ou paramètre de laméthode englobante doit être déclarée ! ���pour pouvoir être utilisée dans une classe ano-nyme. Si dans la classe $�����������2 ��� ����&�$������������� vousoubliez de déclarer ! ��� la variable��1�� ���, le compilateur vous affichera lemessage suivant :�$D$��D�����D����D2 ��� ����&�$�������������%�&�EFGE���$���&� �1�����1�� ���� ���$$������!���� �- �� ����$���������������1����$�����! ���

sur la ligne où la méthode ���2�.� est appe-lée sur ��1�� ���.

JAVA Classes anonymes et classes internes

La déclaration d’une variable �1%�� désignant une instance d’uneclasse anonyme ���������&�&���$%���� respecte la syntaxesuivante :

Le compilateur %�&�$ fabrique un fichier $���� pour chaqueclasse anonyme. Le nom de ces fichiers est construit avec l’identifi-cateur de la classe où est définie la classe anonyme suivi du carac-tère H et d’un nombre (par exemple 2 ��� ����&�$�������������HI$����).

Les classes anonymes sont en fait une extension des classes inter-nes (inner classes) qui sont des classes définies à l’intérieur d’autresclasses :

Le modificateur d’accès d’une classe interne peut être ' &���,absent (friendly), '���$��� ou '"1� $ et contrôle la portée de cetype de classes. Une classe interne est déclarée ���� $ ou non. Une instance d’uneclasse interne ���� $ ne dépend d’aucune instance de la classeenglobante (outer class) et s’instancie avec une expression��� ������+.������������������.L’instance d’une classe interne non ���� $ stocke automatiquementune référence vers l’instance de la classe englobante, ce qui permetd’utiliser directement dans la classe interne tous les membres de laclasse englobante, même ceux ' &���. Cette référence doit êtredonnée à l’instanciation de la classe interne, d’où l’expression :�+,��$%�����'�������� ��������������

voire plus simplement ��� �������������� quand cette réfé-rence est �- �.

���������&�&���$%������1%���#����������������&�&���$%���������0�DD��J1"��������$�����������������'"1� $���������&������������� � �������0������DD����"$� �����������J�-�������8����DD��"�����J�-�����������������&�&���$%��������DD�� ��J$���� ���8��DD�� ��������$�������������

'"1� $�$�����������+.����0��(�� � ���&�)���$�������������������0����DD����1��������������������8���DD����1������������+.����8

Page 219: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 207

EXEMPLE com/eteks/test/TirageLotoSansClasseAnonyme.java EXEMPLE com/eteks/test/TirageLotoAvecClasseAnonyme.java'�$�����$������������ �'���$��������"� �� ���� �'���%�&�.�� ��/� �'���%�&����/� �'���%�&�����&���/�$�������"&��"2 ���� �'���������$� �� �����0��' &����3 �1�����1�� ����

��'"1� $���"&��"2 �����3 �1�����1�� ������0�����- ���1�� ����#���1�� ������8

��'"1� $�&� ���$� ��*�!������$� ��+&�����&���0����DD�� ���K�%�"��"���1����&�$���������DD��"�J����L"����"&��"�� ���������1�� ������2�.��� ���������$��2 ��� ��������� ��������88$�����2 ��� ��������������������0��'"1� $����� $�&� ���� ���� ���9:�������0����3 �1�����1�� ����#�����3 �1����������DD��J�� ����L"��1�"������������K�%�"����DD������1����&�$�"����"&��"�� ����������DD�������M$���"�� ���������$���������DD�$�������������"&��"2 �������3)"�����1�"��� ����#������������������3)"������6��"&��"�� ���6������1�"��� �������$� �� ��������������������������"&��"2 �������1�� ������

'�$�����$������������ �'���$��������"� �� ���� �'���%�&�.�� ��/� �'���%�&����/� �'���%�&�����&���/�$�����2 ��� ����&�$�������������0��'"1� $����� $�&� ���� ���� ���9:�������0����! ����3 �1�����1�� ����#�����3 �1����������DD��J�� ����L"��1�"������������K�%�"����DD������1����&�$�"����"&��"�� ����������DD�������M$��K�"��� ���������$����������DD������������3)"�����1�"��� ����#������������������3)"������6��"&��"�� ���6������1�"��� �������$� �� �����������������$� �� ��������������0��������'"1� $�&� ���$� ��*�!�������������������������������$� ��+&�����&���������0����������DD�� ���K�%�"��"���1����&�$��������������DD��"�J����L"����"&��"�� �������������DD���1�� ������ ��N����J$��J����������DD�! ����'�"�'�"&� �N������������DD�"� � �J���������$�������������������������1�� ������2�.��� ���������������$��2 ��� ��������� ��������������8������8��

����DD��!! $-�����"�1�"��������"���1����L"������DD���"���L�"��������"���!��N������3�����!������#�����3������6 ���6������!���������������*���������������� ���"������O � ���"���P5�I�������!���������������*���������1�"��� ���������!���������������*�����������1�� ���������!�����'�$��������!����������!�"�������4'��� ��������������������������3����+@�2A4�A� 4�+������!��������B � 1�����"�����88

����DD��!! $-�����"�1�"��������"���1����L"�����DD���"���L�"��������"���!��N������3�����!������#�����3������6 ���6������!���������������*��������������� ���"������O � ���"���P5�I�������!���������������*���������1�"��� ���������!���������������*�����������1�� ���������!�����'�$��������!����������!�"�������4'��� �������������������������3����+@�2A4�A� 4�+������!��������B � 1�����"�����88

ATTENTION import java.awt.event.*;

La clause �'���%�&����/� n’importe que les classes du paquetage %�&����, pas cel-les de ses sous-paquetages comme %�&�����&���.

Page 220: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004208

Par l’exemple : interface utilisateur d’un carnet d’adressesL’application de classe $����������������������� affiche dans untableau le titre, le nom, le prénom et l’adresse d’un ensemble de contacts.L’ajout d’un nouveau contact s’effectue à partir du menu Fichier/Nouveau etd’un listener anonyme associé à ce menu. La saisie du texte correspondants’effectue dans un panneau de classe $��������"� ��*�����"�����$�,définie plus haut dans la section « Mise en page évoluée ».

Les données de chaque contact sont mémorisées par un modèle de donnéesde classe %�&�.�� ����1����!�"��2�1������� �. Ce modèle est utilisé parune instance de %�&�.�� ��32�1�� � pour obtenir les valeurs à afficherdans un tableau et permet de modifier les données affichées �.

REGARD DU DÉVELOPPEUR Avantages des classes anonymes

• Les méthodes d’une classe anonyme peuvent utiliser les champs et lesméthodes d’instance de la classe englobant la classe anonyme.

• Les méthodes d’une classe anonyme peuvent utiliser les variables locales etles paramètres de la méthode dans laquelle la classe anonyme est définies’ils sont déclarés ! ���.

• L’instruction de création d’une classe anonyme de type listener permetd’associer à un composant Swing son listener juste après l’instanciation ducomposant, regroupant ainsi la création et le comportement du composant.

• La classe étant anonyme, vous n’avez pas à lui trouver d’identificateur.

• Les IDE capables de créer de façon interactive une IHM Swing permettentaussi de créer automatiquement en quelques clics la structure d’une classeanonyme et de ses méthodes pour réagir à un événement. Il vous reste alorssimplement à implémenter le traitement de l’événement.

EXEMPLE com/eteks/test/CarnetAdresses.java'�$�����$������������ �'���%�&�.�� ��/� �'���%�&�.�� ����1����!�"��2�1�������� �'���%�&�����&���/� �'���$��������"� ��*�����"�����$��

$�����������������0

ATTENTION Titres des colonnes d’un tableau Swing

Pour faire apparaître les titres des colonnes d’untableau de classe %�&�.�� ��32�1��, cedernier doit être inclus dans une instance depanneau à ascenseurs de classe%�&�.�� ��3�$���*���.

DANS LA VRAIE VIESauvegarde des informations saisies

En l’état, l’application du carnet d’adresses n’aqu’un intérêt limité car elle n’est pas capable desauvegarder les données saisies dans un fichier.Pour enregistrer les contacts du tableau, vous pou-vez soit utiliser une base de données (voir lechapitre 11, « Connexion à la base de donnéesavec JDBC »), soit utiliser des fichiers en recourantaux classes du paquetage %�&� �.

La variable locale !����� doit être déclarée! ��� pour être utilisable dans la classe ano-nyme qui implémente �$� �� �����

��'"1� $����� $�&� ���� ���� ���9:�������0

B ����! ����3�����!������#�����3������6�����$��6��

Création d’un modèle de tableau auquel il serapossible, ultérieurement, d’ajouter des lignes. B

������ ���9:�$��������#�062 ��656���656*Q"GG�R���656������68�����! ������!�"��2�1���������������#�����������������������������!�"��2�1���������$�������5�G����

Création d’un tableau utilisant ce modèle. B ����32�1�����1���"�#�����32�1��������������

Ajout du tableau dans un panneau avec ascen-seurs à la fenêtre.

B ����!���������������*��������������3�$���*�������1���"���

Page 221: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 209

Vous noterez qu’ici la méthode �-�����! �� ���� utilise en premier para-mètre la référence !����� � �, ce qui permet de créer une boîte de dia-logue modale de confirmation à une position relative à la fenêtre de l’appli-cation et de bloquer toute saisie dans cette fenêtre tant que la boîte dedialogue n’a pas été fermée.

���� �����"$-�>�$$�"$ ��#�%�&����2���� ������!�"��2���� �������������������������������������������������"�-��$"�C���������

3 Récupération de la touche utilisée pour les rac-courcis clavier (Ctrl sous Windows ou Cmd –pomme – sous Mac OS).

����3���"��������"��"&��"�#�����3���"������6��"&��"65�L�L���������"��"&��"����$$�����������������C����������C���������C��+&���BCA�5���"$-�>�$$�"$ ����

3 Création de l’élément de menu Nouveau (demnémonique N) et de raccourci clavier Ctrl + Nou Cmd + N.

�������"��"&��"����$� �� ������������$� �� ��������������0��������'"1� $�&� ���$� ��*�!�������$� ��+&�����&���������0

����������*�����"�����$��'�����"�#�����*�����"�����$�������������� ����'�����#�34'� ��*����-�����! �� �����!�����5����������������������������'�����"5�6��"&��"�$����$�65����������������������������34'� ��*���4CA����+ A4*2�4�5����������������������������34'� ��*���* ���A�+���O+����

3 Saisie d’un nouveau contact avec un panneau desaisie de classe $��������"� ��*�����"�����$�

���������� !���'�����##�34'� ��*���4CA4*2�4�����������������������>��������� ���9:�����������������0'�����"���2 ����5�'�����"��������5�����������������'�����"���*������5�'�����"�����������8������������8������8��

3 Si l’utilisateur a confirmé sa saisie en cliquantsur 4�, ajout d’une ligne au modèle du tableaudes contacts avec les valeurs saisies. Le tableauest automatiquement mis à jour à l’écran.

����3���"��������";" ����#�����3���"������6;" ���65�S;S���������";" �������$� �� ������������$� �� ��������������0��������'"1� $�&� ���$� ��*�!�������$� ��+&�����&���������0

3 Création de l’élément de menu Quitter et de sonlistener associé.

���������� !��34'� ��*����-�����! �� �����!�����5���������������������6B�"��?<&�"��&� �����T" ����=65�6;" ���65���������������������34'� ��*���U+�A�4A4*2�4������������������������������##�34'� ��*���U+�A4*2�4����

3 Si l’utilisateur confirme l’arrêt de l’application...

�������������������. ���G����������8������8��

3 ... arrêt de la JVM.

����3���")��1�����"�#�����3���")�����������!��������3���")���1�����"������3���"����"� $- ��#�����3���"��6� $- �6������1�����"��������"� $- ������������"� $- ���������"��"&��"����������"� $- ���������";" ������

3 Création d’une barre de menus avec le menuFichier et ses éléments de menu.

����!��������� ?���FGG5�PGG������!����������!�"�������4'��� ���3�����4A�42,��OA4�A� 4�+��

����!��������B � 1�����"�����88

3 Affichage de la fenêtre.

JAVA 5.0 Impression des tableaux

Plusieurs méthodes ' �� ont été ajoutées à laclasse %�&�.�� ��32�1�� dans Java 5.0,pour faciliter l’impression des tableaux.

Page 222: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004210

La barre de menus d’une fenêtre est créée grâce à une instance de%�&�.�� ��3���")� � à laquelle sont ajoutés les menus � et les élémentsde menu nécessaires à l’application.

Programmer une applet Une applet est une classe particulière de composant Swing qui s’affiche dans unepage HTML visualisée par un navigateur. En voici les principales caractéristiques.La classe d’une applet doit dériver de la classe %�&�.�� ��3�''���, être'"1� $ et avoir un constructeur '"1� $ sans paramètre (éventuellement, celuifourni par défaut).La balise V�''���� $���#6$%����)��%��6� W est incluse dans un fichierHTML pour faire appel à une applet de classe $%����)��%��. Quand unepage HTML contenant une balise �''��� est visualisée, la JVM :1 Télécharge la classe d’applet spécifiée par l’attribut $���.2 Crée une instance de la classe d’applet.3 Appelle la méthode � �. Une applet étant une sorte de panneau Swing,

cette méthode est redéfinie dans une classe d’applet pour ajouter àl’applet les composants à visualiser.

4 Appelle la méthode ���� au moment où l’applet apparaît à l’écran. Cetteméthode est le plus souvent redéfinie pour démarrer une animationquand l’applet en visualise une.

5 Appelle la méthode ���' au moment où l’applet disparaît de l’écran. Paropposition à la méthode ����, cette méthode est redéfinie pour arrêterune animation, si nécessaire.

6 Appelle la méthode ������ au moment où la page HTML n’est plusvisualisée.

Figure 10–12 Application $�����������������������

ASTUCE Console Java des applets

Les diagnostics d’exceptions et les textes affichésavec le champ �"� de la classe%�&����������� sont écrits sur la consoleJava pendant l’exécution d’une applet. Selon lesystème d’exploitation, la console s’obtient :• sous Windows, en choisissant le menu Ouvrir

la console disponible sur l’icône Java qui s’affi-che dans la barre d’applications Windows aulancement d’une applet ;

• sous Mac OS X, en lançant l’applicationConsole située dans le dossier Applications/Utilitaire :

• sous Linux, généralement en choisissant lemenu Console Java du navigateur.

Page 223: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 211

Comme pour une image, une applet s’affiche dans une zone de taille définiepar les attributs � ��- et -� �-� de la balise �''���.

Les balises V'��������#6���������6�&��"�#6��%�&�*��������6W incluses dansla balise �''��� permettent de paramétrer une applet. Une classe d’appletinterroge ces paramètres grâce à la méthode ���*������ dont elle hérite.

Pour éviter toute intrusion dans le système d’exploitation où fonctionne lenavigateur, le gestionnaire de sécurité utilisé par la JVM pour les applets esttrès restrictif.

JAVA Installation du plugin Java

La gestion des applets dans un navigateur s’effec-tue grâce à un plugin Java. Sous Windows, le pro-gramme d’installation du JDK et du JRE fourni parSun propose de configurer automatiquement lenavigateur de votre système pour qu’il utilise ceplugin. Sous Linux, il vous faudra mettre à jourmanuellement un lien symbolique si vous voulezque votre navigateur utilise la dernière version duplugin installée, comme l’explique le documentsuivant.B http://www.java.com/fr/download/help/

5000010500.xml

ATTENTION Restrictions appliquées aux applets

Le gestionnaire de sécurité de la JVM applique les restric-tions suivantes pour les applets :• Pas d’accès au système de fichiers local : les classes

d’entrée/sortie sur les fichiers et la classe%�&�.�� ��3� ���-���� ne peuvent pas être utili-sées.

• Possibilité d’accès réseau uniquement avec l’hôte où esthébergé le fichier $���� de la classe de l’applet.

• Accès interdit avec la classe %�&����������� à certai-nes propriétés de la JVM comme "������, "��-���,"��� ,� "��$�"���, "������"���, %�&�-���� �"%�&�$����'��-.

• Impossibilité de lancer des applications locales.

Une exception non contrôlée de classe %�&���$" ���$$���������+.$�'� �� (sous-classe de %�&�������$" ��+.$�'� ��) est déclenchée si vous tentez d’effec-tuer une des opérations interdites.

Si votre programme a besoin de ces droits, soit vous enfaites une application, solution plus compliquée à distri-buer, installer et mettre à jour, soit vous en faites uneapplet signée.

API JAVA Méthodes les plus utiles de la classe javax.swing.JApplet

La super-classe %�&�����''��� de la classe %�&�.�� ��3�''��� définit de nombreuses méthodes. Voici la liste des plus utiles :

Description Méthode

Méthodes appelées par le navigateur que vous devez redéfinir pour spécifierles traitements de votre applet

'"1� $�&� �� � ���'"1� $�&� ��������'"1� $�&� �����'��'"1� $�&� ����������

État de l’applet (la valeur renvoyée est �"� si l’applet est active, c’est-à-dire après l’appel à ���� et avant l’appel à ���')

'"1� $�1������� ��$� &���

Interrogation de la valeur d’un paramètre '"1� $�%�&������� �������*�������%�&������� ��������

Interrogation de l’URL de la page HTML qui contient la balise �''��� del’applet

'"1� $�%�&�����> ������$"����)�����

Page 224: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004212

Par l’exemple : bienvenue dans le monde des applets !L’applet de classe ������������������ �������� affiche un label utilisantun texte construit avec le paramètre ���.

Pour lancer la classe d’applet ������������������ ��������, il faut écrirela balise ������� ������������������������ ���������� ������������ ������������

dans un fichier HTML (par exemple, ����� �������������), puis :• Soit lancer la commande ����������� ����� �������������. Cette com-

mande ouvre une fenêtre de dimensions (�����,������) pour y exécuterl’applet correspondant à la classe de l’attribut �����

• Soit visualiser le fichier ����� ������������� dans un navigateur qui estcompatible avec Java.

Les attributs ����, ����� et ������ sont les trois attributs obligatoires de labalise ������. Les paramètres de l’applet et leur valeur sont cités dans desbalises ��� �����������������������������%�&��� placées entre les balises dedébut et de fin d’applet ������������ et �!�������. La classe de l’applet uti-lise la méthode ���"� ����� pour obtenir la valeur d’un de ces paramètres. Si le dossier du fichier ����� ������������� ne contient pas le chemin ���!����!���!����� ������������, vous pouvez ajouter l’attribut ����#�� àla balise ������ pour donner un chemin absolu ou relatif permettantd’accéder à la racine des classes nécessaires à l’applet. Si le fichier����� ������������� est dans le dossier #�� de développement et le fichier���!����!���!����� ������������ dans le dossier des classes ����, onobtient le fichier suivant :

EXEMPLE com/eteks/test/AppletBienvenue.java��������������������$���� ��%���&������'$

����� �������� est une sous-classe ��#��� de %���&������(������.

B ��#������������� ����������&�����(�����)

Point d’entrée de l’applet : méthode appelée au chargement de l’applet.

B ����#��������������*+��)

Récupération du paramètre ���. B ����,� �������������"� ����� *�����+$

Création d’un label avec le paramètre. B ����(-�#�����#�� ���������������(-�#���*� ��%�� ���.����+$

Ajout du label au contenu de l’applet. B �������/������"���*+����*��#�� ��������+$��00

EXEMPLE bin/AppletBienvenue.html������������������� ���������!�������!������#��1��������������������������������� ��������������������������������������������#������!������������ ���������������������2�������!��������!#��1��!�����

ATTENTION Modification d’une applet

Pour que le navigateur recharge les fichiers���� d’une applet qui ont été modifiés, vousdevez quitter le navigateur et le relancer. Parcontre, ����������� propose le menuRecharger qui permet de recharger les fichiers���� et prend en compte les modificationssur ces fichiers.

Figure 10–13Applet������������������ ��������

avec le paramètre ��� égal à 2����visualisée avec la commande �����������

Page 225: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 213

Créer une interface utilisateur avec une appletComme la classe %���&������(����� représente un panneau avec un layoutde classe %�������� � �� -�1��� par défaut, on peut lui ajouter plusieurscomposants ou sous-panneaux avec la méthode ���.

Par l’exemple : interface utilisateur du calcul de mensualitéL’applet de classe ������������������3�� ��� permet de calculer les men-sualités et le coût d’un emprunt en réutilisant la méthode ������� 4��������de la classe ���������������3�� ���.

L’interface utilisateur de cette applet met en page plusieurs champs de saisiepour simplifier l’utilisation du programme (voir figure 10–14). Elle utilise lesclasses %���&������(5� ������2�&�5���� et %���&������(,����� pour lasaisie du capital, du taux et de la durée de l’emprunt.

JAVA Chargement des classes non standards

Si une classe d’applet a besoin de charger d’autres classes non standards ou des fichiersavec la méthode ���6��� �� de %���������/��, il suffit de les héberger avec votreclasse d’applet en les organisant comme une application Java.

La classe ���������������3�� ��� a étédéfinie dans le chapitre 6, « Les classes de base dela bibliothèque Java »

API JAVA Champs de saisie numériques

Les classes %���&������(5� ������2�&�5����et %���&������(,����� sont apparuesdans la version Java 1.4 et utilisent le formatnumérique correspondant à la langue del’utilisateur : le séparateur décimal pour lesfrancophones est la virgule.

EXEMPLE com/eteks/test/AppletEmprunt.java��������������������$

���� �����������������3�� ���$���� ��%������&��7��#� 5� ���$���� ��%���&������'$���� ��%��������'$���� ��%��������������'$

!''�'�������������������������������8������ �����'!��#�������������3�� �����&�����(�����)

3 Importation de la classe de calcul de mensuali-tés.

����#��������������*+��)

3 Point d’entrée de l’applet.

����9��#������������������9��#���*���"� ����� �*���������++$����9��#�������&����������9��#���*���"� ����� �*����&�++$����:����� ��� �����������:����� �*���"� ����� �*��� ���++$

3 Récupération des valeurs par défaut passées enparamètre.

����;�����(5� ������2�&�5���������/����������������������������������������(5� ������2�&�5����*�������+$����;�����(5� ������2�&�5���������2��&����������������������������������(5� ������2�&�5����*���&+$����;�����(,����� �����9� �����������(,����� �*+$��������9� �����<�����*�� ��+$

3 Création des composants de saisie du capital, dutaux et de la durée de l’emprunt, initialisée avecles valeurs par défaut.

����;�����(-�#�����#��4���������������(-�#���*+$����;�����(-�#�����#��/����������(-�#���*+$

3 Création des labels affichant les résultats descalculs de mensualité et de coût.

Page 226: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004214

Ajout des composants précédents à un panneauutilisant une grille de 5 lignes × 2 colonnes, avecun label d’information devant chaque compo-sant.

B ����("������������3�� ����������("�����*�����������������������%��������= ��-�1����*�>��>��>��++$�����������3�� ��������*����(-�#���*�/���������� ���?����@�A�++$�����������3�� ��������*����/������+$�����������3�� ��������*����(-�#���*����������������������������2��&��8���?����@ ?�������*���B+�A�++$�����������3�� ��������*����2��&+$�����������3�� ��������*����(-�#���*����������������������������9� ?����@��*������?����@�+�A�++$�����������3�� ��������*����9� ��+$�����������3�� ��������*����(-�#���*�4�������?����@�A�++$�����������3�� ��������*��#��4��������+$�����������3�� ��������*����(-�#���*�/�?���;#��A�++$�����������3�� ��������*��#��/���+$

Création du bouton et de son action qui provo-que un calcul de mensualités avec les valeurssaisies.

B ����( ������#�����/������ �������( ������*�/������ �+$����#�����/������ ���������-����� *���������-����� �*+��������)����������#���������������"� ;� ���*�����3�������+���������)

Récupération des valeurs saisies, converties dansleur type primitif Java respectif.

B �������������#�������������**7��#� +����/����������<����*++�����������������������������������#��<����*+$�������������#������&������**7��#� +����2��&����<����*++�����������������������������������#��<����*+�!������!���$���������������#4�����������**7��#� +����9� ������<����*++�����������������������������������<����*+�'���$

Si le nombre de mensualités est négatif, un mes-sage signalant l’erreur est affiché à l’utilisateur.

B �����������;�*�#4�������������+������������(C�����"�������4����9�����*�����3�� �������>�������������������-���� ?����@�������?������ �����������>�����������������/������4�������?����@�>�����������������(C�����"����D67:7=E43,,=3+$�����������������������)

Calcul de la mensualité et des intérêts. B ���������������#���������������3�� ����������� 4��������*������������������������������������&>��#4��������>��������+$�����������������#������� ���������������'��#4���������������������������������������F��������$

Modification du texte des labels affichant lerésultat des calculs.

B ������������7��#� 5� ����;� ���7��# ���������������������������������7��#� 5� �������:������*+$��������������#��4�����������2�&��*�����������������������;� ���7��# ��;� ����*���������++$����������������#��/������2�&��*;� ���7��# ��;� ����*���� ��++$����������0��������0������0+$

Ajout du bouton à un panneau utilisant unlayout de classe %��������5���-�1���(layout par défaut de ("����) afin qu’il prenneses dimensions préférées. B ����("������������/������������("�����*+$

�����������/���������*#�����/������ +$

Ajout des deux panneaux au contenu del’applet.

B �������/������"���*+�����*�������3�� ���>� � �� -�1����7C62G+$�������/������"���*+�����*�������/�����>� � �� -�1����,CH2G+$��00

Page 227: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

10 –

Inte

rface

s ut

ilisa

teur

ave

c Sw

ing

© Groupe Eyrolles, 2004 215

À chaque fois que l’utilisateur clique sur le bouton Calculer �, cette applet calculela mensualité qui correspond aux valeurs saisies � et met à jour les labels affichantle résultat des calculs �. Les valeurs affichées dans ces labels respectent le formatd’écriture des nombres de la langue de l’utilisateur grâce à l’utilisation de la classe%������&��7��#� 5� ���. Notez qu’ici la méthode ���4����9����� utilise enpremier paramètre la référence sur l’applet courante � et qu’il faut, à l’intérieurd’une classe anonyme, répéter le nom de la classe devant ��� pour obtenir uneréférence sur l’objet de la classe englobant la classe anonyme.Pour lancer l’applet de classe ������������������3�� ���, il faut créer unfichier HTML contenant la balise ������ et les paramètres donnant lesvaleurs par défaut du capital, du taux et de la durée de l’emprunt.

EXEMPLE bin/AppletEmprunt.html�������������������3�� ����!�������!������#��1�����3�� ����!�����������������������������������3�� ���������������������I������������J�������#������!����������� �������������������������������������� ������������&���������������������� ����������� �������������������H�����K������������� ��������#��������(������L���� ���������� ���������������!��������!#��1��!�����

POUR ALLER PLUS LOIN Java Web Start

Les applets permettent de distribuer automatiquement un logiciel et ses mises à jour par Inter-net, ce qui facilite son déploiement sur de nombreux postes. Java Web Start inclus en standarddepuis Java 1.4 reprend le même principe avec la possibilité de lancer une application Java ouune applet. La classe dont la méthode ���� est utilisée comme point d’entrée de l’applicationdoit alors être citée dans un fichier �%��� respectant une syntaxe spéciale.B http://java.sun.com/products/javawebstart/

REGARD DU DÉVELOPPEUR Utilisation des applets

Ce sont les applets qui ont fait les premiers succès de Java car c’était la pre-mière technologie qui permettait de lancer automatiquement des program-mes téléchargés au sein d’une page d’un navigateur et ce, en toute sécurité.Malheureusement, c’est aussi cette intégration qui oblige à multiplier les testsdes applets sur tous les navigateurs pour vérifier qu’elles fonctionnent correc-tement. Quelle version de la JVM est supportée par le navigateur ? L’utilisa-teur doit-il installer le JRE ? Le navigateur arrête-t-il d’office tous les threadsde l’applet à sa disparition ou fait-il confiance au programmeur de l’applet ? Àquel moment exactement les méthodes ��� et ��� �1 sont-elles appeléespar le navigateur ? Est-ce qu’une applet peut changer de dimensions quandles attributs ����� et/ou ������ de la balise ������ sont exprimés en pourcen-tage (comme l’applet de chat du dernier chapitre) ? Autant de questions qui n’ont pas toujours la même réponse selon le navigateur.En Intranet, cela pose peu de problèmes car la configuration des utilisateurs(navigateur + version de Java) est connue voire imposée.

Figure 10–14Applet ������������������3�� ���

visualisée dans un navigateur

API JAVA Classe java.text.NumberFormat

La classe %������&��7��#� 5� ��� et sasous-classe %������&��9������5� ��� per-mettent de convertir un nombre en texte ou untexte en nombre. À la différence des méthodes��,� ��� et des méthodes préfixées par �� �des classes d’emballage, les méthodes ;� ��� et�� � de la classe %������&��7��#� 5� ���respectent le format habituellement utilisé dans lalangue de l’utilisateur, le séparateur décimal étantalors la virgule pour les francophones.

Page 228: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004216

En résumé...Ce chapitre a exploré les possibilités de la très riche bibliothèque Swing pourcréer et gérer des interfaces utilisateur d’applications et d’applets. Bienentendu, les environnements de développement évolués qui prennent encharge Swing de façon interactive simplifient considérablement leur mise enœuvre. Il demeure important de comprendre les fonctionnalités et lesrouages de Swing.

Voyons maintenant comment enregistrer et lire des données en Java dansune base de données afin de gérer les informations du forum de discussion,principale étude de cas de cet ouvrage.

POUR ALLER PLUS LOIN Créez vos propres composants

Pour obtenir une nouvelle classe de composant Swing, vous devezcréer une sous-classe de %���&������(/�������� qui redéfinitles deux méthodes suivantes :

La méthode �����/�������� est appelée par le système pourmettre à jour le dessin d’un composant, aussi bien à la premièrevisualisation du composant, qu’ultérieurement pour le redessinerpartiellement ou entièrement. Il faut implémenter cette méthode endessinant avec les méthodes de l’objet de classe%��������= ����� reçu en paramètre. Ces méthodes appartien-nent à deux catégories :• Les méthodes ��/��� et ��5��� modifient la couleur et la

police de caractères courantes utilisées par les méthodes de des-sin.

• Les méthodes � ��-���, � ��"��1���, � ��C���,� ��,� ���, � ��:����, ;���"��1���, ;���C���... dessi-nent des formes. Les coordonnées (x,y) de dessin manipulées parces méthodes sont exprimées en pixels, le point (0,0) se situantdans le coin supérieur gauche d’un composant.

La méthode ���" �;� ��,�K�� est appelée par le gestionnairede mise en page pour connaître la taille préférée d’un composant. Ilfaut implémenter cette méthode pour retourner un objet de classe

%��������9������� initialisé avec la largeur (width) et la hau-teur (height) préférées du composant.

Par exemple, la classe �������������3����� suivante des-sine une ellipse en noir dans un composant, dont la taille préféréeest de 100 x 100 pixels :

Ne manquez pas la très jolie démo (����9��� fournie dans lesous-dossier ����!%;�!(����9 du dossier d’installation du JDK :elle donne un bon aperçu des vastes possibilités de dessin offertesen Java.

��#��������������/���������*%��������= �������+��#����%��������9�����������" �;� ��,�K��*+

��������������������$���� ��%���&������'$���� ��%��������'$����3�������&�����(/��������)����#��������������/���������*= �������+��)��������/��� */��� � -/M+$������� ��C���*�>��>����D����*+>����G�����*++$��0����#����9�����������" �;� ��,�K��*+��)���� ��� ������9��������*���>����+$��00

Page 229: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

11Connexion à la base de données avec JDBC

SOMMAIRE

B Connexion à une base de données avec JDBC

B Installation de MySQL

B Programmation SQL en Java

B Classes de gestion du forum pour la base de données

MOTS-CLÉS

B JDBCB MySQLB ConnectionB StatementB ResultSetB PreparedStatement

Les bases de données permettent d’organiser efficacement la sauvegarde et la lecture des données d’un programme. Après avoir explicité la façon dont nous recommandons d’exploiter en Java les bases de données du marché, nous présentons dans ce chapitre les classes de gestion des utilisateurs et de leurs messages dans une base de données.

SGBD Application Java

SQL Driver JDBC

Table FACTURE

Champ Type SQL

CLIENT CHAR(50)

ARTICLE VARCHAR(255)

MONTANT DECIMAL(9,2)

Page 230: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004218

Utilisation d’une base de données en JavaJDBC (Java DataBase Connectivity) est une bibliothèque d’interfaces et declasses utilisées pour accéder à un SGBDR (Système de gestion de base dedonnées relationnelle, ou RDBMS, pour Relational DataBase ManagementSystem en anglais).Un programme JDBC envoie à un SGBDR des requêtes écrites en SQL(Structured Query Language) puis exploite le résultat renvoyé en Java. Ce chapitre vous présente comment se connecter à une base données, com-ment créer et utiliser des tables avec les classes et interfaces JDBC du pac-kage ��������. La mise en pratique de JDBC est réalisée pour deux applica-tions avec des données différentes dans la base de données :• Abordée dans la section « Par l’exemple : enregistrer les factures client »,

page 226, la première application crée et initialise une table de factura-tion puis montre comment rechercher les articles achetés par un clientdonné.

• Les sections « Forum : gérer la connexion à la base de données »,page 228, et « Forum : stocker utilisateurs et messages », page 232, décri-vent les tables nécessaires au stockage des données du forum puis la façonde les exploiter dans des classes Java. Ces classes seront utilisées commeoutils intermédiaires entre les données du forum en base et les pages JSPqui présenteront ces données.

L’utilisation ici de MySQL permet de tester de façon réaliste les classesdéveloppées avec un vrai SGBD. Mais les instructions SQL utilisées étantsimples et standards, vous pouvez tout à fait tester les applications avec leSGBD de votre choix.

REGARD DU DÉVELOPPEUR Avantages /inconvénients de JDBC

Avantages

• Comme JDBC repose sur SQL, cette bibliothèque bénéficie detoutes ses fonctionnalités éprouvées : création et mise à jour detables, sélections avec jointure, transactions, appels à des procé-dures stockées.

• La durée d’apprentissage de JDBC est réduite pour les personnesutilisant déjà un SGBDR avec SQL.

• Pour permettre d’exploiter leur produit en Java, les éditeurs deSGBDR du marché (Oracle, Sybase...) n’ont qu’à développer undriver JDBC, ensemble de classes qui implémentent les interfacesdu paquetage ��������.

• Une application peut se connecter à plusieurs SGBDR en mêmetemps.

• Si votre programme utilise la version standard de SQL, il suffit dechanger le driver approprié en cas de changement de SGBDR.

Inconvénients

• Obligation de connaître un minimum SQL pour utiliser JDBC.JDBC n’inclut pas de méthodes pour construire automatiquementles instructions SQL.

• Les instructions SQL étant construites sous forme de chaînes decaractères, leur exactitude ne peut être vérifiée ni par le compila-teur Java ni par JDBC, mais uniquement par le SGBDR aumoment de leur traitement.

• JDBC n’oblige pas un éditeur de SGBDR à implémenter tout SQLdans son driver, ce qui peut gêner la portabilité d’une applicationJava en cas de changement de SGBDR.

• Basée sur SQL, JDBC est limité à l’utilisation de bases de donnéesrelationnelles : aucune utilisation de base de données objet (SGBDO)n’est prévue, fait étonnant pour un langage objet comme Java.

• JDBC peut difficilement évoluer indépendamment de SQL.

B.A.-BA Base de données

Une base de données est un ensemble de tablesorganisées pour stocker dans des fichiers les don-nées manipulées par une application. Une tableest comparable à un ensemble d’objets Java demême classe avec leurs champs : elle stocke unensemble d’enregistrements (records en anglais),chaque enregistrement d’une table ayant lesmêmes champs (fields) et chaque champ étanttypé (chaîne de caractères, nombre...).

Page 231: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 219

Se connecter à une base de données avec un driver JDBCChaque éditeur de SGBDR fournit son driver JDBC sous forme d’unensemble de classes rassemblées dans un fichier d’archive ���, qu’il fautajouter à l’option ������� � lors de l’exécution de votre programme.

On procède à la connexion au système de gestion de base de données endeux étapes :1 Chargement de la classe du driver par la JVM : cette classe implémente

l’interface ������������� et peut être chargée en appelant la méthodede classe ������ de la classe ���������������.

Exemple

2 Connexion : elle s’effectue en appelant la méthode �� ������ ��� de laclasse ������������������� avec en premier paramètre une chaîne decaractères de la forme �������� ��������?-1��. Différant d’un driver àl’autre, ����?-1��décrit la machine où tourne le SGBDR et le nom dela base de données, auxquels vous voulez vous connecter.

Exemple

On dispose aussi de la méthode �� ������ ��� avec deux paramètressupplémentaires représentant un utilisateur référencé sur le SGBDR etson mot de passe. Utilisez cette forme de la méthode quand le SGBDRrequiert une authentification de l’utilisateur en cours de connexion.

Exemple

�������������������� ��������������!" 3 Chargement du driver du SGBDR MySQL.

��������������� ���������#����$����������������� ������ ����������� ����%%�������� % �� �!"

3 Connexion au SGBDR MySQL tournant sur lamachine locale avec la base �� ( �� est uncatalogue en JDBC).

��������������� ���������#����$����������������� ������ ����������� ����%%�������� % �� �&

�������&���'� �!"

3 Connexion au SGBDR MySQL pour l’utilisateur����� et son mot de passe �'� .

API JAVA registerDriver

Une classe de driver JDBC doit appeler la méthode de classe ���� ���� ������������������� ����! de la classe ������������������� pour se signalercomme driver JDBC. Comme cet appel est effectué par toute classe de driver JDBC dans son ini-tialisateur � � ��, il suffit de charger la classe d’un driver dans la JVM pour que la connexion àune base de données soit possible. L’appel à la méthode ������ est généralement préféré carson paramètre textuel permet de spécifier à l’exécution la classe du driver à charger en fonctiondu SGBDR utilisé.

Page 232: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004220

Par l’exemple : tester la connexion avec la base de donnéesL’application suivante teste la connexion à la base de données de test ins-tallée par défaut avec MySQL. Les méthodes des classes de JDBC (con-nexion et instructions SQL) étant susceptibles de déclencher des exceptionscontrôlées de classe ���������()*+#��� ���, l’appel à ces méthodes doit êtreprogrammé dans une instruction � �� ��, et ce, même pour la méthode����� exécutée dans le bloc ������ .

EXEMPLE com/eteks/test/TestConnexionJDBC.java ���,��������� �,�� �� "

���� ����������-"���� �����#��.����/0� ���1���"

������2�� �����#���/�3�4���5������ � ��������������( ���67����!��4���������� ���������#����$��5��"���� ����4�������������������������� ��������������!"

Chargement de la classe du driver JDBC deMySQL.

B

Ouverture de la connexion avec MySQL tournantsur la même machine.

B �����������#����$�������������� ������ ������������ ����%%% �� �!"������/0� ���1�������.���������������5��&�������#����0,�!"����8

Exception déclenchée si la classe n’est pas char-gée par ������.

B ������ ����������� 9�5��+#��� �����#!����4������/0� ���1�������.���������������5��&����������������������������� �5��������:��#��� ���������!!"����8

Exception déclenchée en cas de problème avecle SGBD.

B ������ ����()*+#��� �����#!����4������/0� ���1�������.���������������5��&�������������������������#�������������������:��#��� ��������!!"����8���������� ����4������ ������4�����������������#����;$��5��!

Fermeture de la connexion. B ���������������#����������!"������8�������� ����()*+#��� �����#!������4���������#���� ( ��,2�����!"������8����8

Arrêt de la JVM. B ����( � ����#� ��<!"��88

Page 233: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 221

Installation du SGBD MySQLPour exécuter le test précédent et tous les exemples requérant une connexionavec la base de données, vous devez installer et démarrer le SGBDRMySQL. Distribué sous licence GNU GPL, ce SGBDR peut être utilisélibrement. Pour l’installer, téléchargez à http://dev.mysql.com la dernière versionde MySQL (version 5.x) pour votre système et de son driver JDBCConnector/J (version 3.x), puis suivez les instructions ci-après.

Sous Windows1 Décompressez le fichier � ���=�������=.���'�� :

2 Exécutez le programme d’installation �� 5���#� et choisissez l’optionTypical dans la boîte de dialogue Setup Type. Sous Windows NT/2000/XP,dans la dernière boîte de dialogue d’installation, cochez l’option ConfigureThe MySQL Server now avant de cliquer sur le bouton Finish.

3 Sous Windows NT/2000/ XP, choisissez l’option Standard Configurationdans l’assistant de configuration et cochez ensuite les options Install AsWindows Service et Launch the MySQL Server automatically, qui permettent àMySQL d’être disponible comme service au démarrage de la machine.Dans la boîte de dialogue suivante, entrez un mot de passe pour l’utilisa-teur �� dans les champs sous l’option Modify Security Settings, et cochezl’option Create An Anonymous Account. Finalement, cliquez sur les bou-tons Execute puis Finish. Sous Windows 95/98/ME, la notion de service n’existe pas et il vousfaudra démarrer MySQL en exécutant le programme ��>1����

9����>� ()*>� ()*�(����?�<>���>� ������#�. Par ailleurs, il n’existe paspar défaut d’utilisateur anonyme MySQL sous ce système et vous devrezvous connecter à MySQL sous l’utilisateur �� sans mot de passe pardéfaut (par exemple avec la commande � �����#��=5��� � �� ).

Sous Linux1 Créez un groupe � ��� et un user � ��� s’ils n’existent pas, en exécutant

les commandes suivantes dans une fenêtre de terminal :

2 Installez le fichier � ���=�������0��� ���' de votre système avec lescommandes suivantes :

���#��%�� �%����%� ���=�������=.���'��

�5��� %5�%����%��5������ ����%5�%����%5������=��� ����� ���

���%5�%������5�'���@�%������%���%� ���=�������=��� ���'�A� ��#������=��� ���=�������=���%5�%�����%� ������%5�%�����%� ������� �%� ���B��� ���B���==5��$� ������.��=C��� ��%5�%�����%� ���

DANS LA VRAIE VIEEt les autres bases de données ?

Pour utiliser une autre base de données avec lesapplications de cet ouvrage, il suffit de récupérerleur driver JDBC, puis de modifier la classe du dri-ver et la chaîne de connexion, toutes deux néces-saires à la connexion. Notez qu’il existe de nom-breux SGBDR écrits en Java qui ont pour avantaged’être simples à installer et à utiliser avec uneapplication Java. Dans cette catégoire, HSQL Data-base Engine et Derby sont les seuls SGBDR totale-ment gratuits en développement et en distribution. B http://hsqldb.sourceforge.net/B http://db.apache.org/derby/

ASTUCE Tester MySQL

Une fois MySQL démarré, vous pouvez testerdirectement des instructions SQL en lançant leprogramme � �����#� sous Windows ou lacommande %5�%�����%� ���%���%� ���dans une fenêtre de terminal sous Linux etMac OS X. Il vous faudra d’abord choisir avecl’instruction 5�� la base (ou catalogue) surlaquelle vous voulez travailler, par exemple :5��� �� "

pour la base �� créée par défaut dansMySQL. Vous pouvez ensuite lancer n’importequelle instruction SQL comme celles décritesdans les pages suivantes, chaque instructiondevant se terminer par un point-virgule.

Page 234: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004222

3 Démarrez MySQL sous utilisateur �� du système :

Sous Mac OS XLa version Mac OS X de MySQL n’est qu’une variante de la version pourLinux utilisant la même organisation, mais plus simple à installer.1 Ouvrez le fichier � ���=�����������.2 Exécutez les deux programmes d’installation � ���=���������,� et

� ()*( � 5�D ����,�. Le premier programme installe MySQL dans lesous-dossier � ��� de %5�%����� et le second installe un script qui lanceautomatiquement MySQL au démarrage de la machine.

3 Redémarrez la machine.

Installer le driver JDBCUne fois MySQL installé, au tour du driver JDBC MySQL !1 Décompressez le fichier du driver JDBC � ���=������ �=����=

��������'�� avec la commande :

Si le système ne connaît pas la commande ��, vérifiez que le 1E2F estbien correct (voir la section du chapitre 2, « Télécharger et installer lesprogrammes pour développer en Java »).

2 Copiez le fichier d’archive � ���=������ �=����=�������=������ qu’ilcontient dans le sous-dossier ��� du répertoire de votre dossier de déve-loppement Java.

3 Ajoutez le fichier d’archive à l’option =������� � des commandes ����des applications qui accèdent à MySQL :

���.��=C�� ����%5�%�����%� ���%�� ������=C�� ����%5�%�����%� ������.��=C��� �%5�%�����%� ���%���

�5��� ���%5�%�����%� ���%5�%�����%� ���%���%� ����B�����==5��$� ����G�#�

���#��%������%���%� ���=������ �=����=��������'��

FICHIER bin\TestConnexionJDBC.bat������������ ����>�������"��>���>� ���=������ �=����=�������=��������X������ �,�� �� �2�� �����#���/�3��

ou������������ �����> �� ���"��>���>� ���=������ �=����=�������=��������X������ �,�� �� �2�� �����#���/�3�

FICHIER bin/TestConnexionJDBC.sh������������ ����%����������%���%� ���=������ �=����=�������=��������X������ �,�� �� �2�� �����#���/�3�

ou�����=������� ����%���% �� ������%���%� ���=������ �=����=�������=���������X������ �,�� �� �2�� �����#���/�3�

ATTENTION Administration de MySQL

L’administration de MySQL (arrêt de MySQL,création d’autres bases de données, attributionde droits spécifiques aux utilisateurs des basesde données...) s’effectue sous l’utilisateur �� de MySQL. Au premier lancement de MySQL,attribuez par sécurité un mot de passe à cet uti-lisateur spécial avec la commande :%5�%�����%� ���%���%� ���������X�=5��� �����.���votreMotDePasseVoir aussi http://dev.mysql.com/doc/mysql/fr/

ASTUCE Dossier des extensions Java

Tous les fichiers d’archive placés dans le dossierdes extensions Java sont automatiquement ajou-tées aux chemins de l’option =������� �. Sivous y copiez le fichier du driver JDBC, vousn’aurez donc pas à citer ce fichier avec cetteoption.Ce dossier spécial est, sous Windows et Linux, lesous-dossier ��%���%�# du dossier d’installa-tion du JDK, et, sous Mac OS X, le dossier%*��� %/���%+# �������.

Page 235: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 223

SQL, le langage des bases de données

Principaux types de donnéesChaque type SQL a son équivalent en tant que constante numérique dans laclasse ���������2 ���. Tous les types SQL déclarés dans la classe ���������2 ���ne sont pas forcément pris en charge par toutes les bases de données.

Si vous ne connaissez pas SQL, utilisez lors de votre apprentissage les ins-tructions décrites ci-après.

Mettre à jour les tables et les index

Tableau 11–1 Correspondance entre les types SQL et Java

Type SQL Description Type Java Constante java.sql.TypesD�2+H+C Entier signé �� � 2 ����D�2+H+C

9*0E2 Nombre à virgule flottante ���� 2 ����9*0E2

�0I3*+ Nombre double à virgule flottante ��5��� 2 �����0I3*+

�+�D�E*��&�! Nombre décimal de n chiffres et d décimales ������� ��3��������� 2 �����+�D�E*

�FEC��! Chaîne de caractères de n caractères ����������( ���� 2 �����FEC

JEC�FEC��! Chaîne de caractères de longueur variable avec n caractèresau maximum

����������( ���� 2 ����JEC�FEC

�E2+ Date ����������� � 2 �����E2+

2D�+ Heure ���������2��� 2 ����2D�+

2D�+(2E�1 Date et heure ���������2���� ��� 2 ����2D�+(2E�1

3*03 Bloc de données de taille variable permettant de stocker desdonnées binaires (images, données brutes...)

���������3���≈�� ��67

2 ����3*03

Créer une table Exemples

�C+E2+�2E3*+�2����2�� �������K������&���&�������������! �C+E2+�2E3*+�9E�2IC+���*D+�2��FEC�?<!&�EC2D�*+�JEC�FEC�L??!&��0�2E�2��+�D�E*�M&L!!

Crée la table 2����2�� dont la liste des champs suivis de leur type estdonnée entre parenthèses.Créer un index

�C+E2+�D��+N�D���#2�� �0��2����2�� �������D&������/! �C+E2+�D��+N��*D+�29E�2�0��9E�2IC+���*D+�2!�Crée l’index D���#2�� sur les champs �����D et �����/ de la table 2����2�� .

Supprimer une tableASTUCE Index�C01�2E3*+�2����2��

Pour optimiser les recherches et les tris sur lestables, il est possible de créer un ou plusieursindex. Ces index sont maintenus automatiquementet stockent l’ordre des enregistrements des tablesselon un critère de tri sur un ou plusieurs champs.

Supprime la table 2����2�� .Supprimer un index�C01�D��+N�D���#2�� �0��2����2��

Supprime l’index D���#2�� de la table 2����2�� .

Page 236: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004224

Modifier et rechercher les enregistrements d’une table

Exemples Insérer un enregistrementD�(+C2�D�20�9E�2IC+���*D+�2&�EC2D�*+&��0�2E�2!�JE*I+(��O2�������5���P&�O��C#K<P&�OQ�R?P!

D�(+C2�D�20�2����2�� �������K&������L&���&������!����������������JE*I+(������5K&�����5L&���&�����5�!

Insère un nouvel enregistrement dans la table 2����2�� avec les valeurscorrespondant aux champs.

Modifier un enregistrement

I1�E2+�9E�2IC+�(+2��*D+�2$O(�������5���P�SF+C+��*D+�2$O(�������� ��P

I1�E2+�2����2�� �(+2������K$����5K&������L$����5L&��������������������SF+C+�������$����5�

Modifie dans la table 2����2�� certains champs du ou des enregistre-ments vérifiant la condition ������$����5�.

Supprimer un enregistrement

�+*+2+�9C0��9E�2IC+�SF+C+��*D+�2$O2�������5���P

�+*+2+�9C0��2����2�� �SF+C+�������$����5�

Supprime de la table 2����2�� le ou les enregistrements vérifiant la con-dition ������$����5�.

Rechercher dans une table

(+*+�2������K&������L&����9C0��2����2��

Recherche et sélectionne les champs demandés dans tous les enregistre-ments de la table 2����2�� et les renvoie, ou renvoie tous les champs si -remplace la liste des champs.

(+*+�2�-�9C0��9E�2IC+�SF+C+��*D+�2$O(�������� ��P

(+*+�2������K&������L&����9C0��2����2�� ���������������������������SF+C+�������$����5�

Recherche et sélectionne dans la table 2����2�� le ou les enregistrementsvérifiant la condition ������$����5�.

(+*+�2������K&������L&����9C0��2����2�� ���������������������������SF+C+�������$����5��0C�+C�3T�������

Recherche et sélectionne dans la table 2����2�� le ou les enregistrementsvérifiant la condition ������$����5� et triés dans l’ordre ascendant desvaleurs du ������.

DANS LA VRAIE VIE SQL, un langage beaucoup plus riche

Les instructions SQL présentées dans cet ouvrage sont volontairement choisies parmi lesplus simples afin que tous les programmeurs puissent les aborder et que toutes les bases dedonnées puissent les supporter. Mais JDBC vous laisse la possibilité d’utiliser toutes lesfonctionnalités SQL de votre base de données, notamment les contraintes sur les champs etles recherches complexes.

B.-A.-BA Casse et valeurs littérales en SQL

SQL ne fait pas de différence entre les majusculeset les minuscules. Les valeurs littérales autres quenumériques comme les chaînes de caractères et lesdates doivent être notées entre apostrophes ouentre guillemets (U ou �).

Page 237: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 225

Programmation SQL avec JDBC

Utiliser une connexion JDBC (java.sql.Connection)La connexion renvoyée par la méthode �� ������ ��� de la classe������������������� est l’objet qui est principalement utilisé pour effec-tuer des opérations sur la base de données. La classe de cet objet implémentel’interface ��������������� ��� dont voici les principales méthodes :• ��� �( � ���� : ces méthodes renvoient une instance de ���������

( � ���� utilisée pour exécuter une instruction SQL sur la base de données.• �����( � ���� : ces méthodes précompilent des instructions SQL

paramétrées et renvoient une instance de ���������1�����( � ���� .• ��������� : ces méthodes préparent l’appel aux procédures stockées de la

base de données et renvoient une instance de �����������������( � ���� .• �� E5 ������ , ����� et ������, gèrent les transactions sur la base de

données.• �� �� ��� � : cette méthode renvoie une instance de ���������

�� ������� ��� � pour obtenir des informations sur la base de données etsur ses possibilités.

• ����� et �������� gèrent la fermeture d’une connexion.

Exécuter des instructions SQL (java.sql.Statement)Les méthodes ��� �( � ���� d’une connexion renvoient un objet dont laclasse implémente l’interface ���������( � ���� . Les méthodes de cetteinterface le plus utilisées sont :• �#��5 �I��� � : elles exécutent l’instruction SQL en paramètre sur la base de

données, pour mettre à jour ses tables ou les enregistrements d’une table.• �#��5 �)5� : elles exécutent une sélection SQL se servant de l’instruction

(+*+�2 en paramètre et renvoient une instance de ���������C��5� (� utili-sée pour énumérer les champs recherchées ligne par ligne.

Exploiter les résultats d’une sélection SQL (java.sql.ResultSet)L’interface ���������C��5� (� est dotée de deux catégories de méthodes,appelées tour à tour :• Les méthodes ��# , ��� , ��� , ��� ���, �����5 �, sont utilisées pour

changer de ligne : ces méthodes renvoient 5� s’il existe une ligne à laposition choisie.

B.A.-BA Procédure stockée

Une procédure stockée (stored procedure enanglais) est une fonction programmée sur unSGBD, qui regroupe un ensemble d’instructionsSQL.

B.A.-BA Transaction

Une transaction est un groupe d’instructionsSQL qui doivent être effectuées ensemble pourassurer la cohérence d’une base de données.Les trois méthodes �� E5 ������ , ����� et ������, s’utilisent généralement dans unprogramme structuré ainsi :

%%�1��������������� ����� ����������#������ E5 ������ ������!" 4��%%�D�� 5� �����()*��������%%� ����� ���

��%%�������� ���������� ����� ����������#��������� �!"8�� ����()*+#��� �����#!4��%%�E��5�� ���������� ����� ����������#����������,�!"8������ 4�������#������ E5 ������ � 5�!"8

Page 238: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004226

Si la méthode �� 2 �� renvoie la valeur C��5� (� �2T1+B90CSEC�B0�*T,seule la méthode ��# peut être appelée. L’ensemble des lignes renvoyéespar une instruction (+*+�2 est le plus souvent parcouru dans une boucle.���� appelant la méthode ��# de la forme :

• Les méthodes �� ��� comme �� ( ���, �� D� , �� �� �, �� 0���� …,renvoient la valeur d’un des champs d’une ligne. Chacune de ses métho-des existe sous deux formes qui prennent en paramètre :– soit une chaîne de caractères correspondant à l’identificateur d’un

champ dans l’instruction (+*+�2 ;– soit un entier représentant le numéro d’ordre d’un champ. Le numéro

du premier champ est 1.

Les informations sur les champs (identificateur, type…) sont obtenues grâce uneinstance de ���������C��5� (� �� ��� �, renvoyée par la méthode �� �� ��� �.

Par l’exemple : enregistrer les factures clientL’application suivante montre comment programmer les instructions SQLavec JDBC en manipulant une table de factures.

Exécution d’une instruction de recherche. B ���������C��5� (� ����$� ����&� ����#��5 �)5� ��(+*+�2�����!"

Tant qu’il y a encore des lignes... B .�����������# �!!4

...utilisation de la nouvelle ligne. B ��%%�D� ���� �������������� �������������������5�� �8

EXEMPLE com/eteks/test/CalculTotalFactures.java

Figure 11–1 Application ����� �,�� �� �����5�2� ��9�� 5��

���,��������� �,�� �� "

���� ����������-"���� �����#��.����/0� ���1���"

����������5�2� ��9�� 5��4���5������ � �������������( ���67����!��4���������� ���������#�����$��5��"����( � ���� ����� 5� ����$��5��"����C��5� (� ����5� � ��$��5��"���� ����4Chargement de la classe du driver JDBC de

MySQL. B �������������������������� ��������������!"

Ouverture de la connexion avec MySQL tournantsur la même machine.

B �����������#����$�������������� ������ ����������������������������������������������� ����%%% �� �!"����������� 5� ����$������#������� �( � ���� �!"

Création de la table 9E�2IC+ avec ses champs�*D+�2, EC2D�*+ et �0�2E�2�

B ��������� 5� �����#��5 �I��� ��������������C+E2+�2E3*+�9E�2IC+��*D+�2��FEC�?<!&�����������:���EC2D�*+�JEC�FEC�L??!&��0�2E�2��+�D�E*�M&L!!�!"��

Page 239: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 227

��������� 5� �����#��5 �I��� �������������D�(+C2�D�20�9E�2IC+���*D+�2&�EC2D�*+&��0�2E�2!�����������:���JE*I+(��U2�������5���U&�U��C#K<U&�UQ�R?U!�!"����������� 5� �����#��5 �I��� �������������D�(+C2�D�20�9E�2IC+���*D+�2&�EC2D�*+&��0�2E�2!�����������:���JE*I+(��U(�������� ��U&�U1�U&�UK?<<U!�!"��������� 5� �����#��5 �I��� �������������D�(+C2�D�20�9E�2IC+���*D+�2&�EC2D�*+&��0�2E�2!�����������:���JE*I+(��U(�������� ��U&�UD������ �U&�UKL<�?U!�!"

3 Ajout d’enregistrements dans la table 9E�2IC+.

��������5� � �$���� 5� �����#��5 �)5� ������������(+*+�2�EC2D�*+&��0�2E�2�9C0��9E�2IC+�����������:���SF+C+��*D+�2$U(�������� ��U�!"��������( ����� ������$���"��������5������� �� 2� ���$�<"

3 Recherche dans la table 9E�2IC+ des articlescommandés par Sophie Martin.

������.��������5� � ���# �!!������4

3 Tant qu’il y a des factures...

��������� ������:$���5� � ��� ( ������EC2D�*+�!�:����"����������� �� 2� ���:$���5� � ��� ��5�������0�2E�2�!"��������8������/0� ���1�������.���������������5��&�����������E ����������:�� ���������������:��>���� �� � � �������:���� �� 2� ���:���>5L<���!"

3 … Récupération de l’article et du montant de lafacture.

��������� 5� �����#��5 �I��� ����C01�2E3*+�9E�2IC+�!"����8������ ����������� 9�5��+#��� �����#!����4������/0� ���1�������.���������������5��&���������������������� �5��������:��#��� ���������!!"����8������ ����()*+#��� �����#!����4������/0� ���1�������.���������������5��&�������������+�5�/�3������:��#��� ���������!!"����8���������� ����4

3 Suppression de la table 9E�2IC+ (simplementpour pouvoir exécuter plusieurs fois l’applicationsans provoquer d’exception).

������ ������4��������������5� � �;$��5��!������������5� � �������!"��������������� 5� ����;$��5��!������������� 5� ����������!"�����������������#����;$��5��!���������������#����������!"������8�������� ����()*+#��� �����#!������4���������#���� ( ��,2�����!"������8����8����( � ����#� ��<!"��88

3 Fermeture des objets utilisés pendant la con-nexion JDBC.

ASTUCE Valeurs littérales des instructions SQL

Notez les valeurs littérales SQL entreapostrophes (U) pour obtenir des chaînes d’ins-tructions SQL le plus lisible possible. Si vous optezpour les guillemets, vous serez obligé d’ajouterune barre oblique inverse > devant les guillemets.

Page 240: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004228

Une fois connecté à la base de test �, l’application de classe����� �,�� �� �����5�2� ��9�� 5�� crée la table 9E�2IC+ � avec ses champs�*D+�2, EC2D�*+ et �0�2E�2. Trois enregistrements sont ensuite ajoutés à cettetable �. Enfin, les factures de Sophie Martin sont recherchées � dans latable 9E�2IC+ pour en calculer le montant total �.

Notez que les variables �����#���, ��� 5� ��� et ��5� � doivent êtredéclarées et initialisées en dehors de l’instruction ��� �� pour pouvoir êtreutilisées dans le bloc ������ .

Obtenir des informations sur la base de données (java.sql.DatabaseMetaData)La méthode �� �� ��� � d’une connexion renvoie un objet dont la classeimplémente l’interface ����������� ������� ��� �. Les méthodes de cetteinterface permettent d’obtenir des informations complètes sur la base dedonnées : tables, index, procédures stockées, champs, droits d’utilisation…

La plupart de ces informations sont renvoyées sous forme d’une instance de���������C��5� (� utilisée pour énumérer les réponses :• �� 2����� renvoie la liste des tables.• �� ���5��� renvoie la liste des champs des tables.• �� D���#D��� renvoie la liste des index des tables.

Forum : gérer la connexion à la base de donnéesLa classe ����� �,����5�������� �59�5� qui est définie ci-après gère laconnexion à la base de données pour le forum. Les méthodes de cette classepermettent de paramétrer la classe de driver, la chaîne de connexion, le loginet le password d’une connexion, et de créer les tables requises pour le forum.Ces tables sont créées automatiquement lors de la connexion si elles n’exis-tent pas pour faciliter la mise en route du forum. Elles stockent les informa-tions mémorisées par les objets de classes ����� �,����5��I ����� �5 et����� �,����5��������� (voir le chapitre 6, « Les classes de base de labibliothèque Java ») comme cela est décrit ci- après :

ATTENTION Blancs typographiques dans les instructions SQL

N’oubliez pas les blancs typographiques signifi-catifs dans la construction des instructions SQL.Quand vous coupez une instruction SQL sur plu-sieurs lignes, fixez-vous une règle simple pouréviter les erreurs d’inattention. Par exemple, unblanc typographique est ajouté ici au début dechaque chaîne concaténée avec la précédente.

Figure 11–2 Diagramme UML de la classe ����� �,����5�������� �59�5�

- driver : String - chaineConnexion : String - login : String - password : String

+ getConnexion() : Connection + fermerConnexion() # verifierTables(connexion : Connection)# verifierTable (connexion : Connection, table : String)

ConnecteurForum

com.eteks.forum

Tableau 11–2 Table UTILISATEUR

Champ Type SQL Remarque Champ de la classe com.eteks.forum.Utilisateur

�������� �� ����� Doit être unique pour chaque utilisateur ����������

����� ��� �� ����� ����������

������ ���� �� �� � Stocke les valeurs � (utilisateur) ou (modérateur) égalesaux valeurs des constantes ���!�� ���� et���� ���� de la classe ��"#"�����$

����$"���"��

Page 241: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 229

Tableau 11–3 Table MESSAGE

Champ Type SQL Remarque Champ de la classe com.eteks.forum.Message

�� ����%�� Identifie chaque message avec un entier unique

����� �� ����� Correspond au champ �������� de la table���!�� ����

�����$

� ����� ���� ����� � �����$���"��

��&�� ' ��� ��())� Le type ' ��� � évite de perdre de la place inutilementpour les sujets courts

��*��

��+�� ' ��� ��,���� ��-��

FORUM com/eteks/forum/ConnecteurForum.java��./�0�1.��2���/�23�$��4

"���$�1*�5�2�6#274

877171�����.���$109$���1���1.����-"��1&�:�1���$1#�1;���1��13�$��1��171.$9���1#��1��;#��1���!�� ����1��1��� %�1�"1�9.����"$�2178��;#".1.#���1�����.���$<�$��=

11�$"5���1��$"�011111�$"5�$1111111111>1?.��2���6#2*�;.2�$"5�$?411�$"5���1��$"�011111.@�"�������-"��1>1?*�;.A���6#A888����?411�$"5���1��$"�011111#�0"�411�$"5���1��$"�011111����B�$�4

3 Champ mémorisant les informations nécessairespour la connexion à un SGBD avec un driverJDBC.

11�$"5���1�����.�"��1.����-"��4 3 Champ mémorisant la connexion à la base dedonnées une fois qu’elle est établie.

11��;#".15�"�1����$"5�$1���$"�01�$"5�$�1�@$�B�1�C!�-.���"��11=1111�@"�2�$"5�$1>1�$"5�$411113�$��$�����-"��1��411D

3 Modifie la classe du driver et ferme la connexionsi elle est ouverte pour provoquer l’ouvertured’une nouvelle connexion au prochain appel dela méthode 0�������-"��2

11��;#".15�"�1����@�"�������-"��1���$"�01.@�"�������-"���1111111111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=1111�@"�2.@�"�������-"��1>1.@�"�������-"��411113�$��$�����-"��1��411D

3 Modifie la chaîne de connexion.

11��;#".15�"�1���!�0"�1���$"�01#�0"��1�@$�B�1�C!�-.���"��11=1111�@"�2#�0"�1>1#�0"�411113�$��$�����-"��1��411D

3 Modifie le login.

Page 242: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004230

Modifie le mot de passe. B 11��;#".15�"�1�������B�$�1���$"�01����B�$��1�@$�B�1�C!�-.���"��11=1111�@"�2����B�$�1>1����B�$�411113�$��$�����-"��1��411D

Ferme la connexion si elle est ouverte. B 11��;#".15�"�13�$��$�����-"��1��1�@$�B�1�C!�-.���"��11=1111"31��@"�2.����-"��1E>1��##1FF1E�@"�2.����-"��2"��#�������111111�@"�2.����-"��2.#�����411D

Renvoie une connexion à la base de données. B 11��;#".1�����.�"��10�������-"��1��1�@$�B�1�C!�-.���"��1�11=1111�$�1111=

Obtention d’une connexion si la connexion n’estpas ouverte.

B 111111"31��@"�2.����-"��1>>1��##1GG1�@"�2.����-"��2"��#�������111111=

Chargement de la classe de driver. B 11111111�#���23�$����1��$"5�$�4

Ouverture de la connexion stockée dans lechamp .����-"��2

B 11111111"31�#�0"�1E>1��##�1111111111�@"�2.����-"��1>1�$"5�$���0�$20�������.�"��1�1111111111111111�@"�2.@�"�������-"��H1�@"�2#�0"�H1�@"�2����B�$��411111111�#��1111111111�@"�2.����-"��1>1�$"5�$���0�$20�������.�"��1�1111111111111111�@"�2.@�"�������-"���4

Vérification de l’existence des tables nécessairesà ce connecteur.

B 111111115�$"3"�$��;#��1��@"�2.����-"���4111111D111111$���$�1�@"�2.����-"��41111D

Exception déclenchée si la classe n’est pas char-gée par 3�$����2

B 1111.��.@1��#������<�����-.���"��1�-�1111=

111111�@$�B1��B1�C!�-.���"���1111111111111111111?�#����1"��$��5�;#�1?1I1�-20������0�1���41�1111D11D

Vérifie l’existence des tables ���!�� ���� et��� %�2

B 11�$���.���15�"�15�$"3"�$��;#��1������.�"��1.����-"���111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

Si la table ���!�� ���� n’existe pas... B 1111"31�E5�$"3"�$��;#��.����-"��H1?���!�� ����?��1111=111111���������1"���$�.�"��1>1.����-"��2.$���������������4

Création de la table ���!�� ���� dont leschamps correspondent à ceux de la classe.��2���/�23�$��2��"#"�����$2

B 111111"���$�.�"��2�-�.����������?��� ��1� :!�1���!�� ����?1111111111I1?1���������1�� �����H1����� ���1�� �����H?1111111111I1?1 ������ ����1�� �� ��?�4

Création d’un index sur le champ ��������pour accélérer les recherches sur les utilisateurs.

B 111111"���$�.�"��2�-�.����������?��� ��1����+1����+������?1111111111I1?1��1���!�� ����1����������?�4111111"���$�.�"��2.#���1��41111D

Page 243: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 231

La connexion à la base de données est encapsulée et gérée par la méthode0�������-"�� � de la classe .��2���/�2���"#�2�����.���$<�$��. Cetteméthode ouvre une connexion si nécessaire ou renvoie la connexion précé-demment ouverte. Notez que cette méthode détourne l’exception de classe*�5�2#��02�#������<�����-.���"�� en déclenchant une exception de classe*�5�2�6#2�C!�-.���"�� à la place �. Cela a pour effet de simplifier la listedes exceptions que peut déclencher la méthode 0�������.�"��, liste donnéedans la clause �@$�B� �. La dernière méthode 5�$"3"�$��;#� utilise laméthode 0����;#�� de l’interface *�5�2�6#2����;���������� pour déterminersi une table existe déjà ou non.

1111"31�E5�$"3"�$��;#��.����-"��H1?��� %�?��1111=111111���������1"���$�.�"��1>1.����-"��2.$���������������4

3 Si la table ��� %� n’existe pas...

111111"���$�.�"��2�-�.����������?��� ��1� :!�1��� %�?11111111I1?1���1����%��H1 �����1�� �����H1� ����� ����?11111111I1?1����� �H1��&��1' ��� ��())�H1��+��1' ��� ��,�����?�4

3 Création de la table ��� %� dont les champscorrespondent à ceux de la classe.��2���/�23�$��2����0�2

111111"���$�.�"��2�-�.����������11111111?��� ��1����+1����+� ��1��1��� %�1�� ����� �����?�4111111"���$�.�"��2�-�.����������11111111?��� ��1����+1����+��1��1��� %�1����?�4111111"���$�.�"��2.#���1��41111D11D

3 Création d’index sur les champs� ����� ���� et �� pour accélérer les recher-ches sur les messages.

11�$���.���1;��#���15�$"3"�$��;#�1������.�"��1.����-"��H1��$"�01��;#��111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=1111����;����������1"�3�1>1.����-"��20���������1��4

3 Vérifie si une table existe déjà dans la base dedonnées.

1111����#����1$���#���1>1"�3�20����;#��1�11111111111111111111.����-"��20������#�0��H1��##H1��;#�H1��##�41111;��#���1��;#��-"���1>1$���#���2��-�1��41111$���#���2.#���1��41111$���$�1��;#��-"���411DD

3 Si la table existe, la méthode 0����;#�� ren-voie au moins un enregistrement.

REGARD DU DÉVELOPPEUR To throw or to catch, that is the question...

La méthode 0�������-"�� ne gère pas elle-même les erreurs de connexion duesà une exception de classe *�5�2�6#2�C!�-.���"��, mais laisse au traitement quifera appel à cette méthode le soin de le faire. Cela s’exprime au travers de laclause �@$�B� *�5�2�6#2�C!�-.���"�� qui suit la déclaration de la méthode à laplace du bloc .��.@ (*�5�2�6#2�C!�-.���"��1 �-�. Ce style de programmationest souvent utilisé par les méthodes des classes d’outils pour laisser aux classesgérant l’interface homme-machine le soin de signaler une erreur à l’utilisateurdans un bloc .��.@ de la manière la plus adéquate :• Une interface Web utilisant des pages JSP signalera l’erreur avec une page

HTML spéciale.

• Une interface utilisant Swing signalera l’erreur au moyen d’une boîte de dia-logue d’erreur.

• Une application batch sans interface enregistrera l’erreur dans un fichier.

JAVA Utilisation de protected

Les méthodes 5�$"3"�$��;#�� et 5�$"3"�$��;#� disposent d’un modificateur d’accès�$���.��� afin qu’elles puissent être redéfinieset utilisées dans une classe dérivée. La méthode5�$"3"�$��;#�� peut ainsi être redéfinie dansune sous-classe de .��2���/�2���"#�2�����.���$<�$�� pour créer des tables avec deschamps supplémentaires pour ajouter des fonction-nalités au forum.

Page 244: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004232

Paramétrer les instructions SQL d’accès à la base du forum (java.sql.PreparedStatement)Les méthodes �$���$���������� d’une connexion précompilent une instruc-tion SQL paramétrée où chaque paramètre est symbolisé par un pointd’interrogation (J) remplacé par une valeur lors de l’exécution de l’instruc-tion. Exemple : ��!���1 ����!�H1��� ��1<��1< �����1K����1�!����>J2

Ces méthodes renvoient un objet dont la classe implémente l’interface*�5�2�6#2�$���$����������� qui dérive de *�5�2�6#2���������. Cette inter-face définit en plus :• Les méthodes ���222, comme �����$"�0, ������, �������…, utilisées pour

spécifier la valeur de chaque paramètre de l’instruction SQL précompilée.Le premier paramètre des méthodes ���2221correspond au numéro d’ordredu paramètre de l’instruction. Le numéro du premier paramètre est 1.

• Les deux méthodes sans paramètre �-�.��������� et �-�.���C��$�, appe-lées pour exécuter l’instruction SQL précompilée en remplaçant les J parla valeur des paramètres.

Forum : stocker utilisateurs et messages dans la base de donnéesComme la classe .��2���/�2���"#�2�����.���$<�$�� permet d’obtenir uneconnexion sur la base de données avec les tables nécessaires pour le forum, ilfaut maintenant programmer la lecture et l’enregistrement des utilisateurs etdes messages dans les tables. On réalise ces traitements avec des instructionsprécompilées dans des sous-classes des classes d’utilisateur, et de messagedéfinies au chapitre 6, « Les classes de base de la bibliothèque Java ».Ces classes supplémentaires seront mises en œuvre dans la dernière applica-tion de ce chapitre pour vous donner un aperçu de leur utilisation. Cesclasses sont exploitées plus concrètement dans le chapitre 13, « Interface uti-lisateur du forum » pour programmer le forum sur un site Web.

Enregistrer et rechercher un utilisateurLa classe suivante dérive de la classe .��2���/�23�$��2��"#"�����$ et permetde rechercher et d’ajouter un utilisateur dans la table ���!�� ����.

JAVA Avantages des instructions précompilées

Elles permettent de paramétrer une instructionSQL. Elles laissent au driver JDBC le soin de trans-mettre les valeurs des objets au format requis parla base de données. Cette caractéristique est trèsutile pour enregistrer en base les objets qui repré-sentent des dates, des textes contenant des carac-tères L ou ? et des données binaires des BLOB.L’instruction SQL d’une instruction précompiléeétant une chaîne qui n’est pas construite, elle peutêtre aussi facilement lue à partir d’un fichier de res-sources.Une instruction précompilée peut être utilisée plu-sieurs fois. Cette fonctionnalité n’est pas mise enœuvre ici pour éviter des problèmes de concur-rence d’accès dans les environnements d’exécutionmulti-threads tels que les pages JSP.

Figure 11–3 Diagramme UML de la classe .��2���/�23�$��2��"#"�����$<�$��

Utilisateur

com.eteks.forum

+ UtilisateurForum() + UtilisateurForum(pseudonyme : String, motDePasse : String, autorisation : String) + rechercher(connecteur : ConnecteurForum) : boolean + ajouter(connecteur : ConnecteurForum)

UtilisateurForum

com.eteks.forum

FORUM com/eteks/forum/UtilisateurForum.java��./�0�1.��2���/�23�$��4"���$�1*�5�2�6#274

Sous-classe de .��2���/�23�$��2��"#"�����$.

B ��;#".1.#���1��"#"�����$<�$��1�-�����1��"#"�����$=

Constructeur avec paramètres. B 11��;#".1��"#"�����$<�$�����$"�01����������H1��$"�01����������H1111111111111111111111111��$"�01����$"���"���11=

Passage des paramètres à la super-classe. B 1111����$1�����������H1����������H1����$"���"���411D

Page 245: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 233

Vous noterez que les méthodes $�.@�$.@�$ et �*����$ prennent en paramètreun objet de classe .��2���/�23�$��2�����.���$<�$��, ce qui garantit que latable ���!�� ���� sera bien créée au moment de la connexion.

11��;#".1��"#"�����$<�$����11=

3 Constructeur sans paramètre.

1111�@"�1���##H1��##H1��##�411D

3 Passage des valeurs par défaut à l’autre cons-tructeur.

11��;#".1;��#���1$�.@�$.@�$1������.���$<�$��1.����.���$�11111111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

3 Recherche un utilisateur dans la base de don-nées avec son pseudonyme et renvoie �$�� s’ilexiste.

1111�$���$�����������1$�.@�$.@���"#"�����$1>1111111.����.���$20�������-"����2�$���$����������1�11111111111?��!���171<��1���!�� ����1K����1��������>J?�4

3 Préparation d’une instruction SQL de recherched’un utilisateur avec son pseudonyme.

1111$�.@�$.@���"#"�����$2�����$"�01� H10���������������41111����#����1$���#���1>1$�.@�$.@���"#"�����$2�-�.���C��$���41111;��#���1��"#"�����$�-"���1>1$���#���2��-���4

3 Spécification du pseudonyme en paramètre, puisrecherche dans la table ���!�� ����2

1111"31���"#"�����$�-"����1111=111111������������1�$���#���20����$"�0�?����� ���?��4111111��� ���$"���"��1�$���#���20����$"�0�? ������ ����?��41111D1111$���#���2.#�����41111$�.@�$.@���"#"�����$2.#�����41111$���$�1��"#"�����$�-"���411D

3 Si l’enregistrement a été trouvé, mise à jour deschamps de l’utilisateur.

11��;#".15�"�1�*����$1������.���$<�$��1.����.���$�1111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

3 Ajoute un utilisateur à la base de données.

1111�$���$�����������1�*�����"#"�����$1>111111.����.���$20�������-"����2�$���$����������1�11111111?������1����1���!�� ����?11111111I1?1���������H1����� ���H1 ������ �����?11111111I1?1' !���1�JH1JH1J�?�4

3 Préparation d’une instruction SQL d’ajout d’unutilisateur.

1111�*�����"#"�����$2�����$"�0� H10���������������41111�*�����"#"�����$2�����$"�0�(H10��������������41111�*�����"#"�����$2�����$"�0��H10�� ���$"���"�����41111�*�����"#"�����$2�-�.���������1��41111�*�����"#"�����$2.#�����411DD

3 Préparation des paramètres, puis insertion del’utilisateur dans la table ���!�� ����2

POUR ALLER PLUS LOIN Chiffrer le mot de passe

Pour éviter de stocker les mots de passe en clair dans la base de don-nées, vous pouvez utiliser les classes du paquetage *�5�2��.�$"��qui permettent de chiffrer des données grâce aux algorithmes les plusconnus. Par exemple, les instructions suivantes chiffrent la chaîne���������� en utilisant l’algorithme SHA :

����0��"0���1�@��"0���1>11111111����0��"0���20��������.��?�� ?�4881 *���1��1���1��1�����1M1.@"33$�$�@��"0���2�����������������20��:�������4881��.$���"��1���1����9��;���1NO1������������.$����1>1�@��"0���2�"0������4

Page 246: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004234

Enregistrer et rechercher un message

La classe suivante dérive de la classe .��2���/�23�$��2����0� et permet derechercher, d’ajouter et de mettre à jour un utilisateur dans la table ��� %�.

FORUM com/eteks/forum/MessageForum.java��./�0�1.��2���/�23�$��4"���$�1*�5�2�6#274��;#".1.#���1����0�<�$��1�-�����1����0�=11�$"5���1"��1"�41�11��;#".1����0�<�$��1���"#"�����$1�����$H1��$"�01��*��H111111111111111111111111��$"�01��-���11=1111����$1������$H1��*��H1��-���411D11��;#".1����0�<�$��1��11=1111�@"�1���##H1��##H1��##�411D11��;#".1"��10����1��11=1111$���$�1�@"�2"�411D

11��;#".15�"�1�����1�"��1"��11=1111�@"�2"�1>1"�411D

Recherche un message dans la base de donnéesavec son identifiant et, s’il existe, renvoie �$��.

B 11��;#".1;��#���1$�.@�$.@�$1������.���$<�$��1.����.���$�1111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

Préparation d’une instruction SQL de recherched’un message avec son identifiant.

B 1111�$���$�����������1$�.@�$.@�����0�1>111111.����.���$20�������-"����2�$���$�����������11111111111?��!���171<��1��� %�1K����1��>J?�4

Spécification de l’identifiant en paramètre puisrecherche dans la table ��� %�2

1111$�.@�$.@�����0�2������1� H1�@"�2"��41�1111����#����1$���#���1>1$�.@�$.@�����0�2�-�.���C��$���41111;��#���1�����0��-"���1>1$���#���2��-���4

Si l’enregistrement a été trouvé, mise à jour deschamps du message.

B 1111"31������0��-"����1111=111111��� ����$1�$���#���20����$"�0�? �����?��4111111��������$���"��1�$���#���20���"��������?� ����� ����?��4111111�����*��1�$���#���20����$"�0�?��&��?��4111111�����-��1�$���#���20����$"�0�?��+��?��411111D1111$���#���2.#�����41111$�.@�$.@�����0�2.#�����41111$���$�1�����0��-"���411D

Ajoute un message à la base de données. B 11��;#".15�"�1�*����$1������.���$<�$��1.����.���$�1111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

Figure 11–4 Diagramme UML de la classe .��2���/�23�$��2����0�<�$��

Message

com.eteks.forum

+ MessageForum() + MessageForum(auteur : Utilisateur, sujet : String, texte : String) + rechercher(connecteur : ConnecteurForum) : boolean + ajouter(connecteur : ConnecteurForum) + mettreAJour(connecteur : ConnecteurForum)

MessageForum

com.eteks.forum

- id : int

Page 247: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 235

Le champ "� �, identifiant de manière unique un message dans la table��� %�, a été ajouté à cette classe pour permettre de rechercher � et demettre à jour � un message dans cette table. Avant d’ajouter un message à latable1��� %�, une valeur unique � est attribuée au champ "� d’un messageen recherchant la valeur maximale dans la table.

1111�$���$�����������1$�.@�$.@��-������0�1>111111.����.���$20�������-"����2�$���$�����������11111111111?��!���1 +����1<��1��� %�?�41111����#����1$���#���1>1$�.@�$.@��-������0�2�-�.���C��$�1��41111$���#���2��-�1��4

3 Recherche de la valeur maximale du champ ��dans la table ��� %�2

1111�@"�2"�1>1$���#���20�����1� �1I1 41�1111$���#���2.#���1��41111$�.@�$.@��-������0�2.#�����4

3 Modification de l’identifiant du message avec lavaleur suivante du maximum trouvé, pour attri-buer à chaque message un identifiant unique.

1111�$���$�����������1�*�������0�1>111111.����.���$20�������-"����2�$���$�����������1111111111?������1����1��� %�?1111111111I1?1���H1 �����H1� ����� ����H1��&��H1��+���1?1111111111I1?1' !���1�JH1JH1JH1JH1J�?�4

3 Préparation d’une instruction SQL d’ajout d’unmessage.

1111�*�������0�2������1� H1�@"�2"��41111�*�������0�2�����$"�01�(H10�� ����$���4

3 Préparation des paramètres puis insertion dumessage dans la table ��� %�2

1111�*�������0�2����"�������1��H111111111��B1�"�������1�0�������$���"����20���"��1����41111�*�������0�2�����$"�01�,H10����*�����41111�*�������0�2�����$"�01�)H10����-�����411111�*�������0�2�-�.���������1��41111�*�������0�2.#�����411D

3 Création d’un objet de classe*�5�2�6#2�"������� à partir de la date decréation.

11��;#".15�"�1����$� &��$1������.���$<�$��1.����.���$�1111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=1

3 Met à jour un message dans la base de données.

1111�$���$�����������1�"�� &��$����0�1>111111.����.���$20�������-"����2�$���$����������1�11111111111?��� ��1��� %�1���1 �����>JH1� ����� ����>JH?11111111111I1?1��&��>JH1��+��>J1K����1��>J?�41�

3 Préparation d’une instruction SQL de mise à jourd’un message. Le champ � ����� ���� doitêtre répété pour éviter que la base de donnéesn’y insère la date en cours lors de la mise à jour !

1111�"�� &��$����0�2�����$"�01� H10�� ����$���41111�"�� &��$����0�2����"�������1�(H11111111��B1�"�������1�0�������$���"����20���"��1����41111�"�� &��$����0�2�����$"�01��H10����*�����41111�"�� &��$����0�2�����$"�01�,H10����-�����41

3 Préparation des paramètres, puis mise à jour dela table ��� %�2

1111�"�� &��$����0�2������1�)H1�@"�2"��41111�"�� &��$����0�2�-�.���������1��41111�"�� &��$����0�2.#���1��411DD

DANS LA VRAIE VIE Champs AUTO INCREMENT

Certaines bases de données (comme MySQL) per-mettent de qualifier un champ de façon que savaleur augmente automatiquement à chaque inser-tion d’un nouvel enregistrement. Cette fonctionna-lité très pratique et sa syntaxe ne sont malheureuse-ment pas standards en SQL. Toutefois, les méthodes�$���$���������� et �-�.��������� ont étésurchargées dans Java 1.4 pour permettre de récu-pérer la valeur du champ AUTO INCREMENT d’unnouvel enregistrement.B http://dev.mysql.com/tech-resources/articles/

autoincrement-with-connectorj.html

Page 248: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004236

Rechercher un ensemble de messages

La classe .��2���/�23�$��2�����;#�����0��<�$�� qui suit encapsule une col-lection de classe *�5�2��"#2 $$��!"�� pour gérer un ensemble de messages eteffectuer des recherches de messages dans la table ��� %�.

FORUM com/eteks/forum/EnsembleMessagesForum.java��./�0�1.��2���/�23�$��4"���$�1*�5�2�6#274"���$�1*�5�2��"#274��;#".1.#���1�����;#�����0��<�$��=11�$"5���1 $$��!"��1�����0��1>1��B1 $$��!"��1��411��;#".15�"�1�*����$1�����0�1�����0��11=1111�@"�2�����0��2���1������0��411D

11��;#".1���$���$1"��$���$1��11=1111$���$�1�@"�2�����0��2"��$���$��411D

Figure 11–5Diagramme UML de la classe .��2���/�21

3�$��2�����;#�����0��<�$��

- messages : ArrayList

+ ajouter(message : Message) + iterator() : Iterator + rechercherSujets (connecteur : ConnecteurForum) + rechercherMessagesSujet (connecteur : ConnecteurForum, sujet : String) - rechercher (instructionRecherche : PreparedStatement, parametresInstruction : Object [])

EnsembleMessagesForum

com.eteks.forum

Recherche l’ensemble des sujets disponiblesdans la base de données.

B 11��;#".15�"�1$�.@�$.@�$��*���1������.���$<�$��1.����.���$�11111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

Préparation d’une instruction SQL de recherchedes messages regroupés par sujet et ordonnésdans l’ordre inverse des dates de création.

B 1111�$���$�����������1$�.@�$.@���*���1>111111.����.���$20�������-"����2�$���$����������1�11111111?��!���1��H1 �����H1 +�� ����� �����1 �1� ����� ����H?11111111I1?1��&��H1��+��1<��1��� %�1%����1:1��&��?11111111I1?1�����1:1� ����� ����1����?�41�

La recherche et la mise à jour de l’ensemble desmessages sont déléguées à la méthode$�.@�$.@�$2

B 1111$�.@�$.@�$�$�.@�$.@���*���H1��##�41111$�.@�$.@���*���2.#�����411D

Recherche l’ensemble des messages d’un sujetdans la base de données.

B 11��;#".15�"�1$�.@�$.@�$����0����*��1������.���$<�$��1.����.���$H11111111111111111111111111��$"�01��*���1�@$�B�1�C!�-.���"��11=

Préparation d’une instruction SQL de recherchedes messages d’un sujet, ordonnés dans l’ordrechronologique des dates de création.

B 1111�$���$�����������1$�.@�$.@�����0����*��1>111111.����.���$20�������-"����2�$���$����������1�11111111?��!���171<��1��� %�?11111111I1?1K����1��&��>J1�����1:1� ����� ����1 ��?�41�

La recherche et la mise à jour de l’ensemble desmessages sont déléguées à la méthode$�.@�$.@�$.

B 1111$�.@�$.@�$1�$�.@�$.@�����0����*��H1��B1�;*�.�1NO1=��*��D�41111$�.@�$.@�����0����*��2.#�����411D

Exécute l’instruction de recherche avec ses para-mètres.

B 11�$"5���15�"�1$�.@�$.@�$��$���$�����������1"���$�.�"����.@�$.@�H1111111111111111111111111�;*�.�1NO1��$����$������$�.�"���111111111111111111111111111111111111111111111�@$�B�1�C!�-.���"��11=

Page 249: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

11 –

Con

nexi

on à

la b

ase

de d

onné

es a

vec

JDBC

© Groupe Eyrolles, 2004 237

On exécute l’instruction précompilée correspondant à la recherche des sujets� et des messages d’un sujet � au moyen de la méthode $�.@�$.@�$. Cetteméthode passe les paramètres qu’elle reçoit à l’instruction précompilée � puisajoute chaque message renvoyé par la recherche à l’ensemble des messages �.

Afficher les sujets du forum

L’application suivante crée un utilisateur et des messages dans la base dedonnées, puis effectue une recherche des sujets.

1111"31���$����$������$�.�"��1E>1��##�1111113�$1�"��1"1>1�41"1P1��$����$������$�.�"��2#��0�@41"II�11111111"���$�.�"����.@�$.@�2����;*�.�1�111111111111111111111111"1I1 H1��$����$������$�.�"��1N"O�41�1111����#����1$���#���1>1"���$�.�"����.@�$.@�2�-�.���C��$���4

3 Préparation des paramètres puis lancement de larecherche.

1111B@"#�1�$���#���2��-����1111=

3 Tant qu’il reste des messages à lire...

111111����0�<�$��1�����0�1>1��B1����0�<�$��1��4 3 ... création d’un objet pour le message.

111111�����0�2�����1�$���#���20������?��?��4111111�����0�2��� ����$1�$���#���20����$"�0�? �����?��4

3 Mise à jour de l’objet avec les informations d’unmessage, extraites de la base de données.

�����0�2��������$���"��1�1111111111111111111111111$���#���20���"��������?� ����� ����?��4111111�����0�2�����*��1�$���#���20����$"�0�?��&��?��4111111�����0�2�����-��1�$���#���20����$"�0�?��+��?��4

111111�*����$������0��41�1111D1111$���#���2.#�����411DD

3 Ajout du message à l’ensemble des messages.

Figure 11–6 Application .��2���/�2����2 33".@�$��*���

EXEMPLE com/eteks/forum/AfficherSujets.java��./�0�1.��2���/�2����4"���$�1.��2���/�23�$��274"���$�1*�5�2��"#274"���$�1*�5�2�6#2�C!�-.���"��4"���$�1*�5�-2�B"�02&���"������4.#���1 33".@�$��*���=11��;#".1����".15�"�1��"����$"�0NO1�$0��11=

1111��"#"�����$<�$��1����$����$1>1��B1��"#"�����$<�$��1�111111?����$����$?H1?�Q�$��?H1��"#"�����$2���� �����41111����0�<�$��1�����0� 1>1��B1����0�<�$��1�111111����$����$H1?:"��5����?H111111?:��*��$1R�����1����H1.�13�$��1���R����S$R����S1��$���1��-?111111I1?1"��.$"��1��1����$1���16����"���1��1��1$R����S����$�2?�41111����0�<�$��1�����0�(1>1��B1����0�<�$��1�111111����$����$H1?!"5$�1&�5�?H111111?C��#1#"5$�1��1.����"##�QT5���1���$1���$���$�1&�5�1J?�4

3 Création d’un utilisateur et de deux messagesavec des sujets différents.

Page 250: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004238

En résumé...Ce chapitre vous a permis d’apercevoir comment exploiter une base de don-nées en Java grâce aux classes et interfaces du package *�5�2�6# et quelquesrudiments du langage SQL. Le chapitre 13 consacré à la création de l’interfaceutilisateur du forum de discussion avec des pages JSP utilisera les classesdécrites ici pour gérer les utilisateurs et les messages dans une base de données.

1111�$�1111=111111�����.���$<�$��1.����.���$1>1��B1�����.���$<�$��1��4

Ajout de l’utilisateur et des messages dans labase de données.

B 111111����$����$2�*����$�.����.���$�4111111�����0� 2�*����$�.����.���$�4111111�����0�(2�*����$�.����.���$�4

Recherche des sujets enregistrés dans la base dedonnées.

B 111111�����;#�����0��<�$��1��*���1>1��B1�����;#�����0��<�$����4111111��*���2$�.@�$.@�$��*����.����.���$�4111111��$"�01#"�����*���1>1?!"���1���1��*���1��13�$��1A?4

Énumération des messages trouvés pour cons-truire un message affichant la liste des messagesà l’écran.

B 1111113�$1����$���$1"�1>1��*���2"��$���$��41"�2@����-���41�111111=11111111����0�1�����0�1>1�����0��"�2��-���411111111#"�����*���1I>1?R�1R�()��1?1I1�����0�20����*����4111111D111111&���"������2�@�B����0��"�#�0���##H1#"�����*����4

D

Exception déclenchée par les méthodes d’accèsà la base de données.

B 1111.��.@1��C!�-.���"��1�-�1111=111111&���"������2�@�B����0��"�#�0���##H1111111111111?�$$��$1&�:�1A1?1I1�-20������0�1���41111D11������2�-"�1���4D

D11

POUR ALLER PLUS LOIN Extension du forum

Les classes du paquetage .��2���/�23�$�� mettent en œuvre une version minimalistedu forum mais leur architecture est conçue pour que l’on puisse y ajouter des fonctionnali-tés en gardant la même base. Comment faire ? Pour ajouter des informations à un utilisa-teur (e-mail, pays, fuseau horaire...), vous pouvez par exemple :• Redéfinir la méthode 5�$"3"�$��;#�� dans une sous-classe de .��2���/�23�$��2�����.���$<�$�� pour ajouter à la table ���!�� ���� les champs nécessaires.

• Ajouter des champs et redéfinir les méthodes $�.@�$.@�$ et �*����$ dans une sous-classe de .��2���/�23�$��2��"#"�����$<�$�� pour manipuler ces nouvelles infor-mations. Vous pourrez y ajouter aussi une méthode ����$� &��$ permettant de modi-fier un utilisateur existant.

POUR ALLER PLUS LOIN EJB entité, JDO, Hibernate

Stocker les informations des objets dans unebase de données est une opération très cou-rante en entreprise. C’est pourquoi plusieursbibliothèques comme les EJB entités (Enter-prise JavaBeans entities) dans J2EE, JDO (JavaData Objects) et Hibernate ont été créées pourautomatiser cette tâche.La solution présentée ici a pour avantage dedépendre uniquement de JDBC, ce qui simpli-fie la mise en œuvre du forum.B http://java.sun.com/products/jdo/B http://www.hibernate.org/

Page 251: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

12Programmation Web avec les servlets, JSP

et JavaBeans

SOMMAIRE

B Architecture client-serveur

B Programme CGI

B Servlets

B Installation de Tomcat

B Application Web

B Pages JSP

B Utilisation des composants JavaBeans

MOTS-CLÉS

B HTTPB CGIB TomcatB ServletB JSPB jsp:usebean

Les servlets et les pages JSP permettent de générer des pages dynamiques sur un serveur Web. Après une introduction sur l’architecture client-serveur d’Internet, ce chapitre expose comment installer le serveur Tomcat et créer les servlets et les pages JSP d’une application Web.

Serveur Web (Serveur HTTP + Serveur servlet/JSP)

Pages HTML statiques

Pages JSP dynamiques Servlets JSP

Composants JavaBeans public class ...{ // ...}

<%@ page ...><html>...</html>

<html>...</html>

Servlet

Navigateur (client HTTP)

Navigateur (client HTTP)

Page 252: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004240

Protocole HTTP et programme CGIUn serveur Web et le protocole HTTP permettent de diffuser sur le Webdes informations visualisées par un navigateur. Ces informations peuventêtre contenues dans de simples fichiers au format HTML mais peuventaussi être générées grâce à un programme CGI. Les servlets et les pages JSP,technologies dédiées à la programmation CGI d’un serveur en Java, serontutilisés pour réaliser le forum de discussion.

Principe de l’architecture client-serveurLe mode de programmation client-serveur implique qu’il y ait au moinsdeux acteurs en jeu, un client et un serveur communiquant entre eux souventà travers un réseau :• Un serveur est un programme ou, par extension, une machine program-

mée pour rendre un service donné, en réponse à une requête qui lui estadressée.

• Un client est un programme ou, par extension, une machine quidemande à un serveur un service, en lui adressant une requête.

Le Web est un exemple tout choisi d’application d’architecture client-serveur : les sites sont animés par des serveurs qui rendent toujours le mêmeservice aux clients que sont les navigateurs. Quel service au juste ? Le ser-veur Web attend qu’on lui demande des données (statiques ou résultant d’untraitement). En réponse à une requête, il renvoie le contenu des donnéesrequises. Le navigateur de son côté est client du serveur auquel il a envoyéune requête HTTP. Le navigateur présente à l’utilisateur une réponse unefois les données téléchargées.

La plupart des systèmes de gestion de base de données sont eux aussi acces-sibles en client-serveur, et plusieurs clients peuvent s’y connecter en mêmetemps. La base de données est gérée par un serveur qui répond aux requêtesSQL que lui adressent des clients. Le client est souvent un programme quitourne sur un PC et met en page les réponses reçues du serveur.

L’architecture client-serveur sépare le serveur qui, généralement, gère desdonnées, du client qui cherche à accéder à ces données.

Choisir un protocole pour communiquerLa clé de voûte qui permet à une architecture client-serveur de fonctionner,sans que ni le client ni le serveur ne sachent comment ils fonctionnent l’unl’autre, est l’utilisation d’un protocole commun. Un protocole établit lanorme que doit respecter un client pour communiquer avec un serveur :• comment établir une communication entre un client et un serveur ;

L’architecture client-serveur est une techniqueinformatique utilisée dans de très nombreuxdomaines : applications Internet (Web, news, FTP,etc.), bases de données, terminaux X11...

DANS LA VRAIE VIELes protocoles au service de la diversité

Dans le cas du Web, un même serveur répondsimultanément à des navigateurs qui peuvent êtretrès différents et tournent sous des systèmesd’exploitation différents. Quant au serveur Web,peu importe le système d’exploitation sur lequel ilse trouve tant qu’il répond correctement auxrequêtes du client – on privilégie évidemment larobustesse, la continuité de service, etc.

Page 253: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 241

• ce qu’un client peut envoyer comme requête à un serveur ;• ce qu’un serveur répondra à la requête d’un client.

Le protocole le plus utilisé pour communiquer avec un serveur Internet est leprotocole HTTP (Hyper Text Transfer Protocol), lui-même basé sur le pro-tocole TCP (Transport Control Protocol). Une fois la connexion établieentre un client et un serveur, le protocole TCP garantit que les donnéesémises d’une machine parviendront à l’autre, et ce dans l’ordre où elles ontété émises.

Adresse IP et port, point de rendez-vous des serveurs InternetUn serveur Internet est accessible par un nom de machine hôte (par exemple����������, ���� �����). Chaque nom correspond à une adresse IP, quiest l’identifiant numérique représentant la machine hôte où tourne un ser-veur. Ce nombre de 32 bits est généralement noté sous la forme d’une suitede 4 nombres de 8 bits séparés par des points (par exemple ���������).Chaque machine reliée à Internet (client ou serveur) est identifiée par uneadresse IP qui la représente sur le réseau.

Pour distinguer les programmes serveurs qui tournent simultanément surune même machine hôte, un deuxième niveau d’identification est nécessaire,qui est donné par un numéro de port, codé sur 16 bits et donc compris entre0 et 65535.

Requête HTTP vers une URLLa requête la plus simple du protocole HTTP est formée de ��� suivi d’uneURL qui pointe sur des données (fichier statique, traitement dynamique…).Elle est envoyée par un navigateur quand on saisit directement une URLdans le champ d’adresse du navigateur. Le serveur HTTP répond en ren-voyant les données demandées.

À RETENIR Identification d’un serveur sur Internet

Chaque programme serveur accessible parl’Internet est identifié par l’adresse IP de lamachine hôte sur laquelle il tourne et le numérodu port auquel il est associé. Il est important denoter qu’une même machine peut disposer deplusieurs interfaces réseau – et donc être asso-ciée à plusieurs adresses IP, chaque interfaceréseau pouvant elle-même être associée à plu-sieurs adresses IP. Parmi celles-ci, l’adresse IP127.0.0.1 est particulière et représentel’adresse IP de votre propre machine. Les com-mandes ������ sous Windows et������ sous Linux et Mac OS X renvoientles adresses IP de votre machine.

B.A.-BA L’URL, notation unique d’une ressource sur Internet

Une URL (Uniform Resource Locator) est unechaîne de caractères qui désigne une res-source sur un serveur. Elle est de la forme : ������%��������������� ������������&��où : • protocole représente le protocole d’accès au

serveur, par exemple ����, ��� ou ���� ;• hote est le nom ou l’adresse IP de la

machine hôte où le serveur tourne ;

• port est le numéro de port associé auserveur ;

• �� ������������&�� est le chemind’accès à la ressource sur le serveur.

Une ressource représente une information ouun programme mis à disposition. Ce peut êtreun fichier, une image, une application, à vraidire tout ce qui pourrait être utilisé d’unemanière ou d’une autre.

Les numéros des ports des protocoles FTP etHTTP sont implicitement 80 et 21 dans uneURL s’ils ne sont pas mentionnés.

B http://www.google.fr:80/B http://editions-eyrolles.com:80/

php.informatique/Vitrine/index.php3?page=cahiersProg

B http://www.eteks.com/index.html

Page 254: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004242

En Java, on manipule une URL à l’aide de la classe ���������� ����� ou de laclasse ���������!"# selon les besoins. Les méthodes de la classe ����������!"#permettent d’obtenir les différentes parties d’une URL et d’accéder à son con-tenu sous forme de flux de données.

Par l’exemple : afficher le contenu d’une URL dans une fenêtre SwingL’application suivante affiche dans un composant Swing de classe����$�������%�&���'��� le contenu d’une URL saisie par l’utilisateur.

API JAVA Méthodes les plus utiles de la classe java.net.URL

Description Méthode

Interrogation du protocole, de l’hôte, du port et du chemin de la res-source d’une URL

��(��)���������� �����)���'���*+��(��)���������� �����)���,��*+��(��)���)���'��*+��(��)���������� �����)���-���*+

Ouverture d’une connexion à l’URL pour accéder à son contenu ��(��)�������.���� �����)��� �����*+��(��)���������!"#/������)���/������*+

ATTENTION URL mal formée

Comme les constructeurs de la classe ���������!"# peuvent déclencher une exception declasse ���������0������&!"#�$�����, la création d’une instance de ���������!"#doit être programmée dans une instruction �� ���. L’objet créé ne garantit pas que la res-source existe, mais seulement que l’URL mémorisée par l’objet est correctement formée et que leprotocole spécifié est géré par la JVM.

JAVA Visualiser un document HTML

La classe ����$�������%�&���'��� est uncomposant Swing capable d’afficher des docu-ments HTML 3.2 avec feuille de style CSS. Même sicette classe ne peut pas remplacer un navigateurInternet, elle est capable de gérer des liens hyper-textes et s’avère très pratique pour afficher dansune application Java des pages d’aide ou autres.

EXEMPLE com/eteks/test/AfficherContenuURL.java��1���)�����1������2�����)����$�������32�����)�������32�����)���������32����)4������/�����!"#5))��(��)�����)��&)����)* �����)67)����+))5)))) �����)��$��!"#)8)����2))))�� ))))5

Saisie d’une URL et création d’un objet de classe���������!"#.

B ))))))��$��!"#)8)%9����'�������.����:����*;!"#)�;+2))))))!"#)���)8)���)!"#)*��$��!"#+2

Création d’un composant ����$�������%�&���'��� capable de lire et d’afficher lecontenu de l’URL au format texte ou HTML.

B ))))))%�&���'���)�������,�0#)8)���)%�&���'���*���+2))))))�������,�0#�����&���(��*�����+2

Page 255: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 243

))))))%-����)�������)8)���)%-����)*��$��!"#+2))))))����������� �<�*=��>)?��+2))))))�����������/�����'���*+��&&)*���)% ���'���*�������,�0#++2))))))�����������:������/���9�������)*%-������@.�A9BA/#9 �+2))))))�����������C���(��)*����+2))))D

3 Affichage du composant dans un panneau avecascenseurs d’une fenêtre.

))))���)*0������&!"#�$�����)�$+)))))5))))))%9����'�������0������:����*����>)))))))))))))))))))))))))));!"#);)E)��$��!"#)E);)�������;+2)))))) ������$��*�+2))))D

3 Exception déclenchée si l’URL est malformée.

))))���)*.9�$�����)�$+)))))5))))))%9����'�������0������:����*����>))))))));������)&F�G����H�)G�����)�F!"#);)E)��$��!"#)E);G�;)E)�$+2)))))) ������$��*�+2))))D))DD

3 Exception déclenchée en cas de problème à lalecture de l’URL.

Figure 12–1 Application �����1�������4������/�����!"#

ATTENTION Choix du serveur proxy

Si vous testez cette application dans une entreprise qui requiert un serveur proxy pour accéder àInternet, vous aurez besoin de communiquer à Java l’adresse IP et le port de ce serveur pour lafaire fonctionner. Ces informations sont stockées dans les propriétés �������$ ,�� et�������$ '�� de la JVM, et vous pouvez donner leur valeur en utilisant l’option I: de lacommande ����, par exemple :����)I:�������$ ,��8��?�=J�K��HL)I:�������$ '��8�?=J

))X)I��������)�����(���������)�����1�������4������/�����!"#

Page 256: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004244

Programme CGILes ressources accessibles par le protocole HTTP peuvent être des fichiersstatiques ou des programmes qui renvoient un contenu généré dynamique-ment à la demande de l’utilisateur.

Ce type de programme est utilisé dans de nombreux domaines :• moteurs de recherche,• commerce électronique,• gestion de communautés (forums, groupes...),• cours de la bourse…

On interface ces programmes avec le serveur HTTP en utilisant le standardCGI (Common Gateway Interface), d’où leur nom de programmes CGI ouscripts CGI. Le standard CGI spécifie notamment comment envoyer desvaleurs à un programme CGI pour le paramétrer. La liste de ces paramètresest une chaîne de caractères qui suit un point d’interrogation (M) dans uneURL : cette chaîne est construite en donnant pour chaque paramètre sonnom suivi du caractère 8 et de la valeur du paramètre, chaque paramètre étantséparé d’un autre par le caractère N. Les valeurs des paramètres respectent leformat $I���I���I�����&�& où tous les blancs typographiques sont rem-placés par le signe +, et tous les caractères non alphanumériques et différentsdu caractère souligné _ par leur code hexadécimal précédé du symbole O.

Exemple : l’URL

fait référence au programme -��&.� du serveur HTTP �������1��� et luipasse les valeurs �P������� ���� et "������ pour les paramètres ����� et��(���.

Utiliser un formulaire HTML pour paramétrer un programme CGILe format HTML spécifie un ensemble de balises de formulaire qui évitentaux utilisateurs d’écrire l’URL d’un programme CGI :• À chaque balise correspond un composant à l’écran (champs de saisie,

liste, bouton...) utilisé par les utilisateurs pour saisir la valeur d’un desparamètres d’un programme CGI.

• Ces balises sont incluses dans une balise Q���)����8;9�:*��4�����$?�;����&8;���;R dont l’attribut ���� spécifie l’URL de base d’un pro-gramme CGI.

B http://www.eteks.com/servlet/FindIt?search=op%E9rateurs+java&submit=Recherche

ASTUCE Le format x-www-form-urlencoded

Si vous avez besoin de construire en Java une URLavec ses paramètres, utilisez la méthode de classe��&� de la classe ���������!"#��&��pour obtenir la valeur d’un paramètre au format $I���I���I�����&�&.

Page 257: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 245

Par l’exemple : un formulaire de rechercheÀ partir du formulaire HTML présenté ci-après, un utilisateur peut faireappel au programme CGI ��������������1������������-��&.� grâce à unchamp de saisie.

Une fois que l’utilisateur a confirmé sa saisie, le navigateur envoie unerequête au serveur HTTP avec une URL construite à partir de l’URL debase de l’attribut ����, suivie de la liste des paramètres avec leur nom etleur valeur. Le nom de chaque paramètre est obtenu à partir de l’attribut���� de chaque balise de formulaire, et sa valeur à partir de l’attribut ����� oude la valeur effectivement saisie.

Q���)����8;��������������1������������-��&.�;)����&8;���;R

))QSII)/����)&�)������)���)�J)����T���)IIR))Q�����)� ��8;��$�;)))����8;�����;)��<�8;�J;R

))QSII)U���)&�)���������)IIR))Q�����)� ��8;��(���;)����8;��(���;)�����8;"������;RQ����R

B.A.-BA Langage HTML

HTML (Hyper Text Markup Language) est le langage de mise en page des navigateurs Web. Celangage très simple définit un ensemble de balises (tags en anglais) notées entre les symbo-les < > ou </ > (balises de début et de fin). Incluses les unes dans les autres de manièrehiérarchique, ces balises structurent les informations à afficher. Voici les principales fonc-tionnalités d’HTML qu’il convient de connaître :• Une page HTML commence par la balise Q����R et se termine par la balise de fin Q�����R.

• Le texte affiché dans la fenêtre du navigateur est compris entre les balises Q(& R et Q�(& R, incluses avec le titre de la page dans la balise Q����R de la façon suivante : Q����R)Q���&RQ�����R� ���#��#%�#��4�Q������RQ����&R)Q(& R��'��#��#%�#��4�Q�(& RQ�����R

• Les différents niveaux de titres se notent grâce aux balises Q��R Q��R Q�?R Q�=R Q�JRQ�KR (� comme header en anglais).

• Les paragraphes se distinguent grâce aux balises Q�R ou Q(�1V���R. Un retour à laligne se note avec la balise Q(�R.

• Tout ce qui est compris entre les balises Q�����R Q������R est centré dans la page.• Le texte en italique, en gras ou en couleur se note grâce aux balises Q�R, Q(R (( comme

bold), Q���)��8;W��??--;R où la valeur ��??-- de l’attribut �� représente uncode couleurs RVB (rouge vert bleu) en hexadécimal.

• Les lettres accentuées s’écrivent avec les entités N���2. La liste des codes pour les let-tres francophones est donnée dans le chapitre 3, « Création de classes ». Le caractère Qse note N��2 (comme Less Than).

• Les espaces multiples et les retours à la ligne ne sont comptés que comme uniqueespace, sauf cas très particuliers.

Figure 12–2 Formulaire HTML avec champ de saisie et bouton de confirmation

Page 258: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004246

L’attribut ����& de la balise ��� peut prendre aussi la valeur '9 � : dans cecas, la liste des paramètres est envoyée à la suite de l’URL du programmeCGI mais de manière séparée. Cette méthode est conseillée pour l’envoi deparamètres comportant un mot de passe afin d’éviter que celui-ci n’appa-raisse dans le champ d’adresse des navigateurs.

Programmation d’une servlet sur le serveurLes servlets sont intégrées à l’environnement Java pour exécuter des classescapables de s’interfacer avec un serveur HTTP grâce au standard CGI.Toute servlet est une instance d’une classe dérivant de����$��������������,��� ������.

Classe javax.servlet.http.HttpServletUne nouvelle classe de servlet doit dériver de la classe ����$��������������,��� ������, être ��(�� et avoir un constructeur ��(�� sans paramètre(éventuellement celui fourni par défaut). Une classe de servlet redéfinit laméthode &��� et/ou &'�� pour implémenter la réponse à une requête.

&��� est le point d’entrée d’une servlet appelée par une requête HTTP ���.Un navigateur envoie une requête ��� dans les conditions suivantes :• Lors de la saisie d’une URL dans le champ d’adresse du navigateur.• À un clic sur un lien hypertexte définie dans une balise Q4

,"�-8;9�:: ��;R�

• Pour accéder à d’autres ressources dépendantes d’un fichier HTML,comme les images des balises Q.0�) "/8;9�:���4�;R.

• En confirmation d’un formulaire HTML utilisant une balise ��� dontl’attribut ����& est ���.

&'�� est le point d’entrée d’une servlet appelée par une requête HTTP'9 �. Un navigateur envoie une requête '9 � quand vous confirmez la saisied’un formulaire HTML utilisant une balise ��� dont l’attribut ����& est'9 �.

Ces deux méthodes reçoivent en paramètre deux objets, l’un représentant larequête reçue, et l’autre la réponse de la servlet.

Interface javax.servlet.http.HttpServletRequestCette interface représente la requête HTTP reçue par une servlet.���'�������� est la méthode qui est le plus utilisée de cette interface : ellerenvoie la valeur d’un paramètre passé avec la requête.

JAVA Le paquetage des servlets : javax.servlet.http

Les paquetages ����$�������� et ����$������������� ne sont pas fournis avec la biblio-thèque standard Java mais sont néanmoinsdisponibles :• soit avec un serveur de servlet qui vient s’inter-

facer avec un serveur HTTP, comme Tomcat ouJRun ;

• soit avec un serveur J2EE, comme Weblogic,WebSphere, JBoss...

Le développement de servlets requiert principale-ment que l’on utilise la classe et les deux interfacesprésentées ci-contre.

JAVA Les servlets fonctionnent dans un environnement multi-threads

Le serveur de servlet répond à chaque requêtedes clients dans un thread séparé, ce qui per-met à plusieurs requêtes d’être exécutéessimultanément. Il peut donc être nécessaire desynchroniser l’accès aux données partagées parplusieurs servlets. De plus, comme la méthode&��� (ou &'��) d’une même instance deservlet peut être appelée dans plusieurs threadsen même temps, évitez de recourir à deschamps dans la classe de la servlet pour stockerdes informations variables d’une requête àl’autre. Nous reviendrons sur la synchronisationdans le dernier chapitre.

Page 259: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 247

Interface javax.servlet.http.HttpServletResponseCette interface représente la réponse de la servlet. Les méthodes les plus uti-lisées de cette interface sont :• ���/������ �� qui spécifie le type MIME de la réponse ;• ���X����� qui renvoie une instance de �������'����X����� utilisée pour

envoyer le texte de la réponse au client de la servlet ;• ���9����� ����� qui renvoie une instance de ����$���������

������9����� �����, sous-classe de �������9����� �����, utilisée pourenvoyer au client de la servlet des informations binaires, comme cellesd’une image au format JPEG.

Renvoyer du texte HTML avec une servletLa classe d’une servlet HTML implémente les méthodes &��� et/ou &'��avec des instructions qui renvoient au client un texte HTML au moyen desméthodes �����, ����� ou ������� de la classe �������'����X�����. Le textegénéré dépend généralement des paramètres passés lors de l’appel de la servlet.

Par l’exemple : Bienvenue dans le monde des servlets !La servlet de classe �����1������� ������U�������� interroge le paramètre�� � et renvoie un texte HTML � de bienvenue. Le texte renvoyé est dif-férent selon que le paramètre existe ou non �.

EXEMPLE com/eteks/test/ServletBienvenue.java��1���)�����1������2�����)����$��������������32�����)����$��������� �������$�����2�����)�������.9�$�����2�����)�������'����X�����2��(��)����) ������U��������)�$���&�),��� ������5))��(��)��&)&���)*,��� ������"�V����)��V����>)))))))))))))))))))))),��� ������"������)�������+)))))))))))))))))))))))�����) �������$�����>).9�$�����))5

B.A.-BA Type MIME

Comme les servlets n’ont pas d’extension tellesque �����, ���� ou ��&�, elles utilisent le typeMIME pour décrire le type de contenu renvoyé. Unnavigateur utilise ce type MIME pour déterminer letraitement approprié pour afficher les informationsreçues. Par exemple, le type MIME ��$������décrit un texte au format HTML, ����������décrit une image au format JPEG.

JAVA Exceptions déclenchées par doGet et doPost

Les méthodes &��� et &'�� de la classe����$���������,��� ������ sont déclaréescomme étant susceptibles de déclencher desexceptions contrôlées de classe����$��������� �������$����� ou�������.9�$�����, avec la clause �����correspondante. Ceci vous permet de répéter lesmême classes d’exceptions à la redéfinition de sesméthodes sans avoir à les traiter avec une instruc-tion �� ���. Si une telle exception survient,le serveur de servlet est programmé par défautpour renvoyer un message d’erreur au client de laservlet.

)))) �����)��)8)��V��������'��������*;��;+2)� 3 Récupération du paramètre ��.

))))�����������/������ ��*;��$������;+2)�))))'����X�����)��)8)�����������X�����*+2))))��������*;Q����RQ���&RQ�����RU��������Q������RQ����&R;)))))))))))))E);Q(& RQ��RU��������Q���R;)))))))))))))E);Q�RU����);+2

3 Envoi d’une réponse en HTML.

Page 260: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004248

Installation de TomcatPour exécuter la servlet précédente et les pages JSP du forum, vous devezinstaller un serveur de servlets tel que Tomcat distribué sous licence Apacheet utilisable librement.

Pour l’installer, téléchargez la version 4.1 la plus récente de Tomcat auformat ZIP disponible à http://tomcat.apache.org/ (fichier de la forme ��1����I����I��������<��) puis décompressez le fichier d’installation avec l’outil devotre choix ou utilisez la procédure suivante :1 Ouvrez une fenêtre de commandes (sous Mac OS X, démarrez l’applica-

tion Terminal du dossier Applications/Utilitaires).2 Déplacez-vous avec la commande & dans le dossier où vous voulez ins-

taller Tomcat.3 Décompressez le fichier ��1����I����I��������<�� avec la commande :

Si le système ne connaît pas la commande ���, vérifiez que le '4�, soitcorrect (voir chapitre 2, la section « Télécharger et installer les program-mes pour développer en Java »).

Tomcat est installé dans le sous-dossier ��1����I����I������� du dossiercourant et le sous-dossier ��1����I����I��������(�� contient les com-mandes du serveur Tomcat.

Il faut ensuite ajouter à votre système la variable d’environnement %4C4A,90�qui a pour valeur le chemin d’accès du JDK (sans le sous-dossier (��). Pourcela, effectuez les opérations suivantes selon votre système d’exploitation.

Sous Windows

Sous Windows 95/98/ME1 Éditez le fichier /�G4!�9�@�/�U4� et ajoutez-y la ligne :

2 Redémarrez votre machine.

Créez un raccourci vers la commande ��1����I����I��������(���

��������(�� avec un espace d’environnement plus grand :

Génération d’un message différent selon que leparamètre existe ou non.

B ))))��)*��)S8)����)NN)���������)*+)R)�+)�))))))��������*��+2))))����))))))��������*;���)�����;+2))))��������*;Q��RQ�(& RQ�����R;+2))DD

���)$�)��� ���������1����I����I��������<��

��)%4C4A,90�8/�G'����Y�G%���G�&1�������

OUTILS Tomcat, de l’Apache Software Foundation

Tomcat est le conteneur (ou moteur d’exécution)de servlets utilisé par Sun Microsystems pourl’implémentation de référence des servlets et despages JSP. C’est en fait un serveur HTTP et un ser-veur de servlets/JSP tout-en-un écrit en Java, ce quirend cet outil très pratique pour tester un site Inter-net qui gère des pages statiques et des pagesdynamiques avec des servlets et des pages JSP.Tomcat peut aussi être intégré au serveur WebApache ou au serveur Web Microsoft IIS.

B http://tomcat.apache.org/B http://java.sun.com/products/servlet

VERSIONS Tomcat et J2EE

Nous décrivons ici les opérations d’installationles plus élémentaires pour faire fonctionnerTomcat 4.1 qui, comme J2EE 1.3, respecte laversion 2.3 des spécifications des servlets et laversion 1.2 des spécifications JSP. Ces opéra-tions s’appliquent aussi avec Tomcat 5 qui,comme J2EE 1.4, respecte la version 2.4 desspécifications des servlets et la version 2.0 desspécifications JSP. Comme les serveurs Tomcat 5et J2EE 1.4 en production ne sont pas encoretrès répandus, nous avons préféré nous teniraux fonctionnalités offertes par la version précé-dente pour le développement du forum.

Page 261: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 249

1 Cliquez avec le bouton droit de la souris sur l’icône du fichier��������(�� et choisissez le menu Créer un raccourci. Renommez le rac-courci ainsi créé si vous le souhaitez.

2 Cliquez avec le bouton droit de la souris sur l’icône du raccourci et choi-sissez le menu Propriétés.

3 Choisissez l’onglet Mémoire dans la boîte de dialogue des Propriétés.4 Dans le champ Environnement Initial, choisissez la valeur 1024.5 Confirmez votre saisie et fermez la boîte de dialogue.

Sous Windows NT1 Cliquez avec le bouton droit de la souris sur l’icône de votre poste de tra-

vail et choisissez le menu Propriétés.2 Choisissez l’onglet Environnement dans la boîte de dialogue des Propriétés.3 Ajoutez la variable d’environnement %4C4A,90� avec la valeur

/�G'�����)-����G%���G�&1�������.4 Confirmez votre saisie en cliquant sur Modifier et fermez la boîte de dia-

logue.

Sous Windows 2000/XP1 Cliquez avec le bouton droit de la souris sur l’icône de votre poste de tra-

vail et choisissez le menu Propriétés.2 Choisissez l’onglet Avancé dans la boîte de dialogue des Propriétés.3 Cliquez sur le bouton Variables d’environnement...

4 Ajoutez la variable d’environnement %4C4A,90� avec la valeur/�G'�����)-����G%���G�&1�������.

5 Confirmez votre saisie et fermez la boîte de dialogue.

Sous Linux1 Rendez les fichiers de commandes de Tomcat exécutables avec la

commande :

2 Éditez le fichier Y��(����, et ajoutez-y les lignes :

3 Redémarrez votre session.

��&)E$)��1����I����I��������(���3���

%4C4A,90�8��� ��������&1��������$���)%4C4A,90�

Figure 12–3 Dossiers et fichiers les plus importants de Tomcat

Page 262: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004250

Sous Mac OS X1 Rendez les fichiers de commandes de Tomcat exécutables avec la

commande :

2 Créez si nécessaire le répertoire �0�9 @ dans votre dossier de départ avecla commande :

3 Éditez (ou créez) le fichier Y��0�9 @����������������� contenant lesvariables d’environnement avec les commandes suivantes (vous pouvezutiliser la commande �� si vous le préférez) :

4 Ajoutez à ce fichier la variable d’environnement %4C4A,90� au fichier, quidoit ressembler à ceci :

5 Enregistrez le fichier et redémarrez votre session.

Lancement de TomcatOn procède au lancement de Tomcat avec la commande ������� commeindiqué ci-après. Pour vérifier que le serveur est bien lancé, ouvrez un navi-gateur et saisissez dans la barre d’adresse la chaîne http://127.0.0.1:8080/. Si votreinstallation est correcte, la page d’accueil de Tomcat s’affiche, vous permet-tant de tester les exemples de servlets et de pages JSP fournis avec ce serveurde servlet. Vous pouvez aussi accéder à partir de cette page à différents docu-ments relatifs à la configuration de Tomcat et à la documentation ����&des API des servlets/JSP.

Sous Windows

Sous Windows 95/98/ME

Double-cliquez sur le raccourci vers la commande ��������(�� créé précé-demment.

��&)E$)��1����I����I��������(���3���

�1&��)Y��0�9 @

���)Y��0�9 @������������������4������������$��&�������/�������0�9 ���$��&��)X)Y��0�9 @�)����������������

QM$��)������8;���;)��&���8;!�-IH;MRQS:9/�Z'�)�����) Z ��0))))));�������������� �����#�(��� �:�:��'����� #����&�&;RQ�����)������8;��L;R))Q&��R))))Q1� R%4C4A,90�Q�1� R))))Q������R�#�(��� �%����,��Q�������R))Q�&��RQ������R

POUR ALLER PLUS LOIN Configuration de Tomcat

Le serveur HTTP de Tomcat peut être configuréavec un autre port que celui par défaut, 8080. Unserveur HTTP utilise généralement le port 80 maisl’équipe de développement de Tomcat a préféré nepas l’utiliser par défaut car le lancement d’un ser-veur sur ce port est réservé par sécurité aux admi-nistrateurs sur la plupart des systèmes d’exploita-tion.La configuration de Tomcat s’effectue soit en modi-fiant manuellement le fichier ����������$��de Tomcat, soit en utilisant les pages Web d’admi-nistration proposées par Tomcat. Par sécurité, cespages ne sont accessibles qu’aux utilisateurs ayantun rôle d’administrateur. Pour créer un utilisateuravec ce rôle, il faut éditer le fichier �������I������$��, y ajouter un utilisateur dutype :

Q����)��������8;�&������������;))))������&8;�<��� ;)����8;�&���;�R

et redémarrer Tomcat si nécessaire.

B http://www-igm.univ-mlv.fr/~dr/XPOSE2003/tomcat/

Page 263: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 251

Sous Windows NT/2000/XP

Double-cliquez sur le fichier de commande ��������(�� situé dans le sous-dossier (�� du dossier d’installation de Tomcat.

Sous Linux et Mac OS X1 Ouvrez une fenêtre de commandes (sous Mac OS X, démarrez l’applica-

tion Terminal du dossier Applications/Utilitaires).2 Déplacez-vous avec la commande & dans le sous-dossier (�� du dossier

de Tomcat.3 Exécutez la commande :

Organiser les fichiers d’une application Web Le plus simple pour installer des servlets et des pages JSP sur un serveurWeb ou J2EE tel que Tomcat est de respecter l’organisation d’une applica-tion Web Java (Web Application en anglais).

Le dossier ��( d’une application Web doit contenir les fichiers et sous-dossiers présentés ci-contre.

Le dossier X�UI.B-�������, ainsi que les bibliothèques ���� du dossierX�U-.B-���( d’une application Web, sont ajoutés automatiquement au�������� de cette application, ce qui simplifie sa mise en route sur un ser-veur Web. L’organisation de nos servlets et pages JSP (que nous verrons plusloin dans ce chapitre) est présentée à la figure 12–5.

������������

Figure 12–4 Page d’accueil de Tomcat

SOUS MAC OS X Tomcat et JBoss préinstallés

Des versions récentes de Tomcat et du serveurJ2EE Open Source JBoss sont fournies sousMac OS X avec les outils de développement dusystème et installées dans le dossier �#�(��� .Pour exécuter cette version de Tomcat, vous devezêtre administrateur du système et lancer dans unefenêtre de Terminal la commande suivante :

�#�(��� ������(�������������

Attention ! Cette version de Tomcat est configuréepour fonctionner sur le port L��K et non sur leport H�H�.

Administration de Tomcat

Documentation : Mode d'emploi, API servlet/JSP…

Exemples de servlets et de pages JSP

Dossier Type de fichiers

��( Fichiers ����� et ����

X�UI.B- Fichier ��(�$�� de configu-ration de l’application

������ Fichiers ����� des servlets et des classes d’outils de l’application

��( Bibliothèques ���� non standards comme les drivers JDBC

Page 264: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004252

Compilation d’une application WebLe fichier de commande (���&��(��� compile la classe�����1������� ������U�������� puis crée le fichier d’archive �������� avecle contenu du dossier ��( (le fichier (���&��(�(�� contient les mêmes com-mandes avec des barres obliques inverses G à la place des barres obliques �).

Le fichier X�UI.B-/��(�$�� décrit notamment comment le client du serveurfait appel aux servlets d’une application Web. Pour appeler la servlet declasse �����1������� ������U�������� avec l’URL http://127.0.0.1:8080/test/

bienvenue, on obtiendra le fichier suivant :

FICHIER buildweb.sh

����))I��������)����))I&)����(�X�UI.B-�������)X)I��������)��� ���������1����I����I��������������(������������X)����������1������� ������U�������������)���)I�0)����(���������)I/)����()�

ASTUCE Fichier web.xml

Reprenez un des fichiers ��(�$�� donnés en exemple dans Tomcat pour créer celui de votreapplication Web. La syntaxe du langage XML sera abordée au début du chapitre 14 consacré àXML.

Pages accessibles par le client du serveur Web

Classes nécessaires à l'application Web

Arborescence des dossiers de

l'application Web à créer

Figure 12–5Organisation des fichiers

d’une application Web

ATTENTION Bibliothèques requises

Afin de compiler une servlet, il faut ajouter labibliothèque �����������, qui contient lesclasses relatives aux servlets, à la commande decompilation ���� avec l’option [��������.Par ailleurs, n’oubliez pas si nécessaire de reco-pier dans le dossier X�UI.B-���( les fichiers���� des bibliothèques nécessaires à l’applica-tion Web, par exemple le fichier du driver JDBC.

Page 265: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 253

Mise en route d’une application WebAussitôt que le fichier �������� de l’application Web �� est déposé dans ledossier ��(���� de Tomcat, cette application est automatiquement déployée :les fichiers de �������� sont extraits dans le dossier ��(���������, ce quipermet à l’utilisateur de faire appel à une servlet ou à un fichier de cetteapplication en la faisant précéder du nom de l’application Web (par exemplehttp://127.0.0.1:8080/test/bienvenue+.

C’est le nom du fichier ���� d’une application Web qui détermine la base duchemin d’accès à l’application dans une URL. L’application Web "99� estspéciale et correspond à la racine du serveur.

Par l’exemple : exécuter la servlet de bienvenueUne fois que Tomcat est lancé et que le fichier �������� est déployé, la ser-vlet de classe �����1������� ������U�������� peut être appelée d’une desdeux façons suivantes :• en saisissant l’URL http://127.0.0.1:8080/test/bienvenue?nom=Thomas dans le

champ d’adresse d’un navigateur ;• en utilisant un formulaire HTML comme celui du fichier

���������(������������� de l’application Web ���� (avec ici une URLrelative dans l’attribut ����).

EXEMPLE WEB-INF/web.xmlQM$��)������8;���;MR 3 Prologue XML.

QS:9/�Z'�)��(I���)'!U#./))))));I�� ��)0��� �����>).����:�:)X�()4��������)��?���B;)))));������������������&�&���(I���A�A?�&�&;R

3 Description de la DTD que doit respecter lefichier ��(�$��.

Q��(I���R 3 Balise décrivant l’application Web.

)Q�������R)))Q�������I����RU��������Q��������I����R))))Q�������I����R�����1������� ������U��������Q��������I����R

3 Correspondance entre la servlet de nomU�������� et sa classe �����1������� ������U��������.

)Q��������R

)Q�������I�������R)))Q�������I����RU��������Q��������I����R)))Q���I�������R�(��������Q����I�������R)Q��������I�������RQ���(I���R

3 Correspondance entre la servlet de nomU�������� et son chemin d’accès dans l’URL.

À RETENIR Applications Web Java

L’organisation des classes de servlets et des pagesJSP sous forme d’application Web Java permet desimplifier leur mise en route : Tomcat, comme lesserveurs J2EE, configure une application Web àpartir de son fichier de description X�UI.B-���(�$�� et des bibliothèques de classes des dos-siers X�UI.B-������� et X�UI.B-���(.

B.A.-BA URL relative

Pour faciliter le déploiement de fichiers HTML surdes serveurs différents, HTML permet de spécifierune URL relativement à celle de la page courante.Ici, l’attribut ���� du formulaire ���������(������������� ne répétant pas l’adresse IP duserveur, le navigateur fera appel à la servlet(�������� en remplaçant ���������(������������� par (��������, dans l’URLhttp://127.0.0.1:8080/test/formulairebienvenue. html.

Page 266: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004254

Cycle d’exécution de la servlet de bienvenueLa figure 12-6 montre comment s’exécute une requête à la servlet de classe�����1������� ������U�������� lancée avec le formulaire ���������I

(�������������. • Une fois que l’application Web ���� est déployée dans le dossier ��(����

de Tomcat, l’utilisateur peut demander � le formulaire ���������I(������������� au serveur, qui renvoie � simplement le contenu de cefichier statique.

• À la confirmation du formulaire �, le navigateur construit une requête��� vers le programme CGI ������(�������� avec le paramètre �� et lavaleur saisie.

• Lorsqu’il reçoit cette requête, le serveur Web utilise � le fichier X�UI.B-���(�$�� de l’application Web ���� pour retrouver à quelle servlet corres-pond le chemin �(��������. Le serveur recherche d’abord la balise Q�������I�������R qui associe lechemin contenu dans une balise Q���I�������R avec le nom logique d’uneservlet dans une balise Q�������I����R, c’est-à-dire ici U�������� �.

• Il cherche ensuite la balise Q�������R qui associe le nom logique d’uneservlet � avec sa classe dans une balise Q�������I����R, c’est-à-dire ici�����1������� ������U�������� �.

• Cette servlet est ensuite créée si elle n’existe pas et sa méthode &��� estappelée en lui passant les deux objets qui représentent la requête et laréponse .

• Toutes les informations écrites sur le flux de données de la réponse sontfinalement renvoyées au client de la requête.

EXEMPLE formulairebienvenue.htmlQ����RQ���&RQ�����RU��������Q������RQ����&RQ(& RQ�����RQ�R/�����)���)������<I���)MQ��R

Formulaire faisant appel à la servlet(��������.

B Q���)����8;(��������;)����&8;���;R

Champ de saisie du nom. B ))Q�RQ�����)� ��8;��$�;)����8;��;RQ��R

Bouton de confirmation. B ))Q�RQ�����)� ��8;��(���;)�����8;��� ��)��)���������;RQ��RQ����RQ������RQ�(& RQ�����R

POUR ALLER PLUS LOIN Initialisation et destruction d’une servlet

Le serveur de servlets appelle les méthodes ����et &���� d’une servlet respectivement aumoment de sa création et juste avant de ladétruire. Vous pouvez redéfinir ces méthodes dansvos classes de servlet, si besoin est. La méthode���� est généralement redéfinie pour configurerune servlet en fonction de paramètres dont lesvaleurs sont précisées dans le fichier de descriptionX�UI.B-���(�$��, et récupérées dans la servletgrâce à la méthode ���.���'��������.

Page 267: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 255

Mise à jour d’une application WebEn cas de changement des classes ou des pages dans le fichier ��������, lamise à jour de l’application Web ���� peut s’effectuer de plusieurs façonsdans Tomcat. La plus directe est de supprimer le sous-dossier ���� du dos-sier ��(���� du serveur et de redémarrer le serveur (pour arrêter proprementTomcat, utilisez la commande ����&�� située dans le même dossier que�������).

Figure 12–6 Exécution de la servlet �����1������� ������U�������� avec le formulaire ���������(�������������

package com.eteks.test;

public class ServletBienvenue extends HttpServlet{ public void doGet (HttpServletRequest request, HttpServletResponse response) { String nom = request.getParameter("nom"); PrintWriter out = response.getWriter(); out.write("..."); }

Serveur Web (Serveur HTTP + Serveur servlet) Navigateur (client HTTP)

<?xml version="1.0"?><web-app> <servlet> <servlet-name>Bienvenue</servlet-name> <servlet-class>

com.eteks.test.ServletBienvenue </servlet-class> </servlet> <servlet-mapping> <servlet-name>Bienvenue</servlet-name> <url-pattern>/bienvenue</url-pattern> </servlet-mapping></web-app>

Instance Bienvenue de la classecom.eteks.test.ServletBienvenue

GET /test/formulairebienvenue.html

<html><head><title>Bienvenue</title></head><body><center><p>Comment vous appelez-vous ?</p><form action="bienvenue" method="GET"> <p><input type="text" name="nom"></p> <p><input type="submit" value="Envoyer le formulaire"></p></form></center></body></html>

GET /test/bienvenue?nom=Thomas

<html><head><title>Bienvenue</title></head><body><h1>Bienvenue</h1><p>Bonjour Thomas</p></body></html>

Page 268: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004256

Pour éviter d’arrêter Tomcat, vous pouvez recourir au gestionnaire d’applica-tions Web de Tomcat de la façon suivante :1 Cliquez sur le lien Tomcat Manager de la page d’accueil de Tomcat, puis

saisissez le nom et le mot de passe d’un utilisateur ayant le rôle de�������.

2 Supprimez l’application Web ��� en cliquant sur son lien Retirer.3 Réinstallez l’application en saisissant l’URL de son fichier ��� (une

URL sur un fichier local commence par � ��� suivi du chemin absolu dufichier) ou en téléchargeant son fichier ��� sur le serveur.

Figure 12–7 Gestionnaire d’applications Web de Tomcat

ATTENTION Attribution des rôles

Par sécurité, la page du gestionnaire d’applications Web de Tomcat n’est accessible qu’aux utili-sateurs ayant un rôle de �������, tandis que les pages d’administration de Tomcat sont réser-vées aux utilisateurs ayant un rôle d’��� �. Pour attribuer à un utilisateur ces deux rôles, il fautéditer le fichier ������������������, y ajouter un utilisateur du type :���������������������������������������������������������� ����������� et redémarrer Tomcat si nécessaire.

Page 269: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 257

En phase de développement, il est plus pratique de configurer Tomcat detelle façon que votre application Web utilise directement le sous-dossier ��!de votre arborescence de travail et que le serveur recharge automatiquementtoute classe modifiée dans le dossier "#$�%&'�����, que ce soit une classede servlet ou une classe d’outil. Vous ne déployez alors le fichier ��� qu’unefois votre application Web terminée.

Pour configurer ainsi une application Web, recourez aux pages d’administra-tion de Tomcat de la façon suivante :1 Cliquez sur le lien Tomcat Administration de la page d’accueil de Tomcat puis

saisissez le nom et le mot de passe d’un utilisateur ayant le rôle d’��� �.2 Cliquez sur le symbole d’ouverture à gauche du lien Service (Tomcat-

Standalone) puis sur le lien Host qui doit apparaître.3 Choisissez l’élément Create New Context dans la liste déroulante intitulée

Host Actions, pour afficher les propriétés d’un nouveau contexte d’applica-tion Web.

4 Dans le premier tableau intitulé Context Properties, remplissez le champ desaisie Document Base avec le chemin absolu du dossier ��! de votre arbores-cence de travail et le champ Path avec le chemin de base de l’application Web(par exemple, ������( pour une URL qui débutera par http://127.0.0.1:8080/

testdev). Dans ce même tableau, passez la propriété Reloadable à ����.5 Confirmez la création du nouveau contexte en cliquant sur les boutons

Save puis Commit Changes. 6 Redémarrez Tomcat.

VERSIONS Tomcat 5.5

Depuis la version 5.5, l’application Web d’adminis-tration de Tomcat n’est plus fournie d’office avecTomcat et doit être téléchargée séparément.

Figure 12–8Création d’un contexte

d’une application Web dans Tomcat

ATTENTION Modification du fichier web.xml

Tomcat ne recharge pas automatiquement lefichier de description "#$�%&'���!���d’une application Web quand il est modifié.Pour que la mise à jour de ce fichier soit prise encompte sans redémarrer Tomcat, vous pouvezredémarrer l’application Web dans le gestion-naire d’applications Web en cliquant sur sesliens Arrêter et Démarrer.

Page 270: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004258

Créer l’interface d’une application Web avec les JavaServer PagesLes pages JSP ( JavaServer Pages) simplifient la création de pages généréesdynamiquement sur un serveur HTTP, en utilisant une démarche opposée àcelle des servlets. Au lieu d’écrire du code HTML dans le code Java d’uneclasse de servlet, un développeur JSP écrit du code Java dans le code HTMLd’un fichier JSP…

C’est cette technologie qui est en œuvre pour créer l’interface utilisateur duforum. Mais voyons d’abord comment se programme une page JSP.

Balises JSP pour inclure du contenu dynamiqueOn décrit les instructions Java d’un fichier JSP avec les balises spéciales pré-sentées dans le tableau 12-1. Pour toute requête à un fichier JSP, le serveur HTTP fait appel au serveur deservlet. Celui-ci :1 Crée une classe équivalente de servlet à partir des balises JSP et du reste

du texte du fichier. Le code Java est généré dans la méthode )*�+��( ��d’une classe qui implémente l’interface *�(����(���*�,���-�.���.

2 Compile cette classe.3 Crée une instance de la classe et exécute la méthode )*�+��( �� en lui

passant les objets de requête et de réponse.

Si entre deux requêtes le fichier JSP n’a pas été modifié, seule la méthode)*�+��( �� est appelée, ce qui évite de générer et compiler à nouveau uneclasse équivalente.

ASTUCE Mémo des balises JSP

Un résumé complet de la syntaxe des balises JSPest disponible dans un document PDF de 4 pagesqui peut être téléchargé à l’adresse B http://java.sun.com/products/jsp/syntax/1.2/

card12.pdf

Tableau 12–1 Balises générales JSP

Balise JSP Description

�/0������ �������*�(�1�2�%�����&*�>�4���������3���������(�(�#6#���� �4�������.�����9�:��%�� ��*�4�����&��� #����.�������&��&��%����/

Balise générale d’une page avec les attributs optionnels suivants (listepartielle) :• ����� spécifie les paquetages ou les classes à importer.• �������3��� spécifie le type MIME et le format de codage des carac-

tères de la réponse.• �����.��� est la page à utiliser en cas d’exception.• #����.��� est égal à ���� quand la page JSP est une page de trai-

tement d’erreur.

�/0� �������� ����9�:��%�� ��! ����/ Inclut le contenu du fichier 9�:��%�� ��! �� au fichier courant.

�/���$������� �����/ Commentaire JSP non inclus dans la réponse.

�/4���%���� ��$����&(������/ Déclare les champs et les méthodes Java de la page.

�/����@����/ Inclut du code Java (instructions, déclarations de variables locales).

�/���'����� ��@����/ Inclut dans la réponse une expression Java convertie en texte.

Page 271: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 259

Variables JSP prédéfiniesPour effectuer leur traitement, le code Java des balises JSP �/����@����/ et�/���'����� ��@����/ peut utiliser un ensemble de variables prédéfinies. Letableau 12-2 présente celles qui sont le plus utiles.

Par l’exemple : bienvenue dans le monde JSPLe fichier JSP ! ��(����*� est l’équivalent de la servlet de classe������5���+��(���$ ��(����. La section suivante « Exécuter la pageJSP de bienvenue » montre les légères modifications à effectuer pour faireappel à cette page à la place de la servlet de bienvenue.

REGARD DU DÉVELOPPEUR Inconvénients des servlets

Il est possible de générer n’importe quel contenu dynamique avec les servletsmais leur développement présente des inconvénients majeurs :• Quand une servlet génère un code HTML complexe, ce code n’est pas facile-

ment modifiable.• L’écriture des servlets requiert une bonne connaissance de Java et du code

HTML même pour une page dynamique simple.• La syntaxe du code HTML (ou XML) généré par les appels à �� �� ne peut

pas être vérifiée au moment de l’écriture de la classe de la servlet.Les servlets sont surtout utilisées pour produire dynamiquement des contenusbinaires comme des images ou des fichiers PDF. Les servlets et les pages JSP peu-vent parfaitement cohabiter au sein de la même application Web.

Tableau 12–2 Quelques variables prédéfinies en JSP

Variable Type Description��1��� *�(����(�������,���+��(���6�1��� Requête reçue par le serveur. Surtout utilisée pour récupérer les valeurs des

paramètres.

������ *�(����(�������,���+��(���6����� Réponse renvoyée par le serveur.

������ �� *�(�����3�����!�� Exception déclenchée dans une page JSP et reçue dans une page d’erreur.

��� *�(����(���*�-�"� ��� Flux de sortie des caractères à destination du client.

EXEMPLE bienvenue.jsp�/�+�� �����������1������.��������7�����89�/ ����� ����� �� ��� $ ��(������� ��� ������ ��!��� ��: $ ��(�������: �� $��*����

3 Récupération du paramètre ���.

�/� ��7����4�������;;�����������78� �<8���=�/ ���/������/ �/�>���������=�/ ������� �������/�>�/ ��� ��!��� ������

3 Génération d’un message différent selon que leparamètre existe ou non.

ATTENTION Utilisez les accolades de façon systématique

Tout code JSP ou HTML exécuté dans une instruction de contrôle �, ���, ���,�� ��..., d’une balise �/�/ doit être inclus dans un bloc Java = >, quel qu’ensoit le nombre de lignes ou d’instructions. Les codes JSP �/� ��� / et���� ������ de cet exemple doivent être inclus dans des blocs =�>.

Page 272: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004260

Exécuter la page JSP de bienvenuePour tester la page ! ��(����*�, il faut :• soit placer le fichier dans le dossier d’une application Web, par exemple

un des sous-dossiers du dossier ��!��� de Tomcat,• soit l’ajouter au fichier ��� d’une application Web et déployer ce fichier

sur le serveur de servlet.

Si le fichier ! ��(����*� est à la racine du fichier ������, vous pouvez yfaire appel avec une des deux solutions suivantes :• en saisissant l’URL http://127.0.0.1:8080/test/bienvenue.jsp?nom=Sophie dans le

champ d’adresse d’un navigateur,• en utilisant le formulaire ������� ��! ��(�������� défini précédemment

avec un attribut ��� �� faisant appel au fichier ! ��(����*� :

Contrôle des erreurs dans une page JSPDes erreurs se produisant dans un fichier JSP peuvent être détectées à cha-cune des phases de son interprétation par le serveur de servlet :• lors de la création de la classe équivalente de servlet si certaines balises

JSP sont incorrectes ;• lors de la compilation de cette classe, si le code généré ne respecte pas la

syntaxe Java. La page renvoyée répète alors le texte généré par *�(�� ;• à l’exécution si la méthode )*�+��( �� de cette classe déclenche des

exceptions. Si vous avez spécifié une page d’erreur dans l’attribut�����.��� de la balise �/0� ����� / , l’exécution est alors détournée verscette page.

EXEMPLE formulairebienvenue.html����� ����� �� ��� $ ��(������� ��� ������ �!��� ������� �� ?�������(�����������(���@��� ��������� ����! ��(����*�����������A#3� ���� � ��������������������������� ��� ���� � ������������!� ���(������#�(��������������� ��� ��� ������ �������� ��!��� ������

ASTUCE Code Java de la servlet équivalente à une page JSP

Vous pouvez consulter le code Java des servlets générées par Tomcat dans le sous-dossier���5 du dossier d’installation de Tomcat. On peut facilement identifier la classe généréegrâce à l’organisation du dossier ���5 et aux noms des fichiers *�(�. Il est quelquefoisnécessaire de consulter ces fichiers pour corriger une erreur dans un fichier JSP suite à uneerreur de compilation ou d’exécution.

Fichier web.xml et pages JSP

La présence d’un fichier de description "#$�%&'���!��� n’est pas obligatoire pour faire fonction-ner une application Web constituée uniquementde pages JSP.

Notez qu’il est possible de faire appel à une pageJSP en utilisant les méthodes A#3 et .B+3.

Figure 12–9 Page JSP ! ��(����*�avec la liste de paramètres ����+��� �

Figure 12–10 Organisation du dossier ���5 de Tomcat

Page 273: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 261

Mise à jour des pages JSPDans la configuration par défaut de Tomcat, la servlet d’une page JSP estautomatiquement régénérée à chaque mise à jour de son fichier *�, ce quiest très pratique pendant la phase de mise au point d’une page. Vous pouvezmodifier une page pour la corriger ou pour l’enrichir sans avoir à redémarrerou redéployer son application Web, sauf dans de rares cas.

Utiliser les classes Java dans une page JSPN’importe quelle classe Java peut être utilisée dans un fichier JSP, que ce soitune classe de la bibliothèque standard, d’une autre bibliothèque, ou de vosclasses. Un objet peut être mémorisé par :• un champ déclaré dans une balise �/4�/ �• une variable locale déclarée dans une balise �/�/ �• un attribut associé à un objet JavaBeans (voir ci-dessous) et géré par le

serveur de servlet.

Utiliser les composants JavaBeans dans une page JSPUn composant JavaBeans™ est une classe Java conçue pour être réutilisabledans certains environnements comme les IDE Java ou les pages JSP. Uncomposant JavaBeans définit :• des propriétés (properties en anglais) correspondant aux données d’un

objet auxquelles l’utilisateur peut accéder ;• des événements permettant à un objet d’une classe de communiquer avec

d’autres objets.Une simple classe Java ?���3�� peut être considérée comme un compo-sant JavaBeans si :• ?���3�� est ��!� � ;• ?���3�� a un constructeur ��!� � sans paramètre (le constructeur par

défaut peut convenir) ;• ?���3�� définit des méthodes préfixées par ��� et �� permettant

d’interroger et de modifier des données de la classe correspondant à leurpropriété JavaBeans. Les propriétés peuvent être éventuellement héritéesd’une super-classe.

ASTUCE Mise au point d’une page JSP

Dans Tomcat, les textes écrits avec les méthodes �� �� et �� ���� du champ ��� de la classe*�(�����+���� sont enregistrés par défaut dans le fichier ��������� ����� deTomcat, qui contient aussi des informations enregistrées par le serveur pendant son exécution.N’hésitez pas à recourir à ce moyen simple pour vérifier les points par lesquels passe l’exécutiondes pages JSP et des classes d’une application Web. Évitez de recourir à la méthode���C����D ���� de la classe *�(��� ��-B�� ��.��� car l’appel à cette méthodeest bloquant.

À RETENIR Où stocker les classes non standards ?

Les classes et les bibliothèques non standards utili-sées dans une page JSP doivent être stockées dansles dossier "#$�%&'����� et "#$�%&'�� !de l’application Web dont dépend la page.

C# Propriétés

Les propriétés d’un composant JavaBeans et cellesd’une classe C# sont similaires, mais ne se pro-gramment de la même façon. En C#, la notion depropriété interrogeable via son accesseur ��� etmodifiable via son mutateur �� est intégrée aulangage. En Java, une propriété est définie dansune classe grâce à des méthodes préfixées par��� et �� suivis de l’identificateur de la pro-priété.

Page 274: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004262

Par exemple, la classe ������5�����C����'���� représentant un mes-sage du forum est un composant JavaBeans dont les propriétés ������,����?���� ��, �*��, ����� et � sont accessibles en lecture/écriture. Enrevanche, sa super-classe ������5�����C���� ne peut être utiliséecomme composant JavaBeans car elle n’a pas de constructeur sans paramètre.

Dans des pages JSP, un objet peut être instancié à partir d’un composantJavaBeans grâce à une balise JSP *����$���. À chaque objet créé de cettefaçon est associée une portée (scope en anglais) :• Un objet de portée ���� est associé à la page JSP et peut être comparé à

une variable locale.• Un objet de portée ��1��� existe pendant toute la durée d’une requête

HTTP.• Un objet de portée � �� est associé au client de la requête HTTP et

existe dans toutes les pages JSP pendant les différentes requêtes du mêmeclient. Ce type d’objet est utilisé par exemple pour « tracer » un utilisa-teur au cours de sa visite sur un site ou pour gérer le panier d’achat d’unclient. Pour qu’un objet de portée � �� puisse être associé au mêmeclient d’une requête HTTP à l’autre, le client doit autoriser le cookierenvoyé par le serveur.

• Un objet de portée ���� ��� �� existe pendant la durée de l’applicationWeb. Partagé entre toutes les pages JSP, il est utile pour partager uneconnexion JDBC par exemple.

Les balises présentées ci-après dans le tableau 12-3 sont utilisées pour mani-puler un composant JavaBeans dans une page JSP.

REGARD DU DÉVELOPPEUR Conventions JavaBeans et francophonie

Les préfixes ��� (ou aussi pour une valeur booléenne) et �� de l’accesseuret du mutateur d’une propriété sont pratiques pour créer rapidement descomposants JavaBeans. Certains IDE automatisent même la création de cesméthodes en permettant au développeur de citer uniquement les propriétésd’une classe et leur type. Mais si vous appliquez cette convention pour desnoms de propriétés francophones, comme dans notre cas, vous obtiendrez desnoms de méthodes au franglais fort discutable… Les spécifications JavaBeansautorisent néanmoins d’utiliser les identificateurs de votre choix pour l’acces-seur et le mutateur d’une propriété, mais vous devrez alors créer des classessupplémentaires postfixées par $���%���� pour décrire les propriétés quemanipulent ces mutateurs et ces accesseurs.

ATTENTION Les balises jsp: sont des balises XML

Les balises JSP débutant par *�� sont des balises XML (eXtended Markup Language). Avantd’aborder le chapitre sur XML, retenez pour l’instant qu’à la différence d’HTML, il faut en XMLrespecter la casse des balises et de leurs attributs, et ne pas oublier de fermer les balises :• soit avec � à la fin de la balise quand elle n’inclut pas d’autres balises ;• soit avec une balise de fin ��+�% ��A(: .

Pour plus d’informations, voir aussi The JavaBeansspecification à :B http://java.sun.com/products/javabeans/docs/

B.A.-BA Cookie

Un cookie correspond la plupart du temps à unidentifiant dans une base de données. Un serveurutilise les cookies pour reconnaître le client avecqui il communique au cours des requêtes de sa ses-sion voire d’une session à l’autre. Si besoin est, lesméthodes ���?��5 � de l’objet ��1��� et���?��5 � de l’objet ������ permettent deconfigurer des cookies en plus de celui créé d’officepar le serveur de servlet.

POUR ALLER PLUS LOINGérer une session sans cookie

Les pages JSP autorisent aussi la gestion d’une ses-sion quand le navigateur est configuré pour refuserles cookies. On programme cette fonctionnalité enappelant la méthode ������E6F de l’objet������ pour toute URL présente dans votre site(lien �� ������9�:� , action de formulaire����� ��� ����9�:� ...). Cette méthodeajoute si nécessaire une information à l’URL con-cernant la session de l’utilisateur en cours.

Page 275: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 263

À RETENIR jsp:useBean = attribut d’une servlet

Si vous recherchez le code écrit pour une balise *����$��� dansle fichier source de la servlet équivalant à une page JSP, vous verrezqu’un objet créé à partir d’un composant JavaBeans est en faitmémorisé dans un attribut qui associe un texte à un objet Java. Uneservlet équivalente manipule chaque attribut grâce aux méthodes���G��� !���, ��G��� !��� et ����(�G��� !��� définiesdans la classe *�(����(���*�.���?������ de l’objet pré-défini ����?������.Si vous voulez manipuler ces mêmes attributs dans une servlet, utili-sez les méthodes équivalentes définies dans les classes*�(����(�������,���+��(���6�1���,*�(����(�������,���+� �� et�*�(����(���+��(���?������.Ces classes permettent de représenter respectivement une requête,une session ou le contexte de l’application Web.

Par exemple, la balise *����$��� :

est équivalente dans une servlet aux instructions Java suivantes :

�*����$���� ������ ������������������*�(��� �G����F ���������������� �����

���6H���H��� ���������� ��,���+� ���� �������1������+� ��789���?�H�� �������I���� !������ �������I ���I�� ������������G����F ����� ������7G����F �8����� �����G��� !���7���� ����89 ��7��� �����������8=����� ����������G����F ��789��� ����G��� !���7���� ��������� ���89>

Tableau 12–3 Balises JSP pour les composants JavaBeans

Balise JSP Description

�*����$���� ���+����������%����-����������������4��&��2&����&���� ���&���% �� ����

Déclare la variable locale d’identificateur +��� et de type %����-���ou %�����&��������-��� référençant l’objet +���.

Les balises *����$��� avec un attribut ��� crée un objet declasse %����-��� si l’objet +��� n’existe pas. Les propriétés de cetobjet peuvent être initialisées en incluant d’autres balises comme dansla deuxième forme de la balise *����$���.

La portée de l’objet dépend de l’attribut ���� qui peut être égal à����, ��1���, � �� ou ���� ��� �� (���� par défaut).

�*����$���� ���+����������%����-����������������4��&��2&����&���� ���&���% �� ��� ���*����.�������� ���+�������������������� ������������������������(��������%�&��� ���*����.�������� ���+�������������������� ������������������������(�������/���'����� ��@����/ �� ���/���G�����!�� ���J � � �� �� �����/ ��*����$���

�*����$���� ���+�����������%�����&��������-����������������4��&��2&����&���� ���&���% �� ����

�*����.��������������+�������������������� ���������������������(��������%�&���

Modifie une propriété de l’objet +��� avec une valeur donnée, le résul-tat d’une expression Java ou la valeur d’un paramètre. Si la propriété estde type primitif, la valeur textuelle est convertie dans ce type.

La dernière forme de la balise *����.������� modifie toutes lespropriétés de l’objet +��� avec les valeurs des paramètres de mêmesnoms.

�*����.��������������+�������������������� ����������������������(�������/���'����� ��@����/ ��

�*����.��������������+�������������������� ����������������������������������������

�*����.��������������+���������������2��

�*�����.��������������+�������������������� ����� Renvoie la valeur d’une propriété de l’objet +��� convertie en texte.

Page 276: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004264

Par l’exemple : créer une liste de coursesLa page �� ������ ������� permet d’éditer un article pour l’ajouter à la listede courses gérée par la page � �������*�.

La page � �������*� ajoute un article à la liste des articles et affichecette liste.

Figure 12–11 Liste de courses de plusieurs utilisateurs accédant simultanément au même serveur

EXEMPLE editerarticle.html����� ����� �� ��� F �������������� ��� ������ �!��� ������� ��: G*������������ ������:

Formulaire faisant appel à la page � �������*�.

B ��������� ����� �������*���������������

Champ de saisie de l’article à ajouter. B ���� G�� ������� �������������� ���������������� ���

���� � ������������!� ���(������G*������ ��� ������ �������� ��!��� ������

EXEMPLE listecourses.jspDéclaration de l’objet ��� ��� de portée � ��.

B �*����$���� ������ ����������*�(��� �G����F ���������������������� ����� ��

Si le paramètre ��� ��� est présent dans la liste, l’article est ajouté à l’ensemble ��� ���.

B �/� ��7��1������.���������7���� ����8�4������8�������� �������7��1������.���������7���� ����889�/ ��

����� ����� �� ��� F �������������� ��� ������ �!��� ������� ��: F ��������������:

Lien vers la page d’ajout d’article. B ����������� ������ �������� G*������������ ������ �������� �!���51����

Boucle ��� d’énumération de tous les articles. B �/�����7 ��� ��<9� ������ ��� ���789� KK8�����=�/

Affichage du -ème article. B ��������/����� �������7 8�/ �!� ��

Fin de la boucle ���. B �/�>�/ ��!���51���� ��!��� ������

Page 277: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

12 –

Pro

gram

mat

ion

Web

ave

c le

s se

rvle

ts, J

SP e

t Jav

aBea

ns

© Groupe Eyrolles, 2004 265

La liste de courses est stockée dans l’objet ��� ��� de classe *�(��� �G����F �. Cet objet de portée � �� � est associé au navigateur sur le ser-veur et est personnel pour chaque client. L’objet ��� ��� est créé au débutde la session d’un client puis réutilisé à chacune de ses requêtes. L’article enparamètre est ajouté à l’ensemble des articles � puis la liste des articles lignepar ligne � est affichée dans une boucle d’énumération �.

Faire appel à d’autres pages JSPLes balises présentées ci-après dans le tableau 12-4 sont utilisées pour faireappel à d’autres pages JSP et permettent d’organiser les pages JSP d’uneapplication Web d’une manière plus modulaire. Leur mise en œuvre estabordée au chapitre suivant.

ATTENTION Quelques erreurs JSP typiques

Voici quelques erreurs souvent rencontrées avec les pages JSP :• �E����� �����#��������������Il est probable qu’une balise LCF� *�� n’a pas été correctement fermée avec lesymbole �.

• � ���>� ��������������������La plupart du temps, cette erreur survient quand vous avez oublié une accolade fermantedans le code Java de votre page ou si vous avez mal placé des symboles / pour fermerune balise de code Java.

• Une zone de la page ou une valeur générée dynamiquement n’apparaît pas comme pré-vue. Vérifiez la casse de la balise XML correspondante.

Pensez aussi à vérifier les fichiers inclus avec une balise �/0� �������� ������/ quand vous ne trouvez pas l’erreur dans la page elle-même.

ATTENTIONDélai d’expiration d’une session

Le délai d’expiration (timeout en anglais) d’unesession est par défaut de 30 minutes dans Tom-cat, c’est-à-dire que si l’utilisateur n’envoieaucune requête pendant cette durée les objetsde session qui lui sont associés sur le serveursont automatiquement détruits. Dans cet exem-ple, si vous ne faites pas appel au serveur pen-dant cette durée ou si vous redémarrez votrenavigateur, votre liste de courses sera perdue !

Tableau 12–4 Balises JSP d’appel à d’autres pages

Balise JSP Description

�*����������������9�:��%�� ���� Renvoie le contrôle de la page courante à la page donnée dans l’attribut����, en lui passant éventuellement des paramètres supplémentairesavec les balises *�������.

�*�����������������/���'����� ��@����/ ��

�*����������������9�:��%�� ��� ���*��������������������������(��������%�&��� ���*���������������������������������������(�������/���'����� ��@����/ �� ��*���������

�*�� �������������9�:��%�� ���� Appelle la page donnée dans l’attribut ����, en lui passant éventuelle-ment des paramètres supplémentaires avec les balises *�������.

�*�� ��������������/���'����� ��@����/ ��

�*�� �������������9�:��%�� ��� ���*��������������������������(��������%�&��� ���*���������������������������������������(�������/���'����� ��@����/ �� ��*�� �������

Page 278: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004266

On n’utilise pas les balises ������ et *�� ������ de la même façon : • La balise �/0 ������ � ����� ��� / inclut le fichier de l’attribut

� %� dans le texte de la page courante au moment de la génération ducode Java de la servlet (comme la directive M ������ du C). Elle s’utilisesurtout pour inclure des déclarations d’objets utilisés dans plusieurspages.

• La balise �*�� ���������������4�� � appelle la page de l’attribut ��4�au moment de l’exécution de la page JSP courante. Elle permet de créerdans des pages JSP isolées des portions de page réutilisables dans plu-sieurs pages, par exemple pour une barre de navigation.

En résumé…Ce chapitre vous a présenté les différentes façons d’exploiter en Java un ser-veur Web, d’abord avec les servlets puis avec les pages JSP et les composantsJavaBeans. Abordons maintenant un cas plus concret avec la création del’interface utilisateur du forum de discussion grâce aux pages JSP.

CONVENTIONS Fichiers inclus

Par convention, les fichiers inclus avec la balise �/0 ������ � ����� ��� / portentune extension *��. Ces fichiers, ainsi que les autres fragments de page JSP inclus avec labalise �*�� ������ ��������4�� � , sont généralement rangés dans un sous-dossier*�� du dossier "#$�%&' de l’application Web. Comme le contenu du dossier "#$�%&' n’estaccessible que du serveur, vous pouvez aussi y ranger les fichiers nécessaires à votre applicationWeb auxquels vous voulez interdire l’accès par une requête HTTP d’un client.B http://java.sun.com/developer/technicalArticles/javaserverpages/code_convention/

Page 279: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

13Interface utilisateurdu forum

SOMMAIRE

B Scénario d’utilisation

B Programmation des pages

B Composants JavaBeans

B Identification et inscription

B Page d’accueil

B Création de message

MOTS-CLÉS

B Architecture 3 tiersB jsp:usebeanB scopeB sessionB jsp:forwardB jsp:include

Ce chapitre montre comment intégrer les classes du forum définies dans les chapitres précédents pour créer l’interface utilisateur du forum grâce à des pages JSP hébergées sur un serveur Web.

Page 280: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004268

Scénario d’utilisationL’application de forum est décrite à l’aide de scénarios d’utilisation, qui ser-vent de base pour la réalisation des pages JSP (voir figure 13–2).Le forum donne des droits d’utilisation différents selon que les utilisateurssont identifiés ou pas :• Un utilisateur non identifié peut consulter la liste des sujets du forum et

leurs messages.• Un utilisateur identifié peut en plus créer de nouveaux sujets, répondre à

des sujets et modifier ses messages. Un modérateur a le droit de modifiertous les messages qu’il en soit l’auteur ou non.

Pour faciliter la navigation des deux types d’utilisateur, les liens hypertexte affi-chés dans les pages du forum deviennent différents une fois qu’un utilisateurs’est identifié (barre de navigation et liens Répondre et Modifier d’un message).

Scénario pour un utilisateur non identifiéQuand un utilisateur arrive sur la page d’accueil du forum �, les sujets luisont affichés sous forme de liste dans un ordre allant du plus récemmentmodifié au plus ancien. Il peut alors :• Cliquer sur un sujet pour en consulter les messages �. En choisissant le

lien Sujets �, il peut revenir à tout moment à la page d’accueil pour con-sulter les messages d’autres sujets.

• S’identifier s’il a déjà un pseudonyme et un mot de passe �.• S’inscrire en choisissant un pseudonyme �. Le mot de passe qui lui est

attribué par le serveur � lui permet alors de s’identifier en cliquant sur lelien Identification �.

Scénario pour un utilisateur identifié Une fois qu’un utilisateur a saisi son pseudonyme et son mot de passe correc-tement, il revient sur la page d’accueil où les liens Identification /Inscriptionont été remplacés par un lien Quitter . Il peut maintenant :• Lire les messages d’un sujet � et y répondre en cliquant sur le lien Répon-

dre � qui ne s’affiche que pour les utilisateurs identifiés. Après avoirconfirmé la saisie de son message , la page du sujet fait alors apparaîtreson nouveau texte.

• Éditer les messages � qu’il a rédigés pour modifier leur texte en cliquantsur le lien Modifier. Après confirmation de la modification �, la page dusujet laisse alors apparaître son texte modifié.

• Créer de nouveaux sujets � en cliquant sur le lien Nouveau sujet dans labarre de navigation. Après avoir saisi le sujet et un message �, la page dunouveau sujet est alors affichée.

DANS LA VRAIE VIE Cas d’utilisation UML

En conception UML, on identifie au début les casd’utilisation d’une application que l’on symbolisesous la forme d’un schéma UML, comme celui dela figure 13-1.

Figure 13–1 Cas d’utilisation du forum

Internaute

Consulter les messages

S’inscrire

S’identifier

Ecrire des messages

<<include>>

<<include>>

Page 281: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 269

Figure 13–2 Scénario d’utilisation du forum

Utilisateurnon identifié

Utilisateuridentifié

� �

Page 282: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004270

Programmation des pages du forumLe forum met en œuvre une architecture 3 tiers classique où des informationsenregistrées sur un serveur de bases de données sont traitées par les pages JSPet les classes Java d’un serveur Web, auquel des navigateurs font appel.

Organisation des pages du forumComme le montre la figure 13–4, les pages JSP du forum se répartissent endeux catégories : les pages affichées par le navigateur, qui présentent les mes-sages et les formulaires de saisie, et les pages intermédiaires lancées lors de laconfirmation des formulaires et du lien Quitter. Ces pages intermédiairesn’affichent rien. Elles exécutent les modifications en réponse à leur formu-laire puis renvoient le contrôle à une page capable d’afficher le résultat del’action.

Utilisation des classes des paquetages com.eteks.forum et com.eteks.outilsLes pages JSP du forum utilisent les classes du paquetage ������5�����pour lire et enregistrer dans la base de données les utilisateurs et les messagesdu forum, ainsi que les deux classes d’outils ������5��� �B�� �?�� ��et ������5��� �C��D�.��. Ces classes ont été définies dans leschapitres 6 « Les classes de base de la bibliothèque Java » et 11 « Connexionà la base de données avec JDBC ».

Figure 13–3 Architecture 3 tiers d’un site Web et intervenants

SGBD DBA

Serveur Web (Serveur HTTP + Serveur servlet/JSP)Webmaster

Développeurs Java Développeurs Web Infographistes

Rédacteurs

Pages HTML statiques

Pages JSP dynamiques Servlets JSP

SQL

SQL

Composants JavaBeans

Driver JDBC

public class ...{ // ... }

public class ...{ // ... }

<%@ page ...><html>...</html>

<%@ page ...><html>...</html>

<html>...</html>

Servlet

Servlet

Navigateur (client HTTP) Utilisateur

Navigateur (client HTTP) Utilisateur

B.A.-BA Architecture n tiers

Une architecture n tiers répartit sur plusieurs ser-veurs et clients les fonctionnalités d’une applica-tion. Le forum que l’on étudie dans cet ouvrage estmis en œuvre avec une architecture 3 tierstypique :• un SGBD chargé de la sauvegarde des données ;• un serveur chargé d’exploiter les données du

SGBD pour les mettre en page ;• un client gérant l’affichage des données et les

interactions avec l’utilisateur.Suivant les besoins, les serveurs peuvent être sur lamême machine ou sur des machines séparées.

Page 283: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 271

Classe com.eteks.forum.ConnecteurForumUn objet unique de classe �������������� �������������� est utilisé pourpartager la connexion à la base de données entre toutes les pages JSP del’application. Cet objet d’identificateur ��������������� est créé grâce à unebalise ��������� de portée �����������, qui est déclarée dans le fichier��������������������������������� ; les pages ayant besoin d’accéder àla base de données incluent ce fichier grâce à une balise �� �����!� ���"#�

���������������������������������# �$.

Classe com.eteks.forum.UtilisateurForumUn objet de classe ��������������%�������������� est créé pour chaqueutilisateur pour la durée de sa session grâce à une balise ��������� deportée ����. Cet objet d’identificateur ��������������� est déclaré dansle fichier ��������������������������������� et permet à toutes les

Figure 13–4 Liens entre les pages JSP du forum

ajoutermessage.jsp

index.jsp identifierutilisateur.jspcreerutilisateur.jsp

creersujet.jsp creermessage.jsp modifiermessage.jsp

liresujet.jsp

ajouterutilisateur.jsp

quitter.jsp

mettreajourmessage.jsp

verifierutilisateur.jsp

Page 284: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004272

pages JSP de connaître l’utilisateur qui a lancé une requête. Cet objet étantcréé, que l’utilisateur se soit identifié ou non, l’application manipule troistypes d’utilisateur : les inconnus dont la propriété ����������� est ����, lesutilisateurs identifiés dont la propriété ����������� n’est pas ���� et le(s)modérateur(s) pour qui la propriété ��!������� est vraie (cette propriété estobtenue avec la méthode �&�!�������). Cette classe est aussi utilisée pourcréer des objets de portée ��'� au moment de l’inscription d’un utilisateur etau moment de l’initialisation de l’objet ��������������� pour inscrire d’officeun modérateur dans la base de données.

Classe com.eteks.forum.MessageForumCette classe est utilisée dans les pages de saisie d’un message ou d’un sujetpour créer des objets dont la portée est limitée à la page ou la requête.

Classe com.eteks.forum.EnsembleMessagesForumCette classe est instanciée dans la page d’accueil et la page présentant lesmessages d’un sujet pour effectuer des recherches dans la base de données.La liste des messages trouvés est affichée dans un tableau HTML.

Classe com.eteks.outils.OutilsChaineLa méthode �������(��'���� de cette classe est appelée pour limiter la lon-gueur du sujet pour les titres des pages. L’autre méthode ���)�������*+&( estutilisée pour convertir les retours à la ligne et les symboles ,-�-.-/ des textesdes messages.

Classe com.eteks.outils.MotDePasseLa méthode ��0�� de cette classe est appelée lors de l’inscription d’un utilisa-teur pour générer aléatoirement son mot de passe.

B.A.-BA Architecture MVC

L’organisation des classes et des pages du forum met en pratique le design pattern Modèle VueContrôleur. Ce modèle d’architecture sépare les classes d’un programme en trois catégories : • celles du modèle, qui structurent les données d’un programme, comme ici les classes du

paquetage ������������� ;• celles de la vue, qui mettent en page les informations du modèle, comme ici les servlets des

pages qui affichent les messages et les formulaires de saisie ;• celles du contrôleur, qui gèrent les actions de l’utilisateur sur la vue pour modifier le modèle,

comme ici les servlets des pages intermédiaires.Une architecture MVC permet de réutiliser les classes d’un même modèle dans d’autres environ-nements comme Swing, où la vue sera à base des composants et le contrôleur sera un ensemblede listeners.B http://java.sun.com/developer/technicalArticles/javaserverpages/servlets_jsp/

Organisation de l’application Web forum

Les fichiers du forum sont organisés sous formed’une application Web Java : le dossier �������contient un sous-dossier ���� où sont stoc-kées les classes nécessaires au fonctionnementdes pages JSP, un sous-dossier ��� qui contient lefichier d’archive du driver JDBC de MySQL et unsous-dossier �� qui contient des fragments depages JSP, comme la barre de navigation (voiraussi en annexe, pour une liste complète desfichiers du forum).

Figure 13–5 Organisation des fichiers du forum

Page 285: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 273

Identification de l’utilisateurLa page d’identification est la plus simple du forum : c’est un formulaire de saisieavec deux champs, l’un pour le pseudonyme, l’autre pour le mot de passe.

La barre de navigation incluse est abordée dans la section suivante, « Paged’accueil ». Le champ ������ du formulaire fait appel à la page JSP)������������������� pour vérifier si le pseudonyme et le mot de passe cor-respondent aux informations d’un utilisateur existant dans la base de données.

FORUM identifierutilisateur.jsp���������!�-��'�"#��������������)�'��������#-�$��$�!������1�)��-����-����������-��-����-����$

3 Inclut la barre de navigation et d’informationcommune à toutes les pages.

����-������"#)�������������������#-���2�!"#���#$--������-���!��"#3#$----���$------��!$4��!��5��-����!$

3 Formulaire d’identification du pseudonyme/motde passe de l’utilisateur.

------��!$������-����"#���!��5��#-�5��"#��6�#-----------------��6���'�2"#73#$���!$----����$----���$------��!$&��-!�-���-����!$

3 Champ de saisie du pseudonyme avec 30 carac-tères au maximum.

------��!$������-����"#���8�4��#-�5��"#��9��!#-----------------��6���'�2"#73#$���!$----����$--�������$

3 Champ de saisie du mot de passe avec 30 carac-tères au maximum.

--������-�5��"#�����#-)����"#�!�������#$�����$��������$����!5$��2���$

3 Bouton de confirmation Identifier.

ATTENTION Chemin des fichiers inclus

Un chemin qui débute par une barre oblique �dans une balise�� �����!� ���"#�� �! ��# �$

est relatif au dossier de l’application Web.

FORUM verifierutilisateur.jsp�� -��'�-�����4�'�"#���������#-�$ 3 Balise ��'� spécifiant la page d’erreur.

�� -�����!�-���"#����������������������������������#-�$�� -�����!�-���"#����������������������������������#-�$

3 Inclut les objets décrits dans les fichiers du sous-dossier ���������������.

����-:��2�����������-!�-�;����������-���$ 3 Commentaire JSP.

������4������5-����"#���������������#-----------------�������5"#���!��5��#-�����"#���!��5��#-�$

3 Modification de la propriété ���!��5�� del’objet ��������������� avec le paramètrede même nom.

��-�-<---�������������������2���2��-<���������������=-�-------,,-����������������'��&��8�4��<=��>���-<----------------------��>����'��4��������<#���8�4��#===----?-�$

3 Vérification de l’existence de l’utilisateur dans labase de données et de la correspondance de sonmot de passe avec le paramètre ���8�4��.

-----������9��!-��'�"#��!�6���#-�$-���-@

3 Transfert du contrôle à la page d’accueil.

---������������������:����������<����=A-�$ 3 Annulation de l’autorisation de l’utilisateur s’iln’existe pas ou si le mot de passe est incorrect.

������9��!-��'�"#�!��������������������#$-�--���������-����"#������#-)����"#�!�����������-����������#-�$�������9��!$

3 Transfert du contrôle à la page �!�������������������� avec le para-mètre ������.

Page 286: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004274

Cette page passe le contrôle à la page d’accueil � si l’utilisateur a saisi cor-rectement son pseudonyme et son mot de passe � ou sinon renvoie le con-trôle à la page précédente �. Le message d’erreur Identification incorrectespécifié par le paramètre ������-est affiché par la barre de navigation.

La page )������������������� vérifie les coordonnées de l’utilisateur dansla base de données en utilisant l’objet ��������������� de portée �����������,déclaré dans le fichier ���������������������������������.

Figure 13–6 Résultat de l’identification avec la page )�������������������

B.A.-BA Tableau HTML

Les tableaux HTML sont très souvent utilisés pourdisposer les éléments d’une page HTML. La balise������$ d’un tableau inclut pour chaque ligneune balise ���$ (comme table row) où chaque cel-lule est décrite avec une balise ��!$ (commetable data).Pour le forum, on a recours ici à certains des attri-buts de ces balises, pour améliorer l’esthétique despages du forum : les attributs ������!!��',���������' et 9�!�2 de la balise ������$spécifient la largeur de bordure intérieure de chaquecellule, l’espacement entre chaque cellule et la lar-geur du tableau (exprimé en pourcentage ou enpixels) ; les attributs �'����� et ���'� de la balise���$ spécifient la couleur de fond et l’alignementdes textes utilisés pour les cellules d’une ligne.

Identification correcte Identification incorrecte

FORUM WEB-INF/jspf/bean/connecteurforum.jspfDéclaration de l’objet ��������������� dontla portée s’étend à toute l’application Web.

B ����������-�!"#���������������#-����"#�����������#-------------���"#�������������� ��������������#$

Au moment de l’initialisation de l’objet���������������, modification de ses pro-priétés utilisées pour la connexion à la base dedonnées.

B --������4������5-����"#���������������#-�----------�������5"#!��)��#-)����"#�����5>���!���8��)��#�$--������4������5-����"#���������������#----------�������5"#�2���� ����6���#-)����"#�!����5>��������#�$--������4������5-����"#���������������#----------�������5"#��'��#-)����"##�$--������4������5-����"#���������������#----------�������5"#��9��!#-)����"##�$

Déclaration de l’objet ��!������� de portéelimitée à cette page.

B --����������-�!"#��!�������#-----------���"#��������������%��������������#$-�

Attribution d’un pseudonyme, d’un mot de passeet d’une autorisation de modérateur.

B ----������4������5-����"#��!�������#---------------------�������5"#���!��5��#-)����"#��!�������#�$----������4������5-����"#��!�������#---------------------�������5"#���8�4��#-)����"#�1���5#�$----������4������5-����"#��!�������#-�������5"#�����������#----------)����"#��"-��������������%����������&B8�C:+�%C-�$#�$

Si le modérateur n’est pas déjà dans la base dedonnées, il y est ajouté.

B ----��-�-<D��!�����������2���2��-<���������������==---------��!���������������-<���������������=A-�$--�����������$

Fin de l’initialisation de l’objet ���������������.

B �����������$

Page 287: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 275

Lors de l’instanciation de l’objet, les propriétés de l’objet ���������������relatives à la connexion avec la base de données � sont initialisées et unmodérateur est ajouté à la base de données �. Les valeurs des propriétés uti-lisées pour la connexion � sont les mêmes que les valeurs par défaut de laclasse �������������� �������������� ; elles sont citées pour que voussachiez où se programme la configuration de la connexion à la base de don-nées si vous souhaitez changer de SGBD pour le forum.

Les instructions qui permettent de créer le modérateur auraient pu aussi êtreprogrammées dans une balise ��-�$, comme ceci :

L’objet ��������������� représentant l’utilisateur en cours d’identificationdans la page )������������������� est un objet de portée ����, déclarédans le fichier ���������������������������������.

La page ��������� est appelée au cas où se produiraient une exception pendantl’exécution des pages du forum utilisant l’attribut �����4�'�"#���������# dansleur balise �� -��'�-�$, comme la page )�������������������.

Une page d’erreur reçoit l’exception déclenchée dans la variable prédéfinie�6�������, qui est ici tout simplement convertie en texte avec sa méthode��E����'.

��-��������������%��������������-��!�������-"-----��9-��������������%��������������<#��!�������#F-#�1���5#F------------------------��������������%����������&B8�C:+�%C=A---�-<D��!�����������2���2��-<���������������==-----��!���������������-<���������������=A-�$

ATTENTION Initialisation d’un objet de portée application

Un objet de portée ����������� n’est créé etinitialisé qu’une seule fois pour toute la duréede vie de l’application Web, c’est-à-dire que lesinstructions et les balises comprises entre labalise de début ���������� ���$ et labalise de fin �����������$ ne sont exécu-tées qu’une fois. Si vous souhaitez modifier cesinstructions directement dans le fichier JSP dontse sert le serveur de servlet pour utiliser parexemple un autre SGBD ou pour changer demodérateur, vous devrez alors redémarrerl’application Web. Si vous ne maîtrisez pas lesoutils d’administrations de Tomcat, arrêtez etredémarrez simplement Tomcat.

FORUM WEB-INF/jspf/bean/utilisateurforum.jspf����������-�!"#���������������#-����"#����#-------------���"#��������������%��������������#-�$

3 Déclaration de l’objet ��������������� dontla portée s’étend à la session de l’utilisateur.

FORUM erreur.jsp�� -��'�-������4�'�"#����#-�$�2���$�2��!$������$�������������$��2��!$���!5$�������$�2G$���������-��2G$��$H����-!����!�-�;�-��-�����������$��$&����-!�-�'�����-��-�����������-!�-���-����!���-��-9����������$!�-��-���-��-���-�����������-��-��6��-!;������->��-���-����$

3 Balise spécifiant que cette page est une paged’erreur.

��$��$��"-�6�������-�$���$���$��������$����!5$��2���$

3 Affichage du texte renvoyé par la méthode��E����' de l’exception.

Figure 13–7 Page d’erreur affichée quand la base de données n’est pas démarrée

POUR ALLER PLUS LOIN Gestion des erreurs

La gestion des exceptions est simplifiée dans unepage JSP car le code Java équivalent à la pageest généré d’office dans une instruction ��5����2. En cas d’exception, le bloc ����2détourne le contrôle d’erreur vers la paged’erreur spécifiée ou vers une page par défautaffichant l’exception. Mais cela ne vous interditpas de programmer une instruction ��5-����2dans la page JSP si vous voulez disposer d’uncontrôle plus fin sur l’exception qui est survenue.

Page 288: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004276

Page d’accueilLa page d’accueil affiche dans un tableau la liste de tous les sujets dansl’ordre rétrograde du plus récent au plus ancien.

FORUM index.jspBalise ��'� spécifiant les paquetages à impor-ter et la page d’erreur.

B �� -��'�-������"#��)�������IF��)������IF��)����6��IF--��������������IF���������������I#-�����4�'�"#���������#-�$

Inclut l’objet ���������������. B �� -�����!�-���"#����������������������������������#-�$�2���$�2��!$������$�����-�-:�������������$��2��!$���!5$�������$�2G$�������2G$Inclut la barre de navigation et d’information

commune à toutes les pages. B ���������!�-��'�"#��������������)�'��������#-�$���$

Création d’un tableau HTML avec une bordureoccupant 90 % de la largeur de la page.

B ������-���!��"#G#-������!!��'"#J#-���������'"#3#-9�!�2"#K3�#$

Ligne d’en-tête avec les deux colonnes Sujet etDernier message, affichée sur un fond bleu.

B --���-�'�����"#LKKKK #-���'�"#������#$----��!$��$E�������$���!$----��!$��$8������-���'����$���!$--����$

Recherche des sujets disponibles dans la base dedonnées.

B --��-�������&��'������-����-"-��9-�������&��'������-<=A-----��������2���2��E����-<���������������=A-�

Format de date standard. B -----8���������-!���������-"-8����������'���������-<=A-----���-��'��-"-3A

Énumération des sujets ligne par ligne. B -----��-<��������-��-"-�������������-<=A-���2���6�-<=A-=-�-----?-------&��'������-����-"-<&��'������=�����6�-<=A-�$

Création d’une ligne de tableau pour chaque sujet. B --���-�'�����"#��"-��'��MM-�-J-""-3-N-#L������#-�-#L #-�$#$-�

La première colonne contient les sujets avec unlien vers la page �����������.

B ----��!$��-2��"#��"-#�����������N����"#----------M-%C(����!�������!�<�����'��E����<=F-#�EB�OOPK�G#=-�$#--------$��"-B���� 2��������)�������*+&(<-----------------------------�����'��E����-<==-�$���$���!$-�

La seconde colonne contient la date du derniermessage.

B ----��!-���'�"#������#$��"-!���������������-<----------------------------�����'��8��� �������-<==-�$���!$-�--����$

Fin de la boucle d’énumération ��. B --��-@-�$�������$��������$����!5$��2���$

Utilisateur identifié Utilisateur non identifié

Figure 13–8Page d’accueil du forum

Page 289: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 277

Après avoir recherché la liste des sujets dans la base de données �, chaque lignedu tableau est générée dans une boucle �� qui énumère tous les sujets �.Chaque ligne du tableau a deux colonnes, l’une pour le sujet �, l’autre pourla date du dernier message ajouté à un sujet �. La couleur de fond des lignesalterne entre le gris et le blanc en testant la parité du numéro de ligne �.

Le fichier �������������)�'�������� contient la barre de navigation quiapparaît sur chaque page.

ATTENTION Conversion des caractères accentués au format x-www-form-urlencoded

Le format 6�999������������!�! permet de coder au format %XX les caractères spé-ciaux (différents des lettres non accentuées et des chiffres) des paramètres d’une requêtemais ne détermine pas l’encodage initial de ces caractères. De ce fait, la méthode ����!�de la classe ��)������%C(����!�� prend deux paramètres : le second paramètre de laméthode sert à préciser l’encodage à appliquer aux caractères Unicode de la chaîne en pre-mier paramètre, avant que le format 6�999������������!�! ne soit appliqué au résul-tat intermédiaire. Pour spécifier l’encodage ISO-8859-1 qui est par défaut, celui du proto-cole HTTP, on obtient donc l’expression %C(����!�������!�<�����F- #�EB�OOPK�G#=utilisée ici dans la construction de l’URL des liens �:-*C��"#�����������N����"���#$pour coder les sujets des messages.Pour assurer la portabilité d’une application Web, n’utilisez pas la méthode ����!� avec unparamètre car elle utilise l’encodage par défaut du système sur lequel est exécutée la JVM.Elle est d’ailleurs !��������! depuis Java 1.4.

ASTUCE Opérateur ternaire ? :

L’utilisation de l’opérateur ternaire � permet deprogrammer en une seule instruction le choix de lacouleur. L’expression suivante :��'��MM-�-J-""-3-N #L������#------------------� #L #-renvoie le code couleur du blanc #L������# si lavariable ��'�� est paire ou le code couleur du gris#L # si elle est impaire.

DANS LA VRAIE VIESurveiller la taille de la page d’accueil

Si votre forum a du succès, les sujets vont finir parêtre trop nombreux, ce qui rendra votre paged’accueil trop volumineuse. Il sera alors intéressantd’afficher les messages par groupe de 20 parexemple avec des liens pour chaque groupe etd’ajouter un moteur de recherche.

FORUM WEB-INF/jspf/navigation.jsp�� -�����!�-���"#����������������������������������#-�$-� 3 Inclut l’objet ���������������.

������-���!��"#G#-������!!��'"#J#-���������'"#3#-9�!�2"#K3�#$--���-�'�����"#LKKKK #$

3 Création d’un tableau HTML d’une ligne avecune bordure occupant 90 % de la largeur de lapage.

----��!$��-2��"#��!�6���#$E�������$���!$ 3 Lien vers la page d’accueil.

------��-�-<����������������'��:����������-<=-""-����=---------?-�$----��!-���'�"#��'2�#$------��-2��"#�!��������������������#$�!��������������$-�------��-2��"#������������������#$�������������$----���!$------��-@

3 Si l’utilisateur n’est pas identifié, affichage desliens Identification et Inscription alignés à droitedans une cellule.

---------���---------?-�$

3 Si l’utilisateur est identifié...

----��!-���'�"#������#$------��-2��"#������������#$���)���-�������$-�----���!$

3 ...affichage du lien Nouveau sujet centré dansune cellule.

----��!-���'�"#��'2�#$------�������-��"-���������������B���� 2��������)�������*+&(<---------------------------����������������'��4��!��5��<==-�$------��-2��"#>���������#$Q���������$----���!$

3 Affichage d’un message de bienvenue et du lienQuitter.

Page 290: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004278

Une partie de la barre de navigation étant différente selon que l’utilisateurs’est identifié ou non, l’objet ��������������� � de portée ���� est utilisépour déterminer s’il faut afficher les liens Identification /Inscription � ou lesliens Nouveau sujet /Quitter �. Enfin, ce fichier prend en charge l’affichagedes messages contenus dans les paramètres ������ � et ���������� �.

Inscription d’un utilisateurLa page d’inscription est un simple formulaire de saisie comportant unchamp pour saisir un nouveau pseudonyme.

------��-@-�$--����$

Fin du tableau de la barre de navigation. B �������$

Si la requête a un paramètre ������, son texteest affiché en rouge, précédé du texte Le serveurreporte cette erreur:

B ��-�-<��>����'��4��������<#������#=-D"-����=-�---?-�$-��$����-�����"#L��3333#$(�-��)���-�������-�����-������-�---------------��"-��>����'��4��������<#������#=-�$������$���$��-@

Si la requête a un paramètre ����������, sontexte est affiché en vert.

B ---�-<��>����'��4��������<#����������#=-D"-����=-�---?-�$-��$����-�����"#L77 33#$---------------��"-��>����'��4��������<#����������#=-�$�����$���$��-@-�$

FORUM creerutilisateur.jsp�2���$�2��!$������$�����-�-8����!�-!;�����������������$��2��!$���!5$�������$�2G$8����!�-!;������������2G$

Inclut la barre de navigation. B ���������!�-��'�"#��������������)�'��������#-�$���$

Formulaire de saisie de l’utilisateur. B ����-������"#��������������������#-���2�!"#���#$

Création d’un tableau HTML. B --������-9�!�2"#K3�#-���!��"#G#-������!!��'"#J#-���������'"#3#$

Texte Pseudonyme et champ de saisie du pseudo-nyme sur 30 colonnes avec 30 caractères aumaximum.

B ----���$------��!-�'�����"#LKKKK #$��$4��!��5�����$���!$------��!$������-����"#���!��5��#-�5��"#��6�#-----------------�1�"#73#-��6���'�2"#73#-$���!$----����$

Texte d’information sur la génération du mot depasse par le serveur.

B ----���$------��!-�'�����"#LKKKK #$��$&��-!�-������$���!$------��!$-��$(�-���-!�-���-����������-!�-)��-�!�������--------��-',������A�,������A�,������A-���-��-��)������$���!$----����$--�������$

Bouton de confirmation Envoyer la demande. B --���$������-�5��"#�����#-)����"#��)�5��-��-!����!�#$�����$��������$����!5$��2���$

Page 291: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 279

Le champ ������ du formulaire fait appel à la page JSP�������������������� pour vérifier si le pseudonyme saisi est correct, puisajouter le nouvel utilisateur dans la base de données.

Cette page repasse le contrôle à la page d’inscription � � si l’utilisateur n’apas saisi de pseudonyme � ou si le pseudonyme a déjà été choisi �. Sinon,le nouvel utilisateur est ajouté à la base de données � puis le contrôle estpassé à la page d’accueil avec un message communiquant au nouveaumembre du forum le mot de passe qui lui a été attribué �.

FORUM ajouterutilisateur.jsp�� -��'�-������"#��������������IF���������������I#---------�����4�'�"#���������#-�$

3 Balise ��'� spécifiant les paquetages à impor-ter et la page d’erreur.

�� -�����!�-���"#����������������������������������#-�$ 3 Inclut l’objet ���������������.

����������-�!"#����������#-------���"#��������������%��������������#-$--������4������5-����"#����������#-�������5"#I#�$�����������$

3 Déclaration de l’objet ���������� de portéelimitée à cette page et initialisé avec les paramè-tres (ici ���!��5��).

��-�-<�����������'��4��!��5��-<=-""-����=-�---?-�$

3 Vérification que le pseudonyme de l’utilisateurn’est pas ���� (si aucune valeur n’a été saisie).

--������9��!-��'�"#������������������#$-�----���������-����"#������#---------------)����"#H��-!�)�1-�2����-��-���!��5��#-�$--�������9��!$��-@-�$

3 Transfert du contrôle à la page������������������ avec le paramètre������.

��-�-<��������������2���2��-<���������������==-�---?-�$

3 Vérification que le pseudonyme saisi par l’utili-sateur n’existe pas déjà dans la base de don-nées.

--������9��!-��'�"#������������������#$-�----���������-����"#������#-)����"#��"-#4��!��5��-��$#-----------M-�����������'��4��!��5��-<=-----------M-#���$-!,������A�,�'��)�A-�����,������A����$#-----------M-# 2����1���-��-�����#-�$#-�$--�������9��!$��-@-�$

3 Transfert du contrôle à la page������������������ avec le paramètre������ décrivant que le pseudonyme saisiexiste déjà.

��-�������������:����������-<%����������%+�(�E:+�%C=A 3 Attribution de l’autorisation d’utilisateur.

---�������������&��8�4��-<&��8�4��������-<==A 3 Attribution d’un mot de passe aléatoire.

---������������������-<���������������=A-�$-� 3 Ajout de l’utilisateur à la base de données.

������9��!-��'�"#��!�6���#$--���������-����"#����������#-)����"#��"-#H��-���)�1-)��#---------M-#-�!�������-����������-�)��-��-���!��5��-#---------M-�����������'��4��!��5��-<=-M-#-��-��-���-!�-���-#---------M-�����������'��&��8�4��-<=-�$#-�$-��������9��!$

3 Transfert du contrôle à la page d’accueil avec leparamètre ���������� contenant une infor-mation sur son pseudonyme /mot de passe.

ATTENTION La balise jsp:setPropertyignore les paramètres vides

La balise �����4������5 n’a aucun effetpour les paramètres vides (par exemple pour���!��5��") et n’appelle donc pas le muta-teur de la propriété avec la valeur ���� ou lachaîne vide ##.

Page 292: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004280

Messages d’un sujetLa page ����������� affiche dans un tableau la liste de tous les messagesd’un sujet donné dans l’ordre chronologique.

Figure 13–9 Résultat de l’inscription avec la page ��������������������

ASTUCE Utilisation du symbole *

Utilisez le plus souvent possible la balise �����4������5 avec un attribut �������5égal à I pour initialiser toutes les propriétés d’un objet avec les paramètres envoyés par unformulaire. Même si, dans un premier temps, cette balise n’initialise qu’une seule propriétécomme c’est le cas dans la page ��������������������, ce procédé se révélera prati-que pour faire évoluer le site au moment où vous rajouterez de nouvelles propriétés et leursparamètres ; vous n’aurez pas à y retoucher !

Pseudonyme déjà utilisé Inscription confirmée

DANS LA VRAIE VIEEnvoi du mot de passe par e-mail

La plupart des forums d’Internet vous confirme-ront votre inscription par e-mail, par sécurité, etafin que vous puissiez garder une trace de votrepseudonyme /mot de passe pour un usagefutur. En ajoutant un champ pour saisir l’e-mailde l’utilisateur dans la page d’inscription, vouspourrez réaliser cette opération dans la page�������������������� avec la biblio-thèque JavaMail™ développée par Sun Micro-systems et incluse dans Tomcat B http://java.sun.com/products/javamail

Figure 13–10 Liste des messages du sujet Bienvenue

Utilisateur Thomas Utilisateur non identifié Modérateur

Page 293: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 281

FORUM liresujet.jsp�� -��'�������"#��)�������IF��)������IF��)����6��IF--��������������IF���������������I#-�����4�'�"#���������#-�$

3 Balise ��'� spécifiant les paquetages à impor-ter et la page d’erreur.

�� -�����!�-���"#����������������������������������#-�$�� -�����!�-���"#����������������������������������#-�$

3 Inclut les objets ��������������� et���������������.

��-E����'-����-"-��>����'��4��������<#����#=A-�$-� 3 Récupération du paramètre ����.

�2���$�2��!$������$�����-�-��"-B���� 2��������)�������*+&(<-----B���� 2������������(��'����-<����F-P3==-�$�������$��2��!$���!5$�������$�2G$�������2G$

3 Crée un titre reprenant les 50 premiers caractè-res du sujet.

���������!�-��'�"#��������������)�'��������#-�$���$ 3 Inclut la barre de navigation.

������-���!��"#G#-������!!��'"#J#-���������'"#3#-9�!�2"#K3�#$ 3 Création d’un tableau HTML.

--���-�'�����"#LKKKK #$----��!-���'�"#������#$��$&��'�-!�-����------��$��"-B���� 2��������)�������*+&(<����=-�$���$���$���!$--����$

3 Ligne d’en-tête reprenant le sujet en gras et itali-que.

--��-�������&��'������-���'�"-��9-�������&��'������<=A-----���'�����2���2��&��'�E����<���������������F-����=A-�

3 Recherche des messages du sujet dans la basede données.

-----8���������-�����8���-"-8����������'��8����������-<=A-----8���������-�����*����-"-8����������'��+����������-<=A-----���-��'��-"-3A

3 Format de date et d’heure standard.

-----��-<��������-��-"-���'����������-<=A-���2���6�<=A-=-�-----?-------&��'������-���'�-"-<&��'������=�����6�<=A-�$

3 Énumération des messages du sujet ligne parligne.

--���-�'�����"#��"-��'��MM-�-J-""-3-N-#L������#-�-#L #-�$#$ 3 Création d’une ligne de tableau par message.

----��!$8�-��$��"-B���� 2��������)�������*+&(<-----------------------------------���'��'��:�����-<==-�$���$-�--------��-��$��"-�����8���������-<--------------------------���'��'��8��� �������<==-�$���$-�--------,�'��)�A-��$��"-�����*����������<--------------------------���'��'��8��� �������-<==-�$���$-�

3 Génération du texte.De auteur le jj mmm aaaa à hh:mm.

----������>����$��"-B���� 2��������)�������*+&(<-----------------------���'��'��+�6��<==-�$�������>����$-�

3 Affichage du texte du message en retrait.

----��-�-<����������������'��:����������-<=-D"-����=--------?-�$------��-2��"#��"-#��������'����N����"#--------------------M-%C(����!�������!�<����F-#�EB�OOPK�G#=-�$#-------$C,������A���!�����$-

3 Si l’utilisateur est identifié, ajout du lien Répon-dre.

------��-�-<---�����������������&�!�������-<=-------------RR-���'���������4��-<���������������==-�---------?-�$--------��-2��"#��"-#��!�������'����N�!"#---------------------M-���'��'���!<=-�$#$&�!�������$-�------��-@-�$----��-@-�$���!$--����$

3 Si l’utilisateur est un modérateur ou si l’utilisa-teur est l’auteur du message, ajout du lien Modi-fier.

--��-@-�$�������$��������$����!5$��2���$

3 Fin de la boucle d’énumération ��.

Page 294: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004282

Après avoir recherché dans la base de données � la liste des messages dusujet passé en paramètre �, chaque ligne du tableau est générée dans uneboucle �� qui énumère tous les messages �. Chaque ligne du tableauaffiche l’auteur �, la date �, l’heure � et le texte � d’un message, et ajouteles liens Répondre et Modifier � en fonction de l’autorisation de l’utilisa-teur �.

Création de sujet, de message, et modification

Pages de saisieLes trois pages ������������, ��������'���� et ��!�������'����sont décrites ensemble car elles utilisent le même formulaire de saisie dufichier �����������������������'����. C’est l’occasion d’aborder lamise en œuvre d’une balise ��������!� avec des paramètres ��������.

La page de création d’un sujet assemble la barre de navigation � et le for-mulaire de saisie d’un message � auxquels elle transmet l’action de formu-laire à utiliser et le label du bouton de confirmation.

Figure 13–11 Pages utilisant le formulaire de saisie d’un message

FORUM creersujet.jsp�2���$�2��!$������$�����-�-���)���-�����������$��2��!$���!5$�������$�2G$���)���-������2G$

Inclut la barre de navigation. B ���������!�-��'�"#��������������)�'��������#-�$���$-�

Inclut le formulaire de saisie du message avecles paramètres ���������������� et�����E�����.

B ���������!�-��'�"#������������������������'����#-$-�--���������-����"#����������������#-)����"#����������'����#�$--���������-����"#�����E�����#------)����"#:������-��-����#-�$����������!�$��������$����!5$��2���$

FORUM creermessage.jspBalise ��'� spécifiant le paquetage à importeret la page d’erreur.

B �� -��'�-������"#���������������I#-�����4�'�"#���������#-�$

Déclaration de l’objet ���'� de portée��>��� et initialisation de sa propriété ����avec le paramètre de même nom.

B ����������-�!"#���'�#-���"#��������������&��'������#-------------����"#��>���#$-�-������4������5-����"#���'�#-�������5"#����#-�����"#����#�$�����������$

Page 295: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 283

La page de création d’un message crée l’objet ���'� de portée ��>���-�

initialisé avec le sujet en paramètre. Cet objet est utilisé au cours de la mêmerequête pour initialiser le champ sujet du formulaire de message inclus �.Vous noterez que les pages ������������ et ��������'���� appellent lamême page ����������'���� dans l’action du formulaire.

La page de modification d’un message crée l’objet ���'� de portée ��>����. Cet objet est initialisé avec la valeur du paramètre �! pour rechercher lesdonnées du message en cours de modification dans la base de données �.Cet objet est utilisé au cours de la même requête pour initialiser les champssujet et texte du formulaire de message inclus �.

�2���$�2��!$������$�����-�-��"-B���� 2��������)�������*+&(<------B���� 2������������(��'����-<���'��'��E����-<=F-P3==-�$�������$��2��!$���!5$�������$�2G$���)���-���'���2G$

3 Création d’un titre reprenant les 50 premierscaractères du sujet.

���������!�-��'�"#��������������)�'��������#-�$���$- 3 Inclut la barre de navigation.

���������!�-��'�"#������������������������'����#-$-�--���������-����"#����������������#-)����"#����������'����#�$--���������-����"#�����E�����#-)����"#:������-��-���'�#-�$����������!�$��������$����!5$��2���$

3 Inclut le formulaire de saisie du message avecles paramètres ���������������� et�����E������

FORUM modifiermessage.jsp�� -��'�-������"#���������������I#-�����4�'�"#���������#-�$ 3 Balise ��'� spécifiant le paquetage à importer

et la page d’erreur.

�� -�����!�-���"#����������������������������������#-�$ 3 Inclut l’objet ���������������.

����������-�!"#���'�#-���"#��������������&��'������#-------------����"#��>���#$-�--������4������5-����"#���'�#-�������5"#�!#-�����"#�!#�$

3 Déclaration de l’objet ���'� de portée��>��� et initialisation de sa propriété �!avec le paramètre de même nom.

--��-���'�����2���2��-<���������������=A-�$-������������$

3 Recherche du message avec son �!�

�2���$�2��!$������$�����-�-��"-B���� 2��������)�������*+&(<------B���� 2������������(��'����-<���'��'��E����-<=F-P3==-�$�������$��2��!$���!5$�������$�2G$&�!��������-!;��-���'���2G$

3 Création d’un titre reprenant les 50 premierscaractères du sujet.

���������!�-��'�"#��������������)�'��������#-�$���$ 3 Inclut la barre de navigation.

���������!�-��'�"#������������������������'����#-$-�--���������-����"#����������������#-)����"-----#��"-#��������������'����N�!"#-M-���'��'���!-<=-�$#-�$--���������-����"#�����E�����#-)����"#&�!����-��-���'�#-�$����������!�$��������$����!5$��2���$

3 Inclut le formulaire de saisie du message avecles paramètres ���������������� et�����E�����.

JAVA Utilisation des objets de portée request

Comme un objet de portée ��>��� existe pendant toute la durée d’une requête HTTP surle serveur, ce type d’objet est intéressant pour créer et initialiser un objet qui est destiné àêtre réutiliser dans d’autres pages JSP appelées avec les balises ��������!�- et�����9��!.

Page 296: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004284

Le formulaire de saisie d’un message affiche deux champs de saisie initialisésavec les propriétés ���� � et ��6�� � de l’objet ���'� �. Si l’objet���'� de portée ��>��� n’existe pas déjà, il est créé (c’est le cas quand leformulaire est inclus par la page ������������), sinon il est récupéré telqu’il était avant l’appel à cette page (c’est le cas pour les pages��������'���� et ��!�������'����).

Pages d’ajout et de modification de messageLa page ����������'���� ajoute un message à la base de données.

FORUM WEB-INF/jspf /formulairemessage.jsp

Déclaration de l’objet ���'� de portée��>���.

B ����������-�!"#���'�#-���"#��������������&��'������#-------------����"#��>���#�$-�

Formulaire de saisie du message dont l’actionest égale au paramètre �����������������

B ����-������"#��"-��>����'��4��������-<#����������������#=-�$#------���2�!"#���#$

Création d’un tableau HTML. B --������-���!��"#G#-������!!��'"#J#-���������'"#3#-9�!�2"#K3�#$----���$��!-�'�����"#LKKKK #$��$E�������$���!$

Champ de saisie du sujet sur 50 colonnes avec255 caractères au maximum.

B --------��!$������-����"#����#-�5��"#��6�#-�1�"#P3#-------------��6���'�2"#JPP#

Initialisation du texte du champ de saisie avec lapropriété ���� de l’objet ���'�.

B -------------)����"#��"-���'��'��E����<=-D"-����-----------------------------N-���'��'��E����<=-�-##-�$#$���!$����$-�----���$��!-)���'�"#���#-�'�����"#LKKKK #$��$&��'����$���!$

Zone de saisie du texte sur 50 colonnes et 5lignes. B --------��!$���6�����-����"#��6��#-���"#P3#-��9"#P#

Initialisation du texte du champ de saisie avec lapropriété ��6�� de l’objet ���'��

B ----------$��"-���'��'��+�6��<=-D"-����-------------------N-���'��'��+�6��<=-�-##-�$����6�����$���!$����$-�--�������$

Bouton de confirmation dont le label est égal auparamètre �����E������

B --���$������-�5��"#�����#-----------)����"#��"-��>����'��4��������<#�����E�����#=-�$#$�����$

ATTENTION Initialisation d’un champ multiligne

Si vous désirez initialiser une balise multilignes ��6�����, veillez à bien coller au texte d’initia-lisation le dernier caractère $ de la balise de début et le premier caractère � de la balise de finpour ne pas insérer des espaces superflus.

ATTENTION Pas de balise jsp:forward dans une page incluse

N’utilisez pas de balise �����9��! dans unepage incluse avec la balise ���������!���'�"#��4��,��#-�$.Cela provoque bien l’arrêt de la page��4��,�� mais la page JSP qui a appelé���������!� ��'�"#��4��,��# �$poursuivra quant à elle son exécution !

FORUM ajoutermessage.jspBalise ��'� spécifiant le paquetage à importeret la page d’erreur.

B �� -��'�-������"#��)������I#-�����4�'�"#���������#-�$

Inclut les objets ��������������� et���������������.

B �� -�����!�-���"#����������������������������������#-�$�� -�����!�-���"#����������������������������������#-�$

Page 297: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

13 –

Inte

rface

util

isate

ur d

u fo

rum

© Groupe Eyrolles, 2004 285

Un objet ���'� est créé et initialisé avec le sujet et le texte en paramètres�. L’auteur du message est ensuite déterminé grâce à l’objet de session��������������� associé à chaque utilisateur �. Enfin, le message est ajoutéà la base de données �.La page ��������������'���� est appelée pour modifier un message dansla base de données.

Un objet ���'� est créé et initialisé avec la valeur du paramètre �! � pourlire les données inchangées du message dans la base de données � avant demodifier son sujet et son texte �. Enfin, le message est mis à jour dans labase de données �.

La dernière balise des pages JSP ����������'���� et��������������'���� utilise la méthode ��!C�!����� avec l’objet������, et non une balise �����9��! comme dans les autres pages. Cetteméthode envoie l’ordre au navigateur de recharger la page passée enparamètre ; elle est donc moins rapide qu’une balise �����9��! puisqu’unenouvelle requête doit être lancée par le client.

����������-�!"#���'�#-���"#��������������&��'������#-$--������4������5-����"#���'�#-�������5"#I#�$-�

3 Déclaration de l’objet ���'� de portée limi-tée à cette page et initialisé avec les paramètres(ici ���� et ��6��).

--��-���'����:�����-<���������������=A-�$-������������$

3 Modification de l’auteur.

��-���'���������-<���������������=A-�$-� 3 Ajout du message dans la base de données.

��-���������!C�!�����<#�����������N����"#--------M-%C(����!�������!�<���'��'��E����<=F-#�EB�OOPK�G#==A-�$

3 Envoie au navigateur l’ordre de recharger lapage �����������.

FORUM mettreajourmessage.jsp�� -��'�������"#��)������I#-�����4�'�"#���������#-�$ 3 Balise ��'� spécifiant le paquetage à importer

et la page d’erreur.

�� -�����!�-���"#����������������������������������#-�$ 3 Inclut l’objet ���������������.

����������-�!"#���'�#-���"#��������������&��'������#-$--������4������5-����"#���'�#-�������5"#�!#-�����"#�!#�$-�

3 Déclaration de l’objet ���'� de portée limi-tée à cette page et initialisation de sa propriété�! avec le paramètre de même nom.

--��-���'�����2���2��<���������������=A-�$-� 3 Lecture du message avec son �!.

--������4������5-����"#���'�#-�������5"#I#�$-������������$

3 Modification des propriétés de l’objet ���'�avec les paramètres (ici ���� et ��6��).

��-���'��������:S���-<���������������=A-�$-� 3 Mise à jour du message dans la base de données.

��-���������!C�!�����<#�����������N����"#--------M-%C(����!�������!�<���'��'��E����<=F#�EB�OOPK�G#-==A-�$

3 Envoie au navigateur l’ordre de recharger lapage �����������.

Page 298: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004286

Dans notre cas, nous préférons la méthode ��!C�!����� et ce pour deux raisons :• Le navigateur de l’utilisateur affichera l’URL de la page �����������

dans le champ d’adresse du navigateur, lui permettant de bien compren-dre que son message a été ajouté au sujet.

• Si l’utilisateur appelle le menu Recharger la page de son navigateur, la page����������� sera relue sans ajouter à nouveau le même message.

Quitter l’applicationCette dernière page annule la propriété ����������� de l’objet��������������� et repasse le contrôle à la page d’accueil.

En résumé...Ce chapitre vous a présenté les différentes façons d’exploiter les pages JSPsur un serveur. La présentation du forum en JSP a permis de passer en revueles principales utilisations des balises JSP en mettant particulièrementl’accent sur la mise en œuvre des composants JavaBeans avec leurs diffé-rentes portées. Vous aurez sûrement remarqué en lisant ces lignes que la pro-grammation d’une interface utilisateur selon que l’on utilise les pages JSP ouSwing diffère du tout au tout...

FORUM quitter.jsp�� -�����!�-���"#����������������������������������#-�$

��-������������������:����������<����=A-�$

������9��!-��'�"#��!�6���#-�$

DANS LA VRAIE VIE Vérification des paramètres et de l’utilisateur

Les pages ����������'���� et��������������'���� ne vérifient pasles paramètres qu’elles reçoivent par souci desimplification. Dans les faits, ces pagesdevraient vérifier que le texte des paramètres���� et ��6�� n’est pas vide pour le caséchéant le signaler à l’utilisateur. De même,les pages de création et de modification demessage ne vérifient pas si l’utilisateur encours est bien identifié. En principe, l’accés àces pages se fait par des liens visibles unique-ment par un utilisateur identifié, maisn’importe qui peut en fait y accéder en saisis-sant directement leur URL dans le champd’adresse d’une page d’un navigateur. Cettevérification pourrait se programmer en ren-voyant le contrôle à la page d’accueil si lapropriété ����������� de l’objet��������������� est ����.

REGARD DU DÉVELOPPEUR Swing ou JSP, que choisir ?

Une fois vos composants de base créés (dans notre cas,ceux du paquetage �������������), les arguments sui-vants guideront votre choix entre les technologies JSP etSwing pour créer l’interface utilisateur de votre applica-tion (si vous avez le choix !) :• Une application Swing est généralement plus ergonomi-

que grâce à un plus grand choix de composants et à l’uti-lisation de menus et de raccourcis clavier. De plus, lamise en page des fenêtres et leur ordre d’affichage sontmieux contrôlés.

• Une application JSP est plus simple à diffuser puisqu’ellene nécessite aucune installation sur le poste du client à

part celle d’un navigateur. Une applet Swing est elleaussi simple à télécharger mais nécessite tout de mêmel’installation du JRE sur le poste du client.

• Une application JSP étant de fait ralentie par les accès auserveur, une application Swing est plus adéquate quandle client a besoin d’un programme réactif, comme unprogramme de dessin ou un jeu d’action, ou tout simple-ment quand l’utilisateur ne peut pas se connecter à unréseau.

• L’interface utilisateur d’une application JSP est plus sim-ple à développer et permet à des non-programmeurs(infographistes, rédacteurs) d’intervenir sur la concep-tion des pages moyennant un minimum de formation.

Page 299: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

14Échanger des informations avec XML

SOMMAIRE

B Les bases de XML

B Analyser un document XML avec SAX et DOM

B Rechercher les utilisateurs ou les messages d’un document XML

MOTS-CLÉS

B élémentB attributB DTDB parserB JAXPB DOMB SAX

XML est de plus en plus utilisé pour représenter des informations de toute sorte et les échanger sur Internet. Ce chapitre vous présente les fondements de ce langage et les solutions proposées en Java pour analyser des documents XML, comme ceux que le serveur Web transmet aux clients du module de messagerie instantanée.

Serveur Web Navigateur + Applet

<?xml version="1.0"?> <messages> <message dateCreation="1088358351127" auteur="Sophie">

--- Arrivée --- </message> </messages>

<?xml version="1.0"?> <utilisateurs> <utilisateur pseudonyme="Sophie" autorisation="U"/> <utilisateur pseudonyme="Thomas" autorisation="U"/> </utilisateurs>

Page 300: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004288

Premiers contacts avec XMLLe langage XML (eXtended Markup Language), sous-ensemble simplifiédu langage SGML (Standard Generalized Markup Language), permet dedécrire des informations organisées sous une forme hiérarchique à l’aide debalises entre � $ de façon similaire au langage HTML. Au premier abord,XML est un langage assez déroutant car il vous laisse la liberté de décider dunom des balises à utiliser et n’impose que peu de règles de construction.Cette souplesse lui a permis d’être adopté très rapidement par la commu-nauté informatique, qui voit XML comme un des meilleurs formats pourstructurer lisiblement des données et les échanger dans le monde ouvertd’Internet.

Description d’un document XMLUn document XML débute normalement par le prologue :

Ce prologue peut comporter aussi un attribut ����!��' qui spécifie le typed’encodage des caractères utilisé dans le document ; comme ����!��' est égalpar défaut à %+��O, la ligne précédente est donc équivalente à :

�N6��-)�����"#G�3#N$

�N6��-)�����"#G�3#-����!��'"#%+��O#N$

REGARD DU DÉVELOPPEUR Choisir un format de données

Le choix d’un format de données dépend essentiellement :• du volume des données à stocker ou à échanger ;

• de la facilité à programmer la création et l’interpréta-tion d’un document à ce format ;

• de la puissance de calcul nécessaire pour traiter ungrand nombre de données à ce format ;

• de la portabilité du format entre systèmes d’informa-tion de types différents ;

• du type de structure de données qu’un format recon-naît intrinsèquement.

Le tableau suivant compare les principaux formats dedonnées disponibles en Java, en leur attribuant une notecomprise entre � et ���� pour chacun des critèresprécédents.

Format API Java écriture/lectureVolume

des données

Facilité de mise

en œuvre

Puissance de calcul

nécessairePortabilité

Structure des données

Binaire ��)�����8���B�����E�������)�����8��������E�����

���� � ���� �� Structure libre

Sérialisation Java ��)�����B�����B�����E�������)�����B����������E�����

��� ���� ��� � Structure objet

Texte libre ou tabulé ��)�������������)�����C��!��

�� ��� �� ��� Peu structuré

XML ��)�����������SAX ou DOM

� �� � ����Structure

arborescente

B.A.-BA UTF-8 l’encodage préféré de XML

UTF-8 (Unicode Transformation Format-8) est leformat idéal pour formater un caractère Unicodede 16 bits. Il permet d’encoder les caractères ducode ASCII à l’aide d’un seul octet et les autrescaractères sur deux à trois octets.

Page 301: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 289

Suivent ensuite les données du document décrites sous une forme arbores-cente d’éléments inclus les uns dans les autres, un document XML ne devantcontenir qu’un seul élément racine. Chaque élément commence par unebalise (tag) de début notée entre les symboles � et � et se termine par unebalise de fin notée entre les symboles �� et �. Chaque balise qui porte le nomde votre choix, est utilisée pour nommer un élément et décrire ses donnéesavec :• une suite d’attributs dans sa balise de début, chaque attribut s’écrivant

avec un nom suivi du signe � et d’une valeur entre �� ou entre �� (parexemple ���� ����������) ;

• et/ou des données textuelles et/ou d’autres éléments enfants (child) entre sesbalises de début et de fin.

Par l’exemple : représenter une facture en XMLLe document XML de la figure 14–1 décrit une facture avec le client auquelelle se rapporte et ses articles. L’élément racine ���� � contient ici trois élé-ments enfants, un élément ����� et deux éléments ������.

Pour éviter de surcharger inutilement un document XML, la balise de find’un élément vide, c’est-à-dire qui ne contient aucune donnée ou aucun élé-ment enfant, peut être remplacée par le caractère � avant le symbole � de sabalise de début, par exemple pour l’élément ������� ��������������������

dans l’exemple suivant.

B.A.-BA XML vs HTML

Les principales différences entre XML et HTML peuvent être résumées ainsi :• XML est axé principalement vers la description de données et a un usage plus général

que HTML, qui est axé sur la présentation et la mise en page de données.• Les balises XML et les attributs qui décrivent vos données ne sont pas déterminés à

l’avance : les balises et les attributs XML peuvent avoir n’importe quel nom choisi enfonction de vos besoins et du sens que vous leur donnez.

• La syntaxe XML est plus stricte que celle d’HTML : les noms des balises et des attributsXML sont sensibles à la casse et toute balise XML doit être fermée. De plus, la validitéd’un document XML peut être vérifiée grâce à une DTD (Document Type Definition), sortede définition de la syntaxe autorisée pour les balises et les attributs d’une famille dedocuments XML.

• Un document XML peut être transformé en un second document au format XML (ouautre) grâce à XSLT (Extensible Stylesheet Language Transformation), langage utilisépour décrire les transformations à opérer sur la structure du document XML pour obtenirle nouveau document.

XML et HTML sont des recommandations spécifiées par le World Wide Web Consortium(W3C). L’adresse suivante référence les recommandations et d’autres documents du W3Ctraduits en français : B http://www.w3.org/2003/03/Translations/byLanguage?language=fr

À RETENIR Noms des éléments et des attributs

Le nom des balises ou des attributs est une suitede caractères alphanumériques, de soulignés ,de tirets ! ou de points ", qui doit débuter parune lettre ou un souligné . Le préfixe ��� (enmajuscules ou en minuscules) est réservé.

B.A.-BA Commentaires XML

Les commentaires d’un document XML se notententre les caractères �#!! et !!� comme en HTML.

Page 302: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004290

Document XML bien forméPour pouvoir être exploité par les analyseurs XML (parsers en anglais) dispo-nibles dans la bibliothèque Java ou par d’autres applications, un documentXML doit être bien formé (well-formed) en remplissant les conditionssuivantes :• Tout élément du document doit être fermé, soit avec une balise de fin

��+�% ��A(:� qui doit correspondre à une balise de début �+�% ��A(:�,soit avec les caractères �� à la fin de la balise de début.

• Le document ne doit contenir qu’un seul élément racine.• Les balises de ses éléments ne peuvent se chevaucher, c’est-à-dire que la

balise de fin d’un élément inclus dans un autre élément doit apparaîtreavant la balise de fin de l’élément qui l’englobe. Par exemple, le docu-ment XML suivant est incorrect car la balise de fin ������ �� apparaîtavant la balise de fin ��������� :

• Les valeurs des attributs de ses éléments doivent être notées entre �� ouentre ��.

• Les caractères � et $ doivent être remplacés par leur entité prédéfinie, res-pectivement $��% (comme Less Than) et $���% (comme ampersand),quand ils sont utilisés comme texte. Dans les valeurs des attributs, vouspourrez avoir aussi besoin des entités $���% et $& ��% en remplacementdes caractères � et �.

Figure 14–1 Document XML décrivant une facture

<?xml version="1.0"?> <!-- Document facture.xml --><facture date="09/04/2004" montant="20.80"><client nom="Albert Dupont">

3, rue du pont 75001 PARIS </client> <article description="CDRx10"/><article description="Papier A4"/>

</facture>

Prologue XML Commentaire

Elément enfant client

Eléments enfants article

Données de l'élément ������

Attributs de l'élément facture Attribut de l'élément client

Attribut de l'élément article Attribut de l'élément article

Balise de début

Balise de fin

Elément racine facture

Structure XML Données du document

����� �'���������(")*���������������������� �����������

POUR ALLER PLUS LOIN Section CDATA

Les données textuelles d’un élément qui contiennent des caractères spéciaux peuvent être aussiécrites telles quelles entre �#+��,-,+ et ..�, ce qui évite alors d’avoir recours aux entitéséquivalentes.

ASTUCE Tester un document XML

Le plus simple pour vérifier qu’un document XMLest bien formé est de le visualiser avec un naviga-teur.

Page 303: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 291

Document XML valide et DTDXML vous laisse toute liberté pour choisir les balises et les attributs des élé-ments qui structurent les données d’un document XML, du moment qu’ilest bien formé. Une même famille de données peut donc être représentée dedifférentes façons en XML. Par exemple, le document XML de lafigure 14-1 pourrait aussi être structuré ainsi :

Comme le but principal de XML est de fournir un format d’interchangeabi-lité clair entre applications, il est préférable de fixer une fois pour toute laliste des balises et des attributs autorisés pour une même famille de données.C’est le but d’une DTD (Document Type Definition), qui définit la syntaxed’un certain type de document XML et permet de vérifier la validité desdocuments de ce type.

Créer une DTDUne DTD définit les différents éléments d’un type de document XML ainsique leurs attributs, grâce à un ensemble de balises spéciales dont letableau 14-1 décrit la syntaxe la plus couramment utilisée.

�/���'0�������"��/������'������1��2�3��2�'���������3�"4���''�������''''�����,�5��'� ����������''''�����'''''')6'� '� '����''''''7*���'8,�9:''''������''��������''�����������������''�����8����',2�������������

REGARD DU DÉVELOPPEUR Attribut ou élément, que choisir ?

Comme XML laisse la liberté de décrire une donnée sous forme d’un élémentou d’un attribut, voici quelques pistes pour vous guider dans ce choix :• La description d’une donnée avec un attribut est plus concise qu’avec un élé-

ment.• L’ordre d’apparition des attributs dans une balise XML ne peut pas être

imposé, contrairement à l’ordre des éléments.• Un élément offre la possibilité de décrire une donnée sous une forme hié-

rarchique plus ou moins complexe, ce que ne permet pas un attribut.

L’ordre des balises �#;<;=;>-� et �#,--<9:-� d’une DTD n’a pas d’importance. En revanche,une entité doit être définie avant sa première utilisation.

DANS LA VRAIE VIE Quelques DTD utiles

Depuis l’apparition de XML, de nombreuses DTDstandards pour des domaines d’activités variéesont été mises au point. Citons, parmi les pluscélèbres :• MathML (Mathematical Markup Language)

pour décrire des formules mathématiques ;• SVG (Scalable Vector Graphics) pour décrire des

constructions géométriques en 2 dimensions ;• OFX (Open Financial eXchange) pour l’échange

d’informations financières...Vous pouvez les réutiliser, mais aussi vous en ins-pirer pour créer vos propres DTD.

Page 304: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004292

Par l’exemple : définir la DTD des facturesLa DTD du fichier ���� �"��� définit la syntaxe que respecte le documentXML défini précédemment dans la figure 14-1.

Tableau 14–1 Syntaxes les plus utiles des balises DTD

Balises DTD Description

�#;<;=;>-'+�% ��A(:'?+�% ���6''''''''''''''''''''''+�% ��� """@��#;<;=;>-'+�% ��A(:'?+�% ���'A''''''''''''''''''''''+�% ��� """@��#;<;=;>-'+�% ��A(:'?+�% ���/@��#;<;=;>-'+�% ��A(:'?+�% ���B@��#;<;=;>-'+�% ��A(:'?+�% ��BC@��#;<;=;>-'+�% ��A(:'?D8��,-,@��#;<;=;>-'+�% ��A(:';=8-E�

Décrit ce que peut contenir l’élément de balise +�% ��A(:.Les éléments enfants de cet élément sont cités entre parenthèses, le caractère virgule (6)donnant l’ordre de citation des éléments enfants, contrairement au caractère A qui nedétermine aucun ordre pour les éléments enfants.La présence ou non d’un des caractères / B C à la suite d’un élément enfant détermine sonnombre d’occurrences :• Un élément seul est obligatoire.• Un élément suivi de / est optionnel.• Un élément suivi de C est obligatoire et peut être répété plusieurs fois.• Un élément suivi de B est optionnel et peut être répété plusieurs fois.D8��,-, indique qu’un élément contient des données textuelles.;=8-E indique qu’un élément doit être vide.

�#,--<9:-'+�% ��A(:'''���� +&�'��,-,'���%1���&����#,--<9:-'+�% ��A(:'''���� +&�'?��%�'A'��%�@'���%����#,--<9:-'+�% ��A(:'''���� +&�'��,-,'D�;FG9�;���#,--<9:-'+�% ��A(:'''���� +&�'��,-,'D9=8<9;���#,--<9:-'+�% ��A(:'''���� +&�'��,-,'DH9I;�'���%��

Décrit un attribut de l’élément de balise +�% ��A(:, avec le nom de cet attribut, son typede valeur et une spécification de valeur par défaut.Le type de valeur d’un attribut est soit ��,-, pour un texte libre, soit une valeur parmi cel-les d’une liste donnée entre parenthèses.La spécification de valeur par défaut d’un attribut est au choix :• ���%1���&�� pour spécifier la valeur par défaut d’un attribut absent.• D�;FG9�;� pour spécifier qu’un attribut n’a pas de valeur par défaut et doit obligatoire-

ment être cité dans la balise de début.• D9=8<9;� pour spécifier qu’un attribut est optionnel et n’a pas de valeur par défaut.• DH9I;�'���%� pour spécifier la valeur d’un attribut qui prend toujours la même valeur.

�#;>-9-E'��� �/A(:'���%��� �/�� Spécifie la valeur ��%��� �/ de l’entité ��� �/A(:. Cette valeur sera utilisée en rempla-cement de chaque entité notée $��� �/A(:%.

�#;>-9-E'J'��� �/A(:'���%��� �/�� Spécifie la valeur ��%��� �/ de l’entité paramètre ��� �/A(:, entité utilisable unique-ment au sein de la DTD. Cette valeur sera utilisée en remplacement de chaque entité notéeJ��� �/A(:%.

EXEMPLE facture.dtdUn élément ���� � doit contenir un élément����� suivi d’au moins un élément ������.

B �#;<;=;>-'���� �'?�����6'������C@�

Les attributs ��� et ������� d’un élément���� � sont obligatoires.

B �#,--<9:-'���� �'���''''��,-,'D�;FG9�;���#,--<9:-'���� �'�������'��,-,'D�;FG9�;��

L’attribut �0� est optionnel. B �#,--<9:-'���� �'�0�'''''��,-,'D9=8<9;��

Un élément ����� contient des données tex-tuelles et son attribut ��� est obligatoire.

B �#;<;=;>-'�����'?D8��,-,@��#,--<9:-'�����'���'��,-,'D�;FG9�;��

Un élément ������ est vide et son attribut��������� est obligatoire.

B �#;<;=;>-'������';=8-E��#,--<9:-'������'���������'��,-,'D�;FG9�;��

Page 305: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 293

Utiliser une DTD dans un document XMLLa DTD utilisée par un document XML est spécifiée grâce à une balise�#�K�-E8; +�% ���� �� ��� � � ��1�1� intercalée entre la balise de prologue�/���� et la balise de début de son élément racine �+�% ���� ���.

La DTD ��� � � ��1�1 peut être décrite d’une des façons suivantes :• en la définissant entre crochets + . au sein même de la balise �#�K�-E8;� ;• en citant le chemin ou l’URL du fichier qui contient la DTD, précédé de

:E:-;=, par exemple �#�K�-E8; ���� � :E:-;= �"����� �"����� ;• en citant le chemin ou l’URL du fichier qui contient la DTD, précédé de

8GL<9� et d’un identificateur qui décrit le nom de la DTD, par exemple :

Par l’exemple : utiliser la DTD d’une facture dans un document XMLLes documents XML ���� �,0��-�9����"��� et ���� �,0��-�;����"���suivants utilisent une DTD interne au document pour le premier et uneDTD externe définie dans le fichier ���� �"��� pour le second.

Remarquez qu’une DTD décrit la syntaxe d’un ensemble d’éléments et leursliens de parenté sans préciser lequel d’entre eux doit être l’élément racined’un document XML. C’est la balise �#�K�-E8;� qui spécifie l’élémentracine.

�#�K�-E8;'M5!���'8GL<9�'''''''''''�!��: �'=����N��6'9��"���-�'O5',����������'3")��;>�''''''''''�����P����0�" �"��������M5!��� 3 )"�����"

B.A.-BA Espace de noms XML

Un espace de noms permet de donner un préfixeaux noms des balises et des attributs issus d’uneDTD, afin d’éviter des conflits de noms avec ceuxd’autres DTD utilisés conjointement dans un mêmedocument XML. Ce préfixe est défini pour un élé-ment et ses enfants grâce à l’attribut réservé���� (comme XML Name Space) en le faisant sui-vre du caractère P et du préfixe désiré. Par exem-ple, l’élément ���� � suivant décrit la formule�C5 à l’aide de balises de la DTD de MathML pré-fixées par ����P.����� �'����P����������P��"""��''�����P����N�''''�����P�� ��''''�����P����������P���''''�����P���5������P���''������P����N������� ��

EXEMPLE factureAvecDTDInterne.xml EXEMPLE factureAvecDTDExterne.xml�/���'0�������"��/��#�K�-E8;'���� �'+'''�#;<;=;>-'���� �'?�����6'������C@�''''�#,--<9:-'���� �'���''''��,-,'D�;FG9�;��''�#,--<9:-'���� �'�������'��,-,'D�;FG9�;��''�#,--<9:-'���� �'�0�'''''��,-,'D9=8<9;��''�#;<;=;>-'�����'?D8��,-,@�''�#,--<9:-'�����'���'��,-,'D�;FG9�;��''�#;<;=;>-'������';=8-E�''�#,--<9:-'������'''''''''''''���������'��,-,'D�;FG9�;��.������ �'������1��2�3��2�'���������3�"4���''������'�����,�5��'� ������'''')6'� '� '����''''7*���'8,�9:''��������''�������'��������������������''�������'�����������8����',2��������� ��

�/���'0�������"��/��#�K�-E8;'���� �':E:-;='�"����� �"���������� �'������1��2�3��2�'���������3�"4���''������'�����,�5��'� ������'''')6'� '� '����''''7*���'8,�9:''��������''�������'��������������������''�������'�����������8����',2��������� ��

POUR ALLER PLUS LOIN DTD vs schéma XML

Une DTD définit la structure que doit respecterun document XML, mais sans possibilité dedécrire le type, numérique ou autre, des don-nées manipulées. Un schéma XML est une alter-native à une DTD qui, entre autres choses, cor-rige cet inconvénient. Un schéma XML est enfait un document XML d’élément racine����, où les balises �#;<;=;>-� et�#,--<9:-� d’une DTD sont remplacées etcomplétées par les éléments ����,������-N�, �����5 �...B http://xmlfr.org/w3c/TR/xmlschema-0/

Page 306: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004294

Analyser un document XML avec JAXPJAXP ( Java API for XML Processing) est un sous-ensemble de classes de labibliothèque standard Java qui permet d’analyser la structure d’un documentXML et d’exploiter les informations qu’il contient. Deux types différentsd’analyseur (parser) sont proposés pour effectuer ces opérations :• SAX (Simple API for XML) et les classes du paquetage org.xml.sax,

pour récupérer les informations que contient un document XML au furet à mesure de sa lecture ;

• DOM (Document Object Model) et les classes du paquetageorg.w3c.dom, pour créer en mémoire une structure arborescente équiva-lant à celle d’un document XML, dont vous exploitez ensuite les infor-mations.

Obtenir une instance d’un analyseurLa création d’une instance d’analyseur SAX ou DOM s’effectue grâce à unefactory (littéralement usine à fabriquer des objets) qui s’utilise sous la formesuivante :

Les classes A(:*�����!����� et A(:*����� sont : • soit les classes ��0��"���"����":,I8���H�����N et

��0��"���"����":,I8��� pour SAX, • soit les classes ��0��"���"����"��� ���L ����H�����N et

��0��"���"����"��� ���L ���� pour DOM.

REGARD DU DÉVELOPPEUR Choisir entre SAX et DOM

Les fonctionnalités proposées par ces deux groupes de classes s’adressent à desdomaines d’utilisation différents. Utilisez SAX pour le traitement de gros volu-mes de données avec une structure XML simple où seules quelques informa-tions vous intéressent. DOM est plus intéressant pour les documents XML peuvolumineux dont vous avez besoin d’exploiter la structure arborescente.

VERSIONS Intégration de JAXP dans Java 1.4

JAXP est une bibliothèque d’extension à Java qui aété intégrée dans la bibliothèque standard à partirde la version 1.4 de Java. Elle peut être aussi utili-sée séparément avec des versions antérieures deJava.

Instanciation d’une factory d’analyseurs XML. B A(:*�����!�����'������N'�'A(:*�����!�����"�M9�����?@%

Configuration éventuelle de la factory (gestionde la validité des documents, des espaces denoms...).

B ������N"�Q���������?��&��&!�%��@%��', ��'������ ������

Instanciation d’un analyseur en fonction de laconfiguration choisie.

B A(:*�����'����'�'������N"�MA(:*�����?@%

Analyse du'document XML B ����"���'?��&����A(:@%

Page 307: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 295

Analyser un document avec SAXLa récupération des informations d’un document XML avec SAX s’effectueà l’aide d’une classe de gestionnaire qui dérive de la classe���"���"��"����"��� ��R�����, et dans laquelle vous redéfinissez desméthodes appelées par un analyseur SAX. Ces méthodes se répartissent enquatre catégories représentées sous forme d’interfaces du paquetage���"���"�� qu’implémente la classe ��� ��R�����. Les méthodes les plusutiles proviennent de l’interface ���"���"��"������R����� et permettentde traiter les balises de début, les données textuelles et les balises de fin deséléments trouvés par l’analyseur.

Une fois définie la classe de gestionnaire SAX qui convient aux traitementsque vous voulez effectuer sur votre document, il faut appeler une desméthodes ��� d’un analyseur SAX en lui passant en paramètre le chemindu document XML (ou un flux de données qui contient ce document) et uneinstance du gestionnaire. Cette méthode provoque la lecture du documentpar l’analyseur SAX qui appelle chaque fois que nécessaire les méthodes dugestionnaire, comme le montre la figure 14-2.

Par l’exemple : rechercher les articles d’une factureL’application de classe ���"�S"��",������,�����H��� � rechercheles articles de la facture décrite dans le fichier ���� �"��� puis affiche la listede ceux-ci.

API JAVA Méthodes les plus utiles de l’interface org.xml.sax.ContentHandler

L’implémentation de ces méthodes dans la classe ���"���"��"����"��� ��R����� ne fait rien. L’objet de classe ���"���"��",����5 � reçu en dernier paramètre de la méthode ����;���� décrit l’ensemble des attributs d’une balise de début. Pour récupérer lavaleur d’un attribut, il suffit d’appeler la méthode ��Q�� sur cet objet en lui passant en paramètre le nom de l’attribut recherché.

Description Méthode

Méthodes appelées au début et à la fin de l’analyse dudocument XML

� 5���'0���'������� ���?@� 5���'0���'����� ���?@

Méthodes appelées sur la balise de début d’un élémentet sur sa balise de fin (les deux premiers paramètres nesont utiles qu’avec les espaces de noms XML)

� 5���'0���'����;����?��0�"����":����� ������G�96'''''''''''''''''''''''''��0�"����":����� �����>��6''''''''''''''''''''''''''��0�"����":����� ���6'''''''''''''''''''''''''���"���"��",����5 � ����5 �@� 5���'0���'��;����?��0�"����":����� ������G�96'''''''''''''''''''''''��0�"����":����� �����>��6'''''''''''''''''''''''��0�"����":����� ���@

Méthode appelée à la lecture des données textuellesd’un élément

� 5���'0���'��������?����+. 5 ���6'��� ����6''��� �����@

Page 308: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004296

Ce programme définit le gestionnaire SAX avec une sous-classe anonyme �

de la classe ������������� ���������������. Ce gestionnaire redéfinit laméthode ���������� � afin de récupérer toutes les descriptions des élé-ments ������ � du document XML analysé.

Figure 14–2 Méthodes du gestionnaire appelées par l’analyseur SAX

<?xml version="1.0"?> <!-- Document facture.xml --><facture date="09/04/2004" montant="20.80"><client nom="Albert Dupont">

3, rue du pont 75001 PARIS </client> <article description="CDRx10"/><article description="Papier A4"/>

</facture>

characters

startElement

startElement

startElement endElement

startElement endElement

Méthodes appelées par SAX

startDocument

endElement

endElement endDocument

JAVA Classes anonymes

Les classes anonymes sont abordées au chapitre 10,« Interfaces utilisateur avec Swing ». Elles permet-tent de redéfinir facilement des méthodes dans unesous-classe qui n’a pas vocation à être réutilisée.

EXEMPLE com/eteks/test/AfficherArticlesFacture.java �������������������� ����������������� �������������� ��������������

Paquetages des classes SAX. B �� ������������ �������� ����������������� ������� ���������������������������������� �����!�� �"�����������������#$�����%&���'���!������(����!

Instanciation d’une ������ d’analyseurs SAX. B ������$�)*��� ����(������(�+�$�)*��� ����(����,�����#'�

Instanciation d’un analyseur SAX. B ������$�)*���� ����+������(����$�)*���#'�

Ensemble stockant les articles trouvés dans lefichier XML.

B ��������������(-����������+��������(-���#'�

Création d’un gestionnaire SAX avec une sous-classe anonyme.

B �����������������������������$�)�+������������������#'����������!

Redéfinition de la méthode appelée quand unebalise de début est lue.

B ���������� �"��������������������#$��������� ��./,0��������������������������������������$����������1��0������������������������������������$���������0�����������������������������������������"��������"��'����������!

Page 309: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 297

���������������#2������2��3���#���''��������������!��������������$����������� �����+������������������������������"������4����#2����� ����2'�������������������������#����� ����'�������������5����������5

3 Récupération de l’attribut ����� ���� deséléments ������.

��������5� 3 Fin de la classe anonyme.

������ ���� ���#2����������20�����������$�)'� 3 Analyse du fichier ���������� avec le ges-tionnaire défini.

������67 ����*������8��������#����0�2��������2�9�������'�����5

3 Affiche )�� %��#C$1�'�7=#*�� ��#)DE.

���������#*���:��������������� �������'����!������67 ����*������8��������#����0����������2*��"�;�<<�=�������������������>�2�9�������8���#''�����5

3 Exception déclenchée si l’analyseur SAX n’a paspu être instancié.

���������#$�)���� �������'����!������67 ����*������8��������#����0����������2�������������������>�2�9�������8���#''�����5

3 Exception déclenchée si l’analyseur SAX n’a paspu analyser le document XML.

���������#,7���� �������'����!������67 ����*������8��������#����0����������2*��"�;�<<�=��������������>�2�9�������8���#''�����5����$(��������#<'���55

3 Exception déclenchée si le fichier ����������n’a pas pu être lu.

REGARD DU DÉVELOPPEUR Limites de SAX

SAX ne donne aucune information sur le niveau hiérarchique d’un élément àl’appel des méthodes ���������� ou �������. Il peut donc être néces-saire d’ajouter des champs dans un gestionnaire SAX pour repérer l’élémentdont dépendent des données textuelles ou un élément enfant. S’il y a besoinde distinguer de nombreux éléments imbriqués les uns dans les autres, imagi-nez alors à quel point ce peut être une tâche compliquée !

JAVA Exceptions déclenchées par les méthodes du gestionnaire SAX

Les méthodes ����������, ����������,�������...� de la classe ������������� ��������������� sont déclaréescomme étant susceptibles de déclencher desexceptions contrôlées de classe ����������$�)���� ����, avec la clause ����� adé-quate. Ceci vous permet d’affiner les contrôlessur les données lues dans la redéfinition de cesméthodes et de déclencher une exception decette classe si vous estimez qu’il y a une erreurqui mérite l’arrêt de l’analyse. Si c’est le cas,répétez la classe d’exception $�)���� ����avec la clause ����� à la redéfinition de sesméthodes. Sinon, rien ne vous oblige à répétercette exception à la redéfinition des méthodes,comme dans le programme ici présent.

Page 310: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004298

Vérifier la validité d’un document avec SAXLe document analysé est validé par SAX uniquement si vous appelez laméthode ��4������� sur une instance de la classe�������� ����$�)*��� ����( en lui passant la valeur ����, avantd’appeler la méthode ���$�)*���. L’analyseur SAX que vous obtenez validealors le document analysé pendant la lecture et appelle en cas d’erreur l’unedes méthodes ������, ����� ou �������� du gestionnaire SAX fourni, enfonction de la gravité de l’erreur détectée. Ces méthodes reçoivent en para-mètre un objet de classe ����������$�)*������ ���� qui décrit l’erreursurvenue.

Par l’exemple : rechercher les erreurs dans un document XMLL’application de classe �������������4�������������)8- vérifie avec SAXsi un document XML saisi par l’utilisateur est bien formé et valide, puisaffiche les erreurs éventuellement trouvées.

API JAVA Interface org.xml.sax.ErrorHandler et classe org.xml.sax.SAXParseException

Les méthodes ������, ����� ou �������� sont définies par���������������������, une des quatre interfaces qu’implémente la classe������������� ���������������. Leur implémentation dans cette classe ne faitrien, sauf pour la méthode �������� qui déclenche l’exception en paramètre.La classe ����������$�)*������ ���� de l’objet que ces méthodes reçoivent enparamètre dérive de ����������$�)���� ����. Elle définit des méthodes supplémentai-res, comme ���-���1��"�� ou ���:�����1��"��, qui permettent d’obtenir des informa-tions complémentaires sur les circonstances de l’erreur (décrite comme toujours par le texte ren-voyé par ���8���).

EXEMPLE com/eteks/test/ValiderDocumentXML.java �������������������� ����������������� �������������� ���������������� ������������ �������� ����������������� ������� �������������������4�������������)8-!�� �"�����������������#$�����%&���'��!������(����!

Saisie du fichier XML. B ������$��������������)8-�+�67 ����*������,� �������#���������������������������������������������2���������)8-�>2'���

Recherche des erreurs dans le fichier XML. B ���������(-����������+����������������#��������)8-'���

Page 311: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 299

���������#��������?�#'�++�<'��������67 ����*������8��������#����0���������������2-����������2�9���������)8-�9�2���������2'���

3 Si aucune erreur, affichage d’un message confir-mant la validité du fichier XML.

���������������!��������$������� ����+�2-����������2�9���������)8-�������������������������9�2������������>2�������������#������+�<����@���������?�#'���99'��������!����������$�)*������ ��������+�#$�)*������ ����'����������#�'������������ ����9+�2;�;�AB���������2�9�������-���1��"��#'����������������������9�2�>�2�9�������8���#'���������5��������67 ����*������8���������#����0�� ���'���������5����5

3 Sinon, création et affichage d’un rapport citantligne par ligne les erreurs trouvées.

���������#*���:��������������� �������'����!������67 ����*������8��������#����0���������2*��"�;�<<�=�������������������>�2�9�������8���#''�����5

3 Exception déclenchée si l’analyseur SAX n’a paspu être instancié.

���������#$�)���� �������'����!������67 ����*������8��������#����0���������2*��"�;�<<�=������ ����>�2�9�������8���#''�����5

3 Exception déclenchée si l’analyseur SAX n’a paspu analyser le document XML.

���������#,7���� �������'����!������67 ����*������8��������#����0���������2*��"�;�<<�=��������������>�2�9�������8���#''�����5����$(��������#<'���5

3 Exception déclenchée si le fichier n’a pas pu êtrelu.

�� ��������������(-�����������������#$��������������)8-'����������*���:��������������� ����0�$�)���� ����0�,7���� ��������!

3 Méthode cherchant les erreurs dans le fichierXML en paramètre.

����$�)*��� ����(������(�+�$�)*��� ����(����,�����#'��� 3 Instanciation d’une factory d’analyseurs SAX.

���������(���4�������#����'�������$�)*���� ����+������(����$�)*���#'��

3 Instanciation dun analyseur SAX validant lesdocuments lus.

������������(-����������+��������(-���#'�� 3 Ensemble stockant les erreurs trouvées dans lefichier XML.

���������������������������$�)�+������������������#'��������!

3 Création d’un gestionnaire SAX.

�������� �"���������������#$�)*������ �������'��������!��������������������#��'���������5

3 Redéfinition des méthodes de gestion d’erreur.

Page 312: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004300

Après la saisie du chemin ou d’une URL d’un document XML �, cetteapplication fait appel à la méthode �������������� � pour vérifier ce docu-ment. La méthode de classe �������������� � obtient un analyseurSAX � capable de valider un document XML �, puis crée un gestion-naire SAX qui redéfinit les trois méthodes ������, ����� et �������� de laclasse ������������� ��������������� �. Chacune de ces méthodes estimplémentée afin de stocker l’erreur reçue en paramètre dans l’ensemble������ . L’analyse du document est ensuite lancée avec cegestionnaire ; l’appel à la méthode �� est programmée ici dans une ins-truction ��( ���� qui n’intercepte que les exceptions de classe����������$�)*������ ���� �, déclenchées si le document analysé n’estpas bien formé. Comme les autres classes d’exceptions ne relèvent pas deserreurs de syntaxe XML, la méthode �������������� ne les gère pas elle-même � et laisse à la méthode ��� le soin de les intercepter. Finalement,un message est affiché pour annoncer le résultat de l’analyse � �.

En testant l’application de classe �������������4�������������)8- sur ledocument invalide�������,���������� suivant, vous obtiendrez le rapportde la figure 14-3 qui indique les 3 erreurs trouvées.

�������� �"��������������#$�)*������ �������'��������!��������������������#��'���������5�������� �"�����������������#$�)*������ �������'����������!��������������������#��'���������5������5�

Analyse du fichier avec le gestionnaire précé-dent.

B ������(����!������ ���� ���#��������)8-0�����������$�)'�� ����5

Rien à faire dans le ����, car l’erreur a déjàété signalée par un appel à �������� �.

B ���������#$�)*������ �������'������!����5��������������������55

À RETENIR Un document mal formé provoque une erreur fatale

SAX doit arrêter l’analyse d’un document XMLaussitôt qu’il détecte que celui-ci n’est pas bienformé. Pour cela, SAX appelle la méthode�������� � du gestionnaire en cours d’utili-sation, puis déclenche l’exception de classe����������$�)*������ ���� passée enparamètre à ��������, si cette méthode ne l’apas déclenchée elle-même.

EXEMPLE factureInvalide.xml@C����������+2D�<2CE@F�7:GH*���������$H$G�8�2�I����������2E

Manque l’attribut obligatoire ���. B @�������������+2DB<<2E��@����������+2$� ����8����2IE

Manque l’attribut obligatoire ����� ����. B ��@������E*:

Manque la balise de fin @I������E. B @I������E

Page 313: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 301

Analyser un document avec DOML’exploitation des informations d’un document XML avec DOM s’effectueen explorant l’arborescence d’objets que renvoie la méthode �� d’un ana-lyseur DOM. Cette arborescence représente en mémoire le document lu etses éléments à l’aide d’objets dont la classe implémente une des interfaces dupaquetage �����J�����, ces interfaces héritant elles-mêmes de l’interface�����J������1���.

Par l’exemple : rechercher le client d’une factureL’application de classe ���������������������:����� ����� recherche lenom et l’adresse du client décrit dans la facture du fichier ���������� puisaffiche les informations trouvées.

Figure 14–3 Application �������������4�������������)8-

API JAVA Interfaces les plus utiles du paquetage org.w3c.dom et leurs méthodes

Seules sont citées dans ce tableau les interfaces et les méthodes utiles pour explorer un document DOM. Toutefois, il est possible aussi de modifierune arborescence DOM pour y ajouter des nœuds, en supprimer, modifier leur valeur...

Description Interface Méthode

Nœud dans l’arborescence DOM(interface dont héritent ��������,������� et G���)

�����J������1��� �"������������1���G( �#' �"���������J������1������� ���:����#' �"���������J������1���-������:����1���#' �"���������J������1�������*����1���#'

Document DOM renvoyé par laméthode ��

�����J�������������� �"���������J��������������������������������#' �"���������J������1���-��

������������K(G�1��#�������$����� �����'

Élément de l’arborescence �����J������������� �"�����������$���������G�1��#' �"�����������$��������������"���#�������$����� ���'� �"���������J������1���-��

������������K(G�1��#�������$����� �����'

Données textuelles �����J������G��� �"�����������$�����������#'

Liste de nœuds �����J������1���-�� �"�����������-�����#' �"���������J������1��������#��� �����'

Page 314: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004302

Ce programme analyse d’abord le fichier XML avec DOM �, puis cherchele premier � élément ������ � dans l’arborescence du document DOM.Le nom et l’adresse du client s’obtiennent finalement en récupérant l’attribut��� � et les données textuelles � de cet élément.

EXEMPLE com/eteks/test/AfficherClientFacture.java �������������������� ����������������� �������������� ������������ �������� ���������J���������� ��������������$�)���� ����������������:����� �����!�� �"�����������������#$�����%&���'���!������(����!

Instanciation d’une factory d’analyseurs DOM. B ��������������K������ ����(������(�+��������������������������K������ ����(����,�����#'�

Instanciation d’un analyseur DOM. B ��������������K�������"�������+������(������������K�������#'�

Analyse du fichier ����������. B ������������������������+�"������� ���#2����������2'���

Recherche dans le document du premier élémentdénommé ������.

B ������1���-�����������+��������������������K(G�1��#2������2'������������������������:������+�#�������'������������#<'���

Récupération de l’attribut ���. B ������$�����������+�2:������>�;�2������������������������9��������:��������������"���#2���2'���

Récupération de l’adresse stockée dans les don-nées textuelles de l’élément.

B ������G����������G�����+�#G���'�������:��������� ���:����#'��������������9+�������G����������#'�

Affiche $% ��� F#)%+���#1&����#B= �&��&#����# �77�#*)���.

B ������67 ����*������8��������#����0�����'�����5

Exception déclenchée si l’analyseur DOM n’a paspu être instancié.

B ���������#*���:��������������� �������'����!������67 ����*������8��������#����0����������2*��"�;�<<�=�������������������>�2�9�������8���#''�����5

Exception déclenchée si l’analyseur DOM n’a paspu analyser le document XML.

B ���������#$�)���� �������'����!������67 ����*������8��������#����0����������2�������������������>�2�9�������8���#''�����5

Exception déclenchée si le fichier ����������n’a pas pu être lu.

B ���������#,7���� �������'����!������67 ����*������8��������#����0����������2*��"�;�<<�=��������������>�2�9�������8���#''�����5����$(��������#<'���55

Page 315: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 303

Forum : rechercher les utilisateurs ou les messages d’un document XMLLa classe ������������������(���)8- ���� définie ci-après permet derechercher dans un document XML un ensemble d’utilisateurs ou de mes-sages à l’aide d’un analyseur DOM. Cette classe sera utile dans le prochainchapitre pour la programmation du module de messagerie instantanée quiéchange des informations entre le serveur et ses clients au format XML.

DTD des utilisateurs et des messages

Voici tout d’abord la DTD qui décrit les types d’informations échangées.L’architecture des éléments XML retenue est très simple et se base sur les classesdu paquetage �������������� développées dans les chapitres précédents.

La date et l’heure de l’attribut ���:������ seront exprimées en millise-condes depuis le 1er janvier 1970, base de temps simple à manipuler en Java.

À RETENIR La DTD, document de référence de votre architecture XML

Même si vous n’avez pas l’intention de valider vosdocuments XML (pour des raisons de performan-ces par exemple), écrivez la DTD correspondant àceux-ci, pour fournir une référence de l’architec-ture XML retenue.

Tableau 14–2 Correspondances entre classes et éléments XML du forum

Classe Élément Commentaire

���������������.�������� ���� ��������� Décrit un utilisateur.

�������������������"��.�������� ���� ��������� Contient un ensemble d’utilisateurs.

���������������8��� ���� ���� Décrit un message.

�������������������"��8��� ���� ���� Contient un ensemble de messages.

FORUM forum.dtd

@F�-�8�1G�����������#����������'E 3 Un élément ��������� contient un ensembled’éléments ���������.

@F�-�8�1G������������8*GHE@F�GG-,$G����������� �����(�����:��G��L/�M.,/��E

3 Un élément ��������� est vide et son attribut �����(�� est obligatoire.

@F�GG-,$G����������������*����:��G��L,8*-,��E 3 L’attribut �����*� est optionnel.

@F�GG-,$G���������������������#����N.N8'�2����2E 3 L’attribut ��������� peut prendre pour valeur����, . ou 8, avec ���� comme valeur par défaut.

@F�-�8�1G������#�����'E 3 Un élément ���� contient un ensemble d’élé-ments ����.

@F�-�8�1G������#L*:��G�'E@F�GG-,$G������������������:��G��L/�M.,/��E@F�GG-,$G���������:�������:��G��L/�M.,/��E

3 Un élément ���� a des données textuelles décri-vant son texte. Ses attributs ����� et���:������ sont obligatoires.

@F�GG-,$G������������������:��G��L,8*-,��E@F�GG-,$G�������������������:��G��L,8*-,��E

3 Les attributs ���� et �� d’un élément ���� sontoptionnels.

Page 316: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004304

Rechercher les utilisateurs ou les messages avec DOM

Les différentes méthodes de la classe ������������������(���)8- ����s’inspirent de la DTD du fichier ��������� pour créer, à l’aide d’un analyseurDOM, les objets des classes du paquetage �������������� qui correspon-dent aux éléments lus dans un document XML.

POUR ALLER PLUS LOIN Castor

Construire des objets à partir des informationsd’un document XML est une opération assez rébar-bative, qui peut être automatisée si besoin est,grâce à des bibliothèques comme Castor ouXStream.B http://www.castor.org/B http://xstream.codehaus.org/ FORUM com/eteks/forum/AnalyseurXMLForum.java

���������������������� �������������� ���������������� ������������ �������� ���������J���������� ��������������$�)���� �����I�����O����������)8-���������������������������I �"����������(���)8- ����!

Renvoie le document DOM correspondant audocument XML lu dans le flux de lecture enparamètre.

B �� �"�����������������)8-�#,� ��$���������-������'���������������������������������������������,7���� ��������!������(����!

Instanciation d’une factory d’analyseurs DOM. B ��������������K������ ����(������(�+��������������������������������K������ ����(����,�����#'�

Instanciation d’un analyseur DOM. B ��������������K�������"�������+������(������������K�������#'�

Analyse du document XML. B ������������������������+�"������� ���#����-������'�����������������������������5

Exception déclenchée si l’analyseur DOM n’a paspu être instancié.

B ���������#*���:��������������� �������'������!����������������,7���� �����#������8����#''�������5

Exception déclenchée si l’analyseur DOM n’a paspu analyser le document XML.

B ���������#$�)���� �������'������!����������������,7���� �����#������8����#''�������5���������(����!

Fermeture du flux de lecture. B ����������-�����������#'�����5��5

Page 317: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 305

�� �"��������"��.�������� ���������.��������)8-���������������#,� ��$���������-������'�������,7���� ��������!����������������������+�����)8-�#����-������'����������"��.�������� ���������������+�����������������������������������������"��.�������� ����#'�

3 Renvoie l’ensemble des utilisateurs correspon-dant au document XML lu dans le flux de lectureen paramètre.

����1���-�����������+���������������������������������������K(G�1��#2���������2'����������#������+�<����@������������-�����#'���99'

3 Recherche des éléments du document dénom-més ���������.

�����������������������#����.���������78#���������������������������������#�������'������������#�'''������������������������5

3 Ajout à l’ensemble de l’utilisateur correspondantà l’élément enfant d’indice �.

�� �"����.�������� ���������.���������78�#���������������'���!����.�������� ���������������+�����.�������� ����#'�

3 Renvoie l’utilisateur correspondant à l’élémentDOM en paramètre.

����������������*�����(��#����������������"���#2 �����(��2''�����$�����������*��+�����������������"���#2�����*�2'��������#�����*��������#'�E�<'������������������8����*�#�����*�'�����$����������������+�����������������"���#2���������2'��������#F�����������3��#2����2''����������������������������#���������'������������������������5

3 Modification des propriétés de l’utilisateur avecles attributs �����(��, �����*� et��������� de l’élément en paramètre.

�� �"��������"��8��� ���������8���)8-���������������#,� ��$���������-������'�������,7���� ��������!����������������������+�����)8-�#����-������'���������"��8��� ����������+���������"��8��� ����#'�

3 Renvoie l’ensemble des messages correspondantau document XML lu dans le flux de lecture enparamètre.

����1���-�����������+��������������������K(G�1��#2����2'�����������#������+�<����@������������-�����#'���99'

3 Recherche des éléments du document dénom-més ����.

�����������������#����8����78##�������'������������#�'''�������������������5

3 Ajout à l’ensemble du message correspondant àl’élément enfant d’indice �.

�� �"����8��� ���������8����78�#���������������'� ��!����8��� ����������+�����8��� ����#'�

3 Renvoie le message correspondant à l’élémentDOM en paramètre.

����$���������+�����������������"���#2��2'��������#���������#'�E�<'�������������,�#,������� ��,��#��''�����$����������+�����������������"���#2���:������2'���������������:������#��������#-���� ��-����#���'''������������$����#����������������"���#2����2''������������������#����������������"���#2�����2''�

3 Modification des propriétés du message avec lesattributs ��, ���:������, ���� et����� de l’élément en paramètre.

����G����������G�����+�#G���'����������� ���:����#'������������G����#������G��������1���4���#''�������������������55

3 Modification de la propriété texte avec les don-nées textuelles de l’élément en paramètre.

Page 318: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004306

Les deux méthodes ����.��������)8- � et ����8���)8- � de cetteclasse construisent d’abord un document DOM en mémoire � en faisantappel à la méthode ����)8-. Ces méthodes recherchent ensuite dans l’arbo-rescence DOM obtenue les informations relatives aux utilisateurs ouaux messages � pour créer les objets qui leur correspondent. Le docu-ment XML est lu à partir d’un flux de classe ������,� ��$����, ce quipermet d’accéder à des sources de données variées, comme des fichiers oudes données en mémoire. Notez aussi que deux des classes d’exceptionscontrôlées � � qui peuvent être déclenchées par DOM sont ici détournéessous forme d’exceptions de classe ������,7���� ���� � �. Ceci a poureffet de simplifier la gestion des exceptions dans les traitements qui fontappel aux méthodes ����)8-, ����.��������)8- et ����8���)8-,puisque seule la classe ������,7���� ���� apparaît dans la clause ����� deces méthodes � � �.

Afficher les utilisateurs d’un document XML

L’application suivante recherche les utilisateurs du document������������� à l’aide de la classe ������������������(���)8- ����,puis les affiche en faisant appel implicitement à la méthode ��$����� redé-finie dans la classe ���������������.��������.

POUR ALLER PLUS LOIN Garder la trace de l’exception originale

Depuis Java 1.4, il est possible de chaîner une exception avec une autre grâce à la méthode����:�� ajoutée à la classe �������G����"��, dont hérite toute classe d’excep-tion. Cette méthode prend en paramètre l’exception qui est l’origine du déclenchementd’une autre exception.Cette fonctionnalité permet de garder la trace de l’exception originale quand une exceptionest détournée sous forme d’une exception d’une autre classe � �. Ainsi, l’instruction :

����������,7���� ����#������8���#''�

pourra s’écrire ainsi :

,7���� �������A�+�����,7���� ����#������8���#''���A�����:���#��'���������A�

L’exception chaînée à une autre s’obtient en appelant la méthode ���:��.

EXEMPLE com/eteks/test/AfficherUtilisateursXML.java �������������������� ����������������������� �������������� �������������������������.��������)8-!

POUR ALLER PLUS LOIN XSLT

Traiter les informations d’un document XML dansle but d’obtenir un autre texte, comme dansl’application ci-contre, peut s’effectuer aussi entransformant le document XML avec une feuille destyle XSLT (Extensible Stylesheet Language Transfor-mation) et les classes du paquetage���������������.

Page 319: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

14 –

Éch

ange

r des

info

rmat

ions

ave

c XM

L

© Groupe Eyrolles, 2004 307

Pour le fichier ������������� suivant, on obtient la figure 14-4.

En résumé...Ce chapitre vous a présenté les deux grandes catégories de classes utiliséespour analyser un document XML : SAX et DOM. Ces deux API qui fonc-tionnent très différemment l’une de l’autre couvrent l’essentiel des besoinspour exploiter les informations d’un document XML.

�� �"�����������������#$�����%&���'��!������(����!

������,� ��$���������-�������+��������������������������� ���,� ��$�����#2�������������2'�

3 Ouverture d’un flux de lecture sur le fichier�������������.

���������(���)8- �������(���)8-�+��������(���)8- �����#'�����������"��.�������� ���������������+������������������������(���)8-�����.��������)8-#����-������'�

3 Analyse des utilisateurs du document XML.

������$������������+�22�����������#,����������+������������������#'������1����#'��'��������������9+�2;�AB���2�9��������#'�9�2;�2����������������67 ����*������8���������#����0������'�����5���������#,7���� �������'����!���������������67 ����*������8���������#����0���'�����5����$(���������#<'���55

3 Construction d’un texte avec tous les utilisateurstrouvés.

EXEMPLE utilisateurs.xml

@C����������+2D�<2CE@���������E��@���������� �����(��+2���������2����������+282�IE��@���������� �����(��+2G���2��������������+2.2�IE@I���������E

Figure 14–4 Application ������������.��������.��������)8-

Page 320: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à
Page 321: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

15Messagerie instantanée avec la programmation

multitâche

SOMMAIRE

B Gestion des animations

B Programmation des threads

B Intégration d’un chat au forum

B Synchronisation du chat

MOTS-CLÉS

B TimerB ThreadB startB runB chatB appletB synchronizedB waitB notify

Comme tous les systèmes d’exploitation actuels, la machine virtuelle Java est capable d’exécuter plusieurs tâches simultanément, par exemple pour effectuer des animations ou pour lancer des traitements indépendants les uns des autres. Ce chapitre montre les différentes façons d’exploiter ces fonctionnalités multitâches, notamment dans le but de rendre réactive l’interface utilisateur d’une applet de chat.

Page 322: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004310

Le principe de la programmation multitâche est le suivant : dans la plupartdes cas, l’ordinateur de l’utilisateur ne possède qu’un seul microprocesseur.Cela implique qu’il ne peut y avoir, à un instant donné, qu’une seule tâche(ou thread) en cours d’exécution, les autres tâches étant mises en attente. Lesystème est ainsi obligé de partager le temps d’exécution entre les différentsthreads, en leur octroyant chacun leur tour un petit temps d’exécution duprocesseur (quelques millisecondes). On obtient ainsi l’illusion que tous lesthreads fonctionnent simultanément.

Nous allons dans ce chapitre montrer comment programmer des tâchesindépendantes dans une applet de chat pour que son interface utilisateur nesoit pas bloquée par les temps d’accès au réseau.

Gestion d’animations avec la classe javax.swing.TimerLa classe ����������� �� est le moyen le plus simple de créer des anima-tions qui soient mises à jour régulièrement. Le constructeur de cette classefonctionne en requérant un laps de temps en millisecondes et un listener quiimplémente l’interface ������������������������.

Appelée chaque fois que le laps de temps spécifié s’est écoulé, la méthode���������� �� du listener est implémentée avec les instructions mettant àjour l’animation.

API JAVA Méthodes les plus utiles de la classe javax.swing.Timer

Par l’exemple : afficher les nouvellesL’applet de classe �� ��������������������������� fait défiler verticalementet en boucle un texte affiché dans une instance de ����������������, lamise à jour de l’animation étant assurée toutes les 50 millisecondes par untimer. Comme cette applet gère une animation, ses méthodes ����� et ����appelées lors de l’affichage de l’applet et au moment de sa disparition sontredéfinies pour démarrer � et arrêter � le timer utilisé pour mettre à jourl’animation.

Description Méthode

Démarrage, arrêt et redémarrage du timer ���������������� !��������������� !������������������ !

Changement du laps de temps �������������"���#� � ����#!

B.A.-BA Tâche, thread et processus

Une tâche ou un thread en Java est qualifié de pro-cessus léger. Ce terme désigne un traitement quiest exécuté en parallèle avec d’autres traitementsau sein d’un même programme, qualifié quant àlui de processus lourd.Le terme thread est préféré en Java car il fait réfé-rence à la classe ����������$���� qui lui cor-respond. À un processus lourd correspond la classe����������������.

Les listeners qui « écoutent » des événements sontexpliqués au chapitre 10.

API JAVA Classes java.util.Timer et java.util.TimerTask

Le paquetage �������� contient les deux classes� �� et � ������, qui offrent des fonctionnali-tés équivalant au couple ����������� �� et������������������������.

Page 323: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 311

EXEMPLE com/eteks/test/AppletNouvelles.java

���������� �����������%

�������������������&% ���������������&%

'&&�&�������������(����������� ��������������� ���������&'������������������������������������������) Champ mémorisant le timer démarré et arrêté

dans les méthodes ����� et ���� de l’applet.���������� ���� ��% 3

������������� !��)�

3 Point d’entrée de l’applet : méthode appelée lorsdu chargement de l’applet.

���������������������*����������� ������� ����� +�����+!!% 3 Création d’un label utilisant le paramètre �����.

�������������������� ,-����.��$�� !!%�������������/0�� ������������������/0� !!%

3 Positionnement du label en bas de l’applet aveccalcul de sa taille « préférée ».

�������1�������� !������#���� ���!%�������1�������� !����� �����!%

3 Annulation du layout de l’applet pour pouvoirdéplacer le label pendant l’animation.

���������������� ���������*��������������� !������)���������������������������� ��� ����2������!��������)

3 Création d’un listener mettant à jour la positionverticale du label �����.

������������#�*����������3 !% 3 Récupération de la position vertical du label.

������������ #�4�5���������.��$� !!������������#�*����.��$�� !%��������������

3 Si tout le texte a défilé, le label est repositionnéen bas de l’applet.

������������#55%�������������������������� ���������6 !-�#!%��������7������7%

3 Sinon le label est déplacé d’un pixel vers le haut.

�����$��� ���*����� ��� 8,-�� ��������!%��7

3 Création du timer appelé toutes les 50 millise-condes (ce qui correspond à 20 images/seconde).

������������������ !��)

3 Méthode appelée à l’affichage de l’applet.

�����$��� �������� !%����7

3 Démarrage de l’animation.

����������������� !��)

3 Méthode appelée à l’arrêt de l’applet.

�����$��� ������� !%����77

3 Arrêt de l’animation.

Page 324: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004312

La classe d’applet �� ��������������������������� fait défiler verticalementle texte contenu dans le paramètre �����. Le fichier HTML����������������$� � utilise un texte HTML pour l’animation.

Programmation d’un thread avec la classe java.lang.ThreadLa classe ����������$���� permet de créer un traitement dans un threadindépendant par rapport au thread principal lancé au démarrage de la JVM.��, ����� et ����� sont les méthodes les plus utilisées de cette classe.

La méthode �� doit être redéfinie dans une sous-classe de ����������$����en précisant les instructions du traitement à exécuter dans un thread séparé.

La méthode ����� est appelée pour démarrer un thread et exécuter les instruc-tions implémentées dans sa méthode �� en parallèle avec les autres threads.

La méthode ����� est appelée pour arrêter le thread en cours d’exécutionpendant un laps de temps donné en millisecondes.

EXEMPLE bin/AppletNouvelles.html

Figure 15–1 Applet�� ���������������������������

4$� �94����9��������������4'����94'$���94���#9�������:������%�������������;4��94�����������*+�� ���������������������������+����$*+<,,+��������$��$�*+=,,+���������*+��'�������+9��4���� �� �*+�����+��������������*+4$� �94$>9/��������������������?4'$>9����������������/���05�����@�������� ������4����9��������������������������������4'����94��9������������������� ����A����$�������������������� ���.�B��C4��9����������������4$>9��������� ���� ��@�:������%����������:������%�����������������4'$>9����������������"������������ �������:������%�����-���������� ������������������� ��@�:������%4��9���������������������#:������%������ ���������������������������������49D�������?4'9���4'$� �9+9��4�9/���4��$���*+$���;''���������� '�������'+9����4'�9-������������������������ �����������������4'�94'������94'���#94'$� �9

Instructions exécutées par un thread B ������������� !

Démarre un thread puis exécute la méthode ��dans le nouveau thread.

B ���������������� !

Arrête le thread en cours d’exécution pendant ladurée donnée en paramètre.

B ��������������������� ��� ���!��$��������������E���������2������

Page 325: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 313

Implémenter la méthode runLes instructions d’un thread doivent être implémentées dans la méthode ��,soit dans une sous-classe de ����������$����, soit dans une classe quiimplémente l’interface ���������F�����.

Une application peut lancer autant de threads qu’elle le désire et les instruc-tions d’un thread peuvent utiliser toutes les données du programme accessi-bles dans la méthode ��.

Implémenter la méthode run avec une sous-classe de java.lang.Thread

Le moyen le plus simple d’exécuter un ensemble d’instructions dans unthread séparé est d’utiliser une sous-classe anonyme de ����������$����,qui prend la forme suivante :

REGARD DU DÉVELOPPEUR Du bon usage de la méthode sleep

Évitez de recourir à une boucle d’attente comme :

pour laisser s’écouler le temps dans un programme. Une telle bou-cle a une durée très variable d’une machine à l’autre et peut dégra-der la réactivité du système. Préférez-lui la méthode de classe ����� ; l’appel à cette méthodevous oblige à prendre en compte l’exception contrôlée de classe���������E���������2������ qu’elle peut déclencher,mais c’est bien la seule difficulté d’utilisation de cette méthode.

La méthode ����� est souvent utilisée pour gérer l’attente entredeux mises à jour d’une animation. Pour programmer une anima-tion qui requiert un délai fixe entre deux mises à jour, préférez-lui laclasse ����������� �� : cette classe évite de prendre encompte le temps que dure la mise à jour de l’animation, avec lesappels à la méthode ������� �B��� de la classe���������/#��� que cela implique.

���� ���*�,%��4�=,,,,,,,,,%�GG!��%

��#)��''����H��������=����������$����������� =,,,!%7����$� E���������2���������!)��''����H������$���������� ��7

ATTENTION Démarrez un thread avec start

Il faut appeler la méthode ����� pour démarrerun thread, pas la méthode ��. Si vous appelezla méthode �� directement, les instructions decette méthode seront exécutées dans le threaden cours d’exécution et non dans un threadséparé.

�$�������$�����*�����$����� !��)

3 Définition d’une sous-classe anonyme de����������$���� dont l’instance est affec-tée à la variable ��$����.

����������������� !�����)

3 Redéfinition de la méthode �� de la classe����������$����.

������''�E���������I���J���������7

3 Traitement à exécuter dans un thread indépen-dant.

��7% 3 Fin de la classe anonyme.

��$���������� !% 3 Démarrage du thread.

Page 326: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004314

Implémenter la méthode run avec l’interface java.lang.Runnable

L’autre moyen de décrire le traitement exécuté par un autre thread est d’uti-liser une classe qui implémente l’interface ���������F�����. Pour exécuterdans un thread séparé les instructions de la méthode �� d’une telle classe, ilfaut créer une instance de ����������$���� en passant à son constructeur unobjet de cette classe, puis appeler la méthode ����� sur ce nouveau thread.

Ajout d’un module de chat au forum de discussionVoyons à présent coment ajouter un module de chat au forum dont l’inter-face utilisateur est réalisée avec une applet. Cette applet exécutée dans lenavigateur de chaque participant au chat fait appel à un ensemble de pagesJSP du serveur Web pour lui envoyer chaque nouveau message, obtenir laliste des derniers messages et la liste des participants au chat. Les appels àces pages, qui peuvent être ralentis par le temps d’accès au serveur, sont pro-grammés dans des threads séparés de façon que l’interface utilisateur soitplus réactive.

API JAVA Interface java.lang.Runnable

L’interface ���������F����� contient uni-quement la méthode ������ ���� �� !. Laméthode �� de la classe ����������$����provient en fait de l’interface F����� qu’implé-mente cette classe.

���������� �����������%

������1�����F������ ��� ����F�����)��''�1$� ������ J�$�����������������

Implémentation de l’unique méthode �� del’interface ���������F�����.

B ��������������� !���)����''�E���������I���J�������������$������J�������77��������������B����$����)������������������ �� /���KL�����!��)����1�����F����������*����1�����F����� !%

Création d’un thread avec un objet dont la classeimplémente ���������F�����.

B �����$�������$�����*�����$����� ���!%�

Démarrage du nouveau thread. B ������$���������� !%����''���������������������$���������������J���������DB��77

B.A.-BA Chat

Un chat permet de dialoguer en direct avec plu-sieurs personnes. À la différence d’un forum de dis-cussion, l’interface utilisateur d’un chat se chargeelle-même de mettre à jour la liste de tous les mes-sages postés par les participants au chat.

Page 327: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 315

Interaction entre l’applet de chat et les pages JSPComme le montre la figure 15-2, l’interface utilisateur de l’applet de chatcouvre les deux fonctions principales d’un chat : la saisie et l’affichage desmessages postés par les participants au chat.

REGARD DU DÉVELOPPEUR Programmation multithread et Swing

La mise à jour des composants à l’écran et l’appel aux listeners de votre pro-gramme quand un événement survient, sont gérés par un thread propre àAWT et Swing. Ce thread est lancé par la JVM aussitôt que ces bibliothèquessont utilisées à l’exécution d’un programme Java. Même si Swing a ses propresthreads, il existe des cas où il est nécessaire de créer des threads personnalisésavec cette bibliothèque : si vous programmez une longue opération dans uneméthode d’un listener comme ���������� ��, vous risquez de retarder àl’exécution la mise à jour des composants à l’écran et la réaction aux événe-ments provoqués ultérieurement. Si l’attente se prolonge, ce type de pro-grammation donne l’impression à l’utilisateur que l’application n’est pas réac-tive ou bloquée, ce que tente d’éviter l’applet de chat.

Figure 15–2 Interaction entre l’applet de chat et le serveur Web

Serveur Web Navigateur + Applet

chat/annoncerarrivee.jsp

chat/ajoutermessage.jsp

chat/liremessages.jsp

chat/annoncerdepart.jsp

chat/lireparticipants.jsp

Navigateur + Applet

<?xml version="1.0"?> <utilisateurs>

<?xml version="1.0"?> <messages>

...

...?texte=message

Aucune valeur retournée

Aucune valeur retournée

Aucune valeur retournée

Page 328: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004316

Pendant son exécution, l’applet a recours à cinq pages JSP du serveur pourassurer ses fonctionnalités :1 Lors de son lancement, l’applet fait appel à la page �$��'

��������������� � pour ajouter l’utilisateur à la liste des partici-pants du chat et annoncer son arrivée aux autres participants du chat.L’applet affiche ensuite la liste des participants renvoyés par la page �$��'���������������� �, puis lance un thread pour lire les messages etles afficher. Tant que l’applet est en marche, ce thread fait appel en bou-cle à la page �$��'��� ����������� � pour obtenir la liste des nouveauxmessages, puis attend une seconde avant de recommencer.

2 Une fois l’applet lancée, l’utilisateur peut saisir des messages dans lechamp de saisie, qui sont envoyés au serveur aussitôt qu’il appuie sur latouche Entrée (retour chariot). Le texte de chaque message est transmisau serveur en faisant appel à la page �$��'������� ���������� � qui lemémorise sur le serveur afin que la page �$��'��� ����������� puisse leretransmettre à tous les participants.

3 À l’arrêt de l’applet, la page �$��'��������������� � est finalementappelée pour retirer l’utilisateur de la liste des participants du chat etannoncer son départ aux autres participants.

Composants JavaBeans du serveur pour le chatL’ensemble des messages du chat et la liste des participants sont stockés pardes objets de portée �������� pour pouvoir être partagés entre tous lesutilisateurs et les pages du chat. Le mode de fonctionnement du chat repro-duit celui des chats disponibles sur Internet, proposant en général d’afficheruniquement les messages créés depuis la connexion d’un utilisateur sans pos-sibilité de remonter dans l’historique avant connexion. Ces listes n’ont doncpas besoin d’être sauvegardées dans la base de données et restent enmémoire.

Ensemble des messages du chatLa liste des messages est stockée par l’objet �������1$�� de classe�� ����������� �2�� ���B�������M��� . Cet objet est déclaré dans le fichierN2O5E�M'����'���' ��������$�������, inclus dans les pages qui doiventaccéder à l’ensemble des messages.

Les classes des messages, des participants et desensembles correspondants sont les mêmes classesque celles utilisées dans le forum, c’est-à-dire lesclasses B������M��� , P��������M��� ,2�� ���B�������M��� et2�� ���P���������M��� du paquetage�� ����������� . Ces classes sont définiesdans les chapitres 6 « Les classes de base de labibliothèque Java », 7 « Abstraction et interface »et 11 « Connexion à la base de données avecJDBC ».

CHAT WEB-INF/jspf/bean/messageschat.jspf

Déclaration de l’objet �������1$�� de portée��������.

B 4���;���O����*+ �������1$��+������*+��������+������������������*+�� ����������� �2�� ���B�������M��� +�'9

Page 329: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 317

Message du chatLa classe �� ����������� �B������M��� est utilisée comme composant Java-Beans pour mémoriser chaque message du chat, leur sujet n’étant pas utilisé ici.

Ensemble des participants au chatL’ensemble des participants est stocké dans l’objet ���������1$�� declasse �� ����������� �2�� ���P���������M��� . L’objet ���������M��� d’un utilisateur y est ajouté quand il accède au chat puis en est retiré quand ilquitte le chat. L’objet ���������1$�� est déclaré dans le fichier N2O5E�M'����'���'����������$������� qui est inclus dans les pages devantaccéder à l’ensemble des participants.

Date de la dernière lecture des messagesPour éviter d’envoyer la liste de tous les messages à chaque fois que l’appletdemande une mise à jour du chat, on associe à chaque participant un objet�����������B�������1$�� de portée ����� qui mémorise la date de sa der-nière requête de lecture des messages.

Pages JSP de gestion du chatLes cinq pages propres au module de chat utilisent les objets décrits précé-demment pour gérer les messages et les accès au chat d’un utilisateur duforum.

Arrivée d’un utilisateur dans le chatLa page �$��'��������������� est appelée au lancement de l’applet d’unutilisateur pour ajouter cet utilisateur à l’ensemble des participants auchat � et créer automatiquement un message qui signale son arrivée en fai-sant appel à la page �$��'������� ���������� �.

L’objet ���������M��� de portée �����représente chaque utilisateur du forum. Il estdéclaré dans le fichier N2O5E�M'����'���'������������� �����, décrit au chapitre 13« Interface utilisateur du forum ».

CHAT WEB-INF/jspf/bean/participantschat.jspf

4���;���O����*+���������1$��+������*+��������+������������������*+�� ����������� �2�� ���P���������M��� +�'9

3 Déclaration de l’objet ���������1$�� deportée ��������

CHAT WEB-INF/jspf/bean/datelecturemessageschat.jspf

4���;���O����*+�����������B�������1$��+������*+�����+������������������*+���������"���+�'9

3 Déclaration de l’objet ������������B�������1$�� de portée �����

Page 330: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004318

Cette page modifie aussi l’objet �����������B�������1$�� de l’utilisateur enlui affectant la date du moment � : cette opération permet à la page de lec-ture des messages, �$��'��� �����������, de n’envoyer à l’utilisateur que lesmessages de �������1$�� ajoutés après son arrivée.

Lecture des participants au chatLa page �$��'���������������� peut être appelée à tout moment pourobtenir du serveur la liste des participants au chat. Cette page renvoie undocument XML � � d’élément racine ���������� � qui décrit les utili-sateurs participant au chat avec leur élément ��������� correspondant �.

CHAT chat/annoncerarrivee.jsp

Balise ���� spécifiant le paquetage à importer. B 4QR������ ����*+���������&+�Q9

Inclut les objets décrits dans les fichiers du sous-dossier N2O5E�M'����'���.

B 4QR����������*+'N2O5E�M'����'���'������������� �����+�Q94QR����������*+'N2O5E�M'����'���'����������� ��������$�������+�Q94QR����������*+'N2O5E�M'����'���'����������$�������+�Q9

Ajout de l’utilisateur à l’ensemble des partici-pants.

B 4Q����������1$����������� ���������M��� !%�Q9��

Initialisation de l’objet �����������B�������1$�� avec la date du moment.

B 4Q������������B�������1$������� � ���"��� !����� �� !!%�Q9��

Transfert du contrôle à la page ������� ����������.

B 4���;������������*+������� ����������+9����4���;���� �� �*+�����+������*+4Q*�+555�����S�,,�T��555+�Q9+'94'���;�������9

REGARD DU DÉVELOPPEUR Servlet ou JSP, que choisir ?

Les pages JSP du chat ne font pas de mise en page et auraient très bien pu êtredéveloppées sous forme de servlets. Les pages JSP ont été utilisées ici principa-lement par souci de concision et parce que les balises ���;���O�� sont plussimples à programmer que leur code équivalent dans une servlet qui utilisedes attributs (ouvrez un fichier ����� équivalent à une page JSP et vous pour-rez comparer par vous-même !).

ASTUCE Tester les pages JSP

Même si certaines des pages JSP utilisées par lechat ne renvoient pas de texte (comme la page������������$������), il est importantde pouvoir les tester individuellement pendant leurmise au point. Ainsi, si vous saisissez directementl’URL de la page JSP dans le champ d’adresse dunavigateur (par exemple, http://127.0.0.1:8080/forum/chat/annoncerarrivee.jsp), le serveur vousrépondra par un texte d’erreur s’il n’a pas réussi àinterpréter ou exécuter la page.

CHAT chat/lireparticipants.jsp

Prologue XML. B 4C� �������*+=�,+C9��

Balise ���� spécifiant le type MIME de XMLavec l’encodage P�M5U.

B 4QR������������#��*+��������'� �%�$�����*P�M5U+�������� ����*+�� ����������� �&-�� �������������&-���������&+�Q9

Inclut l’objet ���������1$��. B 4QR����������*+'N2O5E�M'����'���'����������$�������+�Q9

Balise de début de l’élément racine. B 4����������9��

Énumération des participants au chat. B 4Q����� E����������*����������1$���������� !%���$������ !%!���)�����P��������M��� ����������*� P��������M��� !����� !%Q9

Page 331: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 319

Comme un attribut XML ne doit pas contenir un des symboles : 4 A +, notezque la méthode �������22���� de la classe �� �������������

V����1$�� est appelée sur le pseudonyme de l’utilisateur � pour convertir,si besoin est, ces caractères en leur entité respective.

Lecture des messages du chatLa page �$��'��� ����������� est appelée régulièrement par l’applet pourobtenir du serveur les derniers messages ajoutés au chat, sous forme d’undocument XML d’élément racine �������.

Pour éviter d’envoyer la liste de tous les messages à chaque requête del’applet de chat, cette page utilise l’objet �����������B�������1$�� propre àchaque utilisateur (grâce à sa portée �����) afin de ne lui envoyer que lesnouveaux messages postés depuis sa dernière requête.

��4���������������������# �*+4Q*�V����1$����������22���� ����������������������������������������������# �� !!�Q9+�������������*+4Q*����������������������� !�Q9+�'94Q�7�Q9

3 Création d’un élément ��������� avec sesattributs ������# � et ����������

4'����������9 3 Balise de fin de l’élément racine.

Les éléments et les attributs XML retenus pouréchanger des informations entre le serveur et lesclients du module de chat sont décrits dans la DTD���� ���� donnée à la fin du chapitre 14« Échanger des informations avec XML ».

CHAT chat/liremessages.jsp4C� �������*+=�,+C9� 3 Prologue XML.

4QR������������#��*+��������'� �%�$�����*P�M5U+������� ����*+�� ����������� �&-�� �������������&-���������&+�Q9

3 Balise ���� spécifiant le type MIME de XMLavec l’encodage P�M5U.

4QR����������*+'N2O5E�M'����'���' ��������$�������+�Q94QR����������*+'N2O5E�M'����'���'����������� ��������$�������+Q9

3 Inclut les objets décrits dans les fichiers du sous-dossier N2O5E�M'����'���.

4 �������9 3 Balise de début de l’élément racine.

4Q����� E����������*� �������1$����������� !%���$������ !%�!�����)�����B������M��� � �������*� B������M��� !����� !%�����"����������������B�������*� ����������"���1����� !%

3 Énumération des messages du chat.

������� ����B������������� �����������B�������1$��!!�������)�Q9

3 Si la date du message est postérieure à la datede dernière lecture...

��4 �����������1�����*+4Q*�����B����������� � !�Q9+�������������������*+4Q*�V����1$����������22���� �������������������������������������� ����������������� !!�Q9+�9����4Q*�V����1$����������22���� ���������������� !!�Q9��4' ������94Q���7���7

3 ... création d’un élément ������ avec sesattributs ����1�����-������� et ses don-nées textuelles représentant le texte du mes-sage.

��������������B�������1$������� � /#��� �������� �B��� !!%�Q9�� 3 Modification de l’objet �����������B�������1$�� avec la date du moment.

4' �������9 3 Balise de fin de l’élément racine.

Page 332: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004320

Au cours de l’énumération sur l’ensemble des messages �, seuls les messagespostérieurs à cette date � sont donc renvoyés sous la forme d’un élément ������ �. Une fois l’énumération terminée, l’objet �����������B�������1$��est mis à jour avec la date du moment �.

Ajout d’un message dans le chatLa page �$��'������� ���������� est appelée par l’applet pour transmettreau serveur le texte des messages rédigés par l’utilisateur. Les pages �$��'��������������� et �$��'��������������� y font aussi appel pour créerautomatiquement un message qui annonce l’arrivée ou le départ d’un partici-pant du chat.

Cette page crée un objet de classe �� ����������� �B������M��� � initialiséavec le texte reçu en paramètre � puis l’ajoute à l’ensemble des messages duchat �.

Avant cela, les messages qui ont plus de 5 minutes � (5 minutes = 5 × 60 ×1 000 millisecondes) sont supprimés de l’ensemble �����������, pour qu’ilspuissent être détruits par le ramasse-miettes de la JVM. Comme les mes-sages sont lus presque instantanément par les applets, il est inutile de stockeren mémoire des messages qui ont déjà été renvoyés aux applets connectées ;la marge (arbitraire) de 5 minutes permet de tolérer les éventuelles coupuresde connexion Internet qui retarderaient la lecture des messages.

ATTENTION Blancs typographiques introduits dans une page JSP

Toutes les indentations et balises JSP isolées surune ligne introduisent autant d’espaces ou deretours à la ligne dans la réponse. Ces espacesn’empêchent pas le document XML d’être syn-taxiquement correct, excepté pour le prologueXML, qui doit apparaître au tout début dufichier JSP pour ne pas poser de problème auxanalyseurs XML.

CHAT chat/ajoutermessage.jsp

Balise ��� spécifiant le paquetage à importer. B �� ������������������������������������������

Inclut les objets décrits dans les fichiers du sous-dossier � !"#$%&���&'��(.

B �� ��(���)��������&� !"#$%&���&'��(&������������������������ ��(���)��������&� !"#$%&���&'��(&�������������������

Énumération des messages du chat. B �������*#�����������������������������*+,������$�-*+,�+���.�����/������%���������������*/������%����+��(�-*+,

Si le message date de plus de 5 minutes... B ��������*��01���������(2���/�����*+����������"�����������3��������(*+���2���*+���455555+��

... suppression du message. B ����������������*+,���6���

Création d’un message avec le texte en paramè-tre de la requête.

B ���7���!��(��)���������������������������������/������%�������������7��8����1�(������������������1����&���

Modification de l’auteur. B ���������������9�����*���������%����+,����&��7���!��(�

Ajout du message à l’ensemble des messages. B ����������������������*�������+,�����

Page 333: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 321

Départ d’un participant du chatLa page ���&�((�(���)������ est appelée lors de l’arrêt de l’applet d’unutilisateur pour retirer ce dernier de l’ensemble des participants au chat � etcréer automatiquement un message signalant son départ �.

Interface utilisateur du chatL’interface utilisateur du chat est réalisée sous la forme d’une applet inclusedans une page JSP. Cette applet de classe ���������������9����� meten page une zone de texte de classe ����-��:�(��;2�-9��� � affichant laliste des messages du chat et un composant de classe ����-��:�(��;2�-%���)� pour la saisie de nouveaux messages. On accède aux pages JSP du serveurdécrites précédemment au moyen des cinq méthodes, �((�(���9������ �,����8������(� �, ����/������� , �(��1��/������ � et �((�(���3��� , de la classe 9�����.

CHAT chat/annoncerdepart.jsp

�� ��(���)��������&� !"#$%&���&'��(&������(�������������� ��(���)��������&� !"#$%&���&'��(&����������������������

3 Inclut les objets décrits dans les fichiers du sous-dossier � !"#$%&���&'��(.

���������(�������������*���������%����+,����� 3 Suppression de l’utilisateur de l’ensemble desparticipants.

���7���:��)�������������������������������7�����(������-���������������"""�3<�55�=���"""�����&��&��7���:��)�

3 Transfert du contrôle à la page ����������������.

CHAT com/eteks/forum/AppletChat.java���������������������,�����������:��,�����������:����(��,���������-��:�(���,����������(���,��������������,���������������,�����������-��,�'����������9�������-�()��;9��.

Figure 15–3 Interface utilisateur du chat

��������;2�-9�������-�/����������(�:�;2�-9����*+,����������;0�����8�(���((���9���(�������������������������������(�:�;0�����8�(��*�-�/�������+,��������;>�'�����'��/����������������������������������(�:�;>�'���*� (�������)����((�-��(����+,��������;2�-%���)�������/���������(�:�;2�-%���)*?5+,��

3 Création des composants Swing affichés dansl’applet.

��������3��%����������@�������3��%�������2���#(��(��*+, 3 Format pour afficher l’heure des messages.

��������9(��1����A/>%������(��1����A/>����������������������������������(�:�9(��1����A/>%����*+,

3 Analyseur des documents XML renvoyés par lespages JSP du serveur.

Page 334: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004322

Champ utilisé pour arrêter le thread principal del’applet.

B ��������'�����(�����9��,

Point d’entrée de l’applet : Méthode appelée auchargement de l’applet.

B ���'�������)��(�*+��.

Le champ de saisie multiligne �-�/�������est rendu non éditable et met automatiquementà la ligne les phrases qui excèdent la largeur ducomposant, mais sans couper les mots.

B ���������-�/���������� )��'��*�����+,���������-�/����������>�(����*���+,���������-�/�������������01�����)*���+,

Ajout du label et du champ de saisie du messageau panneau de saisie.

B ����;8�(����((���0��������(�:�;8�(��*(�:�!��)��>�1���*++,�����((���0�������))�*������'��/��������!��)��>�1���� 02+,�����((���0�������))�*����������/��������!��)��>�1���� $2 B+,

Le champ de saisie est rendu invisible tant que laconnexion n’est pas établie.

B ����������/���������C���'��*�����+,

Utilisation pour l’applet d’un layout de classe!��)��>�1��.

B ��������(�(8�(�*+���>�1��*(�:�!��)��>�1���*5��?++,

Ajout du panneau à ascenseurs au centre et dupanneau de saisie en bas.

B ��������(�(8�(�*+��))�*�((���9���(������!��)��>�1���� $2 B+,��������(�(8�(�*+��))�*�((���0�������!��)��>�1���0DE2@+,

Ajout du listener d’action au champ de saisiepour envoyer le message saisi au serveur.

B ����������/��������))9���(>���(��*(�:�9���(>���(���*+������.���������'�������)�����(8�������)�*9���( ��(���+����������.

Récupération du texte saisi sans les espaces audébut et à la fin.

B ����������0��(���-�0�������������/���������2�-*+����*+,

Envoi du texte saisi si sa longueur n’est pasnulle.

B �������������*�-�0�������(���*+���5+�������������(��1��/�������*�-�0����+,

Suppression du texte saisi dans le champ de saisie. B ����������������/���������2�-*��+,��������6������6+,��6

Ajout du message en paramètre à la fin duchamp de saisie multiligne.

B ���'�������)���������/�������*0��(���������+��.���������-�/����������()*��������F��<(�+,

Positionnement de l’ascenseur vertical à sa posi-tion la plus basse pour visualiser le texte ajouté.

B ���������((���9���(�������C������0�����!��*+�������������������������������������C����*#(�����/9AGC9>E +,���6

Affichage du message en paramètre et interdic-tion de saisir un nouveau message.

B ���'�������)��������� ������*0��(���������+��.

Changement du texte du label et effacement duchamp de saisie.

B ����������'��/���������2�-*�������+,��������������/���������C���'��*�����+,

Ne plus continuer à lire les messages dans lethread de lecture des messages.

B ������������9��������,����6

Annonce de l’arrivée de l’utilisateur dans le chat. B ���'�������)��((�(���9�������*+����:��#D -����(����.

Appel de la page JSP du serveur qui annoncel’arrivée d’un utilisateur.

B ������(���B�H����*��8��������*��((�(���9�������++,��6

Page 335: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 323

���'�������)�����8������(��*+����:��#D -����(����.

3 Lecture de la liste des participants au chat.

����#(�0��������->��������������������((����*��8��������*�����8������(��++,

3 Connexion à la page JSP du serveur qui renvoiela liste des participants.

���� (���'��E���������%��������������������������(��1����A/>�����E���������A/>*���->�����+,��

3 Lecture des utilisateurs dans le document XML.

����0��(�������������8������(��)������7�,��������*#����������������������������*+,������$�-*+,�+����.������E���������������������*E��������+��(�-*+,��������������F������F�������������8���)�(1��*+,����6

3 Construction d’un message énumérant tous lesparticipants.

������������/�������*�������+,��6

3 Affichage de la liste des participants.

���'�������)�����/��������*+����:��#D -����(���.�����1����.

3 Lecture de la liste des messages du chat.

����������*����9����������,�I����9��,�+������.

3 Démarrage d’une boucle de lecture des messa-ges.

��������#(�0��������->����������������������((�����*��8�������*�����/��������++,����������������/�������A/>�*���->�����+,��������2����)������*J555+,������6����6

3 À chaque tour de boucle, lecture des nouveauxmessages renvoyés par la page JSP du serveur,puis arrêt du thread en cours d’exécution pen-dant 1 seconde.

���������*#(�����) -����(��-+����.�����6��6

3 Exception déclenchée par le navigateur pourcouper la pause du thread quand l’applet estarrêtée.

���'�������)���������/�������A/>�*#(�0��������->�����+����������������������������������������������:��#D -����(��.

3 Lecture de la liste des nouveaux messages dansle flux de données en paramètre.

���� (���'��/�������%��������������������������������(��1����A/>�����/�������A/>*���->�����+,�

3 Lecture des messages dans le document XML.

��������*#��������������������������*+,������$�-*+,�+����.������/�����������������*/������+��(�-*+,

3 Énumération des messages pour les ajouter dansla zone de texte multiligne.

������0��(���������9������������������������������@����������*����������3��������(*++���������������F���"���F�����������9����*+���������������F���7���F�����������2�-�*+,��������������/�������*�������9������+,����6��6

3 Mise en forme du message au formatF��F�� - �&��&� : ��'��.

���'�������)��(��1��/�������*��(���0��(���������+����.

3 Envoi du message en paramètre au serveur.

Page 336: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004324

Création d’un thread pour envoyer le messagesans bloquer l’applet.

B ����2����)�����) (���/���������(�:�2����)�*+��������.

Redéfinition de la méthode ��( de la classe�������(��2����).

B ���������'�������)���(�*+��������.�����������1����������.�

Ajout à la suite de la page JSP du paramètre�-� qui a pour valeur le message au format-":::"����"����(��)�), avec l’encodagede caractères�#0D"KK?="J (codage par défautdes paramètres).

B ������������0��(��������/������9���2�-����������������������8��������*�������/�������+�F��L�-��������������������F�EB> (��)����(��)�*����������#0D"KK?="J�+,�

Appel de la page JSP du serveur. B ��������������(���B�H����*������/������9���2�-�+,�����������6

Si une exception a été déclenchée suite à un pro-blème de connexion avec le serveur, affichaged’un message d’erreur.

B ���������������*#D -����(��-+����������.�������������������� �����*� (����)���������������'���+,����������6��������6������6,

Démarrage du thread. B ��������) (���/�����������*+,��6

Annonce du départ de l’utilisateur du chat. B ���'�������)��((�(���3����*+����:��#D -����(� ��.

Appel de la page JSP du serveur qui annonce ledépart d’un utilisateur.

B ������(���B�H����*��8��������*��((�(���3����++,��6

Appel d’une page JSP relative à celle de cetteapplet, qui ne renvoie pas de données.

B ���'�������)���(���B�H���*0��(�����B������+����:��#D -����(����.

Envoi de la requête au serveur sans lecture desdonnées renvoyées.

B ����#(�0��������->����������((����*���B������+,�������->�����������*+,��6

Renvoi d’un flux de données sur une page JSPrelative à celle de cette applet.

B ���'����#(�0�������((�����*0��(�����B������+���������������������������������������������:��#D -����(����.

Construction d’une URL relative à la page decette applet.

B ����EB>�������(�:�EB>�*��3�����(!����*+�����B������+,��

Envoi de la requête au serveur et obtention d’unflux de lecture sur les données renvoyées.

B ��������(�������(0����*+,��6

Méthode appelée à l’affichage de l’applet. B ���'�������)����*+����.

Création d’un thread pour lire les messages entâche de fond.

B ����2����)�����)9�����(�:�2����)�*+��������.

Redéfinition de la méthode ��( de la classe�������(��2����).

B ���������'�������)���(�*+��������.�����������1����������.

Annonce de l’arrivée de l’utilisateur. B �������������((�(���9������*+,

Page 337: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 325

Threads nécessaires au chatDes threads indépendants sont utilisés dans cette applet dans les deux cir-constances suivantes :• Au moment où le navigateur affiche l’applet en appelant sa méthode

��� �, l’applet annonce l’arrivée de l’utilisateur aux participants duchat, lit la liste des participants � puis démarre la lecture en boucle desmessages . Comme cette dernière opération doit continuer tant quel’applet est à l’écran � ou tant qu’aucun problème ne survient �, l’exécu-tion de la méthode ��� ne peut se terminer que si la lecture des messagesest effectuée dans un thread séparé. Afin que le dessin à l’écran des com-posants, qui est réalisé automatiquement après l’appel à ���, s’effectuesans délai, toutes les opérations nécessitant l’accès au réseau sont en faitprogrammées dans ce thread.

• Chaque fois que l’utilisateur de l’applet appuie sur la touche Entrée duclavier � dans le champ de saisie, le message qu’il a saisi doit être trans-mis au serveur et nécessite donc d’accéder au réseau. Pour que le threadSwing, qui est à l’origine de l’appel à la méthode ����(8�������), ne soitpas gêné pas cette opération, il vaut donc mieux lancer la requête sur lapage JSP dans un thread séparé �.

��������������'��/���������2�-*�/�������7��+,������������������/���������C���'��*���+,

3 Modification du label et affichage du champ desaisie.

����������������8������(�*+, 3 Lecture de la liste des participants au chat.

����������������/��������*+,����������6

3 Lecture de la liste des messages du chat.

���������������*#D -����(��-+����������.�������������������� �����*�9��<�55�K��������'��������������+,����������6��������6������6,

3 Si une exception a été déclenchée suite à un pro-blème de connexion avec le serveur, affichaged’un message d’erreur.

��������)9������*+,��6

3 Démarrage du thread.

���'�������)���*+����.

3 Méthode appelée à l’arrêt de l’applet.

������������9��������,�������1����.

3 Ne plus continuer à lire les messages dans lethread de lecture des messages.

�������((�(���3���*+,����6���������*#D -����(��-+����.�

3 Annonce du départ de l’utilisateur.

�������-���(0���2����*+,����6��66

3 Inutile d’afficher un message d’erreur à l’utilisa-teur puisque l’applet n’est plus à l’écran.

ATTENTION Exceptions déclenchées par une méthode redéfinie

Une méthode d’instance ne peut pas déclarerqu’elle est susceptible de déclencher plus de clas-ses d’exceptions contrôlées que la méthodequ’elle redéfinit. Concrètement, vous ne pouvezdéclarer avec ���:� les exceptions contrôléesque vous ne voulez pas traiter dans une méthoderedéfinie. Le cas se présente dans l’applet de chatpour sa méthode �� � et les méthodes ��(de ses threads � �, qui interceptent ici laclasse �������� -����(.

JAVA Éviter la méthode stop pour arrêter un thread

La méthode �� de la classe �������(��2����) est marquée )������). Pour arrêterun thread qui effectue des instructions en boucle,utilisez une valeur booléenne indiquant au threads’il doit continuer sa tâche ou non, comme nous lefaisons avec le champ ����9��.

Page 338: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004326

Gestion de l’accès aux pages JSP du serveurLes méthodes qui accèdent aux pages JSP du serveur se répartissent en deuxcatégories :• les méthodes �((�(���9������ �, �(��1��/������ � et �((�(���3���

qui ne font que lancer une requête vers leur page JSP respective en appe-lant la méthode ��(���B�H��� � sans avoir à analyser le contenu videqui leur est renvoyé ;

• les méthodes ����8������(� � et ����/������� qui font appel àleur page JSP respective grâce à la méthode ��((���� � pour obtenir unflux de données sur les informations renvoyées par le serveur. Ce flux quicontient ici un document XML est lu et analysé par les méthodes����E���������A/> � et ����/�������A/> de l’analyseur XML, afind’afficher à l’écran les participants au chat et leurs messages.

Toutes les pages ��� nécessaires à l’applet sont décrites avec les paramètres�((�(���9������, �((�(���3���, ������/������, ����8������(�,����/������� de la balise ��� qu’interrogent les méthodes avec la méthode��8�������. Ce paramétrage permet de modifier aisément le nom de cespages JSP sans retoucher à l’applet, fonctionnalité utilisée dans la dernièrepartie de cet ouvrage consacré à la synchronisation des threads. Pour pouvoirexprimer ces pages sous forme d’URL relatives à la page ������ où la balise���� ��)������������������9������ ���� est déclarée, la méthode��((���� utilise le constructeur �'��� EB>*�����(��EB> ����

�������(��0��(� ���B������+ de la classe �����(��EB>, en lui donnant enpremier paramètre l’URL de la page ������ renvoyée par la méthode��3�����(!��� �.

La classe ���������������9(��1����A/>%����de l’analyseur XML est définie à la fin duchapitre 14 « Échanger des informations avecXML ».

POUR ALLER PLUS LOINInterface utilisateur de l’applet

L’interface utilisateur du chat présentée ici estvolontairement simplifiée. Mais vous pouvezl’améliorer assez facilement en affichant parexemple la liste des participants à la droite del’applet, dans une liste de classe����-��:�(��;>��, et en rafraîchissantcette liste régulièrement grâce à la page����������(�������.Souvenez-vous aussi que l’objet���������%���� du serveur Web est associéà chaque utilisateur de l’applet et qu’il est possi-ble d’ajouter des informations dans la classe���������������E��������%���� (oumieux dans une classe dérivée) qui permettraientde personnaliser l’applet de chaque utilisateur(couleurs, délai de rafraîchissement...).

REGARD DU DÉVELOPPEUR Proxy et cookie

Il est très avantageux de programmer le serveur du chatsous forme de pages JSP ou de servlets, car cette technolo-gie simplifie la programmation du serveur et la gestiondes cookies qui assurent automatiquement l’identificationdes participants (tâches que vous auriez à programmer sivous recourriez aux sockets).De plus, si le serveur de servlets est disponible sur leport 80, comme c’est le cas d’habitude en production,vous permettrez même aux utilisateurs passant par unproxy d’utiliser le module de chat, car une applet récu-père automatiquement la configuration du proxy du navi-gateur pour lire une URL.

L’utilisation du cookie dans les requêtes envoyées par lenavigateur est assurée grâce à la bibliothèque LiveCon-nect, intégrée dans la plupart des navigateurs pour per-

mettre à une applet de faire appel à des fonctionnalitésJavaScript (LiveConnect n’est disponible sous Mac OS Xque depuis la version 10.3.3). Pour que le serveur puisse retrouver les objets associés à lasession d’un utilisateur sans LiveConnect, il faut ajouterdans l’URL elle-même une information sur la session utili-sée par le serveur en remplacement du cookie. Cetteinformation est codée en ajoutant aux fichiers des URL dela page ������ le texte �,�������(�)� ����� ���, où ����� �� est l’identifiant de session de l’utilisateur ren-voyé par l’appel ��H������0�����(*+���#)*+.

B http://wp.netscape.com/eng/mozilla/3.0/handbook/plugins/

Page 339: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 327

Page de lancement de l’appletLa page de lancement de l’applet ������ intègre la barre de navigation duforum et la balise ��� adéquate. La balise ��� inclut les balises ����avec les noms et les valeurs des paramètres requis par l’applet pour obtenirles pages JSP du chat.

Intégration du chat au forum de discussionIl nous faut donc maintenant ajouter un lien vers la page ������ dans labarre de navigation du forum pour permettre aux utilisateurs identifiés d’uti-liser le chat. Pour faire apparaître ce lien à côté du lien Nouveau sujet, on pro-cède à la modification suivante dans la page JSP � !"#$%&���&

(�������(��� (voir le chapitre 13, « Interface utilisateur du forum ») :

CHAT chat.jsp�� ����������8���������������������������)����������&�����&���)��'�)1����(�����J�����&�J�

���7�(���)�������&� !"#$%&���&(�������(�����&��'�� 3 Inclut la barre de navigation.

�������)������������������9���������)�'���������������������:�)���=5����������455����������(������((�(���9�������������������&�((�(�����������������������(������((�(���3�����������������&�((�(���)����������������(�����������/��������������������&��������������������������(���������8������(�������������&����������(��������������(���������/�����������������������&�����������������

3 Balise ��� utilisant la classe ���������������9����� installée dans le sous-dossier �������.

3 Liste des pages JSP nécessaires à l’applet pourfaire appel au serveur.

����8�������������������������)���M��(��������������������������������7&&�������(����&������&��;����&���&�

3 Message d’information affiché quand Java n’estpas installé.

�&�����&��(����&'�)1��&����

3 Fin de la balise ���.

ATTENTION Ne pas mélanger les fichiers .class

Les fichiers de l’applet de chat sont téléchargés à partir du serveur pour être exécutés par lenavigateur dans le contexte d’une applet. Ils doivent donc être rangés dans le dossier �����&������� pour être accessibles comme des fichiers ��� ou ����. Pour le forum, il ne faut pasles mettre dans le répertoire �����&� !"#$%&�������, car le serveur interdit à un internautel’accès au dossier � !"#$% d’une application Web. La commande ����� suivante compile la classe ���������������9����� et les clas-ses de l’analyseur XML dont elle a besoin, en rangeant les fichiers ������ produits dans le dos-sier �����&������� du dossier de développement :������"����������&����")��&�����&�������������X�&���&���&����&�����&9����������

�)�����(����(������������������������������$������������&��������������������������&���&)�

Figure 15–4Page �������intégrée dans le forum

Page 340: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004328

Synchronisation du module de chatComme tous les threads d’une même JVM partagent le même espacemémoire, il peut être nécessaire d’éviter dans certains cas que les threadsn’aient accès simultanément à certaines données partagées entre eux. Parexemple, si un thread est en train de modifier les éléments d’un ensemble, ilne faut pas que d’autres threads aient accès à cet ensemble tant que la modi-fication de celui-ci n’est pas terminée. Vous aurez donc besoin de synchroniserl’accès à cet ensemble, ce que nous mettrons en pratique dans le module dechat pour résoudre des problèmes de concurrence d’accès qui peuvent sur-venir sur le serveur.

États d’un threadPour utiliser correctement la synchronisation, il faut tout d’abord com-prendre par quels états passe un thread pendant sa durée de vie :1 À sa création, un thread est dans l’état nouveau.2 À l’appel de la méthode ��� sur un nouveau thread, celui-ci passe dans

l’état exécutable en rejoignant l’ensemble des threads dans le même état eten attente d’être exécutés par le microprocesseur.

3 Un seul thread pouvant être exécuté à la fois par microprocesseur, la JVMdoit élire le thread qui pourra passer dans l’état en cours d’exécution. Parmitous les threads dans l’état exécutable, la JVM choisit celui de plus grandepriorité, ou, à priorité égale, n’importe quel thread dans l’état exécutable. Unthread en cours d’exécution exécute ses instructions et garde le contrôle dumicroprocesseur jusqu’à ce qu’une des circonstances suivantes survienne :– Si le temps accordé au thread par le gestionnaire de tâches du système

s’est écoulé, il repasse alors dans l’état exécutable, ce qui permet àd’autres threads exécutables d’être exécutés à leur tour.

Figure 15–5 États d’un thread

JAVA Thread vivant

Un thread dans l’état exécutable, en cours d’exécu-tion ou bloqué est un thread vivant dont laméthode ��9���� renvoie ���.

JAVA Autres transitions

Seules les méthodes ��(, ���, ���� et�(���� sont représentées dans les transitionsde la figure 15-5, �(���� permettant deréveiller un thread bloqué dont le délai de reposn’est pas entièrement écoulé. Les classes�������(��2����) et �������(��D'���comptent d’autres méthodes liées à la synchroni-sation qui peuvent faire passer un thread dansl’état bloqué. Les plus utilisées sont étudiées dansla suite de ce chapitre.

Nouveau

Exécutable En cours

d'exécution

Mort

Bloqué

start fin de run

thread élu par la JVM

gestionnaire de tâches délai de sleep écoulé interrupt

sleep

Page 341: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 329

– Si le thread appelle la méthode de classe �����, il passe dans l’étatbloqué et repasse dans l’état exécutable quand la durée de repos s’estécoulée ou si la méthode ������ est appelée sur ce thread.

– Après l’exécution de la dernière instruction du thread, il passe dansl’état mort et ne peut plus changer d’état. Pour exécuter à nouveau lesinstructions d’un thread mort, il faut créer une nouvelle instance dumême thread puis appeler ���� sur ce nouvel objet.

Synchroniser les traitements sur les données partagéesLa synchronisation permet de désigner les blocs ou les méthodes qui ne doi-vent pas être exécuté(e)s simultanément, grâce au mot-clé ��� �������.

De la nécessité de synchroniser...La synchronisation est le plus souvent utilisée pour résoudre des problèmesde cohérence d’un objet modifié par un thread et lu par un autre en mêmetemps. Soit un objet ��������������� auquel deux threads����������� ����� et ������� �� dans l’état exécutable tentent d’accéder,l’un en appelant la méthode ������� de cet objet, et l’autre en appelant laméthode ���. Comme vous ne pouvez contrôler ni le moment où le ges-tionnaire de tâches décidera d’exécuter l’un de ces deux threads, ni la duréependant laquelle le thread élu aura le contrôle du microprocesseur, le laps detemps qu’accordera le gestionnaire de tâches au thread ����������� �����n’est donc pas forcément suffisant pour que ce thread ait le temps d’exécutertoutes les instructions de la méthode ������� �. En repassant à l’état exé-cutable, le thread ����������� ����� laissera dans ce cas les données del’objet ��������������� dans un état incohérent, ce qui peut provoquer deserreurs au moment où le thread ������� �� interviendra pour accéder àcet objet avec sa méthode ��� �.

JAVA Priorités des threads

Il est possible de donner une priorité plus ou moinsgrande à un thread avec sa méthode���������, afin que le gestionnaire de tâcheslui accorde un temps d’exécution plus ou moinslong. Toutefois, ne jouez pas sur cette priorité pourforcer l’ordre d’exécution de plusieurs threads, carle fait de donner la plus grande priorité à unthread ne lui permet pas pour autant d’acquérirl’exclusivité du microprocesseur.

Figure 15–6 Accès non synchronisé à un objet

Tem

ps

threadModification exécutable threadLecture exécutable

Instructions exécutées par threadModification

Instructions exécutées par threadLecture

États des threads

objetModifiable .modifier();

threadModification en cours d'exécution threadLecture exécutable

threadModification exécutable threadLecture exécutable

threadModification exécutable threadLecture en cours d'exécution

Données

objetModifiable cohérent

Données

objetModifiable incohérent si l'appel à

modifier n'est pas terminé

objetModifiable .lire(); �

Page 342: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004330

Synchroniser avec synchronizedSi vous n’avez pas en Java le moyen de contrôler le gestionnaire de tâches,vous avez en revanche la possibilité de synchroniser l’accès à un objet pardeux threads concurrents, sans que ces threads aient besoin de se connaîtrel’un l’autre. La synchronisation se programme grâce au mot-clé ��� �������pour signaler qu’un thread doit verrouiller un objet avant d’exécuter unensemble d’instructions accédant à cet objet. Comme l’accès au verrou (locken anglais) d’un objet est exclusif, le thread qui obtient le premier le verroud’un objet empêche les autres threads de verrouiller cet objet, tant qu’il ne l’apas libéré.

Le mot-clé ��� ������� s’emploie soit comme instruction suivie d’un blocd’instructions synchronisées sur un objet, soit comme modificateur d’uneméthode pour synchroniser l’appel à cette méthode sur un objet de sa classe.

En incluant les appels aux méthodes ������� et ��� dans des blocs��� ������� sur l’objet ���������������, les deux threads����������� ����� et ������� �� n’auront plus le droit d’accéder simulta-nément à l’objet ��������������� tant que l’un des deux blocs ��� �������n’a pas été entièrement exécuté (voir figure 15-7). Quand ces threads tententd’exécuter leur bloc ��� ������� �����������������, deux cas de figure peu-vent alors se présenter :• Soit l’objet ��������������� n’est pas verrouillé � : le thread en cours

d’exécution acquiert alors un verrou sur cet objet et exécute les instruc-tions du bloc ��� ������� �. Ce verrou reste en sa possession jusqu’à lafin du bloc ��� �������, même s’il repasse entre temps dans l’étatexécutable � �. À la fin de ce bloc �, le thread libère le verrou surl’objet ��������������� .

• Soit l’objet ��������������� est déjà verrouillé � : si le thread en coursd’exécution n’est pas celui qui a verrouillé l’objet ��������������� �, ilpasse dans l’état bloqué �, tant que cet objet reste verrouillé. Une fois quele verrou sur l’objet est libéré �, ce thread repasse dans l’étatexécutable �, ce qui lui laisse une nouvelle chance de pouvoir verrouillerl’objet ��������������� quand il sera exécuté .

��� ����������+,�������& %%/��

������� ��������� ������������������� ������

!

��� ����������������&�����������

������� ��������� �����������������

!

À RETENIR Tout objet peut être verrouillé

Tout objet Java, quelle que soit sa classe, comporteun verrou qui peut être utilisé pour empêcher quedeux threads aient un accès simultané à cet objet.

JAVA Synchronisation d’une méthode de classe

��� ������� peut être utilisé comme modifica-teur d’une méthode d’instance ou de classe. Pourune méthode de classe, le même mécanisme desynchronisation est mis en œuvre à l’appel de laméthode, mais cette fois-ci en utilisant le verrouassocié à sa classe.

ASTUCE Objets immuables partagés entre threads

Les objets immuables (immutable en anglais),comme ceux de classe ��"�#���$#%���$ ouceux des classes d’emballage sont particulière-ment intéressants en programmation multithread.Leurs données n’étant pas modifiables, ils peuventêtre partagés sans risque entre différents threads,ce qui rend inutile toute synchronisation sur de telsobjets.

Page 343: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 331

Chat : synchroniser l’accès à la liste des participantsUne des applications les plus courantes de la synchronisation concerne lesapplications Web qui partagent des objets entre plusieurs servlets ou plusieurspages JSP. Par l’exemple, voyons le problème que peut soulever le fait de par-tager l’objet ���� ������&��� de portée ����� ����� entre les pages ��������� ���"��#���, ��������� ������#��� et ����������� ������#���.

Figure 15–7 Accès synchronisé à un objet

threadModification exécutable threadLecture exécutable

États des threads

synchronized (objetModifiable) { objetModifiable.modifier (); }

threadModification en cours d'exécution threadLecture exécutable

threadModification exécutable threadLecture exécutable

threadModification exécutable threadLecture en cours d'exécution

Données

objetModifiablecohérent et non verrouillé

Données

objetModifiableincohérent mais verrouillé

par threadModification

threadModification exécutable threadLecture bloqué

threadModification en cours d'exécution threadLecture bloqué

threadModification exécutable threadLecture exécutable

threadModification exécutable threadLecture en cours d'exécution

synchronized (objetModifiable) { objetModifiable.lire(); }

Instructions exécutées par threadModification

Instructions exécutées par threadLecture

Données

objetModifiableincohérent mais verrouillé

par threadModification

synchronized (objetModifiable) { objetModifiable.modifier(); }// Autres instructions...

Données

objetModifiablecohérent et non verrouillé

par threadModification

synchronized (objetModifiable) { objetModifiable.lire(); }

Légende objetModifiable verrouillé

par threadLecture objetModifiable verrouillé par threadModification

threadModification en cours d'exécution threadLecture exécutable

synchronized (objetModifiable) { objetModifiable.modifier(); }// Autres instructions...

Page 344: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004332

Ralentir l’exécution pour révéler un problème de synchronisation

Même si les pages JSP qui partagent l’objet ���� ������&��� fonctionnentsans problème apparent, elles peuvent en fait provoquer des erreurs si la page ����������� ������#��� et l’une des deux autres pages sont appelées simul-tanément. En effet, un serveur de servlets exécute chaque requête d’un clientdans un thread séparé, ce qui lui permet de répondre en même temps auxrequêtes de plusieurs clients. Si l’appel à la méthode ������ sur l’objet���� ������&��� dans la page ��������� ������#��� est exécuté alors quela boucle �� énumérant les participants de la page ����������� ������#���n’est pas encore terminée, comment se déroulera la fin de l’énumérationpuisque l’ensemble ���� ������&��� aura été modifié entre temps ?

Le test de cette situation est difficile à réaliser car tout se joue en quelquesmillisecondes ; pour vous laisser le temps de retirer un utilisateur de la listeavec la page ��������� ������#���, alors que vous accédez à la page ����������� ������#��� dans une autre fenêtre de navigateur ou avec une autremachine, le moyen le plus simple consiste à ralentir volontairement la boucle�� de la page ����������� ������#��� en appelant la méthode ����� de laclasse ��"�#���$#'���� :

Un fois ainsi modifié le fichier ����������� ������#���, vous pouvez pro-voquer une erreur à l’aide d’un seul ordinateur en respectant la procéduresuivante :1 Ouvrez deux fenêtres de navigateur.2 Dans une des deux fenêtres, identifiez-vous sur le forum puis lancez

l’applet de chat.3 Dans la barre d’adresse de l’autre fenêtre, saisissez directement l’URL de

la page ����������� ������#��� (par exemple en tapant http://

127.0.0.1:8080/forum/chat/lireparticipants.jsp).4 Fermez rapidement (vous avez 30 secondes tout de même !) la fenêtre du

chat pour provoquer l’appel à la page ��������� ������#���.5 Une fois écoulé le délai d’attente dans la boucle �� de la page ����

������� ������#���, une erreur sera provoquée sur le serveur, qui vousrenverra la trace de la pile d’exécution de la figure 15-8.

Les pages ����������� ������#��� et ��������� ������#��� sont décrites dansla section « Pages JSP de gestion du chat » audébut du chapitre.

Boucle d’énumération de la page ����������� ������#���.

B ()���������������*����� ������&���#��������+���#���,�-���+������

Thread bloqué pendant 30 secondes pour vouslaisser le temps de tester la modification de laliste des participants.

B �����'����#������.////�+�����0��������1������� ������*��0��������1�����#��-���+)2��(����������������������*3()*�4����&�����# ��"���5�5�������������������������������������� �����#$����������������)23��������������*3()*����� �����#$��6�������������)23��2

()�!�)2

Page 345: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 333

Synchronisation des pages de gestion de la liste des participants

Pour synchroniser l’accès à l’objet ���� ������&���, il faut ajouter les blocs��� ������� adéquats dans les pages ��������� ���"��#���, ����

����� ������#��� et ����������� ������#���. Ces modifications sonteffectuées dans une nouvelle version de ces fichiers rangés dans le dossier �����"�, où seront mises aussi les pages JSP relatives à la synchronisationsur la liste des messages, étudiées dans la suite de ce chapitre.

Figure 15–8 Erreur d’accès à l’objet ���� ������&��� sans synchronisation

3

Cette trace de la pile d’exécution vous informeque l’appel de la méthode ��-� a provoqué uneexception de classe ��"�#���#&�� ��������� �����5- ������.La documentation de cette classe vous indiqueque ce type d’exception est déclenché parce qu’ilest interdit à un thread de modifier une collec-tion pendant qu’un autre thread est en traind’énumérer les éléments de celle-ci (it is not per-missible for one thread to modify a collection whileanother thread is iterating over it).

ASTUCE Vérifier l’effet de la synchronisation

En laissant l’appel à la méthode ����� dans laboucle ��� comme précédemment, vous pourrezvérifier l’effet de la synchronisation dans la page �����"��������� ������#���. Notez aupassage qu’un thread endormi conserve les ver-rous qu’il a acquis.

CHAT chatlive/annoncerarrivee.jsp()7���$�������*3��"�#���#83�)2()7��� ��������*3�95:;�,1����������������������#����3�)2()7��� ��������*3�95:;�,1����������������� �������$�� ���#����3�)2()7��� ��������*3�95:;�,1��������������� ������ ���#����3�)2

()���� ������������� ������&��������

3 Début du traitement synchronisé sur l’objet���� ������&���.

��������� ������&���#���������������1���+ 3 Ajout de l’utilisateur à l’ensemble des participants.

���!�)2 3 Fin du traitement synchronisé

()������� �������$��&���#���'������<�=�����#$��'�������+�)2�(���>��<�����$�*3����������$�#���32��(���>���������*3��-��3�"���*3()*�3;;;�6�"?//�@��;;;3�)23�2(����>��<��2

CHAT chatlive/lireparticipants.jsp(A-���"�����*3B#/3A2�()7���$�� ������'���*3����� ������-��+ �����*0'1;C3������������*3 ��#���D�#���#8E ��#���D�#�����#8E��"�#���#83�)2()7��� ��������*3�95:;�,1��������������� ������ ���#����3�)2(���������2�

()���� ������������� ������&��������

3 Début du traitement synchronisé sur l’objet���� ������&���.

�������������������*����� ������&���#��������+���#���,�-���+��������������0��������1������� ������*�����������������������������0��������1�����#��-���+)2

3 Énumération des participants au ��.

Page 346: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004334

Synchroniser les traitements dans un ordre déterminé��� ������� permet d’empêcher plusieurs threads d’exécuter en parallèle unensemble d’instructions, que ces threads se connaissent ou non. Maintenant,comment assurer que ces threads seront exécutés dans un certain ordre s’ilss’ignorent les uns les autres ? Par exemple, comment un thread����������� ����� qui a modifié les données d’un objet ���������������peut-il prévenir un autre thread ������� �� en attente que de nouvellesdonnées sont disponibles ?

Synchroniser avec wait et notifyLe recours aux méthodes <���, ������ et ������6�� de la classe��"�#���$#4��� � est la meilleure solution pour synchroniser dans un ordredéterminé l’exécution de plusieurs threads qui ne se connaissent pas. Cesméthodes sont liées au verrou de synchronisation que possède chaque objetJava.

��(����������������������*3()*�4����&�����# ��"���5�5�������������������������������������� �����#$����������������)23��������������*3()*����� �����#$��6�������������)23��2()���!

Fin du traitement synchronisé. B ���!�)2(����������2

CHAT chatlive/annoncerdepart.jsp()7��� ��������*3�95:;�,1��������������� ������ ���#����3�)2()7��� ��������*3�95:;�,1����������������������#����3�)2

Début du traitement synchronisé sur l’objet���� ������&���.

B ()���� ������������� ������&���������

Suppression de l’utilisateur de l’ensemble desparticipants.

B ��������� ������&���#����������������1���+

Fin du traitement synchronisé. B ���!�)2(���>��<�����$�*3����������$�#���32���(���>���������*3��-��3�"���*3()*�3;;;�=?//�@����;;;3�)23�2(����>��<��2

JAVA 5.0 Paquetage java.util.concurrent

De nombreuses classes de gestion avancée desthreads (pools de threads, sémaphores, variablesatomiques...) ont été ajoutées à Java 5.0 dans lepaquetage ��"�#���# �� ��� et sessous-paquetages.B http://lroux.developpez.com/article/java/tiger/

API JAVA Méthodes wait et notify de la classe java.lang.Object

Description Méthode

Met en attente volontairement le thread en coursd’exécution sur un objet verrouillé (avec éventuelle-ment un délai maximum d’attente)

���� �"����<���������<����������5- ����������� �"����<�������$ �����������������<����������5- ���������� �"����<�������$ ������������E���� ��������������<����������5- ������

Réveille les threads en attente sur un objet verrouillé ���� �"���������������� �"����������6����

Page 347: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 335

Quand la méthode <��� est appelée sur un objet ���������������

verrouillé �, le thread en cours d’exécution passe dans l’état en attente sur cetobjet et libère le verrou qu’il a acquis sur cet objet � (contrairement à unappel à la méthode ����� de ��"�#���$#'���� qui ne libère pas ce verrou).Comme l’objet est déverrouillé, un autre thread peut alors obtenir un verrousur l’objet ��������������� � et se synchroniser sur celui-ci.

Figure 15–9 Accès synchronisé à un objet avec wait et notify

threadModification exécutable threadLecture exécutable

États des threads

threadModification exécutable threadLecture en cours d'exécution

threadModification exécutable threadLecture en attente

threadModification en cours d'exécution threadLecture en attente

Données

objetModifiablenon verrouillé

synchronized (objetModifiable) { objetModifiable.wait(); objetModifiable.lire(); }

Instructions exécutées par threadModification

Instructions exécutées par threadLecture

synchronized (objetModifiable) { objetModifiable.modifier(); objetModifiable.notify(); // Autres instructions... }

Données

objetModifiablenon verrouillé

threadModification exécutable threadLecture bloqué

threadModification en cours d'exécution threadLecture bloqué

Données

objetModifiableverrouillé

threadModification exécutable threadLecture exécutable

threadModification exécutable threadLecture en cours d'exécution

synchronized (objetModifiable) { objetModifiable.modifier(); objetModifiable.notify(); // Autres instructions... }

Données

objetModifiablenon verrouillé

synchronized (objetModifiable) { objetModifiable.wait(); objetModifiable.lire(); }

threadModification en cours d'exécution threadLecture exécutable

synchronized (objetModifiable) { objetModifiable.modifier(); objetModifiable.notify(); // Autres instructions... }

Page 348: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004336

Après l’appel à la méthode <���, un thread reste en attente jusqu’à ce quel’une des circonstances suivantes survienne :• Le délai donné en argument à <��� s’est écoulé. Par défaut, ce délai est

infini.• Un autre thread a appelé la méthode ������6�� sur l’objet ���������������.• Un autre thread a appelé la méthode ������ sur l’objet

��������������� �, et le thread en attente a été choisi par la JVM parmitous ceux en attente sur cet objet.

• Un autre thread appelle la méthode ������ sur le thread en attentepour le réveiller. Notez que, dans ce cas, les deux threads ne s’ignorentpas, puisque le thread qui réveille l’autre doit avoir une référence sur cedernier.

Le thread en attente passe alors dans l’état exécutable et essaye de verrouiller ànouveau l’objet ����������������quand vient son tour d’être exécuté � �.Aussitôt qu’il obtient le verrou � , il peut alors continuer son exécutiondans le même état qu’avant l’appel à <���.

Chat : synchroniser l’envoi des nouveaux messages aux appletsLe partage de l’objet �����$��&��� de portée ����� ����� entre les pages ��������������$�#��� et ������������$��#��� pose le même problème qu’avecl’objet ���� ������&���. Cependant, au lieu d’ajouter de simples synchroni-sations à ces pages JSP, nous allons les modifier afin que la page qui énumèreles messages soit capable de générer un flux continu de données ; ce flux seraalimenté par les nouveaux messages enregistrés au fur et à mesure dansl’ensemble �����$��&��� grâce à la page d’ajout de message. L’applet de chatsera finalement modifiée afin qu’elle ne se connecte qu’une seule fois au fluxde données, et qu’elle soit capable de mettre à jour à l’écran la liste des mes-sages au fur et à mesure que de nouveaux messages arrivent du serveur.

REGARD DU DÉVELOPPEUR Synchronisation des messages du forum

L’accès aux messages du forum nécessite-il d’être synchronisé lui aussi ? Biensûr, puisque les pages JSP du forum peuvent être exécutées simultanémentelles aussi ! Toutefois, cette synchronisation est réalisée de fait par la base dedonnées elle-même. Les pages JSP du forum qui peuvent être appelées par desrequêtes concurrentes prennent soin aussi de ne partager aucune donnée et,par exemple, la liste des sujets de la page d’accueil ou celles des messages d’unsujet sont relues à chaque requête des clients (il serait possible de gérer unesorte de mémoire cache de ces listes, mais ceci sort du propos de cet ouvrage).C’est aussi pour des raisons de concurrence d’accès que les classes du forumaccédant au SGBDR ne cherchent pas, d’une requête à l’autre, à réutiliser lesinstructions précompilées dont elles ont besoin (voir le chapitre 11« Connexion à la base de données avec JDBC »).

ATTENTION wait et notify s’emploient avec synchronized

Les méthodes <���, ������ et ������6�� nepeuvent être appelées que sur un objet ver-rouillé par le thread en cours d’exécution, c’est-à-dire dans une méthode ou un bloc��� ������� qui a verrouillé cet objet. Si cen’est pas le cas, une exception de classe��"�#���$#����$��������%����5- ������ est déclenchée.

Page 349: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 337

Synchronisation des pages de gestion de la liste des messages

La synchronisation avec les méthodes <��� et ������6�� est utilisée dans le casprésent pour qu’un thread qui exécute la page �����"������������$�#���puisse prévenir � les threads exécutant la page �����"����������$��#��� �

qu’un nouveau message est arrivé sur le serveur. Ces deux pages se synchroni-sent sur le même objet ���� ������&��� � � que les pages JSP relatives à lagestion des participants au chat, car l’accès à cet objet est nécessaire, pourdéterminer si un utilisateur donné est toujours présent sur le chat � et conti-nuer ou non à lui envoyer des messages.

ATTENTION Deadlocks

Évitez quand c’est possible de multiplier lesobjets verrous afin d’éviter les interblocages oudeadlocks entre threads : un deadlock peut surve-nir quand, par exemple, deux threads restentdans l’état bloqué parce que l’un d’eux attendqu’un objet soit déverrouillé par le second, alorsque le second attend qu’un autre objet soitdéverrouillé par le premier thread. C’est à vous defaire attention qu’un deadlock ne survienne pas.

CHAT chatlive/ajoutermessage.jsp()7���$�������*3 ��#���D�#���#8E��"�#���#83�)2()7��� ��������*3�95:;�,1����������������������#����3�)2()7��� ��������*3�95:;�,1����������������$�� ���#����3�)2()7��� ��������*3�95:;�,1��������������� ������ ���#����3�)2

()���� ������������� ������&����������

3 Début du traitement synchronisé sur l’objet���� ������&���.

�������������������*������$��&���#���������+���#���,�-���+��������������������$�1��������$��*�������$�1�����#��-���+�������������%�����# ���'�����������������������;������$�#$��=���&��������#$��'������2�./////�������������#���"����+�����!�)2(���>��:������*3�����$�3� ����*3 ��#���D�#���#�����$�1��32���(���>��������������*3�����$�3�������*383�2���()������$�#���6������������1���+�)2(����>��:���2

3 Suppression des messages datés de plus de5 minutes.

()��������$��&���#������������$��+ 3 Ajout du message à l’ensemble des messages.

��������� ������&���#������6����+�� 3 Notification aux threads en attente.

���!�)2 3 Fin du traitement synchronisé.

CHAT chatlive/liremessages.jsp()7���$�� ������'���*3����� ������-��+ �����*0'1;C3�����������*3 ��#���D�#���#8E ��#���D�#�����#8E��"�#���#83)2()7��� ��������*3�95:;�,1����������������$�� ���#����3�)2()7��� ��������*3�95:;�,1����������������� �������$�� ���#����3)2()7��� ��������*3�95:;�,1��������������� ������ ���#����3�)2()7��� ��������*3�95:;�,1����������������������#����3�)2

()�<����������� 3 Boucle de production du flux continu.

�������� ������������� ������&�������������

3 Début du traitement synchronisé sur l’objet���� ������&���.

�����������F���� ������&���# �����������������1������������������D+

3 Si l’utilisateur ne participe plus au chat, arrêt dela boucle produisant le flux de données continu.

���������# ���:�����+��)2(A-���"�����*3B#/3A2��

3 Effacement des données dans la mémoire tam-pon du flux de la réponse.

Page 350: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004338

La page �����"����������$��#��� ne produit pas le flux d’un seul documentXML, comme cela pourrait sembler normal, mais le flux de plusieursdocuments �, à raison d’un par cycle �. Ce format de données est imposépar la méthode ��������$��G�� de la classe ��#���D�#���#

6������G��1�� : cette méthode qui est appelée par l’applet pour lire lesmessages d’un document XML n’est en effet capable d’analyser que des docu-ment XML bien formés se terminant par une balise de fin (������$��2. Pourassurer que chaque document XML créé débute bien par le prologue(A-�� "�����*3B#/3A2 dès le premier caractère �, les blancs typographiquessuperflus sont éliminés de la mémoire tampon de la réponse grâce la méthode ���:��� �. Les nouveaux messages sont ensuite produits et un symbolenul est écrit afin de faciliter le repérage de la fin du document par l’appletcliente. La mémoire tampon de la réponse est finalement écrite sur le flux dedonnées pour que l’applet reçoive immédiatement le document XML.

(�����$��2����()���������������*������$��&���#���������+���#���,�-���+������������������������$�1��������$��*�������$�1�����#��-���+���������=���������������������$��*������$�#$��=���&��������+����������������������$�#������������ �������$��&����������������)2����(�����$������&������*3()*����������$�#$��'������)23��������������*3()*�4����&�����# ��"���5�5��������������������������������������������������$�#$��6�������)23�2����()*�4����&�����# ��"���5�5������������$�#$��'�-�������)2��(������$�2�����()���!�������!������������� �������$��&���#���'����%�����# ���'������������+�)2(������$��2

Écriture d’un symbole de séparation entre deuxdocuments XML.

B ����()���#<����/�+�

Écriture des données en mémoire tampon. B ���������#������+�)2�

Attente des messages suivants. B ()��������� ������&���#<�����+��

Fin du traitement synchronisé. B �����!�)2

REGARD DU DÉVELOPPEUR notify ou notifyAll

Il faut utiliser dans le cas présent la méthode ������6�� plutôt que ������, caril est possible que plusieurs threads soient en attente, étant donné que le ser-veur Web lance un thread séparé pour chaque requête d’un client afin d’yrépondre simultanément. Si la méthode ������ était appelée, un seul thread,choisi au hasard, serait prévenu et donc une seule applet cliente recevrait lesmises à jour.

POUR ALLER PLUS LOIN Produire un seul document XML et l’analyser avec SAX

L’utilisation d’un analyseur SAX côté client pourraitparaître plus judicieuse car il permettrait de pro-duire côté serveur le flux d’un seul document XMLqui serait analysé au fur et à mesure de l’arrivéedes données dans le flux. Cependant, l’analyseurSAX de la bibliothèque standard Java utilised’office une mémoire tampon à la lecture du docu-ment XML, qui provoque une analyse des donnéesbloc par bloc et empêche l’affichage des messagesaussitôt qu’ils sont reçus par l’applet cliente.

Page 351: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

15 –

Mes

sage

rie in

stan

tané

e av

ec la

pro

gram

mat

ion

mul

titâc

he

© Groupe Eyrolles, 2004 339

Applet de lecture du flux continu de messages

Au lieu de demander à intervalle régulier la liste des nouveaux messages stoc-kées sur le serveur, la nouvelle version de l’applet de chat doit se connecter auflux de données continu renvoyé par la page �����"����������$��#���, et lireles nouveaux messages au fur et à mesure qu’ils arrivent. Ces opérations sontréalisées dans une sous-classe de �������������� ��������� � où laméthode ��������� est redéfinie �, la référence aux nouvelles pages JSP dudossier �������� s’effectuant dans la nouvelle page �����������.

Après s’être connectée à la page JSP �, la méthode lit en boucle � lesoctets reçus sur le flux de données en les stockant � dans une mémoiretampon de classe ������������ ���������������� �. Chaque fois qu’unsymbole de séparation signalant la fin d’un document XML est lu �, lesoctets en mémoire tampon sont récupérés , puis les messages qu’il con-tient sont analysés et affichés grâce à la méthode �������������� � enlui passant un flux de données alimenté à partir des octets lus .

CHAT com/eteks/forum/AppletChatLive.java������������������������������������� �

��!�������� ���������������"��#$� �����������%

3 Sous-classe de �������������� ���������.

����!�������$�����������&'�����(�)�*"������#����%

3 Redéfinition de la méthode de la super-classe.

����)#������������"��������+���������������������##������&���,���������&-���������-''��������������%

3 Connexion à la page JSP renvoyant le flux demessages.

���������� �����������������!����+�#�(����� ����������������&'����������#��!�

3 Création d’une mémoire tampon d’octets.

������(�����&&!�+���"�����������$�&''�.+�/0'�� 3 Boucle de lecture des octets du flux.

����������&!�.+�1'����������!����(����&!'���

3 Ajout à la mémoire tampon des octets lus qui nesont pas le caractère de séparation des docu-ments XML.

���������������������%

3 Si le symbole de séparation est rencontré...

����������!����23���������+�!���������� ����&'������������)#������������"������+��������������������������#�(����� ����)#���������&�������'���������������������������&��"�����'���

3 ... récupération du tableau d’octets lus et affi-chage des messages.

����������!��������&'���������4����4�����#��������%��������"������������&'�����4��44

3 Vide la mémoire tampon, avant de lire la suite.

Page 352: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004340

Page de lancement de l’applet

Le lancement de la version synchronisée du module de chat s’effectue grâceà la page ����������� dont la balise ������ fait référence à la classe�������������� ������������� et aux pages JSP stockées dans le dossier��������.

Pour permettre aux utilisateurs d’utiliser cette nouvelle version du chat, ilreste finalement à remplacer le lien vers la page ������� par un lien vers lanouvelle page ����������� dans la barre de navigation du forum créée par lapage JSP 5*�/)678��8#��������#��� :

En résumé...Dans ce dernier chapitre, nous avons vu comment ajouter au forum de dis-cussion un module de chat qui a recours à la programmation multithread,autant côté client pour rendre l’interface utilisateur d’une applet plus réac-tive, que côté serveur pour synchroniser le partage d’informations entre despages JSP qui sont exécutées simultanément.

CHAT chatlive.jsp9:;�����������,���+-���������-�:<9����<9���$<9�����<���������98�����<98���$<9!�$�<9��#���<9�0<���������98�0<

Inclut la barre de navigation. B 9��=�#���$������+-85*�/)678��8#��������#���-�8<9!�<

Balise ������ utilisant la classe�������������� ������������� instal-lée dans le sous-dossier ����.

B 9���������$�+-�������������� �������������-���$�!��+-����-��������(�$��+->1:-�������+-?11-<

Liste des pages JSP nécessaires à l’applet pourfaire appel au serveur.

B ��9������#���+-�##�#��� ������-�������+-��������8�##�#�������������-<��9������#���+-�##�#���@�����-��������+-��������8�##�#���$��������-<��9������#���+-������������-��������+-��������8���������������-<��9������#���+-����,��������#�-������+-��������8�������������#����-<��9������#���+-���������-����������+-��������8������������-<

��9�<,�������������������A�����$���B��#�����������������������9�����+-����=88������#����8�������8-<C���98�<98�<98������<98��#���<98!�$�<98����<

����9�$�����#+-��#���-<������9�����+-������������-<6�����������98�<������9�����+-�����������-<����98�<����98�$<

REGARD DU DÉVELOPPEUR Programmation synchronisée

La programmation de la synchronisa-tion des threads est une tâche ardue,sur laquelle vous passerez sûrement dutemps... Pour bien l’utiliser, il faut biens’imaginer par quels états vont passerles threads, quelle implication aural’utilisation des méthodes (��� et#���� sur l’ordre d’exécution des ins-tructions du programme, tout en gar-dant bien à l’esprit que ces méthodesne peuvent être appelées que sur desobjets verrouillés.Le piège le plus classique est de seretrouver avec un deadlock parce queles threads sont tous en attente aprèsavoir appelé la méthode (���.

Page 353: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

© Groupe Eyrolles, 2004

Annexes

A. Types de licences logiciellesDe nombreuses classes Java développées par des entreprises ou des particuliers sontdisponibles sur Internet ou sur des CD-Rom de démonstration. Que le code sourcede ces classes soit disponible ou non, n’oubliez pas qu’elles sont utilisables unique-ment sous les conditions de la licence concédée même si celle-ci n’est pas citée.Suite à l’essor des logiciels libres (free en anglais à ne pas confondre avec gratuit !),on distingue aujourd’hui quatre grandes catégories de logiciels :• Les logiciels du domaine public. Ces logiciels peuvent être utilisés, modifiés et dis-

tribués complètement librement, leur(s) auteur(s) ayant abandonné leurs droits.• Les logiciels libres distribués sous license Apache ou GNU LGPL. Ces logi-

ciels peuvent être utilisés, modifiés et distribués en respectant certaines condi-tions assez peu contraignantes. Vous pouvez notamment réutiliser les classesou les bibliothèques distribuées sous cette licence dans des logiciels non libresou propriétaires (voir aussi http://www.apache.org/foundation/licence-FAQ.html pour plusde détails).

• Les logiciels libres distribués sous license GNU GPL. Contrairement auxlogiciels précédents, vous ne pouvez réutiliser les classes ou les bibliothèquesdistribuées sous cette licence que dans des logiciels libres eux aussi et disponi-bles sous une licence comparable. Ceci vous interdit donc de les réutiliser dansdes logiciels propriétaires (voir aussi http://www.gnu.org/philosophy/philosophy.fr.html

pour plus de détails)• Les logiciels propriétaires. Ces logiciels ne peuvent être généralement réutili-

sés que sous certaines conditions contraignantes même s’ils sont distribuésgratuitement. C’est la licence par défaut.

En cas de doute sur la licence des classes que vous désirez réutiliser dans votre pro-gramme, écrivez à son auteur pour plus d’information. Si vous avez l’intention de dis-tribuer vos propres classes, n’hésitez pas à opter pour l’une des licences précédentes.

Page 354: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004342

B. Fichiers du forum de discussion Les fichiers nécessaires au fonctionnement du forum et du chat sont organiséssous forme d’une application Web Java, ce que montre la figure ci-dessous.

La génération du fichier �����(�� de l’application Web est effectuée grâceau fichier de commandes !���$������. Celui-ci effectue les actionssuivantes :1 Compilation des classes nécessaires à l’application Web en les rangeant

dans le dossier ����85*�/)678����.2 Compilation des classes nécessaires à l’applet de chat en les rangeant

dans le dossier ����8����.

Fichiers de l'application Web forum.war

Fichiers .class générés par javac

Pages JSP du forum et du chat

Classes de l'applet de chat

Bibliothèque non standard

Classes de l'application Web

Ne sont représentés dans la figure que lesfichiers du dossier de développement stricte-ment nécessaires au forum. L’application Webdu forum n’a pas besoin de fichier de descrip-tion 5*�/)678(�!�"��.

Mise en route du forum

Il suffit de déposer le fichier �����(�� dans ledossier (�!��� de Tomcat pour déployer leforum.

Page 355: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 343

3 Création du fichier d’archive !�#8�����(�� avec le contenu du dossier����.

Le diagramme de classes UML ci-dessous présente les différentes classes duforum et du chat, avec leurs champs et/ou leurs méthodes principales.

FORUM buildforum.sh������/�����������8���/$��8����85*�/)678�����X�8��8���8����8����8D���������7����������X�8��8���8����8����8*#��!��D���������7����������X�8��8���8����8����8*#��!�������7����������X�8��8���8����8�����8���@�,��������X�8��8���8����8�����8���������#������

������/�����������8���/$��8����8�����X�8��8���8����8����8 ������������������

����/����8!�#8�����(����/���8������

Le fichier !���$�����!�� contient les mêmescommandes avec des caractères E à la place descaractères 8.

com.eteks.outils

com.eteks.forum

- pseudonyme- motDePasse- autorisation

Utilisateur

+ rechercher(conn)+ ajouter(conn)

UtilisateurForum

- auteur- dateCreation- sujet- texte

Message

+ rechercher(conn)+ ajouter(conn)+ mettreAJour(conn)

- id

MessageForum

+ getConnexion()+ fermerConnexion()

- driver- chaineConnexion- login- password

ConnecteurForum

+ ajouter(utilisateur)+ supprimer(utilisateur)+ contient(utilisateur)+ iterator()

- utilisateurs

EnsembleUtilisateursForum

+ ajouter(message)+ iterator()+ rechercherSujets(conn)+ rechercherMessagesSujet (conn,sujet)

- messages

EnsembleMessagesForum

+ lireUtilisateursXML(flux)+ lireMessagesXML(flux)

AnalyseurXMLForum

+ init()+ start()+ stop()+ annoncerArrivee()+ lireParticipants()+ lireMessages()+ envoyerMessage()+ annoncerDepart()

- texteMessages- saisieMessage

AppletChat

+ lireMessages()

AppletChatLive

+ creer()

MotDePasse

+ limiterLongueur(chaine,max)+ convertirEnEntites(chaine)+ convertirEnHTML(chaine)

OutilsChaine

Page 356: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004344

C. Précisions sur les commentaires javadoc Un commentaire entre 8 8 est un commentaire ����$�� utilisé avant ladéclaration d’une classe, d’une interface, d’un champ, d’une méthode oud’un constructeur. Ce commentaire est un texte descriptif au format HTML suivi éventuelle-ment de balises ����$�� précédées du caractère ; comme ;����� ou ;�����#.Par convention, un commentaire ����$�� répète le caractère à chaque débutde ligne, caractère omis dans la documentation générée.B http://java.sun.com/j2se/javadoc/

La première phrase d’un commentaire ����$�� est affichée dans le résumé dela documentation d’une classe.

Balise javadoc Usage

;��������&��&� Décrit l’auteur d’une classe ou d’une interface. Peut être répété pour citer plusieurs auteurs.Exemples :;������� ���$�@���#�;�������F������@���#$

;�����#����� �� Décrit la version d’une classe ou d’une interface. Exemple :;�����#�0�0�?

;���$%����;���$%����G���;���$%����G$%����;���$%����G������;���$%����G������3����*����5;�����������;�����������G������

Crée dans la documentation générée un lien hypertexte vers une classe, une interface, unchamp, une méthode ou un constructeur en rapport avec la classe, l’interface, le champ, laméthode ou le constructeur commenté. Exemples :;�������������������������G�������;������������������,���#�;������������������,���#�G���,��"

;���������������#������� �� Décrit un paramètre d’une méthode ou d’un constructeur. Exemple :;���������"��#����������"�$�����$����

;�����#�������� �� Décrit la valeur retournée par une méthode. Exemple :;�����#��������"�$��������$����

;�"������#�$%�����'#������� �� Décrit les circonstances dans lesquelles une méthode ou un constructeur est susceptible dedéclencher l’exception de classe $%�����'. Exemple :;�"������#��������#��)������ �����#�*"������#����������������������������#����������������#$�H���I1�

JAVA 5.0 Métadonnées ou annotations

Les commentaires ����$�� sont exploitées par des applications Java spéciales appelées desdoclets, dont le générateur de documentation au format HTML du JDK est le représentant le plusconnu. Un outil comme XDoclet se sert de la possibilité de définir des balises personnalisées afinde simplifier la génération de fichiers de configuration Hibernate, J2EE... De façon similaire, lesannotations introduites dans Java 5.0 permettent d’ajouter des informations déclaratives avant ladéclaration d’une classe, d’un champ, d’une méthode ou d’un constructeur grâce à des balises quidébutent aussi par le symbole ; (comme l’annotation ;������$� placée avant une méthoderedéfinie qui force ����� à vérifier sa signature).B http://xdoclet.sourceforge.net/B http://adiguba.developpez.com/tutoriels/java/tiger/annotations/

Page 357: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 345

D. Contenu du CD-Rom d’accompagnementLe CD-Rom d’accompagnement contient les études de cas présentées danscet ouvrage et les outils nécessaires à leur exécution, c’est-à-dire le JDK,MySQL et Tomcat. Ce CD-Rom contient aussi ConTEXT, un éditeur detextes pour écrire vos premiers programmes Java sous Windows, ainsi queJBuilder 2005 Foundation et Eclipse 3.1 deux des IDE les plus puissants dumarché.

Études de cas de l’ouvrageLe dossier � J)*K contient un fichier compressé des études de cas de cetouvrage à destination de chacun des systèmes sur lesquels elles ont été testés :• ������C����B�� pour Windows à décompresser avec l’outil de votre choix

ou avec la commande ���� "� ������C����B�� (contient les fichiers decommandes �!�� des applications) ;

• ������C���������B pour Linux à décompresser avec la commande ����"B������C���������B (contient les fichiers de commandes �� desapplications) ;

• ������C����$�� pour Mac OS X à installer en lançant l’application Installa-tion Cahier Java après avoir double-cliqué sur cette image de disque (con-tient les fichiers de commandes �� et les dossiers ���� des applications).

JDKLe dossier C@L contient les programmes d’installation du JDK version1.5.0_06 pour Windows 98/ME/2000/XP et Linux x86, ainsi que la docu-mentation des API de la version 1.5 du J2SE. L’installation du JDK et de sadocumentation est décrite au chapitre 2.

MySQLLe dossier �M�N� contient les programmes d’installation du SGBD MySQLversion 5.0.18 pour Windows 95/98/ME/2000/XP, Linux x86 etMac OS X, ainsi que le fichier ��H�/��##�����/����/?�0�0I�B�� qui con-tient le driver JDBC MySQL/Connector J version 3.1.12. L’installation deMySQL et de son driver JDBC est décrite au chapitre 11 « Connexion à labase de données avec JDBC ».

TomcatLe dossier O��� O contient le fichier �������/������/P�0�?0�B�� d’installation deTomcat pour tout système. L’installation et le lancement de Tomcat est décrite auchapitre 12 « Programmation Web avec les servlets, JSP et JavaBeans ».

Il est rappelé que le JDK est préinstallé sous MacOS X.

Page 358: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004346

ConTEXTLe dossier ��6O*�O contient le programme d’installation ��#O*�O������"� del’éditeur ConTEXT version 0.98.3 pour Windows. ConTEXT est un édi-teur gratuit suffisant pour débuter la programmation en Java ou pour éditerdes programmes sur une configuration matérielle ancienne.

InstallationLancez ensuite le programme d’installation ��#O*�O������"� puis laissez-vous guider. ConTEXT s’installe dans le dossier de votre choix.

DémarrageLancez le programme Context. Si vous le désirez, le français peut être utilisécomme langue d’affichage en sélectionnant l’élément Environment options...du menu Options, puis en choisissant le français dans la liste proposé en basde la boîte de dialogue affichée et en relançant l’éditeur. Sélectionnez Javacomme langage par défaut de l’éditeur dans l’option Syntaxe de l’ongletEditeur de cette même boîte de dialogue pour que les nouveaux fichiers béné-ficient de la coloration syntaxique Java.

Création des classesComme ConTEXT est un éditeur de textes général, vous n’avez qu’à sélec-tionner l’élément Nouveau du menu Fichier pour créer une classe dans unnouveau fichier.

ConTEXT est diffusé sur le CD-Rom d’accompagne-ment avec l’autorisation expresse de son auteurEden Kirin.http://www.context.cx/

Page 359: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 347

Édition des classesOutre les outils classiques d’un éditeur que vous retrouverez dans le menuEdition, quelques outils sont mis à votre disposition dans le menu Formatpour accélérer l’édition des classes : indentation en bloc de plusieurs lignes,mise en commentaire de code mais aussi l’option Insérer code depuis modèlequi permet de générer des portions de code en ne tapant que quelques let-tres, par exemple pour créer une boucle à partir du mot ��. La liste desmodèles est disponible par le biais de l’élément Modèles de code... du menuOptions.

Compilation et exécutionSi vous souhaitez compiler ou exécuter une application directement à partirde ConTEXT, vous devez construire les commandes ����� et ���� corres-pondantes grâce aux outils de l’onglet Touches d’exécution de la boîte de dia-logue Options d’environnement.

Borland JBuilder 2005 FoundationLe dossier C�D)�@*K contient les programmes d’installation de l’IDEJBuilder 2005 Foundation de Borland pour Windows, Linux et Mac OS X.JBuilder 2005 Foundation est un IDE gratuit qui vous permet de développerdes applications Java à caractère non commercial.

ASTUCE Gérer les fichiers courants

Le Panneau de fichiers de ConTEXT intègre unexplorateur de fichiers, une liste de fichiers favoriset un historique qui vous aide à retrouver lesfichiers dont vous vous servez le plus souvent. Ilest aussi possible de créer de nouvelles listes per-sonnalisées grâce aux éléments du menu Projet.

POUR ALLER PLUS LOIN JBuilder 2005 Developer et Enterprise

JBuilder 2005 Developer et JBuilder 2005 Enter-prise, versions plus riches en fonctionnalités, sontdisponibles en version d’évaluation sur le site deBorland. Leurs possibilités apparaissent en grisédans les menus de la version JBuilder 2005 Foun-dation.Les documentations annexes à JBuilder ne sontpas incluses sur le CD-Rom d’accompagnement.

Page 360: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004348

Systèmes supportés• Windows NT/2000/XP• Linux, notamment Red Hat Linux 7.3 ou Red Hat Enterprise Linux 2.1• Mac OS X, version 10.3

InstallationSous Windows et Mac OS X, décompressez le fichier �!I11QR#!R�����������avec l’outil de votre choix ou avec la commande (si vous avez installé le JDK) :

Sous Linux, décompressez le fichier �������� ����� avec l’outil de votrechoix ou avec la commande :

Sous Windows, Linux et Mac OS X, lancez ensuite le programme d’instal-lation ��� � situé dans le dossier créé puis laissez-vous guider.JBuilder 2005 s’installe dans le dossier de votre choix avec les outils de déve-loppements Java.

DémarrageLancez le programme Borland JBuilder 2005 Foundation. Au premier lance-ment, JBuilder vous demande si vous voulez associer à cet IDE les fichiersd’extension ����� ����� ���� et ���� (les deux derniers sont relatifs à desfichiers propres à JBuilder).

Des informations présentant JBuilder 2005 et les fichiers du projet ������créé par défaut sont finalement affichés : vous pouvez les utiliser pour testerJBuilder ou simplement les ignorer.

Création d’un projetPour créer un projet, choisissez l’élément Nouveau projet... dans le menuFichier. L’Expert projet (Project Wizard en anglais) qui s’affiche vous proposealors les trois étapes suivantes.1 Choisir le nom de votre projet et le dossier dans lequel il sera enregistré.2 Sélectionner les chemins où seront rangés les fichiers source �����, les

fichiers �����, les fichiers générés par �������, ainsi que les bibliothè-ques nécessaires à votre projet et le répertoire de travail dans lequel seralancée la JVM pour exécuter votre application.

3 Choisir l’encodage des fichiers du projet et les valeurs de certains libellés�������.

���������������������������

��������������������� �����

SOUS MAC OS X Installation sous Mac OS 10.4

Si le programme d’installation de JBuilder ne fonc-tionne pas sous Mac OS 10.4, configuré avec leJDK 1.5 par défaut, il vous faudra effectuer lesajustements suivants : dans l’application JavaPreferences du dossier Applications/Utilitai-res/Java/J2SE 5.0, positionnez l’élément J2SE1.4.2 en tête de la liste Réglages de moteurd’exécution de l’application Java. Ensuite,dans une fenêtre de Terminal, modifier le JDK pardéfaut en lançant les commandes suivantes :����� � ���!����� �"����#��$����������X�%���&'������#��$�&��������

��������(����� %)*�������+��,�-���(����� %)*

Pour revenir par défaut au JDK 1.5, remplacer ladernière ligne par :�������+��,�����(����� %)*

B.A.-BA Notion de projet au sein d’un IDE

La notion de projet est très importante dans unIDE : elle correspond en fait à un dossier de déve-loppement dans lequel vous créez et compilez lesfichiers source d’une application (ou de plusieurs)et regroupe toutes les options de compilation etd’exécution des commandes ����� et ����, quisont lancées indirectement par les menus d’un IDE.

POUR ALLER PLUS LOIN Autres options d’un projet

D’autres options sont disponibles sur un projet,comme celles relatives au formatage du code pourla position des accolades, l’indentation, la gestiondes retours à la ligne... Vous retrouverez cesoptions dans la boîte de dialogue affichée ensélectionnant l’élément Propriétés du projet...du menu Projet.

Page 361: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 349

Création des classesLa création de classe s’effectue grâce à des experts qui vous guident en fonc-tion du type de classe que vous désirez (classe simple, application, applet...).Les classes simples se créent grâce à l’élément Nouvelle classe... du menuFichier qui lance une boîte de dialogue Expert classe dans laquelle vous rensei-gnez l’identificateur de la nouvelle classe, son paquetage, sa super-classe etdiverses options comme l’ajout d’une méthode ����, l’implémentation auto-matique des méthodes abstraites... À la confirmation de cette boîte de dia-logue, la classe est créée dans le dossier des sources du projet et les sous-dos-siers correspondant à son paquetage sont créés automatiquement sinécessaire.

Édition des classesOutre les outils classiques d’un éditeur que vous retrouverez dans les menusEdition et Chercher, trois fonctionnalités sont particulièrement utiles pendantl’édition de vos classes :• la vérification syntaxique à la volée qui vous avertit des erreurs que vous

avez faites ;• la complétion automatique qui vous propose les packages à importer, les

méthodes disponibles sur un objet ou une classe... La complétion se déclen-che soit volontairement grâce au raccourci clavier Ctrl + Espace, soit automa-tiquement dans certaines situations. Observez bien son comportement carc’est très probablement l’outil qui améliorera le plus votre productivité ;

• les modèles de code Java (templates) qui permettent de générer des por-tions de code en ne tapant que quelques lettres, par exemple pour créerune boucle d’itération à partir du mot � ��. Cette fonctionnalité s’obtientgrâce au raccourci clavier Ctrl + J après avoir saisi l’un des mots de la listedes modèles disponibles. Cette liste est visible dans la section Editeur /Modèles / Java de la boîte de dialogue Préférences lancée par l’élémentPréférences... du menu Outils.

En cliquant sur l’onglet Bean d’une classe �����, vous accéderez à la fonc-tionnalité de l’outil BeansExpress. L’onglet Propriétés de cet outil permet de

JAVA 5.0 Utilisation de Java 5.0 dans JBuilder

Pour utiliser les nouvelles fonctionnalités de Java 5.0 dans un projet JBuilder, il faut installeraussi le JDK 1.5 car JBuilder est fourni avec Java 1.4. Sélectionnez ensuite l’élémentPropriétés du projet... du menu Projet, et affichez la section Chemins (Paths) dans laboîte de dialogue qui s’affiche. Cliquez sur le bouton ... en regard du JDK puis dans la boîtede dialogue Selection d’un JDK, cliquez sur le bouton Nouveau... pour spécifier le che-min d’installation du JDK 1.5. Dans la section Construction > Java des propriétés du pro-jet, il faudra finalement choisir l’élément Java 2 SDK v 5.0 dans les listes déroulantesFonctionnalités du language et VM cible.

POUR ALLER PLUS LOIN Menu Refactoring

Les éléments du menu Refactoring vous permet-tent de renommer la classe, la méthode ou lavariable en cours de sélection dans l’ensemble desfichiers ����� d’un projet, mais aussi d’engloberdes instructions avec � ��� �..

Page 362: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004350

générer automatiquement les accesseurs �� et les mutateurs �� des pro-priétés de composants JavaBeans en cliquant sur les boîtes à cocher descolonnes getter et setter.

Compilation et exécutionIl suffit d’utiliser les éléments du menu Projet pour compiler les fichiers �����d’un projet, et les éléments du menu Exécuter (Run en anglais) pour lancerune application ou la déboguer.

Conception de l’interface utilisateurJBuilder 2005 contient un outil de conception qui permet d’éditer interacti-vement l’interface utilisateur d’une application. Pour y accéder, cliquez surl’onglet Conception d’une sous-classe de conteneur Swing (comme�������#����%/��� ou �������#����%"����) de votre projet. S’affichent alorsla liste des composants que vous pouvez ajouter à un conteneur, la structurehiérarchique des composants visualisés et la liste des propriétés disponiblessur le composant en cours de sélection, comme son identificateur, son layout,ses dimensions...

Ajout de composantsPour construire une interface, sélectionnez le layout de votre conteneur grâceà sa propriété Layout, puis ajoutez-y les composants ou les sous-conteneursde votre choix en cliquant sur leur icône et en cliquant soit dans leur conte-neur à l’écran, soit sur l’identificateur de leur conteneur dans la structure hié-rarchique des composants. La position d’un composant (�0�1, (02103...) estgérée grâce à la propriété Constraints, si besoin est.

Le code Java qui correspond à l’interface est généré par l’outil de conceptiondans la classe en cours d’édition sous forme de champs et d’instructionsincluses dans la méthode ��4�� appelée par le constructeur de la classe.JBuilder vous autorise à éditer manuellement cette méthode si nécessaire.

Ajout de listeners

JBuilder facilite aussi la programmation événementielle en créant automati-quement la structure des listeners dont vous avez besoin : cliquez sur le com-posant sur lequel vous voulez ajouter un traitement événementiel, sélec-tionnez l’onglet Evénements à côté de l’onglet Propriétés, saisissez l’identifica-teur d’une méthode en regard de l’événement qui vous intéresse puis tapezsur Entrée. L’outil de conception vous positionne alors directement dans lebloc de la méthode que vous avez saisie et vous n’avez plus qu’à programmerles instructions du traitement !

Voir figure page 347.

ATTENTION Dimensions des composants

La taille du conteneur affichée par l’outil de con-ception n’est pas forcément celle que vousobtiendrez au final. Si vous appliquez par exem-ple la méthode ���$ au conteneur, sa tailledépendra du layout choisi et des dimensionspréférées des composants ajoutés au conteneur.

ATTENTION Style du code généré

Pour que le modificateur d’accès des champsgénérés soit ����� � et que la structure géné-rée pour les listeners d’événements utilise desclasses anonymes, il faut modifier les optionsproposées par l’onglet Généré de la sectionFormatage des Propriétés du projet.

Page 363: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 351

Eclipse 3.1Le dossier 0(!4/�0 contient les programmes d’installation de l’IDE Eclipseversion 3.1.1 pour Windows, Linux et Mac OS X. Eclipse est un IDE OpenSource sur lequel est basé l’IDE WebSphere Studio d’IBM.

REGARD DU DÉVELOPPEUR JBuilder 2005 vs Eclipse

JBuilder 2005 est un IDE simple à installer et à appréhender pour lesdébutants : il inclut le JDK 1.4.2, les versions francisées des erreurs de compila-tion ����� et de nombreux outils faciles d’accès. Certaines fonctionnalitéscomme la création d’applications Web ou d’EJB sont par contre disponiblesuniquement dans les versions payantes.Eclipse est un IDE Open Source, offrant des fonctionnalités diverses grâce à denombreux plug-ins inclus en standard. Il est de plus en plus utilisé en entre-prise et sert de base à l’IDE WebSphere Studio d’IBM.JBuilder 2005 a un outil de conception d’interface utilisateur Swing que nepropose pas Eclipse en standard. Ces deux IDE incluent la gestion de CVS pourgérer l’archivage des fichiers d’une équipe.Pour information, JBuilder 2005 et Eclipse sont eux-mêmes des applicationsJava ; l’interface utilisateur de JBuilder 2005 est réalisée avec Swing, tandisque celle d’Eclipse est réalisée avec SWT, une bibliothèque de composants Javacréée pour cet IDE.B http://www.borland.fr/jbuilder/B http://www.eclipse.org/

Page 364: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004352

Systèmes supportés• Windows : Windows 98/ME/2000/XP• Linux : version GTK 2 pour x86• Mac OS X : Mac OS 10.3

InstallationInstallez le JDK comme indiqué dans le chapitre 2, puis décompressez lefichier ������+�)*+5�,�,���� avec l’outil de votre choix ou avec lacommande :

Sous Linux, rendez la commande ������ du dossier ������ exécutablegrâce à la commande :

DémarrageLancez le programme Eclipse de votre système situé dans le dossier ������(���������� sous Windows, ������ sous Linux ou 0��������� sous MacOS X).

Au premier lancement, Eclipse vous demande de renseigner le chemin devotre dossier de travail (Workspace) où seront rangés par défaut les projets.Une page d’accueil vous présentant les fonctionnalités d’Eclipse est finale-ment affichée.

Création d’un projetPour créer un projet, choisissez l’élément Project... dans le sous-menu New dumenu File. Après avoir sélectionné le type de projet Java Project, l’assistant(wizard) New Project qui s’affiche vous propose alors de choisir le nom devotre projet, le dossier dans lequel il sera enregistré, la version du JDK (5.0ou autre) avec lequel il est compatible, ainsi que les sous-dossiers où serontrangés les fichiers source ����� et les fichiers ����� si vous désirez lesséparer. Cet assistant permet aussi de sélectionner les sous-projets et lesbibliothèques nécessaires à votre projet.

�������������+�)*+5�,�,�����

�.����6���������������

POUR ALLER PLUS LOIN Autres options d’un projet

D’autres options comme le chemin où sont rangés les fichiers générés par ������� et certainesoptions de compilation sont disponibles sur un projet. Vous retrouverez ces options dans la boîtede dialogue affichée en sélectionnant l’élément Properties... du menu Project. Les optionscommunes à tous les projets comme celles relatives au formatage du code pour la position desaccolades, l’indentation, la gestion des retours à la ligne... dépendent de la boîte de dialogueaffichée en sélectionnant l’élément Preferences... du menu Window.

Pour des raisons de capacité, le CD-Rom contientune distribution spéciale d’Eclipse qui regroupe enun seul fichier compressé les versions d’Eclipsepour Windows, Linux et Mac OS X.

Vous pouvez franciser l’interface utilisateurd’Eclipse en installant un language pack disponi-ble sur leur site.

Page 365: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 353

Création des classesLa création de classes s’effectue en sélectionnant l’élément Class... dans lesous-menu New du menu File (si l’élément Class... n’apparaît pas, sélectionnezl’élément Other... puis Class dans la liste qui s’affiche). L’assistant New JavaClass qui s’affiche vous permet de renseigner l’identificateur de la nouvelleclasse, son paquetage, sa super-classe et diverses options comme l’ajoutd’une méthode ����, l’implémentation automatique des méthodes abs-traites... À la confirmation de cette boîte de dialogue, la classe est créée dansle dossier des sources du projet et les sous-dossiers correspondant à sonpaquetage sont créés automatiquement si nécessaire. Si Eclipse vous proposede passer en perspective Java, répondez par l’affirmative pour voir apparaîtrevotre nouvelle classe dans la liste des classes de l’écran.

Édition des classesOutre les outils classiques d’un éditeur que vous retrouverez dans les menusEdit, deux fonctionnalités sont particulièrement utiles pendant l’édition devos classes :• La complétion automatique qui ajoute automatiquement les clauses �����

nécessaires à la saisie d’une classe, vous propose les méthodes disponiblessur un objet ou une classe avec des extraits de leur documentation�������... La complétion se déclenche soit volontairement grâce au rac-courci clavier Ctrl + Espace, soit automatiquement dans certaines situations.

• Les modèles de code Java (templates) qui permettent de générer des por-tions de code en ne tapant que quelques lettres, par exemple pour créerune boucle d’itération à partir du mot ���. Cette fonctionnalité s’obtientgrâce au raccourci clavier Ctrl + Espace après avoir saisi l’un des mots de laliste des modèles disponibles. Cette liste est visible dans la section Java /Editor / Templates de la boîte de dialogue Preferences lancée par l’élémentPreferences... du menu Window.

Les menus Source et Refactoring donnent accès à des fonctionnalités pluspoussées comme par exemple, l’élément Generate getters and setters... dumenu Source qui permet de générer automatiquement les accesseurs �� et lesmutateurs �� d’une classe, ou l’élément Rename... du menu Refactoring quipermet de renommer la classe, la méthode ou la variable en cours de sélec-tion dans l’ensemble des fichiers ����� d’un projet.

Compilation et exécutionUn fichier Java est compilé automatiquement au moment où vous l’enregis-trez si l’élément Build Automatically... du menu Project est coché, ou en utili-sant les éléments Build du menu Project.Dans le menu Run, les éléments du sous-menu Run As et ceux du sous-menuDebug As permettent de lancer une application ou de la déboguer.

B.A.-BA Perspective Eclipse

Eclipse propose différentes perspectives et vuessur un même projet : une perspective Resourcepour visualiser les fichiers du projet, des perspecti-ves Java pour visualiser les packages et les classesdu projet ou leur contenu, des perspectives CVS...Le choix d’une perspective s’effectue grâce auxéléments du sous-menu Open perspective... dumenu Window.

B.A.-BA Warning

En plus des erreurs de compilation, le compilateurd’Eclipse peut vous signaler des warnings maisvous n’êtes pas obligé de les prendre en compte.Un warning correspond à une instruction superfluecomme une clause ����� inutile ou peut révélerun problème potentiel comme le fait de laisser untype de retour devant un constructeur, ce qui enfait une méthode. La liste des warnings est visibledans la section Java / Compiler de la boîte dedialogue Preferences.

Page 366: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004354

E. Erreurs de compilation les plus fréquentesVoici une liste des erreurs les plus fréquentes générées par ����� à la compi-lation de fichiers �����. Cette liste complète les autres erreurs décrites dansles différents chapitres de cet ouvrage.

Symbole introuvable

Le package ����� �$���� �� n’existe pas. B $%����A'''�����7�&�: 4��7����$��������� �$���� ���������� �����

Vérifiez si le dossier racine cité par l’option +�������� . (ou le dossier courant sicette option n’est pas utilisée) contient bien l’arborescence de dossiers ����� �$���� ��. Si l’erreur est provoquée par la clause ����� ����� �$���� ���89 véri-fiez par ailleurs que le dossier ����� �$���� �� contient au moins un fichier�����.

Classe $%����G��� du package����� �$���� �� introuvable.

B $%����A'''�����7�&�: 4��7������ ��������� ���� �����7������$%����G������ ���7����$��������� �$���� ��

Vérifiez que le dossier ����� �$���� �� contient bien un fichier$%����G�������� qui déclare la classe ����� $%����G���.

Classe ou type inconnu. B $%����A'''�����7�&�: 4��7������ ��������� ���� �����7�������� ��� ���7������$%����A'''

Vérifiez la syntaxe du type primitif (ici ��� à la place de �� ) ou de la classe.

Variable 4��A''' introuvable. Une méthodesans paramètre est toujours suivi d’un couple deparenthèses vide.

B $%����A'''�����7�&�: 4��7������ ��������� ���� �����7���������4��A'''��� ���7����������� �$�� �� �$%����G���

Vérifiez si l’appel à la méthode 4��A''' est suivi d’un couple de parenthèses.

�.�#'������)���� avec un seul paramètrede classe ���������� ���� n’existe pas.

B $%����A'''�����7�&�: 4��7������ ��������� ���� �����7��� .����.�#'������)������:���������� ����;��� ���7�������������#����%<� ���/���

Ajoutez �� ou un composant en premier paramètre. Pour d’autres méthodes,vérifiez le nombre et le type des paramètres requis par la méthode.

Le constructeur de la classe ����� �$�� �� �$%����G��� sans paramètre n’existepas.

B $%����A'''�����7�&�: 4��7������ ��������� ���� �����7����� ��� ���$%����G���:;��� ���7����������� �$�� �� �$%����G���

Si vous avez déclaré un constructeur avec paramètre dans la classe����� �$�� �� �$%����G��� vous devez lui passer les valeurs attendues ouajouter un constructeur sans paramètre à la classe ����� �$�� �� �$%����G���.

Page 367: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 355

Déclaration de classe incorrecte

Déclaration de méthode incorrecte

Modificateur d’accès incorrect

$%����A'''�����7�&�: 4��7������$%����G������������=��.������������������������������$%����G��������

3 Une classe ����� doit être déclarée dans unfichier du même nom suivi d’une extension �����.

Vérifiez si le nom du fichier correspond au nom de la classe.

$%����A'''�����7�&�: 4��7����$��������� �$�� �� �$%����A'''����.���#� .���������������������$��������� �$�� �� �$%����A'''9

3 Conflit entre le nom du package et de la classe.

Supprimez le nom de la classe à la fin de la déclaration du package.

$%����A'''�����7�&�: 4��7������� ������7������$%����A''' 3 ����� a trouvé deux classes de même identifi-cateur dans le même paquetage.Vérifiez si vous n’avez pas cité plusieurs fois le fichier $%����A'''����� dans la

commande ����� ou si vos fichiers sources ne contiennent pas deux fois la décla-ration de la classe $%����A'''.

$%����A'''�����7�&�: 4��7���������� .��������� ���9��� ���� �����>�����

3 Déclaration de la méthode non valide, type deretour exigé. Seuls les constructeurs ne sont pasprécédés d’un type de retour.Ajoutez ���� ou le type renvoyé devant le nom d’une méthode.

$%����A'''�����7�&�: 4��7�?���� �����@������ ������������������ �4��G���:;��������������A

3 Identifiant attendu. L’identifiant d’une méthodeest précédé de ���� si elle ne renvoie pas devaleur ou d’un type si elle renvoie une valeur.

Éliminez ���� ou le type (ici ��� ) en fonction de ce que doit renvoyer laméthode.

$%����A'''�����7�&�: 4��7������ �$�� �� �$%����G��������� ��������������� �$�� �� 9������ �������������������� ��������$���

3 La classe ����� �$�� �� �$%����G���n’étant pas ����� elle est inaccessible endehors de son package.Ajoutez le modificateur d’accès ����� à la classe ����� �$�� �� �$%����G���.

$%����A'''�����7�&�: 4��7�������HII:;������ ��������������� �$�� �� �$%����G���9������ �������������������� ��������$���

3 La méthode ������HII de la classe����� �$�� �� �$%����G��� n’étant pas����� elle est inaccessible en dehors de sonpackage.

Ajoutez le modificateur d’accès ����� à la méthode ������HII.

$%����A'''�����7�&�: 4��7�4��A''':;����$%����A'''������ ����������4��A''':;�����&���$%����A'''9�� ��� ���� ���������#��$�������������������9�#��������

3 Une méthode ne peut pas avoir un modificateurd’accès qui restreint la portée de la méthoderedéfinie de sa super-classe (plus faible = wea-ker). L’ordre de priorité des modificateursd’accès est du plus restrictif au moins restrictif :����� �, friendly, ��� �� �� et �����.

Utilisez le même modificateur d’accès ou un modificateur d’accès moins restrictifdans la sous-classe. Ici, n’oubliez pas d’ajouter ����� à la déclaration de laméthode 4��A''' dans la classe $%����A'''.

Page 368: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004356

Déclaration de variable locale incorrecte

Utilisation de variable incorrecte

Erreur avec return

Expression non valide. ����� ne peut pas êtredéclarée ����� � si c’est une variable locale.

B $%����A'''�����7�&�: 4��7������� �� ����������������������� ���� ������9

Supprimez ����� � si ����� est une variable locale.

La variable locale �� � est déjà déclarée dansla méthode ����.

B $%����A'''�����7�&�: 4��7� �� ���������� ����������������:���������� ����BC;

Supprimez le type devant �� �� si vous voulez utiliser la variable �� � ouchangez d’identifiant si vous voulez déclarer une autre variable locale.

Les instructions �� ��� ��� #.�� ou �� doi-vent être suivies d’une instruction ou d’un blocd’instructions. Une déclaration de variable localen’est pas une instruction.

B $%����A'''�����7�&�: 4��7��� ���� � ���� ���������������� ������������9

Déclarez votre variable avant l’instruction ou incluez-la dans un bloc. Vérifiezque vous n’ayez pas oublié des accolades.

Tentative d’utilisation de la variable locale �déclarée mais pas initialisée.

B $%����A'''�����7�&�: 4��7��������������. ��� �.������������ ������

Initialisez la variable � avant de l’utiliser.

Perte possible de précision en passant du type����� au type ��� . Attention les valeurs lit-térales décimales ont un type ����� pardéfaut !

B $%����A'''�����7�&�: 4��7���������������������������������7��������>�����7����

Ajoutez un � à la fin d’une valeur littérale décimale pour indiquer qu’elle est detype ��� .

Manque une instruction �� ��� pour renvoyerle résultat de la méthode.

B $%����A'''�����7�&�: 4��7����������� ����� � ����

Ajoutez l’instruction �� ��� suivie du résultat de la méthode.

Instruction impossible à atteindre. B $%����A'''�����7�&�: 4��7�������.����� � ����

Vérifiez la logique des instructions de la méthode : une instruction �� ��� nedoit pas être suivie d’une autre instruction.

Page 369: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 357

Erreur dans les conditions des instructions if, for ou while

Équilibre incorrect entre accolades ouvrantes et fermantes

Chaîne littérale non fermée

Commentaire non fermé

$%����A'''�����7�&�: 4��7�������� ��� ����>�����7����������������7�����

3 Une expression avec l’opérateur D doit avoir unevariable à gauche du symbole D. Cette erreursurvient parfois quand on utilise D au lieu de DDpour une comparaison.Vérifiez si l’opérateur D est vraiment l’opérateur requis.

$%����A'''�����7�&�: 4��7�������� ���� �����������7��� ��>�����7�������

3 Types incompatibles. Cette erreur survient par-fois quand on utilise D au lieu de DD dans uneclause de l’instruction ��.

Vérifiez si l’opérateur D est vraiment l’opérateur requis.

$%����A'''�����7�&�: 4��7�E����E����E�� ������E������ �� 3 Déclaration d’une classe attendue. Cette erreursurvient parfois quand il y a une accolade fer-mante de trop.Vérifiez l’équilibre entre les accolades ouvrantes et fermantes avant la ligne mise

en cause.

$%����A'''�����7�&�: 4��7������� �� ����������������F

3 Expression non valide. Si une instruction d’appelà une méthode suit l’accolade fermante, cetteinstruction est utilisée en dehors d’une méthode.Vérifiez que vous n’ayez pas fermé trop tôt l’accolade de la méthode qui doit con-

tenir l’instruction.

$%����A'''�����7�&�: 4��7������� �� ���� �� 3 Déclaration incorrecte. Si la ligne où l’erreur sur-vient est une instruction commençant par ����� ��� #.�� �� ou �� ���, cette instruc-tion est utilisée en dehors d’une méthode.

Vérifiez que vous n’ayez pas fermé trop tôt l’accolade de la méthode qui doit con-tenir l’instruction.

$%����A'''�����7�&�: 4��7���������� ������ ��� 3 Chaîne de caractères littérale non fermée.

Vérifiez que vous n’ayez oublié le caractère " à la fin de votre chaîne de caractères.Attention : une chaîne de caractères littérale ne peut pas être répartie sur plu-sieurs lignes en Java.

$%����A'''�����7�&�: 4��7��������������� 3 Commentaire non fermé.

Vérifiez si votre commentaire commençant par �8 est bien fermé par 8�.

Page 370: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004358

F. Glossaire

Mot anglais ou mot-clé

Synonymes et traduction

Définition

��� ��� Abstrait Modificateur d’une classe interdite à l’instanciation ou d’une méthode non implémentée.

Access modifier Modificateur d’accès Mot-clé (����� �, rien, ��� �� �� ou �����) modifiant la portée d’un champ, d’uneméthode ou d’une classe.

Accessor Accesseur Méthode généralement préfixée par �� ou �� renvoyant la valeur d’un champ.

API Application Programming Interface Liste des classes d’une bibliothèque mises à la disposition des programmeurs, avec leurschamps et leurs méthodes.

Cast Conversion, transtypage Opérateur utilisé pour convertir la représentation binaire d’une donnée d’un type primitifnumérique dans un autre ou pour changer la classe d’une référence.

���� Classe, modèle, type d’objet Type définissant un ensemble de champs et de méthodes communs à un ensembled’objets.

Collection Collection Instance d’une classe gérant un ensemble d’éléments.

Constructor Constructeur Groupe d’instructions appelées pour initialiser un objet à sa création.

Encapsulation Encapsulation Protection des champs et des méthodes par l’utilisation du modificateur d’accès����� �.

Exception Exception Objet de diagnostic créé en cas d’erreur exceptionnelle.

Field Champ, donnée, attribut, variable Donnée déclarée dans une classe. Un champ d’instance mémorise une donnée pour cha-que objet, un champ de classe mémorise une donnée globale d’une classe.

���� Non modifiable, constant Modificateur d’une classe, d’une méthode, d’un champ, d’un paramètre ou d’une varia-ble locale non modifiables.

Framework Environnement, structure Modèle de traitement requérant l’utilisation d’un ensemble de classes et d’un typed’implémentation.

friendly Package access Modificateur d’accès d’un champ ou d’une méthode limitant leur portée aux classes dumême package que leur classe.

Garbage collector Ramasse-miettes Tâche de la JVM collectant les objets inutiles pour libérer leur mémoire.

Heap Tas Zone de la mémoire utilisée pour stocker les objets Java.

Implement Implémenter Programmer les champs d’une classe et les instructions de ses méthodes.

Inherit Extend, hériter, dériver Relation créée entre une classe et une autre sous catégorie de la première.

Instance Instance Objet créé à partir d’une classe.

�� ������ Interface Ensemble de méthodes et de constantes que peut implémenter une classe pour accom-plir une fonctionnalité.

Iterator Itérateur Outil utilisé pour énumérer les éléments d’une collection.

JVM Java Virtual Machine Interpréteur des fichiers ����� Java.

Lifetime Durée de vie Période d’existence en mémoire d’une variable locale, d’un paramètre, d’un champ oud’une classe.

Listener Écouteur, auditeur Classe utilisée pour suivre les événements émis par un composant réutilisable.

Member Membre Champ ou méthode d’une classe.

Page 371: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Anne

xes

© Groupe Eyrolles, 2004 359

Method Méthode, message, fonction membre

Traitement défini dans une classe répondant aux besoins d’une fonctionnalité. Uneméthode d’instance manipule les champs d’instance d’un objet, une méthode de classeest un traitement global à une classe.

Mutator Mutateur, modificateur Méthode généralement préfixée par �� modifiant la valeur d’un champ.

�� ��� Natif Modificateur d’une méthode dont l’implémentation est donnée dans une bibliothèquedynamique native du système d’exploitation.

Object Objet Module regroupant des données et les traitements s’y appliquant. Instance d’une classe.

Overload Surcharge Définition dans une classe de méthodes avec le même identificateur mais ayant desparamètres de types différents.

Override Redéfinir, outrepasser, spécialiser, supplanter

Définition de méthodes d’instance avec le même identificateur et ayant les mêmes typesde paramètres dans deux classes héritant l’une de l’autre.

���$��� Paquetage Module rassemblant les classes traitant du même thème (application, bibliothèque).

Polymorphism Polymorphisme Faculté qu’a une classe de prendre plusieurs formes grâce à l’héritage, la relation est unet la redéfinition de méthodes.

����� � Privé Modificateur d’accès d’un champ ou d’une méthode limitant leur portée à leur classe.

Promotion Promotion Conversion d’un type primitif numérique dans un autre avec gain de précision.

Primitive type Type primitif L’un des types de données � �, �.�� , �� , ���, ��� , �����, �.�� ou ������.

Property Propriété Donnée d’un composant réutilisable accessible par un accesseur et éventuellement unmutateur.

��� �� �� Protégé, héritable Modificateur d’accès d’un champ ou d’une méthode limitant leur portée aux sous-classesde leur classe et aux classes du même package que leur classe.

����� Public Modificateur d’accès d’un champ ou d’une méthode ayant la même portée que leurclasse.

Reference Handle, référence, pointeur Variable locale, paramètre ou champ désignant un objet ou égal à ��.

Scope Portée, étendue Zone du programme où une variable locale, un paramètre, un membre ou une classe sontutilisables.

Signature Signature Combinaison de l’identificateur et des types des paramètres d’une méthode. Chaqueméthode d’une classe doit avoir une signature unique. Une méthode qui redéfinit uneautre méthode a la même signature.

Stack Pile Zone de la mémoire où sont empilées les variables locales et les paramètres, rendantplus rapide l’allocation et la libération de mémoire.

� � �� Statique, global Modificateur des champs et méthodes de classe.

Subclass Sous-classe, classe dérivée Classe héritant d’une autre classe.

Super-class Super-classe, classe de base, classe mère

Classe dont héritent d’autres classes. Toute classe hérite de la classe ���������<���� .

Thread Tâche, processus Suite d’instructions exécutées en parallèle d’autres sur une même machine.

Wrapping class Classe d’emballage, classe d’enveloppe

Classe mémorisant et manipulant une donnée d’un type primitif sous forme d’objet..

Mot anglais ou mot-clé

Synonymes et traduction

Définition

Page 372: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

© Groupe Eyrolles, 2004360

G. Bibliographie[1] The Objective-C Programming Language – Apple

(http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/)Objective-C est un autre langage de programmation objet dérivé du C commele C++. L’introduction sur la programmation objet de cet ouvrage est très inté-ressante (vous y reconnaîtrez sûrement la notation qui lui a été empruntée poursymboliser les objets dans l’ouvrage que vous avez dans les mains).

[2] UML, le langage de modélisation objet unifié – (http://uml.free.fr/)L’introduction sur la programmation objet de ce site expose la problématiqueposée par l’ajout d’un nouveau type d’ouvrage à une bibliothèque. Un modèledu genre qui vous permettra en plus d’apprendre UML !

[3] Cahier du programmeur UML – Modéliser un site e-commerce, Pascal Roques, Eyrolles 2002. Pour ceux qui croient que l’apprentissage d’UML est ardu, une introductionlimpide à la modélisation UML sur un cas qui concerne tous les développeursWeb : la modélisation d’un site e-commerce.

[4] The Java Tutorial – Mary Campione, Kathy Walrath,... – Sun Microsystems (http://java.sun.com/docs/books/tutorial/, existe aussi en version papier aux éditions Addison Wesley)De très bonnes documentations pour démarrer en Java et pour utiliser sa biblio-thèque.

[5] Thinking in Java – Bruce Eckel – Mind View (http://www.mindview.net/ & http://penserenjava.free.fr/, existe aussi en version papier aux éditions Prentice Hall)S’appuyant sur de nombreux exemples, les premiers chapitres de cet ouvrage deplus de 1000 pages traitent du noyau du langage Java avec une approche origi-nale très efficace pour les personnes ayant déjà programmé. Son plus grosdéfaut est son manque d’illustrations (vous ne trouverez pas une seule captured’écran dans le chapitre consacré à Swing !).

[6] Java Look and Feel Design Guidelines – Sun Microsystems (http://java.sun.com/products/jlf/ed2/guidelines.html, existe aussi en version papier aux éditions Addison Wesley)Ce bel ouvrage explique comment concevoir une interface utilisateur avec lescomposants Swing.

[7] Conception de sites Web : l’art de la simplicité – Jakob Nielsen – CampusPress, 2000S’appuyant sur des exemples de sites Internet existants (ou ayant existé), cetouvrage expose les règles à utiliser pour créer un site Web ergonomique.

[8] Java efficace – Joshua Bosch – Vuibert, 2002Réservé aux programmeurs expérimentés, cet ouvrage très intéressant donne57 recettes pour développer de meilleures classes en Java en s’appuyant notam-ment sur les design patterns.

Page 373: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

361

I n d e xSymboles== 52, 93? : 59, 277

Aabstract 126, 358accents 27accès 358

aux membres hérités 73accesseur 36, 261ActionEvent 204ActionListener 131, 310, 321actionPerformed 204, 315addActionListener 204adresse 25Adresse (classe) 70adresse IP 241, 250affectation 26

opérateur 53, 185AfficherArticlesFacture 295AfficherClientFacture 301AfficherComptes 82AfficherDeuxPrenoms 32AfficherHeure 204AfficherMessages 78AfficherSujets 238AfficherTitre 85AfficherUnitesTelecarte 49AfficherUtilisateursXML 306Agenda 139aléatoire 98, 144AnalyseurXMLForum 303, 321animation 310année 103Ant 47API, documentation 17applet 13, 168, 210, 310, 321AppletBienvenue 212AppletChat 321AppletChatLive 339AppletEmprunt 213AppletNouvelles 310appletviewer (commande

JDK) 18, 212application 12

exécuter 48

application Web 251contexte 257, 263déploiement 253, 255mise à jour 255, 261organisation 272

architecture3 tiers 270client-serveur 240

ArithmeticException 161array 110ArrayIndexOutOfBounds-

Exception 111, 161ArrayList 118, 144, 236, 265

optimisation 144Arrays 115, 136arrêt d’un thread 312ascenseur 195ASCII (American Standard Code

for Information Interchange) 26

assembleur 9assert 157AssertionError 157ATTLIST 291, 303attribut 358

servlet 263, 318vs élément XML 291XML 289

Attributes (classe) 295AUTO INCREMENT 235AWT 191

Bbalise applet 210, 310, 327balise XML 289barre d’outils 195base de données 218

connexion 219BeanInfo 262Bienvenue (classe) 18bienvenue.jsp 259BigDecimal 102bin (dossier des commandes) 45bit à bit 53BLOB 223, 232bloc 54

Boisson (classe) 74, 76, 119, 131, 135BoissonAlcoolisee 74, 76, 119, 135BonAnniversaire 107boolean 24, 26Boolean (classe) 99BorderFactory 195BorderLayout 194, 198, 213, 321boucle 63

indice (variable locale) 65portée de l’indice 64

branchements 59BufferedInputStream 180BufferedReader 181, 184, 186build 46byte 24, 25Byte (classe) 99ByteArrayInputStream 173, 339ByteArrayOutputStream 177, 339bytecode 11

CC#

abstract 126autoboxing 100, 147base 75, 79cast 56, 77, 133checked 56class 33CLR 12, 147const 85constructeur 41constructeur static 83decimal 102delegate 203enum 85, 147exceptions 147, 161for 64foreach 114, 123, 135, 140, 147héritage 75if 60interface 130is 133liste d’arguments variable 115, 147main 20, 116modificateur d’accès 38, 73MSIL 12, 147

namespace 28, 45, 49new 39object 88opérateurs 52out 36, 147override 79, 147passage des paramètres 36polymorphisme 79propriétés 261readonly 84ref 36, 147sealed 84static 83string 94struct 33surcharge des opérateurs 57, 147switch 60tableau 110, 114, 115this 36throw 156typeof 165unsafe 147using 49, 147virtual 79, 147vs Java 147while 63

C++#include 38, 49algorithm 143cast 54, 77catch 154, 158class 33const 84constructeur 41constructeur par recopie 41delete 41destructeur 41dynamic cast 77édition de liens 12enum 85, 147exceptions 154, 161, 174fonction 12for 64héritage 75héritage multiple 130if 59

Page 374: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

362

inline 38liste d’arguments variable 115, 147macro 12main 20, 116méthode virtuelle pure 126, 129modificateur d’accès 38, 73namespace 28, 45, 49new 39, 58opérateurs 32, 52passage des paramètres 36pointeur 25pointeur sur fonction 204polymorphisme 79printf 182référence 25, 36RTTI 89, 162string 94struct 33surcharge des opérateurs 57, 147switch 59tableau 110template 123, 147this 38throw 156, 161try 154typedef 24union 33unsigned 24using 49valeur par défaut des

paramètres 44variable globale 12variable locale 67virtual 79, 147wchar_t 24while 63

calcul 98de mensualités 3, 101, 213

Calcul (classe) 151CalculateurEmprunt 101CalculAvecTryCatch 155CalculAvecTryCatchFinally 159CalculFactorielle 150, 157CalculInterets 80CalculLignesDeCode 185CalculOccurrencesCaractere 175CalculPrixTotal 135CalculProbabilites 66CalculTotalFactures 226calendrier 107caractère 27

char 24encodage 27, 172, 277

carnet d’adresses 2CarnetAdresses 208cas d’utilisation 268CasierBouteilles 119casse 18, 224

modifier 94cast 54, 358Castor 304catch 154, 174, 231, 275

ordre des blocs 158vide 165

CaveAVin 119CDATA 290CGI (Common Gateway

Interface) 244chaîne 26, 93

accent 27comparaison 92, 94manipulations 94modifier la casse 94recherche 94vide 27

champ 24, 358conventions de nommmage 36portée 30

char 24, 25, 93CHAR (SQL) 223, 228Character (classe) 99charAt 94ChargeurRessource 195chat 6, 314

synchronisation 328chemin

absolu 168canonique 168, 186relatif 169

Class 89, 96, 162, 219class (mot-clé) 13, 33, 165ClassCastException 77, 133, 138, 161classe 11, 28, 358

abstraite 126ancêtre commun 88anonyme 205, 296architecture 86charger dynamiquement 162commenter 34conventions de nommage 33d’emballage 99, 144déclarer 33, 130

définir 33explorer 165instanciation 39interne 206méthode de classe 81organisation des fichiers 45paquetage 48portée 30sources 30

classes (dossier des classes compilées) 45, 197, 251, 272

ClassNotFoundException 163, 220classpath 48, 160, 196, 222clavier 203ClavierCalculatrice 193clé 121

vs indice 117clic 203clone 89, 111collection 117, 358

classe utilitaire 142énumérer les éléments 138interfaces implémentées 143itérateur 118, 138manipulation 118protection de type par

encapsulation 141supprimer 118vs tableau 117

Collection (interface) 143Collections (classe) 142commande 18, 20, 27, 46

option 18, 46commentaire 34, 182, 344Comparable 136, 142, 168comparaison 52

bit à bit 53ComparaisonFigures 127ComparaisonUtilisateurs 92Comparator 142compilation 8, 11, 18, 46, 252, 342

erreurs 19, 354vérification des types 54

composant 190composition 70Compte (classe) 80, 83CompteEpargne 80, 83concaténation 57conception objet 10, 11, 37, 86,

268, 272condition 59, 64, 277

ConnecteurForum 228, 271, 275Connection 225Connector/J 221, 272connexion 219, 270console 96, 171, 182, 210constante 85

conventions de nommage 85constructeur 41

déclarer 41nommage des paramètres 43par défaut 41, 75static 83

Constructor (classe) 164Container 192conteneur 190ContentHandler 295ConTEXT 21, 346contrôle de flux 59conventions de nommage 29

champ 36classe 33identificateur 29interface 129méthode 36paquetage 33paramètre 43

conventions de programmation 27, 60, 63, 68, 266

conversion 55, 358de référence 76, 132en chaîne 57, 94, 215en HTML 95en nombre 99implicite 76, 133précision 54types 54

ConversionEuro 56ConversionSommeMontantsEuro 58ConversionsReferencesBoisson 76ConversionsReferencesPayant 132ConvertisseurEuro 55, 58cookie 262, 326CREATE 223, 226, 231createStatement 225, 230CreerObjetClasse 163

DDatabaseMetaData 228DataInputStream 181, 288DataOutputStream 181, 288date 103, 107, 282

Page 375: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Inde

x

363

comparer 103, 136Date (classe) 103, 136, 204, 317DATE (SQL) 223, 232DateFormat 104, 108, 204, 277, 321deadlock 337DECIMAL 223DefaultHandler 295DefaultTableModel 208DELETE 224déploiement 253deprecated 103, 277, 325dériver 72, 210, 232, 246design pattern 86DeuxPersonnesUneAdresse 70, 72développement

organisation des fichiers 45, 251dictionnaire 120do 63, 175doc (dossier de documentation) 45DOCTYPE 293, 300Document (classe) 301document XML 288

bien formé 290, 298valide 291, 298

documentation 17, 251installation 17

DocumentBuilder 302, 304DocumentBuilderFactory 302, 304doGet (point d’entrée de

servlet) 13, 246DOM 294, 301

vs SAX 294doPost 246DOSKEY 15dossier

chemin 168contenu 168courant 47source 45

double 24, 25Double (classe) 99DOUBLE (SQL) 223driver 131, 219, 251, 272DriverManager 219DROP 223DTD 291

ATTLIST 291, 303ELEMENT 291, 303ENTITY 292exemple 292, 303syntaxe 292

utilisation 293, 300vs schéma XML 293

durée de vie 29, 82, 358

EEclipse 16, 351écouteur 203

Voir aussi listenerEditeurTexte 195égalité

entre objets 88EJB entités 238Element (classe) 301ELEMENT (DTD) 291, 303élément XML 289

vs attribut 291else 59emballage 99, 144, 359Emprunt (classe) 100, 213encapsulation 29, 141, 358encode 277encodeURL 262encryption 233enregistrement 218EnsembleMessagesForum 236,

272, 277, 303, 316EnsembleUtilisateursForum 141,

303, 317entité 94, 245, 290, 319enum 24

Voir aussi Java 5.0énumération 138Enumeration (interface) 138environment.plist 250environnements d’exécution 12EOFException 180equals 88, 146

redéfinition 89vs compareTo 136

erreurdans un document XML 298de compilation 19, 354Error 156, 160exécution 21, 153

ErrorHandler 298espace 18espace de noms XML 293ET (opérateur) 53étendre 72, 210, 232, 247euro 27événement 203

EvenementCalendrier 136Event 203exception

catégories 160contrôlée 160, 173, 231, 247, 325créer une classe

d’exception 166déclencher 156, 231diagnostic 153, 333gérer 153, 174, 231hiérarchie de classes 160intercepter 154, 174non contrôlée 160

Exception (classe) 160executeQuery 225, 233executeUpdate 225, 233exécution 11, 12, 48, 150

erreur 21, 153exit 96expiration 265expression 54expression régulière 94, 170extends 73, 212, 232, 247

Ffacture.xml 289fichier

chemin 168commandes 46compilé 45écrire 177exécutable 45lire 172source 28, 33, 45

Field 164Figure (classe) 126File 168FileFilter 168FileInputStream 173, 307FileOutputStream 177FileReader 173, 184FileWriter 177, 184fill 115, 142FilterInputStream 178FilterReader 179, 182filtrage de données 178FiltreCommentaires 182final 84, 206, 358finalize 41, 89finally 159, 174, 187, 220, 304float 24, 25

limitations 102Float (classe) 42, 99FLOAT (SQL) 223FlowLayout 191, 213flux de données 170, 321for 63, 113, 139, 185formats de données 288formulaire HTML 244, 253, 273,

278, 284forName 162, 220forum

affichage des sujets 237architecture 5barre de navigation 277, 327chat 313, 314création de message 282diagramme de classes 343échange de données 303évolution 280extension 238identification 273inscription 278message 104messages d’un sujet 280modérateur 275, 282modification d’un message 283organisation des pages 270, 342page d’accueil 276présentation 4, 267programmation 270scénario 267synchronisation 336utilisateur 89XML 303, 319

forward 266, 274francophonie 262friendly 30, 33, 73, 206, 358fuseau horaire 104

Ggarbage collector.

Voir ramasse-miettesgetConnection 219getContentPane 192getDateInstance 282getInt 226getOutputStream 247getParameter 211, 247, 274getProperty 263getString 226getTables 228

Page 376: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

364

getTimeInstance 282getWriter 247global 83, 359Glossaire (classe) 121GregorianCalendar 107, 113GridLayout 193, 198, 206, 213GrilleLoto 144GUI 190

Hhash 89hashCode 88, 137HashMap 120HashSet 120, 141hasNext 138, 238heap Voir tashéritage 72, 210, 232, 261heure 103hexadécimal 9Hibernate 238hôte 241HotSpot 22HTML

formulaire 244, 253, 273, 278, 284JEditorPane 190, 242JLabel 310JOptionPane 78, 144liens 246, 277, 327servlet 247syntaxe 245tableau 145, 198, 274vs XML 289

HTTPGET 241POST 246procotole 240

HttpServlet 246HttpServletRequest 246, 259, 263HttpServletResponse 247, 259

Iicône 196

standard 197IDE (Integrated Development

Environment) 16, 21, 27, 46, 198, 208

identificateur 24convention de nommage 29

identification 273if 59IHM 190IllegalAccessException 163

IllegalArgumentException 161IllegalMonitorStateException 336IllegalStateException 161ImageIcon 196immuable 100, 142, 330impasse 337implémentation 10, 35, 36, 358

implements 131polymorphisme 76séparer de l’interface 128

import 48, 83, 207include 274

vs jsp:include 266incrémentation 53

décrémentation 53indentation 27index 223, 231IndexOutOfBoundsException 161indice 110, 121

vs clé 117init (point d’entrée d’une applet) 13initialisateur static 83initialisation 210, 254

par constructeur 41inner class 206InputStream 172, 242, 304, 323INSERT 224, 233installation 14

sous Linux 16, 221, 249sous Mac OS X 16, 222, 250sous Windows 15, 221, 249

instance 11, 358méthode d’instance 81

instanceof 52, 91, 133InstantiationException 163instruction

bloc 54conditionnelle 59de contrôle 59précompilée 232vide 63

instruction SQL 225paramétrage 232

int 24, 25INTEGER 223Integer (classe) 100, 144interface 10, 203, 358

constantes 129, 134conventions de nommage 129définir 129référence 133

séparer de l’implémentation 128utilisateur 190, 313, 314

internationalisation 104, 109, 187Internet

architecture 3 tiers 270client-serveur 240

interpréteur 8InterruptedException 313IOException 161, 173, 247, 297, 322IP 241ISO-8859-1 277Iterator 138, 277, 282iterator 86, 120, 237itérer 138

JJ2EE (Java 2 Enterprise

Edition) 15, 238, 246J2ME (Java 2 Micro Edition) 15J2SE (Java 2 Standard Edition) 15JApplet 210, 213, 310, 321jar (commande JDK) 18, 46, 191, 197Java

C# Voir C#C++ Voir C++caractéristiques 8interface 203look and feel 202mise à jour 14mots-clés 24versions 15

java (commande JDK) 18, 48Java 5.0

add 192annotations 147, 344autoboxing 100, 146, 147boucle itérative 114, 123, 135, 140Class Data Sharing 22, 202enum 85, 134, 147généricité 123, 135, 141, 146, 147import static 83, 134, 147liste d’arguments variable 115, 147Math 98metadata 147, 344printf 182StringBuffer 93

Java 6.0 15Java Web Start 215JAVA_HOME 248JavaBeans 261, 270

portée 262

javac (commande JDK) 18, 46javadoc (commande JDK) 18, 46, 344JavaMail 280javax.servlet.http 246JAXP 294JBuilder 16, 347JButton 193, 204, 213JCheckBox 205JComboBox 198, 205JDBC 131, 218, 252JDK (Java Development Kit) 14JDO 238JEditorPane 242JFormattedTextField 213JFrame 192, 204, 208JLabel 192, 198, 206, 213, 310, 321JMenu 208JMenuBar 208JMenuItem 205, 208JOptionPane 78, 101, 122, 144,

160, 164, 200, 208HTML 78

jour 103JoursFeries 113JPanel 197, 213JPasswordField 192JRadioButton 205JRE (Java Runtime

Environment) 14JScrollPane 195, 321JSP (JavaServer Pages) 258

accolades 259balises générales 258classes non standards 261code Java 258erreurs 260, 265errorPage 258, 275exception 259, 275exécution 260forum 267forward 265, 279, 284fragments 266import 258, 277include 258, 265, 277, 282, 317isErrorPage 258JavaBeans 261out 259page 258, 274, 317param 265, 282request 259response 259, 327

Page 377: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Inde

x

365

servlet 258setProperty 317test 261, 318useBean 262, 270, 275, 316variables prédéfinies 259XML 262

JSpinner 213JTable 208JTextArea 198, 321JTextField 192, 198, 205, 321JToolBar 195JVM 13

KKeyEvent 205

Llangage C# Voir C#langage C++ Voir C++langue de l’utilisateur 104, 109, 187layout 191

BorderLayout 194, 198, 213, 321combinaison 197, 213FlowLayout 191, 213getPreferredSize 191GridBagLayout 198GridLayout 193, 198, 206, 213pack 192suppression 310

length 94lettre accentuée 27liaison dynamique 79lib (dossier des bibliothèques

non standards) 45, 197, 251, 272

licence Apache 248, 341licence GNU GPL 221, 341LinkedList 118Linux 16, 21, 210, 221, 249liste chaînée 118liste des fichiers 168liste ordonnée 118listecourses.jsp 264listener 203, 321, 358littéral Voir valeur littéraleLiveConnect 326Locale 104, 109, 187logarithme 98logique 53logs 98, 210, 261long 24, 25Long (classe) 99

look and feel 201Loto 144, 206

MMac OS X 16, 21, 98, 202, 210,

222, 251, 348machine virtuelle 13, 96main (point d’entrée d’une

application) 12, 20, 116MalformedURLException 242manifest 191Math 98mathématique 98maximum 24membre 358mémoire 39, 358

Voir aussi ramasse-miettesmessage 9, 10Message (classe) 104

enregistrement 234, 285lecture 234, 277, 283modification 234, 285recherche 234, 277, 283table 229XML 303, 319

MessageForum 234, 262, 272, 303, 317

Method (classe) 164méthode 359

conventions de nommage 36d’instance 83de classe 81déclarer 35implémentation 35, 36paramètres 35portée 30redéfinir 76, 78surcharge 44

métrique 185microprocesseur 8MIME 247minimum 24modificateur 358modularité 29mois 103monnaie

conversion 55mot-clé 24MotDePasse 112, 272, 279MouseEvent 205multitâche 310

multithreads 246, 310mutateur 36, 262MVC 86, 272MySQL

connexion 220installation 221

Nnative2ascii 27navigateur

applet 212new 39, 42next 138, 225, 238NoClassDefFoundError 21, 160NombreEntier (classe) 60NombreEnToutesLettres 60nommage, conventions 29NoSuchMethodError 21, 160notify 336

vs notifyAll 338null 26NullPointerException 161Number 99, 102NumberFormat 213NumberFormatException 161

OObject 88, 334

equals 88hashCode 88

ObjectInputStream 181, 288ObjectOutputStream 181, 288objet 9, 359

comparer 88, 136créer 39, 206démarche 10forme textuelle 89initialisation 40, 73

opérateurs 52affectation 53arithmétiques 52comparaison 52comparaison bit à bit 53concaténation 57incrémentation 53logiques 53priorité 57ternaire 59, 277

ORDER BY 224, 236ordre chronologique 136, 236organisation des fichiers 28, 45,

197, 251, 272

OU (opérateur) 53out 96, 259OutilsChaine 94, 272, 277, 282, 319OutilsFichier 169, 185OutputStream 176, 247overloaded 44overridden 78

Ppanneau à ascenseurs 195PanneauContact 198, 208paquetage 28, 73, 359

conventions de nommage 33paramètre

conventions de nommage 43d’une applet 210, 310, 327portée 67

parenthèses 34, 63parse 99, 101parser XML 290, 294PATH 15, 19Payant (interface) 130, 132, 135PDF 259Personne (classe) 70PI 98pile d’exécution 150, 333, 359pipeline 171pointeur 25polymorphisme 76, 359

et classe abstraite 126port 241, 250portabilité 22, 215, 218, 277portée 30, 358

application 262, 271, 275page 262, 279, 285paramètres et variables

locales 67request 262, 283session 262, 265, 271, 275,

278, 285précédence 57précision 54, 102Preferences 188PreparedStatement 232print 96, 181println 96, 181PrintStream 96, 181, 182PrintWriter 181, 247priorité des opérateurs 57private 30, 73, 206, 359PrixTotalServices 43

Page 378: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Les

cahi

ers

du p

rogr

amm

eur J

ava

1.4

et 5

.0

366

Probabilite (classe) 65, 82procédurale (programmation) 9procédure stockée 225processus 310, 359programmation orientée objet 9programme CGI 244prologue XML 288propriété 261ProprietesJVM 98protected 35, 73, 206, 231, 359protocole 240proxy 243, 326public 30, 33, 85, 206, 359

Rraccourci clavier 208ramasse-miettes 8, 22, 41, 89, 147,

320, 358RandomAccessFile 172read 172, 176, 182Reader 172, 288RechercheFichiers 170récursivité 150

précautions 154redéfinition 76, 78, 205, 359

exception contrôlée 325vs surcharge 79

référence 25, 359conversion 76, 132tableau 110

réflexion 162relation

a un 70est un 72

répertoire Voir dossierrequest 259, 274requête 240ResourceBundle 187response 259ressource 187, 196, 241ResultSet 225, 236retour à la ligne 18, 94réutilisation

composition 70héritage 72limite avec final 84polymorphisme 76

rôleadmin 250, 256manager 256

run 312

Runnable 314RuntimeException 160

Ssaisie 101SaisieContact 200SaisiePseudonymeMotDePasse 192SAX 288, 294, 338

vs DOM 294SAXException 296, 298, 302, 304SAXParser 296, 299SAXParserFactory 296, 299script CGI 244SDK (Software Development Kit) 14

sources des classes 30SecurityException 161, 168, 211SELECT 224, 236sérialisation 178serveur

client-serveur 240Service (classe) 43, 131, 135servlet 13, 318

compilation 252configuration 252cycle d’exécution 254développement 257généralités 246inconvénients 259initialisation 254

ServletBienvenue 247, 253ServletException 161, 247session 262, 275, 317

expiration 265sessionId 327setDefaultCloseOperation 192setProperty 263, 275, 279setSize 198SGBD 218, 270, 275short 24, 25Short (classe) 99showConfirmDialog 160, 200, 208showInputDialog 101showMessageDialog 78, 116, 122,

144, 164shuffle 142signature 359sleep 312sort 115, 120, 142sortie standard 96, 171, 182, 261souris 203sous-classe

déclarer 73initialisation en deux temps 73

spécialiser 72SQL 219, 223SQLException 161, 220src (dossier des sources) 45stack Voir pile d’exécutionstatement 225static 81, 206, 359stop 325stream 171String 26, 30, 93

créer 39StringBuffer 93StringIndexOutOfBounds-

Exception 161Sun Microsystems 15, 68super 75, 79super-classe

sommet de la hiérarchie 88SuppressionCommentairesFichier 184surcharge 44, 359

vs redéfinition 79Swing

ajout de composant 191création de menus 208gestion événementielle 203interaction utilisateur 203layout 191look and feel 198, 201mise en page 191, 213présentation des

composants 190tableau 208threads 315

SwingSet 191switch 59, 97, 183

conditions d’application 59synchronisation 89, 246, 328synchronized 143, 330System 96, 115, 182, 211, 261, 313système

obtention des propriétés 96

Ttable 218, 223tableau 110

copier 115de type objet 110déclarer 110exceptions 111

manipulation 115multidimensionnel 114organisation 110, 114Swing 208tri 115vs collections 117

TableModel 208tâche 359

pile d’exécution 150tampon 178, 187tas 150, 358Telecarte50 (classe) 39, 49TelecarteEmpruntee 39téléchargement 14TestConnexionJDBC 220TestTypes 26this 36, 38, 44, 83, 215Thread 312, 325thread 359

chat 325états 328pile d’exécution 150servlet 246synchronisation 328

throw 156, 231Throwable 153, 259, 306throws 161, 229, 247, 297TicketDeCaisse 135TIME 223timeout 265Timer 310TIMESTAMP 223, 229TimeZone 104TirageLotoAvecClasseAnonyme 206TirageLotoSansClasseAnonyme 206Tomcat

configuration 250, 255démarrage 250généralités 246installation 248manager 256rôle 256startup 250webapps 253, 260

toString 89, 105, 137, 275traduction 104, 109, 187transaction 225transtypage 55, 358TreeMap 120TreeSet 120, 139, 142tri 115, 120, 139, 142

Page 379: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Inde

x

367

trigonométrie 98TriMots 116try 154, 174, 220, 275typage 24type de données

conversion 54primitif 24, 99SQL 223

UUML 37, 268Unicode 26, 96UnsupportedOperationException 161UPDATE 224, 235URL (Uniform Resource

Locator) 173, 241, 277connexion 326encodage 244manipuler 242relative 253, 326

URLConnection 242URLEncoder 277, 324useBean 263, 270, 275, 316UTF-8 288

Utilisateur 89Utilisateur (classe) 89, 141, 306

enregistrement 232, 279lecture 232, 274recherche 232, 274session 275, 278, 285table 228XML 303, 319

UtilisateurForum 232, 271, 275, 303, 317

Vvaleur littérale 24, 25, 224, 227ValeursMathematiques 99ValiderDocumentXML 298validition 291, 298VARCHAR 223, 229variable

affecter une valeur 26déclarer 24locale 24, 30, 67, 206nom 24objet 25opérateurs d’affectation 53

portée 30verrou 330, 334versions 15, 248void 44

WW3C 289wait 334war 260warnings 123web.xml 252, 257WEB-INF 251, 327WHERE 224, 236while 63, 139WindowEvent 205Windows 15, 21, 98, 188, 202,

210, 221, 248wrapper 99, 359Write Once Run Anywhere 8Writer 177, 288

XXML 288

analyseur 290, 294, 338

attribut 289balise 289DOM Voir DOMDTD Voir DTDélément 289entité 290, 319espace de noms 293parser 290, 294SAX Voir SAXschéma 293syntaxe 288vs HTML 289web.xml 252

XSLT (Extensible StyleSheet Language Transformation) 289, 306

x-www-form-urlencoded 244, 277

ZZIP 178

Page 380: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Dans la collection Poches Accès libre...

Page 381: À travers la réalisation d’un forum de discussion et …...•Le chapitre 11 est consacré à la sauvegarde et à la lecture d’informations dans une base de données grâce à

Dernières parutions