Professional Documents
Culture Documents
Réf. Sun : Réf. Sun : Réf. Sun : Réf. Sun : Réf. Sun :
LJ300 LJ300 LJ300 LJ300 LJ300
Date : 20/7/98 Date : 20/7/98 Date : 20/7/98 Date : 20/7/98 Date : 20/7/98
AVERTISSEMENT
Ce produit ou document est protégé par un copyright et distribué avec des licences qui en restreignent l’utilisation, la
copie, la distribution, et la décompilation. Aucune partie de ce produit ou de sa documentation associée ne peut être
reproduite sous aucune forme, par quelque moyen que ce soit, sans l’autorisation préalable et écrite de Sun et de ses
bailleurs de licence, s’il y en a.
Des parties de ce produit pourront être dérivées du système UNIX® licencié par Novell, Inc. et du système Berkeley 4.3
BSD licencié par l’Université de Californie. UNIX est une marque enregistrée aux Etats-Unis et dans d’autres pays et
licenciée exclusivement par X/Open Company Ltd. Le logiciel détenu par des tiers, et qui comprend la technologie
relative aux polices de caractères, est protégé par un copyright et licencié par des fournisseurs de Sun.
Sun, Sun Microsystems, le logo Sun, sont des marques déposées ou enregistrées de Sun Microsystems, Inc. aux Etats-Unis et
dans d’autres pays. Toutes les marques SPARC, utilisées sous licence, sont des marques déposées ou enregistrées de SPARC
International, Inc. aux Etats-Unis et dans d’autres pays. Les produits portant les marques SPARC sont basés sur une
architecture développée par Sun Microsystems, Inc.
Les interfaces d’utilisation graphique OPEN LOOK® et Sun™ ont été développées par Sun Microsystems, Inc. pour ses
utilisateurs et licenciés. Sun reconnaît les efforts de pionniers de Xerox pour la recherche et le développement du concept
des interfaces d’utilisation visuelle ou graphique pour l’industrie de l’informatique. Sun détient une licence non exclusive
de Xerox sur l’interface d’utilisation graphique Xerox, cette licence couvrant aussi les licenciés de Sun qui mettent en
place l’interface d’utilisation graphique OPEN LOOK et qui en outre se conforment aux licences écrites de Sun.
Le système X Window est un produit de X Consortium, Inc.
CETTE PUBLICATION EST FOURNIE “EN L’ETAT” SANS GARANTIE D’AUCUNE SORTE, NI EXPRESSE NI
IMPLICITE, Y COMPRIS, ET SANS QUE CETTE LISTE NE SOIT LIMITATIVE, DES GARANTIES CONCERNANT LA
VALEUR MARCHANDE, L’APTITUDE DES PRODUITS A RÉPONDRE A UNE UTILISATION PARTICULIERE, OU LE
FAIT QU’ILS NE SOIENT PAS CONTREFAISANTS DE PRODUITS DE TIERS.
Protections Juridiques 7
Intutilé Cours : L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
Table des matières
Prérequis............................................................................................... ii
Objectifs du cours............................................................................... iii
Projet : Le poste de travail d’un courtier en bourse ....................... 2
Généralités ................................................................................... 2
Exposé du problème ................................................................... 2
Le système existant ..................................................................... 2
Le système existant (suite) ......................................................... 3
Spécifications (suite) ................................................................... 4
Configuration de la base : ................................................. 4
Spécifications générales ............................................................. 5
Fonctionnalités principales :............................................. 5
Limitations ................................................................................... 6
PHASE 1 : l’architecture générale..................................................... 7
PHASE 2 : l’accès à la base................................................................. 9
PHASE 3 : l’interaction utilisateur.................................................. 11
PHASE 4 : assemblage d’un produit complet............................... 13
PHASE 5 : consolidations, extensions............................................ 15
Objectifs ...................................................................................... 17
Références .................................................................................. 17
Introduction à mSQL ....................................................................... 18
Généralités ................................................................................. 18
la réalisation de mSQL ............................................................ 19
Les outils de mSQL ................................................................... 19
............................................................................................ 19
............................................................................................ 19
msqld – le moteur mSQL.......................................... 19
les outils mSQL (suite) ............................................................ 20
relshow - Visualiseur de schéma mSQL ....................... 20
msqladmin – administration de la base (pour mémoire)
20
msqldump – image de la base (pour mémoire) ......... 20
Contrôle d’accès mSQL (pour mémoire) ....................................... 21
les outils mSQL (suite) ............................................................ 23
viii
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
Commandes mSQL........................................................................... 24
Généralités ................................................................................. 24
La requête SELECT ................................................................. 25
La requête SELECT (suite)...................................................... 26
Exemples ........................................................................... 26
La requête SELECT (suite)...................................................... 27
Jointures............................................................................. 27
La commande INSERT ............................................................. 28
La commande DELETE ........................................................... 28
La commande UPDATE........................................................... 29
La commande CREATE (pour mémoire) .............................. 30
La commande DROP (pour mémoire) ................................... 30
Exercices ............................................................................................. 31
Introduction ....................................................................................... 34
“Pilote” JDBC..................................................................................... 35
Organigramme JDBC........................................................................ 37
L’enchainement des appels ..................................................... 37
Package java.sql ................................................................... 37
Organigramme JDBC........................................................................ 38
Exemple JDBC ................................................................................... 39
Création de pilotes JDBC ................................................................. 41
Création explicite d’une instance de pilote JDBC ................ 41
Pilotes JDBC ....................................................................................... 43
Désignation d’une base de données....................................... 43
Connexion à une base de données.......................................... 44
Interrogation d’une base de données..................................... 45
Instructions JDBC.............................................................................. 46
Soumission d’une requête........................................................ 46
requête préparée (non disponible sous mSQL) .................... 47
Exemple ...................................................................................... 47
Les méthodes setXXX ............................................................... 47
Méthodes setXXX ........................................................................... 48
procédure stockée (non disponible sous mSQL).................. 49
Exemple ...................................................................................... 50
Appel de procédure .................................................................. 50
Récupération de résultats ........................................................ 51
Méthodes getXXX ........................................................................... 53
Correspondance des types de données SQL en Java ................... 54
Utilisation de l’API JDBC................................................................. 55
Types de conception des pilotes JDBC .................................. 55
Types d’architecture d’accès aux bases de données .................... 56
Conceptions en deux niveaux ................................................. 56
Conceptions en trois niveaux .................................................. 57
Applets................................................................................................ 58
Applets et applications de bases de données traditionnelles .
58
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
Performances ............................................................................. 58
Contraintes de sécurité............................................................. 59
Accès au manipulations graphiques .............................................. 62
Le package AWT ....................................................................... 62
Les gestionnaires de Disposition (LayoutManager) .................... 63
Les événements ................................................................................. 65
Evénements sources.................................................................. 65
Traitements d’événements....................................................... 65
Modèle de délégation (JDK 1.1) .............................................. 66
Comportement de l’interface graphique utilisateur Java............ 70
Catégories d’événements ......................................................... 70
Tableaux ............................................................................................. 71
Comportement de l’interface graphique utilisateur Java............ 72
Evénements générés par composants AWT.......................... 72
Obtention d’informations sur un événement ....................... 73
Récepteurs multiples ................................................................ 73
Adaptateurs d’événements.............................................................. 74
Button.......................................................................................... 76
List....................................................................................................... 80
TextArea ............................................................................................. 83
TextComponent......................................................................... 84
Frame .................................................................................................. 85
Panel.................................................................................................... 86
Dialog.................................................................................................. 87
FileDialog ........................................................................................... 89
ScrollPane........................................................................................... 90
Menus ................................................................................................. 91
Menu Aide ................................................................................. 91
MenuBar ............................................................................................. 92
Menu ................................................................................................... 93
MenuItem ........................................................................................... 94
CheckboxMenuItem ......................................................................... 95
PopupMenu ....................................................................................... 96
Contrôle des aspects visuels............................................................ 98
Couleurs ..................................................................................... 98
Polices ......................................................................................... 99
Polices ....................................................................................... 100
Impression........................................................................................ 101
E/S JAVA : concepts fondamentaux............................................ 104
flots d’E/S (Streams)............................................................... 104
I/O Streams et Reader/Writer.............................................. 105
catégories de flots.................................................................... 105
filtres ......................................................................................... 106
Fichiers.............................................................................................. 107
Noms de fichiers ............................................................ 107
Tests de fichiers ............................................................. 107
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
Information générale axée sur les fichiers et utilitaires.
107
Utilitaires en rapport avec les répertoires .................. 107
Linéarisation .................................................................................... 108
Classes DataInputStream et DataOutputStream..... 108
Méthodes DataInputStream ......................................... 108
Object Input/Output .............................................................. 109
Architecture de linéarisation ......................................................... 110
Package java.io ........................................................................ 110
Interface Serializable ....................................................... 111
Eléments sérialisables............................................................. 111
Ecriture et lecture d’un flot d’objets ............................................. 112
Lecture ...................................................................................... 112
qu’est ce qui est transferré? ................................................... 113
personnalisation de la lecture/écriture d’objet .................. 114
Externalisable........................................................................... 115
Programmation réseau sous Java ................................................. 118
Sockets ...................................................................................... 118
Le modèle réseau de Java............................................................... 119
Principe d’un Serveur TCP/IP...................................................... 120
Exemple de code de mise en oeuvre d’un serveur TCP/IP
120
Principe d’un Client TCP/IP......................................................... 121
échanges UDP................................................................................. 122
Exemple de Serveur UDP ............................................................. 123
Exemple de client UDP ................................................................ 124
UDP en diffusion (Multicast) ..................................................... 125
Exemple de Serveur Multicast ..................................................... 126
Exemple de client Multicast .......................................................... 127
Fonction de l’architecture RMI en Java........................................ 131
Packages et hiérarchies RMI.......................................................... 132
Package java.rmi ................................................................. 132
Création d’une application RMI ................................................... 135
Exemple bancaire .................................................................... 135
Création d’une application RMI ................................................... 136
Interfaces bancaires................................................................. 136
Procédure ................................................................................. 138
Interface Account .................................................................. 139
Interface AccountManager................................................... 140
réalisation de l’interface Account — AccountImpl .......... 141
AccountManagerImpl............................................................ 143
Classe de conteneurs ..................................................... 145
Compilation du code .............................................................. 146
Utilisation de la commande rmic......................................... 147
Application BankServer ...................................................... 148
Application rmiregistry.................................................... 150
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
Application BankClient ...................................................... 151
Exécution de l’application BankClient .............................. 154
Syntaxe............................................................................. 155
Exemples ......................................................................... 155
Sécurité RMI..................................................................................... 156
Chargement de classe ............................................................. 156
Côté serveur RMI ........................................................... 156
Côté client RMI............................................................... 157
Invocation RMI au travers d’un coupe-feu ......................... 157
Pourquoi réaliser du code natif?................................................... 160
un exemple : "Hello World" en C.................................................. 161
résumé des phases : ................................................................ 161
Ecriture du code JAVA :................................................ 161
Création des binaires JAVA de référence : ................ 161
Génération du fichier d’inclusion C/C++ :................ 161
Ecriture du code natif : ................................................ 161
Création d’une librairie dynamique:.......................... 161
Exécution: ........................................................................ 161
Ecriture du code JAVA........................................................... 162
Création des binaires JAVA de référence ............................ 163
Génération du fichier d’inclusion C/C++........................... 164
Ecriture du code natif ............................................................. 165
Création d’une librairie dynamique..................................... 166
Exécution .................................................................................. 167
présentation de JNI ......................................................................... 168
JNI: types, accès aux membres, création d’objets....................... 169
références sur des objets JAVA: .................................................... 172
exceptions......................................................................................... 173
invocation de JAVA dans du C..................................................... 174
Organisation des packages et des répertoires............................. 176
convention de codage..................................................................... 177
Identificateurs (conventions standard)................................ 177
Identificateurs (conseils complémentaires)......................... 177
Nommage (conseils complémentaires)................................ 178
Mise en page ............................................................................ 179
portabilité ......................................................................................... 180
performances ................................................................................... 181
traces, exceptions ........................................................................... 182
le "bon " et le "beau" code ?............................................................ 183
les interactions graphiques ............................................................ 187
répartition......................................................................................... 188
les protocoles ........................................................................... 189
internationalisation......................................................................... 190
intégration des méthodes natives ................................................. 191
introduction : R.A.D et/ou maîtrise du code de base?.............. 194
L’intégration des outils, les ateliers .............................................. 196
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
analyse et conception...................................................................... 197
L’éditeur ........................................................................................... 198
Outils annexes à l’éditeur .............................................................. 199
L’aide à la conception d’interaction ............................................. 200
Gestion des sources......................................................................... 201
principes ................................................................................... 201
outils.......................................................................................... 201
points ........................................................................................ 202
Gestionnaires de maintenance ...................................................... 203
Documentation de code, aide en ligne........................................ 204
Debug................................................................................................ 205
outils.......................................................................................... 205
génération (make) ........................................................................... 206
tests.................................................................................................... 207
principes ................................................................................... 207
produits .................................................................................... 207
points ........................................................................................ 208
analyse de couverture .................................................................... 209
analyses de performances.............................................................. 210
principes ................................................................................... 210
outils.......................................................................................... 210
points ........................................................................................ 210
Analyses statiques du code ........................................................... 211
principes ................................................................................... 211
outils.......................................................................................... 211
points ........................................................................................ 211
préparation à la livraison ............................................................... 212
livraison/déploiement ................................................................... 213
autres outils...................................................................................... 214
décompilateurs/brouilleurs .................................................. 214
outils syntaxiques.................................................................... 214
JavaWorkshop: Gestionnaire de projets ...................................... 216
Mise en oeuvre du “Project Manager”................................. 216
créer ou importer un portefeuille ......................................... 217
créer ou importer un projet ................................................... 217
fixer les attributs d’un projet ................................................. 218
JavaWorkshop: édition, compilation, tests.................................. 219
édition ....................................................................................... 219
personnalisation de l’édition ................................................. 219
contrôle d’accès et version ..................................................... 219
compilation .............................................................................. 220
test ............................................................................................. 220
Copyright 1998 Sun Microsystems, Inc. Tous droits réservés. SunService Avril 98
Introduction
i
Copyright 1998 Sun Microsystems, Inc. All Rights Reserved. SunService 1998
Prérequis
Objectifs
Ce chapitre décrit:
Généralités
L’exposé du problème ne définit pas toutes les spécifications (on retrouve
ici une situation courante dans la vie réelle!). Quelques précisions
supplémentaires seront données par l’animateur dans les présentations
de phases . Il faudra donc réfléchir à des spécifications plus détaillées, en
discuter en équipe et prendre des décisions définitives en accord avec les
orientations que fixera l’animateur.
Exposé du problème
Une société de courtage en bourse a commencé à réaliser une application
pour la saisie d’ordres de bourse. Pour différentes raisons il y a eu un
début de réalisation et l’équipe que vous allez constituer doit tenir compte
du système existant.
Le système existant
La société va déployer son application sur son réseau local sécurisé
(vision "intranet")
• Un serveur HTTP
Le Projet 1/2
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
• Base mSQL:
• serveur HTTP :
Le Projet 1/3
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
Le poste de travail d’un courtier en bourse
Spécifications (suite)
Configuration de la base :
Customer Table
Shares Table
Stock Table
Le Projet 1/4
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
Le poste de travail d’un courtier en bourse
Spécifications générales
L’outil à développer en JAVA doit être un système opérant en mode
client/serveur permettant de mettre à jour les informations contenues
dans la base de données.
Fonctionnalités principales :
Le Projet 1/5
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
Le poste de travail d’un courtier en bourse
Limitations
Du fait de limitations importantes dans le temps on s’efforcera de
simplifier certains aspects du projet.
• Idem pour les valeurs de la cote qui ne seront connues que par
leur code (symbol).
Le Projet 1/6
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
PHASE 1 : l’architecture générale
principes
Déterminer l’architecture générale du projet.
Le Projet 1/7
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
réalisation
1. Former les équipes de développement
4. Obtenir un accord entre les équipes pour que les méthodes d’API
soient communes (objectif: un composant réalisé par une équipe
doit pouvoir être utilisé par l’autre).
références
voir chapitres :
Le Projet 1/8
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
PHASE 2 : l’accès à la base
principes
Réaliser le module d’interrogation de la base de données au travers de
JDBC.
Ce module sera testé à l’aide d’une interface très simplifiée lisant des
requêtes en mode texte sur l’entrée standard.
réalisation
1. Eventuellement, remise à jour des connaissances sur SQL et JDBC
Le Projet 1/9
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
références
voir chapitres :
Le Projet 1/10
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
PHASE 3 : l’interaction utilisateur
principes
Maquette graphique : concevoir et réaliser une première version
d’interface utilisateur.
En tenant compte des principes de conception d’une interface
ergonomique concevoir une interface qui permette à l’opérateur de:
réalisation
1. Eventuellement, remise à jour des connaissances sur les
composants, la disposition AWT, la gestion des événements
graphiques.
Le Projet 1/11
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
4. Tester avec des conditions erronées (analyser la mise en oeuvre
des mécanismes de récupération d’exceptions et leur effet sur
l’interface utilisateur).
références
voir chapitres :
• outils : JavaWorkShop
Le Projet 1/12
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
PHASE 4 : assemblage d’un produit complet
principes
Mise en service dans des conditions réelles.
Répartition de l’application :
réalisation
1. Eventuellement, remise à jour des connaissances sur Sockets,
Threads, DataInput/OutPut, Serialisation, RMI
Le Projet 1/13
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
références
voir chapitres :
Le Projet 1/14
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
PHASE 5 : consolidations, extensions
principes
• compléments de réalisation : impressions, journalisation locale,
personnalisation de l’interface utilisateur.
réalisation
1. Réalisations facultatives : impression d’un document attestant
d’un ordre de bourse (vente-achat d’actions), journalisation locale
des opérations effectuées par l’opérateur, personnalisations de
l’interface utilisateur, exploration de la réalisation de code natif.
références
voir chapitres :
• rappels: JNI
Le Projet 1/15
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
1
Le Projet 1/16
Intitulé Cours: L’atelier de developpement JAVA
Client : Sun Service Formation Révision : D
Réf. Sun : LJ300 Date : 20/7/98
SQL (et miniSQL) 2
1
Objectifs
• introduction à l’outil mSQL
• introduction à SQL
Références
The Practical SQL Handbook, Emerson, Darnovsky, and Bowman, Addison-
Wesley, 1989.
Généralités
Ce cours utilise une base SQL appelée mini-SQL (mSQL).
mSQL est un produit (disponible sous licence) créé par David Hughes1.
Ce produit comprend: le moteur de base de données, une interface
"terminal" simple, un programme d’administration de la base, un
visualiseur de schema et une API en langage "C". L’API et le moteur
fonctionnent dans un environnement client/serveur en utilisant les
services de TCP/IP.
1. MiniSQL nous est fourni par Hughes Technologies Pty Ltd (Australie). Pour
plus d’informations ou pour une copie d’évaluation voir l’adresse :
www.Hughes.com.au.
la réalisation de mSQL
mSQL est écrit en C et la version utilisée dans ce cours a été adaptée pour
Solaris. Au coeur de mSQL il y a le daemon msqld qui écoute sur un port
TCP/IP. Voici un extrait du manuel mSQL :
The server may be accessed either via a well known TCP socket
or via a UNIX domain socket with the file system
(/dev/msqld). The availability of the TCP socket allows client
software to access data stored on machine over the network.
relshow permet d’interroger la base pour connaître les noms des tables
ou les caractéristiques des champs. Il peut être lancé soit localement soit à
distance :
relshow [-h hostname] database
relshow [-h hostname] database tablename
msqldump produit une trace qui peut être utilisée en entrée par le
terminal mSQL. On peut ainsi facilement créer des copies de la base (y
compris sur le réseau avec option -h)
Selon cette définition, la base test est accessible à la fois par des
connexions locales (local) et distantes (remote). Ces connexions peuvent
provenir de tout hôte dans le domain Bond.edu.au sauf pour la machine
student.it.Bond.edu.au.
L’accès en lecture est reservé uniquement à bambi et paulp (et personne
d’autre). L’accès en écriture est reservé à root.
A noter également: les "zones" décrivant chaque base doivent être séparés
par une ligne blanche (qui marque ainsi la fin de la description de la base
courante). Il peut y avoir plusieurs lignes portant sur la même entrée
comme dans:
read=bambi,paulp
read=root
Les informations sur les listes de contrôle d’accès peuvent être rechargées
en cours d’éxécution par msqladmin reload. Ceci réanalysera le fichier
de configuration avant de lancer la commande reload (donc uniquement
si l’analyse s’est correctment terminée). Comme pour toutes les
commandes de msqladmin cette commande ne sera acceptée que si elle
est lancée par root sur la machine serveur.
msql lit des requêtes en mode texte et affiche les résultats. On peut le
lancer localement ou sur un site distant:
msql [-h hostname] database
msql reconnaît quatre commande spéciales préfixées par (\) pour les
distinguer des ordre SQL.
• \q Quittter mSQL.
Généralités
Chaque requête SQL commence par un mot-clef particulier, mSQL répond
aux commandes suivantes :
La requête SELECT
La requête SELECT est la commande élémentaire pour rechercher des
valeurs contenues dans la base. Cette commande permet les services
suivants :
Operateur peut être <, >, =, <=, >=, <>, ou LIKE.Valeur peut être une
colonne ou une constante littérale..
Exemples
Pour trier les résultats dans l’ordre ascendant pour le nom (last_name) et
en ordre descendant pour le prénom (first_name) :
SELECT first_name, last_name FROM emp_details
WHERE dept = 'finance'
ORDER BY last_name, first_name DESC
Jointures
Exemple : une table décrit les employés (emp_details) et une autre table
decrit les équipes de projet (project_detail). Chaque membre d’une équipe
est repéré par un code (emp_id) qui identifie de manière unique un
employé. Pour avoir les informations détaillées sur qui travaille dans quel
projet :
SELECT emp_details.first_name, emp_details.last_name,
project_details.project
FROM emp_details, project_details
WHERE emp_details.emp_id = project_details.emp_id
ORDER BY emp_details.last_name, emp_details.first_name
La jointure entre les deux tables se fait par leurs champs emp_id respectifs
(on notera que ce champ est une clef dans la table emp_details).
mSQL ne limite pas le nombre de tables que l’on peut impliquer dans une
jointure.
✏
en mSQL tous les noms de colonnes dans une jointure doivent être
qualifiés (c’est à dire rattachés à une table). Il n’y a pas de rattachement
implicite d’une colonne à une table.
La commande INSERT
La commande INSERT permet d’ajouter de nouveaux enregistrements à
une table. Il faut spécifier à la fois les noms des champs (décrire le N-
uplet) et la combinaison de valeurs correspondantes (le N-uplet lui-
même) .
INSERT INTO table_name ( column [ , column ]... )
VALUES (value [, value]... )
exemple:
INSERT INTO emp_details ( first_name, last_name, dept,
salary)
VALUES ('David', 'Hughes', 'I.T.S.','12345')
La commande DELETE
La commande DELETE permet de détruire des enregistrements d’une
table. La syntaxe en est:
DELETE FROM table_name
WHERE column Operateur Valeur
[ AND | OR column Operateur Valeur ]...
Exemple:
DELETE FROM emp_details WHERE emp_id = ’12345’
La commande UPDATE
La commande UPDATE permet de changer une ou plusieurs valeurs de
champs dans un enregistrement existant. En mSQL seules des valeurs
littérales peuvent être utilisées pour spécifier la nouvelle valeur d’un
champ (on ne peut pas indiquer un nom de colonne par ex.)
UPDATE table_name SET column=Valeur [, column=Valeur ]...
WHERE column Operateur Valeur
[ AND | OR column Operateur Valeur ]...
Exemple:
UPDATE emp_details SET salary=30000 WHERE emp_id = ’1234’
Exemple:
CREATE TABLE emp_details(
first_name char(15) not null,
last_name char(15) not null,
dept char(20),
emp_id int primary key,
salary int
)
• char (len)
• int
• real
Exemple :
Query OK.
10 rows matched.
+-----------------+--------------+
| symbol | price |
+-----------------+--------------+
| SUNW | 68.75 |
| CyAs | 22.625 |
| DUKE | 6.25 |
| ABStk | 18.5 |
| JSVCo | 9.125 |
| TMAs | 82.375 |
| BWInc | 11.375 |
| GMEnt | 44.625 |
| PMLtd | 203.375 |
| JDK | 33.5 |
+-----------------+--------------+
mSQL >
✏
ATTENTION: ne créer ni détruire aucune table..
Plan du cours
L’API Java de connectivité des bases de données (JDBC) permet aux
développeurs d’écrire un code d’accès à une base de données, sans
connaître la réalisation concrète de cette base.
Bibliographie
• Caractéristiques JDBC : http://java.sun.com/products/jdbc
Application Java
(API JDBC)
URL URL
URL URL
Pilotes ODBC
et de bases Possibilités d’implémentation JDBC
de données
• détermination de la base
Package java.sql
Huit interfaces sont associées à l’API JDBC :
• Driver
• Connection
• Statement
• PreparedStatement
• CallableStatement
• ResultSet
• ResultSetMetaData
• DatabaseMetaData
DriverManager
Driver Driver
Connection Connection
Connection Statement
ResultSet
ResultSet ResultSet
Cet exemple simple utilise la base de données Mini-SQL, ainsi que les
éléments d’une application JDBC. Les opérations réalisées seront les
suivantes : création d’une instance Driver, obtention d’un objet
Connection, création d’un objet Statement et exécution d’une requête,
puis traitement de l’objet retourné ResultSet.
1 import java.sql.*;
2 import COM.imaginary.sql.msql.*;
3
4 public class JDBCExample {
5
6 public static void main (String args[]) {
7
8 if (args.length < 1) {
9 System.err.println ("Usage:");
10 System.err.println (" java JDBCExample <db server hostname>");
11 System.exit (1);
12 }
13 String serverName = args[0];
14 try {
15 // Create the instance of the Msql Driver
16 new MsqlDriver ();
17
18 // Create the "url"
19 String url = "jdbc:msql://" + serverName +
20 ":1112/StockMarket";
21
22 // Use the DriverManager to get a Connection
23 Connection mSQLcon = DriverManager.getConnection (url);
24
25 // Use the Connection to create a Statement object
26 Statement stmt = mSQLcon.createStatement ();
27
28 // Execute a query using the Statement and return a ResultSet
29 ResultSet rs = stmt.executeQuery
30 "SELECT ssn, cust_name FROM Customer" +
31 " order by cust_name");
Résultats:
% java JDBCExample serveur
Il n’est pas nécessaire d’associer ce pilote à une variable car le pilote est
référencé par un objet statique.
Chaîne URL
Gestionnaire de pilotes Programme
Explication Connexion à la
base de données
Le gestionnaire de pilotes appelle StockMarket
getConnection(URL) qui appelle
driver.connection(URL) pour les pilotes du
vecteur jusqu’à ce qu’une correspondance soit trouvée.
L’URL est analysé (jdbc:drivername).
Lorsque le pilote du vecteur correspond au drivername analysé, une
connexion est établie.
Si le pilote ne correspond pas, la valeur NULL est retournée et le StockMarket
pilote suivant du vecteur est examiné.
Exemple
public boolean prepStatement(Reservation obj){
PreparedStatement prepStmnt =
msqlConn.prepareStatement( "UPDATE Flights SET
numAvailFCSeats = ? WHERE flightNumber = ?" );
prepStmnt.setInt(1,
(Integer.parseInt(obj.numAvailFCSeats) - 1));
prepStmnt.setLong(2, obj.FlightNo);
int rowsUpdated = prepStmnt.executeUpdate();
return (rowsUpdated > 0) ;
}
Exemple
String planeID = "727";
CallableStatement querySeats =
msqlConn.prepareCall("{call
return_seats(?, ?, ?, ?)}");
try {
querySeats.setString(1, planeID);
querySeats.registerOutParameter(2,
java.sql.Type.INTEGER);
querySeats.registerOutParameter(3,
java.sql.Type.INTEGER);
querySeats.registerOutParameter(4,
java.sql.Type.INTEGER);
querySeats.execute();
int FCSeats = querySeats.getInt(2);
int BCSeats = querySeats.getInt(3);
int CCSeats = querySeats.getInt(4);
} catch (SQLException SQLEx){
System.out.println("Query failed");
SQLEx.printStackTrace();
}
Appel de procédure
Avant d’exécuter un appel de procédure stockée, vous devez
explicitement appeler registerOutParameter pour enregistrer le type
java.sql.Type de tous les paramètres SQL OUT.
Récupération de résultats
Le résultat de l’exécution d’une instruction peut se présenter sous forme
de table de données accessible via un objet java.sql.ResultSet. Cette
table se compose d’une série de lignes et de colonnes. Les lignes sont
récupérées dans l’ordre. Un objet ResultSet maintient un curseur sur la
ligne de données courante et le positionne tout d’abord sur la première
ligne. Le premier appel de l’instruction next définit la première ligne en
tant que ligne courante, le second appel déplace le curseur sur la seconde
ligne, etc.
getASCIIStream java.io.InputStream
getBigDecimal java.math.BigDecimal
getBinaryStream java.io.InputStream
getBoolean boolean
getByte byte
getBytes byte[]
getDate java.sql.Date
getDouble double
getFloat float
getInt int
getLong long
getObject Object
getShort short
getString java.lang.String
getTime java.sql.Time
getTimestamp java.sql.Timestamp
getUnicodeStream java.io.InputStream de caractères Unicode
La table 2-3 présente les types Java standard pour la correspondance avec
divers types SQL courants.
CHAR String
VARCHAR String
LONGVARCHAR String (ou Stream)
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
Performances
Les performances relatives aux implémentations de connectivité diffèrent
selon que la base de données se trouve ou non sur le réseau. Le temps de
réponse d’une applet de base de données Internet sera très supérieur à
celui d’une applet de réseau local.
Contraintes de sécurité
Certaines contraintes de sécurité rencontrés avec des applets non
sécurisés peuvent apparaître lors de l’utilisation d’une signature digitale
ou d’un scénario à clé cryptographique. Dans ce cas, une applet est traitée
comme une application au sens sécuritaire, mais il subsistera toujours des
problèmes entre les bases de données du client en raison de la difficulté à
localiser la structure de répertoire de la base de données ou du pilote de
base de données.
JAVA BLEND est un tel ensemble d’outils et d’API qui s’appuie du JDBC
et sur JTS (Java Transaction Service : API d’accès aux services
transactionnels).
Objectifs
Rappels sur :
• Les LayoutManagers
Le package AWT
Le package AWT fournit les objets pour accéder aux services du terminal
virtuel portable.
fenêtre.add(panCentral, BorderLayout.CENTER);
fenêtre.add(panBas, BorderLayout.SOUTH);
Evénements sources
Un événement source (au niveau de l’interface utilisateur) est le résultat
d’une action utilisateur sur un composant AWT. A titre d’exemple, un clic
de la souris sur un composant bouton génère (source) un ActionEvent.
L’ActionEvent est un objet (une instance de la classe) contenant des
informations sur le statut de l’événement :
Traitements d’événements
Lorsqu’un événement se produit, ce dernier est reçu par le composant
avec lequel l’utilisateur interagit (par exemple un bouton, un curseur, un
textField, etc.). Un traitement d’événement est une méthode qui reçoit un
objet Event de façon à ce que le programme puisse traiter l’interaction de
l’utilisateur.
Les événements sont des objets qui ne sont renvoyés qu’aux veilleurs
enregistrés. A chaque type d’événement est associé une interface d’écoute
correspondante.
Catégories d’événements
Le mécanisme général de réception des événements à partir de
composants a été décrit dans le contexte d’un seul type d’événement.
Plusieurs événements sont définis dans le package java.awt.event, et
des composants tiers peuvent s’ajouter à cette liste.
Pour chaque catégorie d’événements, il existe une interface qui doit être
implémentée par toute classe souhaitant recevoir ces événements. Cette
interface exige aussi qu’une ou plusieurs méthodes soient définies. Ces
méthodes sont appelées lorsque des événements particuliers surviennent.
Le tableau de la page suivante liste les catégories et indique le nom de
l’interface correspondante ainsi que les méthodes associées. Les noms de
méthodes sont des mnémoniques indiquant les conditions générant
l’appel de la méthode.
On remarquera qu’il existe des événements de bas niveau (une touche est
pressée, on clique la souris) et des événements abstraits de haut niveau
(Action = sur un bouton on a cliqué, sur un TextField on a fait un <retour
chariot>, ...)
Table 4:
Acti mou
on com cont
adju focu mou se win
Composant AWT pon aine item key text
st s se moti dow
ent r
on
Button ● ● ● ● ● ●
Canvas ● ● ● ● ●
Checkbox ● ● ● ● ● ●
CheckboxMenuItem ●
Choice ● ● ● ● ● ●
Component ● ● ● ● ●
Container ● ● ● ● ● ●
Dialog ● ● ● ● ● ● ●
Frame ● ● ● ● ● ● ●
Label ● ● ● ● ●
List ● ● ● ● ● ● ●
MenuItem ●
Panel ● ● ● ● ● ●
Scrollbar ● ● ● ● ● ●
ScrollPane ● ● ● ● ● ●
TextArea ● ● ● ● ● ●
TextComponent ● ● ● ● ● ●
TextField ● ● ● ● ● ● ●
Window ● ● ● ● ● ● ●
Récepteurs multiples
La structure d’écoute des événements AWT permet actuellement
d’associer plusieurs veilleurs au même composant. En général, si on veut
écrire un programme qui effectue plusieurs actions basées sur un même
événement, il est préférable de coder ce comportement dans la méthode
de traitement.
✏
L’ordre d’appel des méthodes de traitement n’est pas défini. En général, si
cet ordre a une importance, les méthodes de traitement ne sont pas liées et
on ne doit pas utiliser cette fonction pour les appeler. Au lieu de cela, il
faut enregistrer simplement le premier écouteur et faire en sorte qu’il
appelle directement les autres. C’est ce qu’on appelle un multiplexeur
d’événements
• mouseClicked (MouseEvent)
• mouseEntered (MouseEvent)
• mouseExited (MouseEvent)
• mousePressed (MouseEvent)
• mouseReleased(MouseEvent)
Pour des questions pratiques, Java fournit une classe d’adaptateurs pour
pratiquement chaque interface de veiller, cette classe implante l’interface
appropriée, mais ne définit pas les actions associées à chaque méthode.
De cette façon, la routine d’écoute que l’on définit peut hériter de la classe
d’adaptateurs et ne surcharger que des méthodes choisies.
Par exemple :
import java.awt.*;
import.awt.event.*;
Button
C’est un composant d’interface utilisateur de base de type "appuyer pour
activer". Il peut être construit avec une étiquette de texte précisant son
rôle .
Button b = new Button(“Sample”);
add(b);
b.addActionListener(this);
On peut créer des cases à cocher à l’aide d’un constructeur spécial qui
utilise un argument supplémentaire CheckboxGroup. Si on procéde ainsi,
l’aspect des cases à cocher est modifié et toutes les cases à cocher liées au
même groupe adoptent un comportement de "bouton radio".
CheckboxGroup cbg = new CheckboxGroup();
Checkbox one = new Checkbox("One", cbg, false);
Checkbox two = new Checkbox("Two", cbg, false);
Checkbox three = new Checkbox("Three", cbg, true);
add(one);
add(two);
add(three);
Lorsqu’un composant Choice est activé il affiche la liste des éléments qui
lui ont été ajoutés. Notez que les éléments ajoutés sont des objets de type
chaîne (String).
Cet espace peut être utilisé pour dessiner, recevoir du texte ou des saisies
en provenance du clavier ou de la souris.
MaFrame
On peut ajouter des veilleurs d’événements de divers type dans une zone
de texte.
TextComponent
La classe TextComponent dont dérivent TextField et TextArea fourni
un grand nombre de méthodes.
C’est la fenêtre générale de "plus haut niveau". Elle possède des attributs
tels que : barre de titre et zones de contrôle du redimensionnement.
Frame f = new Frame(“Frame”);
Les Panels peuvent gérer les événements (rappel : le focus clavier doit
être demandé explicitement).
✏
Il est recommandé de considérer une boîte de dialogue comme un
dispositif réutilisable. Ainsi, vous ne devez pas détruire l’objet individuel
lorsqu’il est effacé de l’écran, mais le conserver pour une réutilisation
ultérieure.
L’exception est le menu PopUpMenu qui peut être ajouté à n’importe quel
composant, mais dans ce cas précis, il n’est pas question de disposition à
proprement parler.
Menu Aide
Une caractéristique particulière de la barre de menus est que l’on peut
désigner un menu comme le menu Aide. Cette opération s’effectue par
l’intermédiaire de la méthode setHelpMenu(Menu). Le menu à considérer
comme le menu Aide doit avoir été ajouté à la barre de menus, et il sera
ensuite traité de la façon appropriée pour un menu Aide sur la plate-
forme locale. Pour les systèmes de type X/Motif, cela consiste à décaler
l’entrée de menu à l’extrémité droite de la barre de menus.
MenuBar
Menu Menu
MenuItem MenuItem
La classe Menu fournit le menu déroulant de base. Elle peut être ajoutée à
une barre de menus ou à un autre menu.
MenuBar mb = new MenuBar();
Menu m1 = new Menu("File");
Menu m2 = new Menu("Edit");
Menu m3 = new Menu("Help");
mb.add(m1);
mb.add(m2);
mb.add(m3);
mb.setHelpMenu(m3);
✏
Les menus présentés ici sont vides ce qui explique l’aspect du menu File.
s.addActionListener(...);
l.addActionListener(...);
f.add("Center", b);
p.add(s);
p.add(l);
f.add(p);
✏
Le menu PopUp doit être ajouté à un composant "parent". Cette opération
diffère de l’ajout de composants ordinaires à des conteneurs. Dans
l’exemple suivant, le menu instantané a été ajouté au Frame englobant.
Coordonnées % composantes
d’origines
✏
Le composant d’origine doit être sous (ou contenu dans) le composant
parent dans la hiérarchie des composants.
Couleurs
Deux méthodes permettent de définir les couleurs d’un composant :
• setForeground(...)
• setBackground(...)
Ces deux méthodes utilisent un argument qui est une instance de la classe
java.awt.Color. On peut utiliser des couleurs de constante désignées
par Color.red Color.blue etc. La gamme complète de couleurs
prédéfinies est documentée dans la page relative à la classe Color.
Un tel constructeur crée une couleur d’après les intensités de rouge, vert
et bleu spécifiées sur une échelle allant de 0 à 255 pour chacune.
Polices
La police utilisée pour afficher du texte dans un composant peut être
définie à l’aide de la méthode setFont(). L’argument utilisé pour cette
méthode doit être une instance de la classe java.awt.Font.
Aucune constante n’est définie pour les polices, mais on peut créer une
police en indiquant son nom, son style et sa taille en points.
Font f = new Font(“TimesRoman”, Font.PLAIN, 14);
• Dialog
Polices
Les constantes de style de police sont en réalité des valeurs entières (int),
parmi celles citées ci-après :
• Font.BOLD
• Font.ITALIC
• Font.PLAIN
• Font.BOLD + Font.ITALIC
Les tailles en points doivent être définies avec une valeur entière.
L’impression est gérée dans Java 1.1 d’une façon similaire à l’affichage sur
écran. Grace à une instance particulière de java.awt.Graphics toute
instruction de dessin dans ce contexte est en fait destinée à l’imprimante.
Après avoir créé une page de sortie conforme à ce que l’on souhaite, on
utilise la méthode dispose() pour que cette page soit soumise à
l’imprimante.
Une fois ce travail terminé, on appele la méthode end() sur l’objet tâche
d’impression. Elle indique que la tâche d’impression est terminée et
permet au système de traitement en différé d’exécuter réellement la tâche
puis de libérer l’imprimante pour d’autres tâches.
Objet
Rappels des notions fondamentales sur les Entrées/Sorties JAVA:
• Flots (Streams)
• I/OStreams et Reader/Writer
• catégories de flots
• filtres
• fichiers
• Data Input/Output
• Object Input/Output
Pour pouvoir être réalisés de manière portable sur tous les systèmes les
Entrés/Sorties Java s’appuient sur des concepts abstraits de haut niveau.
catégories de flots
Parmi les classes de l’API JAVA on peut classifier les flots selon:
filtres
De nombreuses classes d’E/S -et, en particulier, les classes de type
Filter* (FilterInputStream, FilterReader,..)- sont des
adaptateurs qui permettent de combiner les caractéristiques de plusieurs
classes d’Entrées/Sorties.
Noms de fichiers
• String getName()
• String getPath()
• String getAbsolutePath()
• String getParent()
Tests de fichiers
• boolean exists()
• boolean canWrite()
• boolean canRead()
• boolean isFile()
• boolean isDirectory()
• boolean isAbsolute();
• long lastModified()
• long length()
• boolean delete()
• boolean mkdir()
• String[] list()
Méthodes DataInputStream
byte readByte()
boolean readBoolean()
char readChar()
short readShort()
int readUnsignedShort()
int readInt()
long readLong()
float readFloat()
double readDouble()
String readUTF()
Bibliographie
voit documentation
http://chatsubo.sun.com/current/serial/index.html
Object Input/Output
L’interface API de linéarisation d’objet Java fournit un moyen simple et
transparent permettant de transférer des objets JAVA ou de les conserver
dans un fichier.
Package java.io
L’API de linéarisation est basée sur des interfaces conçues pour introduire
ou extraire des objets (ou des types scalaires) d’un flot d’E/S..
java.io.DataOutput java.io.OutputStream
ObjectOutput ObjectOutputStream
ObjectStreamConstants
java.io.DataInput java.io.InputStream
ObjectInput ObjectInputStream
java.lang.Object
java.io.Serializable
Légende
Classe
Classe abstraite
Interface
java.io.Externalizable Etend
Implante
Interface Serializable
L’interface Serializable sert à identifier les classes pouvant être
linéarisées.
Toute classe peut être linéarisée dans la mesure où elle satisfait aux
critères suivants :
Eléments sérialisables
Tous les champs (données) d’un objet Serializable sont écrits dans le
flot. Sont concernés les types scalaires, les tableaux et les références à
d’autres objets.
Ecriture
L’écriture et la lecture d’un objet dans un flot de fichiers est un processus
simple. Examinons le fragment de code suivant qui transmet une instance
d’un objet java.util.Date à un fichier :
Date d = new Date();
FileOutputStream f = new FileOutputStream("date.ser");
ObjectOutputStream s = new ObjectOutputStream (f);
try {
s.writeObject (d);
s.close ();
} catch (IOException e) {
e.printStackTrace();
}
Lecture
La lecture de l’objet est aussi simple que l’écriture, à une exception près —
la méthode readObject() retourne le flot sous forme de type Object et
elle doit être associée au nom de classe correspondant, avant que
l’exécution des méthodes sur cette classe soit possible :
Date d = null;
FileInputStream f = new FileInputStream ("date.ser");
ObjectInputStream s = new ObjectInputStream (f);
try {
d = (Date)s.readObject ();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println ("Date serialized at: "+ d);
• de la désignation de la classe,
• de sa "signature"
Cela implique :
Externalisable
Les classes implantant l’interface Externalizable, prennent la
responsabilité du stockage et de la récupération de l’état de l’objet lui-
même.
package java.io;
Objectifs
Rappels :
• utiliser UDP
Sockets
Les Sockets sont des points d’entrée de communication bi-directionnelle
entre deux applications sur un réseau.
Serveur
Enregistrer
ServerSocket (port #, nb_cnx) ce service. Client
Utiliser la Socket
InputStream OutputStream
OutputStream InputStream
close () close ()
import java.net.*;
import java.io.*;
// envoyer la chaîne!
dos.writeUTF(sendString);
Le client correspondant :
import java.net.*;
import java.io.*;
// on coupe la connexion
s1.close();
}
1import java.io.* ;
2 import java.net.* ;
3 import java.sql.* ;
4
5 public class DatagServer {
6 public static final int PORT = 9999 ;
7 public static final int DATA_MAX_SIZE = 512 ;
8
9 public static void main (String[] tbArgs) {
10 byte[] recBuffer = new byte[DATA_MAX_SIZE] ;
11 try{
12 DatagramSocket veille = new DatagramSocket(PORT) ;
13 while (veille != null) {
14 DatagramPacket recvPack = new DatagramPacket(
15 recBuffer, recBuffer.length) ;
16 veille.receive(recvPack) ;
17 ObjectInputStream inz = new ObjectInputStream
18 (new ByteArrayInputStream(recvPack.getData())) ;
19 Object obj = inz.readObject() ;
20 System.out.println(obj) ;
21 ByteArrayOutputStream boz = new ByteArrayOutputStream();
22 ObjectOutputStream oz = new ObjectOutputStream (boz);
23 oz.writeObject(obj) ;
24 oz.writeObject(new Timestamp(System.currentTimeMillis()));
25 // consommation excessive de données (deux byte buffers!)
26 DatagramPacket sendPack =
27 new DatagramPacket(boz.toByteArray(), boz.size(),
28 recvPack.getAddress() ,recvPack.getPort());
29 veille.send(sendPack) ;
30 }
31 } catch (Exception exc ) {
32 System.err.println(exc) ;
33 }
34
35 }//End main
✏
Actuellement les accès "Multicast" ne sont pas autorisés dans les Applet.
Objectifs
L’API d’invocation de méthodes à distance (RMI) permet d’écrire un code
qui accède aux objets distants comme si c’était des objets locaux.
http://chatsubo.javasoft.com/current/doc/rmi-spec/
rmi-spec.ps
http://chatsubo.javasoft.com/current/doc/tutorial/
rmi-getstart.ps
http://chatsubo.javasoft.com/current/faq.html
Client Serveur
Class
Application Object
Implementation
Method call
Method Results
Package java.rmi
java.lang.SecurityManager java.lang.Object java.io.IOException
Légende
Remote Classe
Classe
extraite
Interface
*Bien qu’il existe davantage d’exceptions dans les packages java.rmi
et java.rmi.server , RemoteException est l’exception que vous Etend
rencontrerez le plus fréquemment.
Implante
• Naming – Cette classe “finale” est utilisée par les clients et serveurs
RMI pour communiquer avec un “aiguilleur” appelé Registre des
noms (Registry) et situé sur la machine serveur. L’application
serveur utilise les méthodes bind et rebind pour enregistrer ses
implantations d’objets auprès du Registre, alors que le programme
client utilise la méthode lookup de cette classe pour obtenir une
référence vers un objet distant.
• Remote – Cette interface doit être étendue par toutes les interfaces
client qui seront utilisées pour accéder aux implantations d’objets
distants.
Package java.rmi.server
java.lang.Object
Operation
LoaderHandler
RMIClassLoader ObjID
RMISocketFactory UID
UnicastRemoteObject
RemoteCall LogStream
RMIFailureHandler
Légende
Skeleton
Classe
Unreferenced Classe
extraite
Etend
ServerRef Implante
Server Client
Open an account
Account Manager
Get current balance
Creates Deposit money
Account
Instance Withdraw money
Exemple bancaire
Pour illustrer l’utilisation de l’invocation RMI, nous allons étudier
l’exemple simple d’une banque dans laquelle on va ouvrir un compte. Les
comptes sont contrôlés par un employé de banque : le gestionnaire de
comptes.
Interfaces bancaires
Si on tente de modéliser ce problème en utilisant l’invocation RMI, on
peut créer deux interfaces Java du type suivant :
• Account.java
package rmi.bank;
interface Account extends Remote {
public float getBalance ();
public void withdraw (float money);
public void deposit (float money);
}
• AccountManager.java
package rmi.bank;
interface AccountManager extends Remote {
public Account open (String name,
float startingBalance);
}
BankClient.java BankServer.java
Account.java AccountManagerImpl.java
(interface)
AccountManager.java AccountImpl.java
(interface)
Procédure
Le processus permettant de créer une application accessible à distance
dans RMI est le suivant :
8. Tester le client.
Interface Account
L’exemple suivant présente l’interface Account complète :
// The Account interface
// Methods for getting the account balance, depositing,
and
// withdrawing money
package rmi.bank;
import java.rmi.*;
public interface Account extends Remote {
// Get the account balance
public float getBalance () throws RemoteException;
// Deposit money to the account -
// throw an exception if the value
// is 0 or a negative number
public void deposit (float balance)
throws BadMoneyException, RemoteException;
// Withdraw money from the account -
//but throw an exception if the
// amount of the withdrawal will exceed the account
balance
public void withdraw (float balance)
throws BadMoneyException, RemoteException;
}
Interface AccountManager
L’interface AccountManager complète inclut :
// The Account Manager interface
package rmi.bank;
import java.rmi.*;
package rmi.bank;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
AccountManagerImpl
La classe AccountManagerImpl est chargée de créer et d’enregistrer de
nouveaux comptes (sous forme d’objets AccountImpl). Cette classe
utilise un vecteur (Vector) permettant d’enregistrer les objets Account
dans une classe de conteneurs appelée AccountInfo, associée au nom
du compte String. Cette classe utilitaire facilite la recherche d’un objet
Account existant.
// AccountManagerImpl - Implementation of the
AccountManager
// interface
//
// This version of the AccountManager class stores all
// instances of the Account(s) it creates in a Vector
// object - if an account requested exists, it will
// return that account.
package rmi.bank;
import java.util.Vector;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
AccountManagerImpl (suite)
// Implement method from AccountManager interface
// Create an instance of an Account - if the account
// name already exists, return that account instead
// of creating a new one
public Account open (String name, float
initialBalance)
throws BadMoneyException, RemoteException {
AccountInfo a;
// Check if this name is in the list already
for (int i = 0; i < accounts.size(); i++) {
a = (AccountInfo)accounts.elementAt(i);
if (a.name.equals (name)) {
return (a.account);
}
}
// Check the initial account value...
if (initialBalance < 0) {
throw new BadMoneyException ("Negative initial
balance!");
}
// Store the new account
a = new AccountInfo();
// Try to create a new account with the starting
balance
try {
a.account = new AccountImpl (initialBalance);
} catch (RemoteException e) {
System.err.println ("Error opening account: "
+ e.getMessage());
throw (e);
}
a.name = name;
accounts.addElement (a);
// Return and instance of an AccountImpl object
return (a.account);
}
}
AccountManagerImpl
Classe de conteneurs
class AccountInfo {
String name;
AccountImpl account = null;
}
Compilation du code
Le chemin d’accès aux classes est important pour la réussite de l’exécution
du code RMI. Il est recommandé d’envisager l’utilisation de l’option -d
du compilateur pour localiser les fichiers de classes créés :
% javac -d classDirectory *.java
Cette étape doit être exécutée après compilation des classes de réalisation
et avant exécution de l’application serveur. La syntaxe de la commande
est la suivante :
Exemple :
% rmic -d classDirectory rmi.bank.AccountManagerImpl \
rmi.bank.AccountImpl
Application BankServer
BankServer gère l’objet AccountManagerImpl. Son unique fonction
consiste à fournir une instance AccountManager à tout client
demandeur.
// BankServer - This class is run on the RMI server
// and is responsible for registering the AccountManager
// implementation.
package rmi.bank;
import java.rmi.*;
public class BankServer {
public static void main(String args[])
{
// Create and install the security manager
System.setSecurityManager(new
RMISecurityManager());
try {
// Create the object instance for registration
System.out.println
("BankServer.main: creating an
AccountManagerImpl");
AccountManagerImpl acm = new AccountManagerImpl
();
// Bind the object instance to the registry
System.out.println
("BankServer.main: bind it to a name:
bankManager");
Naming.rebind("bankManager", acm);
System.out.println("bankManager Server
ready.");
} catch (Exception e) {
System.out.println
("BankServer.main: an exception occurred: " +
e.getMessage());
e.printStackTrace();
}
}
}
où rmi désigne le protocole, host est le nom du serveur RMI (qui devrait
être compatible DNS ou NIS+), port est le numéro de port que le serveur
doit écouter pour les requêtes, et name est le nom exact que les clients
doivent utiliser dans les requêtes Naming.lookup pour cet objet.
Les valeurs par défaut sont rmi pour le protocole, l’hôte local pour host
1099 pour port.
Application rmiregistry
rmiregistry est une application fournissant un simple service
d’aiguillage sur un nom. L’application BankServer fournit à
l’application rmiregistry la référence d’objet et un nom string par le
biais de l’appel de méthode rebind.
Les propriétés peuvent être définies pour la machine JVM du serveur RMI
dans la ligne de commande :
Application BankClient
L’application BankClient tente de localiser un objet AccountManager
en effectuant une recherche à l’aide d’un aiguilleur (Registry). Cet
aiguilleur se situe dans host:port dans la chaîne URL transmise à la
méthode Naming.lookup(). L’objet retourné est “vu” (converti par cast)
comme un gestionnaire de compte (AccountManager) et peut servir à
ouvrir un compte avec un nom et à lancer le calcul du solde.
// BankClient - the test program for the Bank RMI example
//
// This class simply attempts to locate the "bankManager"
// RMI object reference, then binds to it and opens an
// instance to an AccountManager implementation at the
// <server> location.
//
// Then it requests an Account with <name> and
optionally,
// an initial balance (for a new account).
//
// The class then tests the account by depositing and
// withdrawing money and looking at the account balance.
package rmi.bank;
import java.rmi.*;
public class BankClient {
public static void main(String args[])
{
// Check the argument count
if (args.length < 2) {
System.err.println ("Usage:");
System.err.println
("java BankClient <server> <account name>
[initial balance]");
System.exit (1);
}
// Create and install the security manager
System.setSecurityManager(new
RMISecurityManager());
Syntaxe
Exemples
Chargement de classe
Pour utiliser RMIClassLoader, un gestionnaire de sécurité doit déjà
exister afin de s’assurer que les classes chargées à partir du réseau
satisfont aux critères standard de sécurité Java. Si aucun gestionnaire n’est
en place, l’application ne peut pas charger les classes à partir d’hôtes
distants.
Chargement de classe
Objectifs
Ce chapitre introduit l’API Java Native Interface qui permet d’étendre
JAVA avec du code compilé écrit en C ou C++:
• Une application doit utiliser des services non fournis par JAVA
(et en particulier pour exploiter des spécificités de la plate-
forme d’exécution. Exemple : accès à des cartes).
Une classe comprenant des méthodes natives ne peut pas être téléchargée
au travers du réseau de manière standard: il faudrait que le serveur ait
connaissance des spécificités de la plate-forme du client. De plus une telle
classe ne peut faire appel aux services de sécurité de JAVA (en 1.1)
Bien entendu pour toute application JAVA qui s’appuie sur des
composants natifs on doit réaliser un portage du code natif sur chaque
plate-forme spécifique. De plus c’est un code potentiellement plus fragile
puisque les contrôles (pointeurs, taille, etc.) et la récupération d’erreurs
sont entièrement sous la responsabilité du programmeur.
Exécution:
class HelloWorld {
static {
System.loadLibrary("hello");
}
public static native String getGreetings();
(autre exemple sous UNIX : au lieu de "-d ." on peut faire par exemple "-
d $PROJECT/javaclasses")
Le binaire JAVA généré est exploité par les autres utilitaires employés
dans la suite de ce processus.
#ifndef _Included_hi_HelloWorld
#define _Included_hi_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: hi_HelloWorld
* Method: getGreetings
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_hi_HelloWorld_getGreetings
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
/*
* Class: hi_HelloWorld
* Method: getGreetings
* Signature: ()Ljava/lang/String;
* on a une methode statique et c’est la classe
* qui est passée en paramètre
*/
JNIEXPORT jstring JNICALL Java_hi_HelloWorld_getGreetings
(JNIEnv * env , jclass curclass) {
Exécution
Si, par contre, vous obtenez une exception ou un message indiquant que
le système n’a pas pu charger la librairie dynamique il faut positionner
correctement les chemins d’accès aux librairies dynamiques
(LD_LIBRARY_PATH sous UNIX)
• Créer, consulter, mettre à jour des objets JAVA, (et opérer sur leurs
verrous). Opérer avec des types natifs JAVA.
Exemple d’utilisation :
java hi.Uni World
hi.Uni@1dce0764
World
Hello
hi.Uni@1dce077f
World
/*lanceur.c
* usage : lanceur <classe_JAVA_en_format_/> <args> */
JavaVM *jvm ;
JNIEnv * env;
JDK1_1InitArgs vm_args ; /* 1.2 : JavaVMInitArgs */
if (!(mainclass= (*env)->FindClass(env,argv[1])))
exit(1);
if(!(methodID= (*env)->GetStaticMethodID(env,mainclass,
"main","([Ljava/lang/String;)V")))exit(2);
....
jargs = (*env)->NewObjectArray(env,(jsize)(argc-2),
(*env)->FindClass(env,"java/lang/String"), NULL) ;
for (cnt = 0 ; cnt < (argc - 2) ; cnt++) {
jobject stringObj = (*env)->NewStringUTF(env,
argv[cnt+2]);
(*env)->SetObjectArrayElement(env,
jargs,(jsize)cnt,stringObj);
}
(*env)->CallStaticVoidMethod(env,
mainclass, methodID, jargs) ;
.....
(*jvm)->DestroyJavaVM(jvm) ;
}
Un tel code doit être lié à la librairie binaire JAVA (libjava.so sous
UNIX).
La version de JAVA 1.2 introduit quelques modifications (voir
documentation).
Objectifs
Dans ce document nous avons rassemblé quelques considérations sur la
manière de coder en JAVA.
Ces remarques sont faites pour guider vos recherches plutôt que pour
édicter des règles intangibles. JAVA étant un langage neuf l’essentiel des
savoir-faires est encore en gestation.
• organisation en "packages"
• conventions de codage
• portabilité
• performances
• traces, exceptions
• la répartition
• l’internationalisation
références :
De nombreux sites (on constatera qu’il n’y a pas unanimité sur les règles à
suivre!), voir par ex:
http://g.oswego.edu/dl/html/javaCodingStd.html
• Conventions RMI :
public class AccountImpl extends
UnicastRemoteObject
implements Account {
• L’emploi de variables nommées "i", "j", "x", "p" etc. n’améliore pas
la lisibilité. De plus avec la plupart des éditeurs la recherche des
endroit où ces variables sont employées peut s’avérer difficile!
(préférer alors "iy", "ix", etc.)
Mise en page
• Mettre en place des règles cohérentes de mise en page :
// alignements des accolades
public void maMethode(int arg) {
//indentations internes correctes
...
}//End maMethode
if ( cestVrai ) {
// on met les accolades
// même pour une seule instruction
}
références :
http://java.sun.com/100percent/
"Write once, run everywhere" tel est le slogan de JAVA. Si la portabilité est
un des points forts de JAVA elle n’est pas entièrement automatique: il est
parfaitement possible d’écrire des programmes non-portables!
Plus important encore: un Label "100%" JAVA peut être accordé aux
produits que vous développez.
Une autre difficulté peut surgir lorsque JAVA évolue et que les nouveaux
codes ne sont pas totalement compatibles avec les anciens. Ainsi le
passage de la version 1.0 de JAVA à la version 1.1 a donné lieu à de
nombreux problèmes d’adaptation des Applets puisque des Applets
publiées sur le WEB pouvaient être mis en oeuvre par des clients ayant
des niveaux différents de JAVA.
références :
Ici aussi de nombreux sites parlent des optimisations JAVA. par ex:
http://www.cs.cmu.edu/~jch/java/optimization.html
ou les articles spécialisés dans "JavaWorld"
• Comment laisser dans les sources du code dédié aux traces sans
que ce code soit toujours compilé et inclus dans les exécutables ?
(Rappel: il n’y a pas en JAVA de préprocesseur permettant des
compilations conditionnelles)
// VERSION 2
les protocoles
• La définition des protocoles doit permettre une évolutivité
maiximum: les actions élémentaires devraient être définies par
des interfaces; les paramètres des méthodes devraient être au
maximum encapsulés (c.a.d. être eux-même des objets ou des
interfaces); les objets passés doivent tenir compte des contraintes
de linéarisation et éviter les effets de bord (tous les paramêtres
sont passés réellement en copie); dans les types en retour prévoir
des extensions futures de code d’acceptation.
// delicat a maintenir
void creeClient(String nom, String id, String prenom);
// plus evolutif
Acceptation creeClient(Client client)
throws CreationRightsException, UniqueIDException;
// Acceptation peut contenir un certificat, un Objet
// qui en l’occurence p.e. un Client avec mise a jour
// d’un champ qui fixe un numero à ce client
références :
Au fur et à mesure que l’on enrichira les aires culturelles pour lesquelles
une application sera susceptible d’être intelligible, il faudra mettre à jour
des ressources contenant les versions localisés des messages ou des
formats de message (c.a.d. des chaînes de caractères contenant des
emplacements pour des valeurs renseignées par le programme : montants,
numéros de ligne, etc.).
• Vérifier si une exception n’a pas a été levée chaque fois qu’une
fonction d’interface appelle du code JAVA susceptible de
déclencher un exception.
... et, bien entendu, isoler soigneusement tout code posant des problèmes
de portabilité (facilité de maintenance, de portage) ou des problèmes de
sécurité (essayer d’avoir une politique cohérente de sécurité avec le code
JAVA lui-même -à partir de JAVA 1.2 on peut définir une politique de
sécurité pour des applications "locales"-).
Objectifs
Ce chapitre constitue un aide-mémoire1 pour la réalisation d’une chaîne
de production JAVA. On y trouvera :
Le marché des outils JAVA évoluant très vite il est conseillé de consulter
les sites qui les recensent (par ex. javaworld)
• Analyse
• Conception
• Réalisation/codage
• Tests
• Révisions
Toutefois si on tente de réaliser ces phases les une après les autres tout en
appliquant des règles sévères de qualité on court des risques importants
de dérive (évolutions des besoins non prises en compte par la réalisation,
difficultés imprévues de réalisation qui obligent à revoir la conception,
etc.).
Ce sont les outils externes qui collaborent avec l’éditeur pour améliorer le
confort de la programmation.
principes
Les outils de gestion de sources permettent :
outils
Outils standards liés à des systèmes d’exploitation : SCCS, RCS, PVCS,
points
JAVA pose des problèmes particuliers dans la gestion de version. En effet
une "application" peut faire appels à des composants différents. Ces
composants peuvent avoir diverses origines et donc relever chacun d’une
gestion de version qui leur est propre : chaque version d’application est
susceptible de fonctionner sur des combinaisons possibles de versions de
composants. Lorsque ces composants sont chargés dynamiquement les
incompatibilités apparaissent au run-time.
Les bugs, les anomalies sont reportés dans une ressource. Par la suite on
utilise cette ressource pour suivre les opérations : qualification du bug,
documentation, inscription dans une base de connaissance pour le help-
desk, opérations de correction (et modification de la base de test), insertion
dans une nouvelle version (ou suivi de la livraison de corrections
d’urgence).
outils
Généralement fournis avec les ateliers de développement et liés à une
JVM. ex: jdb avec le JDK
Les Makefile sont utilisés par contre pour générer des fichiers ".jar", pour
recompiler des méthodes natives, pour générer des documentations,
passer des tests, etc. Attention : les scripts associés aux règles sont
dépendants de la nature de la plate-forme de production.
principes
On peut catégoriser les tests en fonction de périmètres (tests de
composants, tests d’application), de positionnement dans la vie du
logiciel (tests de non-regression,...), de nature (tests fonctionnels, de
charge, etc.).
Bien que les catégories suivantes se recoupent elles sont commodes pour
caractériser des outils ou des procédures de tests :
produits
SunTest fournit des outils de tests eux-mêmes écrits en JAVA : JAVASPEC
(tests fonctionnels); JAVASTAR (tests d’interface); JAVALOAD (tests de
charge client-serveur)
points
La mise au point de tests fonctionnels est particulièrement intéressante
lorsqu’on s’adresse à des Interface JAVA . En effet, du fait du
polymorphisme, pour le même appel de méthode on pourra avoir des
réalisations effectives différentes et il peut être intéressant de controler
toutes les parties cachées du "contrat" d’interface.
Il faut avoir des indications sur l’étendue de la couverture des tests : dans
quelle mesure ont-ils permis de passer par toutes les branches du code?
L’interprétation globale des résultats est délicate : il faut savoir filtrer des
parties exceptionnelles du code qui ne sont pas pertinentes pour obtenir
un bon taux de couverture. Par ailleurs les informations obtenues ne
préjugent pas de la pertinence fonctionnelle des tests : les informations
les plus précieuses se trouvent dans le détail des parcours des "branches"
de l’arbre des appels et il faut savoir les rechercher.
principes
En exécutant du code Java avec un moniteur spécial (par exemple en
utilisant l’option de profiling -prof de la commande java) on peut
générer des informations donnant des indications sur la "consommation"
de chaque appel de méthode.
Pour être significatifs les tests qui servent analyser les informations de
performances doivent être représentatifs de conditions réelles d’exécution.
En effet l’objectif n’est pas d’optimiser tout le code mais les quelques
points qui peuvent réellement poser des problèmes significatifs.
outils
Il y a des outils qui exploitent les traces standard du profiling JAVA
(HyperProf, JWS) et d’autres plus sophistiqués (JProbe, "Optimize
It") qui utilisent des moniteurs spécifiques.
points
Il est essentiel de pouvoir filtrer les informations : on détecte les "points
chauds" et on élimine les données qui concernent les autres classes.
Attention: un même code java peut s’exécuter sur des JVM différentes:
interprété, JIT, "HotSpot".
principes
Sans recourir à une exécution on peut avoir des informations sur la
qualité du code en ayant recours à des analyseurs statiques. On trouve ici
deux catégories d’outils : les "débourreurs" et les outils de "physique du
logiciel".
outils
Détecteurs de constructions critiques : CodeWizard, etc,
L’outil de test JavaPureCheck est aussi à mettre dans cette catégorie
(bien que spécialisé dans les problèmes de portabilité)
points
Les qualités d’un débourreur se jugent sur la pertinence de ses règles, la
capacité à filtrer ces règles ou à désarmer localement l’application d’une
règle (dans un commentaire)
Une fois que l’état d’avancement du projet est tel que l’on peut procéder à
des livraisons on ne peut directement transférer des binaires ou des
ressources directement depuis l’espace de développement. Voici quelques
suggestions pour mettre en place des procédures qualité très strictes:
Sauf exception l’enchainement est absolu : tout échec sur une phase doit
entraîner une reprise à zero de tout le processus.
décompilateurs/brouilleurs
Les fichiers "binaires" JAVA facilitent l’inspection du code et le passage
d’un bon décompilateur donne une idée assez précise du contenu du
source.
outils syntaxiques
• Pour des raisons de robustesse du code, Java n’utilise pas de
préprocesseur : l’utilisation de macros risque de conduire à un
texte "lisible" qui est différent du code réellement compilé.
Différents produits proposent des macro-processeurs pour JAVA :
l’utilisation doit être limitée (ex. macros de trace, marquage des
messages à internationaliser) et ne pas concerner des parties
critiques du code
2
Objectifs
Ce chapitre constitue un aide-mémoire simplifié d’utilisation pour des
outilsl JAVA
Création : préciser le nom d’un fichier (suivi de .psf) ce fichier sera créé
dans le sous-répertoire “jws” du répertoire d’accueil de l’utilisateur. Il est
possible de préciser un autre répertoire
(attention référence stockée sous forme de cheminom relatif dans le fichier
$HOME/jws<version>/portfolios)
• > Next
édition
Dans project manager:
File ➔ new ➔ file
personnalisation de l’édition
Dans fenêtre édition :
Preferences ➔ source editor
Preferences ➔ keyboard
compilation
Build ➔ Build
La fenetre Build donne les erreurs (qui sont signalées dans l’éditeur de
code lui-même)
test
Lancer
Project➔ run