Cours JAVA

Cours pour débutant en JAVA et la programmation objet


Télécharger Cours pour débutant en JAVA et la programmation objet

★★★★★★★★★★2 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Patrick Ducrot

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 1 -

Plan du document (1/2)

Généralités …………………………………………………………………………………………………………………………………………………………………………   4

Syntaxe de base ………………………………………………………………………………………………………………………………………………………………  21

Concepts objets, classes, constructeurs, destructeurs, surcharge ……………………………… 29

Héritage, interface, package, droits d'accès …………………………………………………………………………………  44 Conversion de type, gestion des exceptions ………………………………………………………………………………………  65 javadoc, le générateur de documentation ………………………………………………………………………………………………… 77 Le format d'archive jar …………………………………………………………………………………………………………………………………………… 83

Gestion de fichiers, flux d'entrée/sortie, sérialisation, ………………………… 86

Les threads ………………………………………………………………………………………………………………………………………………………………………… 118

Les collections ……………………………………………………………………………………………………………………………………………………………… 131

Les nouveautés de la version 1.5 ………………………………………………………………………………………………………………  142

Les applets ………………………………………………………………………………………………………………………………………………………………………… 171

Les interfaces utilisateurs avec le package …………………………………………………………… 189

Gestion des événements …………………………………………………………………………………………………………………………………………… 230

Le package javax.swing …………………………………………………………………………………………………………………………………………… 252

Java et la sécurité …………………………………………………………………………………………………………………………………………………… 284

Obfuscation de code ………………………………………………………………………………………………………………………………………………   272

Programmation réseau ………………………………………………………………………………………………………………………………………………… 307 Remote Method Invocation ……………………………………………………………………………………………………………………………………… 323 ant ……………………………………………………………………………………………………………………………………………………………………………………………… 339 Interaction Java/Base de données ………………………………………………………………………………………………………………… 350

JavaBeans ……………………………………………………………………………………………………………………………………………………………………………… 364

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 2 -

Plan du document (2/2)

Les servlets ……………………………………………………………………………………………………………………………………………………………………… 419

Java Server Pages ………………………………………………………………………………………………………………………………………………………… 449

Java Native Interface ……………………………………………………………………………………………………………………………………………… 474

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 3 -

Généralités

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 4 -

l  Langage conçu par les ingénieurs de « SUN Microsystem » (société rachetée par Oracle en avril 2009)

l  Définition de SUN : "Java est un langage simple, orienté objet, distribué, robuste, sûr, indépendant des architectures matérielles, portable, de haute performance, multithread et dynamique"

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 5 -

•   Simple

•Inspiré du C++, Fortran, Lisp, Smalltalk

•Pas de pointeur; pas de surcharge d'opérateurs; pas d'héritage multiple

•Présence d'un "garbage collector"

•   Orienté objet •La programmation objet modélise des objets ayant un état (ensemble de variables) et des méthodes (fonctions) qui leur sont propres. L’unité de base en Java est la classe. Un des intérêts de Java est de disposer de nombreuses classes déjà faites. Un objet créé à partir d’une classe est une instance.

•   Distribué •Les fonctions d'accès au réseau et les protocoles internet les plus courants sont intégrés.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 6 -

•  Robuste

•Typage des données très strict

•Pas de pointeur

•  Sûr •Java n’est pas compilé à destination d’un processeur particulier mais en « byte code » qui pourra être ensuite interprété sur une machine virtuelle Java (JVM = Java Virtual Machine). Le "byte code" généré est vérifié par les interprétateurs java avant exécution.

•Un débordement de tableau déclenchera automatiquement une exception.

•L’absence      d’arithmétique     de      pointeur     évite  les malversations.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 7 -

Portable •Les types de données sont indépendants de la plate forme (par exemple les types numériques sont définis indépendamment du type de plate forme sur laquelle le byte code sera interprétée).

Haute performance

•Java est un langage pseudo interprété

•Techniques   de      "Just  in Time" (JIT)       améliorent  ces performances

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 8 -

Multi thread •Une application peut être décomposée en unités d'exécution fonctionnant simultanément

Dynamique •Les classes Java peuvent être modifiées sans avoir à modifier le programme qui les utilise.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 9 -

Les différentes version de java

•   Java 1.0 (23 janvier 1996)

•   8 Packages

•   212 Classes et Interfaces

•   1545 Méthodes

•   Java 1.1 (19 février 1997)

•   23 Packages

•   504 Classes et Interfaces

•   3 851 Méthodes

•   Java 1.2  (Java 2)   (9 décembre 1998)

•   60 Packages

•   1 781 Classes et Interfaces

•   15 060 Méthodes

•   Et bien plus dans les versions 1.3 (8 mai 2000), 1.4 (6 février 2002), 1.5 (tiger, 30 septembre 2004) ,1.6 (mustang, 11 décembre 2006)

•   Dernière version: 1.7, le 28 juillet 2011 (OpenSource et sous l’ère Oracle).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 10 -

Les outils de développement

l Quelques environnements java :

Java SE (Standard Edition)

Java ME (Mobile Edition)

Java EE (Enterprise Edition)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 11 -

L'environnement J2SE

l L’outil de base : le JDK (Java Development Kit) de SUN :

•       (lien redirigé sur le site d’Oracle).

•     gratuit

•     comprend de nombreux outils :

•     le compilateur : javac

•     l’interpréteur d’application : java

•     l’interpréteur d’applet : appletviewer

•     le débogueur : jdb

•     le générateur de documentation : javadocetc. l Des environnements de développement:

•    

•    

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 12 -

Utilisation de JAVA

l Le langage Java peut générer :

des applications

des applets

des servlets

des midletsetc.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 13 -

Le code est généré par un compilateur en plusieurs étapes :

Vérification syntaxique.

Vérification sémantique (typage).

Production de code dans un langage plus proche de la machine.

Production de « briques » de code assemblables.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 14 -

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 15 -

l  Avantages/inconvénients du code natif

•Rapidité d’exécution

•Nécessité de recompiler lors du portage d’un logiciel sur une autre architecture/système d’exploitation

•Choix de la distribution du logiciel : source ou binaire ?

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 16 -

Génération de code en java

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 17 -

Principe Machine Virtuelle

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 18 -

Avantages/Inconvénients du bytecode

Code portable au niveau binaire

Moins efficace que du code natif (mais compensé par la technologie JIT)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                     - 19 -

Exemple d’application

Fichier:

public class First

{

public static void main (String args [])

{

.println ("Premier exemple") ;

}

}

Compilation :      javac

Création de First.class

Exécution :           java First

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 20 -

Syntaxe de base

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 21 -

Syntaxe de base du langage Java

l Les commentaires existent sous plusieurs formes:

Commentaires multi lignes

/* */

Commentaires sur une seule ou fraction de ligne

//

Commentaires destinés au générateur de documentation javadoc

/**

*

*

*/

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 22 -

Nombres entiers

                                      •byte               -2^7 , (2^7 )-1   -128,127

                                      •short              -2^15 , (2^15) -1-32768,32767

                                       •int                 -2^31 , (2^31) - 1  -2147483648, 2147483647

                                       •long               -2^63 , (2^63) - 1 

9223372036854775808, 9223372036854775807

Les entiers peuvent être exprimés en octal ( 0323), en décimal (311) ou en hexadécimal (0x137).

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 23 -

Nombres réels

float

simple précision sur 32 bits

1.4023984e-45        3.40282347 e38

double

double précision sur 64 bits 4.94065645841243544 e-324

1.79769313486231570 e308

Représentation des réels dans le standard IEEE 754Un suffixe f ou d après une valeur numérique permet de spécifier le type.

Exemples :

double x = 145.56d ; float     y = 23.4f ; float f = 23.65 ;     // Erreur

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 24 -

boolean

•   Valeurs true et false

Un entier non nul est également assimilé à true

Un entier nul est assimilé à false

char

•   Une variable de type char contient un seul caractère codé sur 16 bits (jeu de caractères 16 bits Unicode contenant 34168 caractères).

•   Des caractères d'échappement existent :

\b     Backspace                       \t

Tabulation horizontale

\n      Line Feed                        \f

Form Feed

\r      Carriage Return            \"

Guillemet

\'       Apostrophe                    \\

BackSlash

\xdd Valeur hexadécimale \ddd

Valeur octale

\u00xx Caractère Unicode (xx est compris entre 00 et FF)

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 25 -

Types de données prédéfinis

l Chaînes de caractères

•  Les chaînes de caractères sont manipulées par la classe String ; ce n'est donc pas un type scalaire, mais il s’en approche beaucoup dans son utilisation.

Exemple :

String str = "exemple de chaîne de caractères" ;

String chaine = "Le soleil " + "brille" ;   // Opérateur de concaténation

•  Remarque: Depuis la version 1.7, il est possible d’utiliser les chaînes de caractères dans les structures switch/case

Exemple:

String chaine= "… " ; switch (chaine)

{

case "Bonjour" :            .println (" Je suis poli ") ; break ;

default:                          .println(" Je suis impoli ") ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 26 -

Les tableaux

l Les tableaux peuvent être déclarés suivant les syntaxes suivantes : type [ ] nom ; type nom [ ] ;

•   Exemples :

int table [ ] ; double [ ] d1,d2 ;Pas de tableau statique.

•   La taille d'un tableau est allouée dynamiquement par l’opérateur newtable = new int [10] ; int table2 [ ] = new int [20] ; int table3 [ ] = {1,2,3,4,5} ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                   - 27 -

Les tableaux

La taille n'est pas modifiable et peut être consultée par la propriété length

.println (table3.length) ;

int [ ] [ ] Matrice = new int [10][20] ;

.println (Matrice.length) ; // 1ère dimension

.println (Matrice[0].length) ; // 2ème dimension

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                   - 28 -

Concepts objet, classes, constructeurs,

destructeurs, surcharge

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                   - 29 -

Concepts des langages objet

Concept de base de la programmation orientée objet : la classe

Une classe modélise la structure statique (données membres) et le comportement dynamique (méthodes) des objets associés à cette classe.

Un objet d’une classe est appelé une instance.

Une classe est la description d’un objet. Chaque objet est créé à partir d’une classe (avec l’opérateur new).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 30 -

Exemple

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 31 -

Exemple d’écriture de la classe Compte

class Compte

{

private int numero ; private float solde ;

public void initialise (int n, float s)  { numero = n ; solde = s ; } public void deposer (float montant) { solde = solde + montant ; } public void retirer (float montant)    {  solde = solde – montant ; }

public float consulterSolde ( )            { return solde ; }

public void afficher()

{

.println ("Compte : " + numero + " solde: " + solde) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 32 -

Utilisation de la classe Compte

public class Banque

{

static public void main (String args [])

{

Compte co1 = new Compte () ;

Compte co2 = new Compte () ;

co1.initialise (1234,1000f) ; co2.initialise (5678,500f) ; co1.deposer (2100.95f) ; co1.afficher () ;

co2.retirer (1000.0f) ; co2.afficher () ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 33 -

Représentation mémoire

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 34 -

Représentation mémoire

co1 et co2 contiennent l'adresse des zones mémoires allouées par l'opérateur new pour stocker les informations relatives à ces objets.

co1 et co2 sont des références.

La référence d’un objet est utilisée pour accéder aux données et fonctions membres de l’objet.

Un objet peut accéder à sa propre référence grâce à la valeur this (variable en lecture seule).

Une référence contenant la valeur null ne désigne aucun objet.

Quand un objet n’est plus utilisé (aucune variable du programme ne contient une référence sur cet objet), il est automatiquement détruit et la mémoire récupérée (garbage collector).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 35 -

Constructeur de classe

Un constructeur est une méthode automatiquement appelée au moment de la création de l’objet.

Un constructeur est utile pour procéder a toutes les initialisations nécessaires lors de la création de la classe.

Le constructeur porte le même nom que le nom de la classe et n’a pas de valeur de retour.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 36 -

Exemple de constructeur

class Compte

{

public Compte (int num,float s)

{

numero = num ; solde = s ;

}

….

}

Compte co1 = new Compte (1234, 1000,00f) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 37 -

Destructeur de classe

Un destructeur peut être appelé lorsqu’un objet est détruit.

Le destructeur peut être utilisé pour libérer des ressources spécifiques(déconnexion d'une base de données, fermeture d'un fichier, …). Il sera appelé lorsque le garbage collector récupèrera la mémoire.

Un destructeur est une méthode:

publicvoid finalize ()

l Remarque: on peut forcer l’appel du garbage collector:

Runtime r = Runtime.getRuntime();

r.gc();

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 38 -

Surcharge de méthodes

Une méthode (y compris le constructeur) peut être définie plusieurs fois avec le même nom à condition de se différencier par le nombre et/ou le type des paramètres transmis (polymorphisme).

Le compilateur décidera de la bonne méthode à utiliser en fonction des paramètres d’appel.

Java ne supporte pas la surcharge des opérateurs (différence avec le C++)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 39 -

Exemples de surcharge de méthodes

l Exemple 1:

class BarreDeProgression

{

private float pourcent ;

public void setPourcent (float valeur) { pourcent = valeur ;} public void setPourcent (int effectue, int total)

{

pourcent = total/effectue ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 40 -

Exemples de surcharge de méthodes

l Exemple 2 :

public class Circle

{ private double x, y, r; 

public Circle(double x, double y, double r)

{ this.x = x; this.y = y; this.r = r;

}

public Circle(double r) { x = 0.0; y = 0.0; this.r = r; } public Circle(Circle c) { x = c.x; y = c.y; r = c.r; } public Circle() { x = 0.0; y = 0.0; r = 1.0; } public double circumference() { return 2 * 3.14159 * r; }

public double area() { return 3.14159 * r*r; } }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 41 -

Comparaison d’objets

l On ne peut comparer 2 objets en comparant les variables d’instance.Exemple 1 :

r1 = new Rectangle (10,20) ; r2 = new Rectangle (30,40) ; r3 = new Rectangle (10,20) ;

Comparaison des variables d’instance:

r1 == r2          à false r1 == r3             à false

Comparaison avec une méthode equals incluse dans la classe Rectangle

r1.equals (r2) à false r1.equals (r3)   à true

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 42 -

Comparaison d'objets

Exemple 2:

Comparaison de chaînes de caractères:

String s1 = "Bonjour" ; String s2 = "Bonjour" ; if (s1.equals (s2))    // Compare le contenu de s1 et s2.

if (s1.equalsIgnoreCase (s2))      // Compare le contenu de s1 et s2 // sans tenir compte des majuscules // et minuscules.

l Remarque: dans le cas des chaînes de caractères, il est malgré tout possible d’utiliser:        if (s1 == s2)

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 43 -

Héritage, interface, package, droits d'accès

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 44 -

Héritage de classe

Concept très important dans la programmation objet.

Une classe peut hériter d’une autre classe et apporter ses propres spécificités.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 45 -

Héritage de classe

Le mot clé pour déclarer une classe dérivée est extends.

Java ne supporte que l’héritage simple.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 46 -

Exemple d’héritage (1/3)

// public class Animal

{

private int poids;

public void dormir () {  .println ("Méthode dormir de Animal"); } public void jouer () { .println ("Méthode jouer de Animal");

public void seReproduire () { .println ("Méthode sereproduire de Animal"); }

}

//

public class Mammifere extends Animal

{

public void seReproduire () {  .println ("Méthode seReproduire de Mammifère");}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 47 -

Exemple d’héritage (2/3)

// public class Chat extends Mammifere

{

public void jouer () { .println ("Méthode jouer de Chat");}

public void miauler () { .println ("Méthode miauler de Chat");}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 48 -

Exemple d’héritage (3/3)

// import Chat;

public class RunChat

public static void main ( String []arguments)

{

Chat minet = new Chat(); minet.dormir(); minet.seReproduire();

minet.jouer();

}

}

L'exécution de RunChat donnera : Méthode dormir de Animal

Méthode seReproduire de Mammifère

Méthode jouer de Chat

Exemple extrait du cours de Stéphane Bortzmeyer,

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 49 -

La classe de base

Toute classe java hérite implicitement de la classe .Object.

l  Quelques méthodes de la classe .Object:

•   public boolean equals(Objectobj ) ;

•   publicStringtoString() ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 50 -

Cas particuliers de l'héritage

Une méthode peut être préfixée par abstract. Dans ce cas, la classe est abstraite. Aucun objet ne peut être instancié d’une classe abstraite et les classes dérivées devront définir complètement les méthodes abstraites.

Le mot clé final interdit la dérivation d’une classe (par exemple, la classe String est final) ; appliqué à une variable, celle ci ne peut pas être modifiée (constante) ; appliqué à une méthode, celle ci ne peut pas être surchargée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 51 -

Héritage: mot clé "super"

l Il est possible d’accéder aux données/méthodes de la classe de base grâce au mot clé super.

Exemple 1 :

class MaFrame extends Frame

{

// Constructeur

MaFrame ( String title)

{

super ( title) ;           // Appel du constructeur de Frame

// Si cet appel est utilisé, c’est toujours

// la première instruction du constructeur

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 52 -

Héritage: mot clé "super"

l Exemple 2 :

class HouseCat extends Feline

{

void speak ( )

{

.println (“Meow !!!”) ;

}

}

class MagicCat extends HouseCat

{

boolean people_present ;

void speak ( )

{ if (people_present) super.speak ( ) ;

else .println (“Hello”) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 53 -

Interface

•    Les interfaces compensent un peu l’absence d’héritage multiple.

•    Le mot clé interface remplace le mot clé class en tête de déclaration.

•    Une interface ne peut contenir que des variables constantes ou statiques et des entêtes de méthodes.

•    Toutes les signatures de méthodes d’une interface ont une visibilité publique.

•    Le mot clé pour implémenter une interface est implements.

•    Une classe implémentant une interface s’engage à surcharger toutes les méthodes définies dans cette interface (contrat).

•    Une interface permet d’imposer un comportement à une classe

•    Une classe peut implémenter autant d’interfaces qu'elle le souhaite.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 54 -

Exemple d’interface

interface Drawable

{ void drawMe (int x, int y) ;

}

class GraphicObject implements Drawable

{

void drawMe (int x,int y)

{

// Code de la fonction drawMe

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 55 -

Packages

•   Les classes java stockées dans la bibliothèques de classe ne sont pas automatiquement disponibles.

•   Les packages sont des collections de classes et d’interfaces regroupées par thème.

•   Une application peut utiliser des classes et interfaces prédéfinies par importation du package concerné.

•   Le mot clé pour importer un package est import

•   De nouveaux packages peuvent être définis rendant le langage très extensible (exemple : package java3d pour des classes graphiques en 3 dimensions).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 56 -

Quelques  packages de base

Principales classes du langage java (importation implicite)

E/S vers différents périphériques

Utilitaires (vecteur, hashtables,

…)

Support du réseau (socket, URL,

…)

Interface graphique

java.applet

Classes de base pour la réalisation d'une applet

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 57 -

Exemple de manipulation de packages

Exemple d’utilisation de packages:

// Le package .* est importe implicitement import .* ; import .* ;

Exemple de création d’un nouveau package :

package monpackage ; import .* ;

public class MaClasse

{

void test ( )

{

.println ("test ") ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 58 -

Droits d’accès

•  Toutes les méthodes et données membres définies au sein d’une classe sont utilisables par toutes les méthodes de la classe.

•  Lors de la conception d’une classe, il faut décider des méthodes/variables qui seront visibles à l’extérieur de cette classe.

•  Java implémente la protection des 4 P (public, package, protected, private).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 59 -

La protection des 4 P

•  private: visible uniquement au sein de la classe.

•  public: visible partout

•  Le droit par défaut est une visibilité des classes/données/membres pour toutes les classes au sein d’un même package. Il n’y a hélas pas de mot clé pour préciser explicitement cet accès.

•  protected: visible uniquement dans la classe et dans les classes dérivées de cette classe.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 60 -

Variables de classe

•   Une variable de classe est une variable associée à une classe et non aux instances de cette classe.

•   Un seul exemplaire d’une variable de classe ne peut exister, indépendamment du nombre d’instances de cette classe créées.

•   Une variable static est partagée par toutes les instances de la classe.

•   Les variables de classe sont préfixées par le mot clé static.

•   On accède à une variable de classe en faisant précéder le nom de cette variable par le nom de la classe suivi d’un point.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 61 -

Exemples de variables de classe

Exemple 1:

class Alien

{ static int counter ;

Alien ( )

{ counter += 1 ;

}

}

Exemple 2:

La classe contient la valeur de PI

class Math

{ public static final double PI=3.141592653589793d ;

}

Utilisation:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 62 -

Méthodes de classe

•  Une méthode de classe est une méthode associée à une classe et non à une instance de cette classe.

•  Les méthodes de classe sont préfixées par le mot clé static.

•  Une méthode de classe est appelable sans avoir à créer d’objet de cette classe.

•  Une méthode de classe est appelée en préfixant le nom de la méthode par le nom de la classe suivi d’un point.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 63 -

Exemples de méthodes de classe

Exemple 1 :

La classe contient beaucoup de méthodes static

class Math

{

public static int max( int a, int b ) ; public static double sqrt( double a ) ;

public static double sin( double a ) ;

}

Utilisation: (3.678) ;

Exemple 2 :

class MathStuff

{ static int halfInt (int x)  {  return x/2 ; } }

Utilisation: MathStuff.halfInt (10) ;

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 64 -

Conversion de types, gestion des exceptions

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 65 -

Conversions de type

Les méthodes de conversion de type sont stockées dans des classes :

class .String class .Integer class class .Float

class .Double

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 66 -

Exemples de conversion de type

int i = 10 ;

String chaine = String.valueOf (i) ;

String chaine="123" ;

int entier = Integer.parseInt (chaine) ;

class Integer

{

……

public static int parseInt(String  s) throws NumberFormatException;

……

}

try {

entier = Integer.parseInt (chaine) ;

} catch (NumberFormatException e)

{

// Si la variable chaine n'est pas convertible on vient ici

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 67 -

Les exceptions

•   Le traitement des exceptions permet à une application d’avoir un comportement adéquat à une situation inattendue.

•   Beaucoup de méthodes sont susceptibles de déclencher une exception (comme par exemple l’exemple précédent).

•   Une exception peut être levée par une clause try/catch .

•   L'utilisation d'une clause try/catch est obligatoire pour les exceptions sous contrôles (une exception sous contrôle est une sous classe de Exception mais pas de RunTimeException).Le concepteur d’un programme java a un devoir de captage des exceptions pour ne pas désemparer les utilisateurs.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 68 -

Aperçu des classes d'exception

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 69 -

La clause try/catch

try ; catch ( ex1) instruction ; catch ( ex2) instruction ; ….

finally ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 70 -

Exemples de gestion d’exceptions

try a = tab [i] ; catch (ArrayIndexOutOfBoundsException ex) a = 0 ;

String chaine ;

int valeur ;

try { valeur = Integer.parseInt (chaine) ;

FileInputStream fichier = new FileInputStream ("c:\\ " );

} catch (NumberFormatException e1)

{

.println ("mauvais format ") ;

}

catch (FileNotFoundException e2)

{

.println ("Fichier non trouve " );

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 71 -

Gestion d’exceptions

l Depuis la version 1.7, on peut gérer plusieurs exceptions dans une seule clause catch:

try { valeur = Integer.parseInt (chaine);

FileInputStream fichier = new FileInputStream ("c:\\") ;

} catch (NumberFormatException | FileNotFoundException e)

{

.println (« Une erreur est survenue ");

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 72 -

Génération d'exception

•   On indique qu’une méthode m peut générer une exception MyException par le mot clé throws (obligatoire pour les exceptions sous contrôle)

void m () throws MyException

{

}

•   On peut déclencher une exception grâce au mot cléthrowExemple:if (x<0)

{

throw new IllegalArgumentException ("x doit etre positif");

// ne mettre aucune instruction en dessous du throw

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 73 -

Exemple de génération d'exception

class Test

{

public String getNom (String key) throws NullPointerException

{ if (key == null)  throw new NullPointerException ("cle nulle") ; else return "OK" ;

}

}

public class Exemple

{ public static void main (String args [])    { new Exemple () ;  } public  Exemple ()

{

Test test = new Test () ; try {

.println (test.getNom (null)) ;

} catch (NullPointerException e)

{

.println (e.getMessage ()) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 74 -

Création de ses propres exceptions

public class Pile

{ private int table [] ; private int hauteur = 0 ;

public Pile ()          {  table = new int [3] ; } public Pile (int h)   { table = new int [h] ; }

public void insertValue (int valeur) throws PileException

{

if (hauteur == table.length) throw new PileException ("Pile pleine") ; else table [hauteur++] = valeur ;

}

public int removeValue () throws PileException

{

if (hauteur == 0) throw new PileException ("Pile vide") ; else return table [--hauteur] ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 75 -

Classe PileException et utilisation

public class PileException extends Exception

{

public PileException(String m)

{

super (m) ;

}

}

Utilisation:

Pile pile = new Pile () ; try {

.println (pile.removeValue()) ; 

} catch (PileException e)

{

.println (e.getMessage()) ;

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 76 -

javadoc: le générateur de documentation

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 77 -

Généralités sur javadoc

l  Outils présent dans la jdk de Sun.

l  Par défaut, la documentation générée est au format HTML.

l  Toute la documentation des API java de SUN a été générée grâce à javadoc. l La documentation générée contient les fichiers suivants:

•  Un fichier html par classe ou interface contenant le détail de chaque classe ou interface.

•  Un fichier html par package

•  Un fichier

•  Un fichier

•  Un fichier

•  Un fichier

•  Un fichier

•  Un fichier pour chaque package.

•  Un fichier pour chaque package.

•  Un fichier pour chaque package.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 78 -

Exemple de génération

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 79 -

Syntaxe des commentaires javadoc

l    Commentaire javadoc:

/**

*   Voilà un exemple de commentaire

*   javadoc

*/

l    javadoc utilise des "tags" pour préciser le rôle de certains composants d'un élément:

-   "tag" standard: @tag

-   "tag" remplacé par une valeur:         {@tag}

-   Liste complète des tags et l'utilisation de javadoc à l'adresse

-   Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp       - 80 -

Quelques "tags" de javadoc

@author

Spécifie l'auteur de l'élément

classe et interface

1.0

@deprecate d

Spécifie que l'élément est déprécié

package, classe, interface,

champ

1.1

{@docRoot}

Représente le chemin relatif du répertoire de génération de la documentation

1.3

@exception

Spécifie une exception qui peut être levée par l'élément

méthode

1.0

{@link}

Spécifie un lien vers un élément de la documentation dans n'importe quel texte

package, classe, interface, méthode, champ

1.2

@param

Spécifie une paramètre de l'élément

constructeur, méthode

1.0

@see

Spécifie un élément en relation avec l'élément documenté

package, classe, interface,

champ

1.0

@since

Spécifie depuis quelle version l'élément a été ajouté

package, classe, interface, méthode, champ

1.1

@throws

identique à @exception

méthode

1.2

@version

Spécifie le numéro de version de l'élément

classe et interface

1.0

@return

Spécifie la valeur de retour d'un élément

méthode

1.0

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 81 -

Exemple d'utilisation de "tags"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 82 -

Le format d'archive JAR

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 83 -

Le format d'archive jar

•Les fichiers archives rassemblent et compressent plusieurs classes java dans un seul fichier.

•Les   fichiers       archives     peuvent      être   signés numériquement.

•  Un fichier jar peut être créé avec la commande jar du JDK; la syntaxe est inspirée de la commande tar d'unix.

•  Exemples:

•  jar cvf *.class

•  jar tvf

•  jar xvf

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 84 -

Utilisation d'un fichier jar

•    Utilisation d'un fichier jar pour une applet:

•    Utilisation d'un fichier jar pour une application: • Il faut spécifier le nom de la classe principale dans un fichier

•    Archiver le fichier et toutes les ressources et classes de l'application:

jar cvfm bibliotheque/*.class

•    Lancement de l'application: java -jar

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 85 -

Gestion de fichiers, flux

d'entrées/sortie, sérialisation

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 86 -

Gestion de fichiers

•   La gestion de fichiers se fait par l’intermédiaire de la classe .

•   Cette classe possède des méthodes qui permettent d’interroger ou d’agir sur le système de fichiers du système d’exploitation.

•   Un objet de la classe peut représenter un fichier ou un répertoire.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 87 -

Quelques méthodes de la classe

File (String name)

File (String path, String name) File (File dir, String name) boolean isFile () boolean isDirectory () boolean mkdir () boolean exists () boolean delete () boolean canWrite () boolean canRead () File getParentFile ()

long lastModified () String [] list ()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 88 -

Exemple d’utilisation de la classe

import .* ;

public class ExempleFile

{ static public void main (String args [])  {  new ExempleFile () ; }

ExempleFile () {    liste (new File ("c:\\")) ; }  private void liste (File dir)

{ if (dir.isDirectory () == true)

{

String fichiers [] = () ;

for (int i = 0 ; i != fichiers.length ; i++) .println (fichiers [i]) ;

}

else

{

.println (dir + " n'est pas un repertoire") ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 89 -

Les flux

•    Difficulté d’un langage d’avoir un bon système d’entrées/sorties.

•    Beaucoup de sources d’E/S de natures différentes (console, fichier, socket,…).

•    Beaucoup d’accès différents (accès séquentiel, accès aléatoire, mise en mémoire tampon, binaire, caractère, par ligne, par mot, etc.).

•    Un flux (stream) est un chemin de communication entre la source d'une information et sa destination

•    Un processus consommateur n'a pas besoin de connaître la source de son information; un processus producteur n'a pas besoin de connaître la destination

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 90 -

Les flux proposés par java

•   Flux d'entrée/sortie de bytes.

•   Flux d'entrée/sortie de caractères depuis la version 1.1 de java.

Toutes les classes d'entrée/sortie sont dans le package

Toutes         les     méthodes  peuvent     générer      une .IOException

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 91 -

Classes de base abstraites des

flux

Flux d’octets

Flux de caractères

Flux d’entrée

.InputStream

.Reader

Flux de   sortie

.OutputStream

.Writer

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 92 -

Classes de flux de bytes

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 93 -

La classe .InputStream

Les méthodes de lecture  :

public int read () ; public int read (byte b [ ]) ; public int read (byte b [ ], int off, int len) ;

Exemple :

InputStream s = ….. ; byte buffer [ ] = new byte [1024] ;

try {

s.read (buffer) ;

} catch (IOException e)

{

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 94 -

La classe .InputStream

Sauter des octets :public long skip (long n) ;

Combien d'octets dans le flux :public int available () ;

Le flux supporte-t'il le marquage ?public boolean markSupported () ;

Marquage d'un flux :public void mark (int readlimit) ;

Revenir sur la marque:public void reset () ;

Fermer un flux :public void close () ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 95 -

Exemple de flux d’entrée

import .* ; public class LitFichier

{ public static void main (String args [])

{ try {

InputStream s = new FileInputStream ("c:\\temp\\") ; byte buffer [ ] = new byte [s.available()] ;

s.read (buffer) ;

for (int i = 0 ; i != buffer.length ; i++)

.print ( (char) buffer [i]) ;

s.close () ;

} catch (IOException e)

{

.println ("Erreur lecture") ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 96 -

La classe .OutputStream

Les méthodes d'écriture :

public void write (int b) ; public void write (byte b [ ]) ; public void write (byte b [ ], int off, int len) ;

Nettoyage d’un flux, forçant l'écriture des données bufférisées :

public void flush () ;

Fermeture d’un flux

public void close () ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 97 -

Exemple de flux de sortie

import .* ; public class EcritFichier

{ static public void main (String args [])

{

String Chaine = "Bonjour" ; try {

FileOutputStream f = new FileOutputStream ("c:\\temp\\") ; f.write (Chaine.getBytes ()) ; 

f.close () ;

} catch (IOException e)

{

.println ("Erreur ecriture") ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 98 -

Les classes FilterInputStream/ FilterOutputStream

l Ces deux classes servent de classes de base à des classes de gestion d’entrées/sorties plus évoluées:

•    BufferedInputStreamet BufferedOutputStream permettent de lire et écrire des données à travers un tampon de lecture/écriture pour améliorer les performances.

•    DataInputStreamet DataOutputStream permettent de lire/écrire des données formatées (byte, int, char, float, double, etc.)

•    etc.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 99 -

Exemples de lecture/écriture

évoluée

InputStream s = new FileInputStream ("fichier") ; DataInputStream data = new DataInputStream (s) ; double valeur = data.readDouble () ;

PrintStream s = new PrintStream (new FileOutputStream ("resultat")) ; s.println ("On ecrit dans le fichier resultat") ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 100 -

Les classes de flux de caractères

Writer

BufferedWriter

CharArrayWriter

OutputStreamWriter

FileWriter

FilterWriter

PipedWriter

StringWriter

PrintWriter

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 101 -

Exemple de BufferedReader

import .*;

public class TestBufferedReader

{ public static void main(String args[])

{ try {

String ligne ;

BufferedReader fichier = new BufferedReader (new FileReader("")); while ((ligne = fichier.readLine()) != null)  .println(ligne); fichier.close();

} catch (IOException e)

{

.println ("Erreur lecture") ;

}    

}    

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 102 -

La sérialisation

La sérialisation est un mécanisme permettant de rendre un objet persistant. Il peut être ensuite:

•    Stocké dans un fichier

•    Transmis sur le réseau (exemple: RMI)

•   

Le processus inverse est la désérialisation.

Un objet sérialisé est dit persistant.

Cette fonctionnalité est apparue dans la version 1.1 de Java.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 103 -

Pourquoi sérialiser ?

Rendre un objet persistant nécessite une convention de format pour la lecture/écriture (cela peut être une opération complexe et difficile à maintenir) ou transmettre un objet via le réseau à une application distante.

La sérialisation permet de rendre un objet persistant de manière simple et naturelle.

Si un objet contient d’autres objets sérialisables, ceux-ci seront automatiquement sérialisés.

La plupart des classes de base (mais pas toutes) du langage Java sont sérialisables.

Si la classe a été modifiée entre la sérialisation et la désérialisation, l’exception .InvalidClassException est déclenchée.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 104 -

Comment sérialiser

•  Une classe est sérialisable si elle implémente l’interface .Serializable.

•  Des objets de type .ReadObjectStream et .WriteObjectStream vont permettre de sérialiser/désérialiser.

•  Les données membres que l’on ne souhaite pas sauvegarder doivent être déclarées transient.

•  Des méthodes de lecture/écriture peuvent être redéfinies le cas échéant:

private void writeObject (.ObjectOutputStream out) throws IOException ;

private void readObject (.ObjectInputStream in)  throws

IOException,ClassNotFoundException ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 105 -

import .* ;

class Info implements Serializable

{

private String Nom = "" ; private String MotPasse = "" ;

public Info(String n, String m)

{

Nom=n ; MotPasse = m ;

}

public String getNom () { return

Nom ; } public String getPassword () {

return MotPasse ; }

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 106 -

public class ExempleSerialisation

{

static public void main (String args [])

{

new ExempleSerialisation () ;

}

public ExempleSerialisation ()

{

Info User = new Info ("Pierre","password") ;

Ecrire (User) ; User = Lire () ; if (User != null)

.println ("nom = " + 

User.getNom () + " mot de passe = " + 

User.getPassword ()) ;

}

void Ecrire (Info user)

{ try {

FileOutputStream file = new  

FileOutputStream ("c:\\travail\\") ;

ObjectOutputStream out = new

ObjectOutputStream (file) ; out.writeObject (user) ; out.flush () ; out.close () ; file.close () ;

} catch (IOException ex)

{

.println ("Erreur d'ecriture " + ex) ;

}

}

// Fin classe ExempleSerialisation transparent // suivant

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 107 Info Lire ()

{

Info User = null ; try {

FileInputStream file = new FileInputStream ("c:\\travail\\") ;

ObjectInputStream in = new ObjectInputStream (file) ;

User = (Info) in.readObject() ;

} catch (Exception ex)

{

.println ("Erreur de lecture " + ex) ;

}

return User

}

}  // Fin classe ExempleSerialisation

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                - 108 -

Le package

l  Nouveau package de gestion des entrées/sorties introduit par la version 1.4.

l  NIO permet d'utiliser des entrées/sorties plus rapides en gérant des blocs plutôt que des bytes ou caractères.

l  Les objets de base pour ce type d'entrée sortie sont:   Buffer et  Channel.

l  Un "Buffer" contient les données à lire ou écrire, un "Channel" désigne la source ou la destination de l'information.

l  Une entrée/sortie sur un objet "Channel" transite obligatoirement par un objet "Buffer".

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 109 -

L'objet "Buffer"

l  Un "Buffer" est un objet contenant les informations à écrire ou recevant les informations lues.

l  Le même objet "Buffer" peut être utilisé en entrée et en sortie.

l  Outre le stockage, un objet "Buffer" fournit des informations sur l'opération d'entrée sortie.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 110 -

Les variables d'état d'un

"Buffer"

l  position

•    indique la 1ère position libre dans la zone de stockage.

l  limit

•    quantité d'information restant à envoyer (écriture) ou espace restant disponible (lecture)

l  capacity

•    taille maximale d'information pouvant être stockée dans un objet buffer

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 111 -

Quelques méthodes de "Buffer"

flip ()

•  positionne "limit" à "position" et remet "position" à 0.

clear ()

•  positionne "limit" à capacity, remet "position" a 0 et efface la marque.

l  mark ()

•  Utilise "position" comme la marque courante

l  reset ()

•  Place "position" à la marque courante

l  rewind ()

•  Place 0 dans "position" et efface la marque

l  Les différentes forme des méthodes get() et put () permettent d'obtenir ou d'initialiser la zone de stockage d'un objet "Buffer".

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 112 -

Fonctionnement d'un

"ByteArrayBuffer"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 113 -

Quelques méthodes de manipulation d'un objet "Buffer"

l  Allocation d'un buffer:

ByteBuffer buffer = ByteBuffer.allocate (512) ; ou

byte array [] = new byte [512] ;

ByteBuffer buffer = (array) ;

l  Decoupage d'un buffer

ByteBuffer buffer = ByteBuffer.allocate (10) ;

buffer.position (3) ; buffer.limit (7) ByteBuffer slice = buffer.slice () ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 114 -

Exemple

import .*; import .*; import .channels.*;

public class Test1Nio

{

Test1Nio()

{ try

{

FileInputStream fin = new FileInputStream("d:\\travail\\");

FileOutputStream fout = new FileOutputStream("d:\\travail\\");

ByteBuffer buffer = ByteBuffer.allocate(512);

FileChannel fcin = fin.getChannel();  FileChannel fcout = fout.getChannel(); while ((buffer) != -1)

{ () ;  fcout.write(buffer); buffer.clear () ;

} fin.close () ; fout.close () ;

} catch (Exception e) { .println(e); }

}

public static void main(String[] args) { new Test1Nio(); }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 115 -

Différents types de buffer

l    ByteBuffer

l    CharBuffer

l    IntBuffer

l    LongBuffer l FloatBuffer

l    DoubleBuffer

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 116 -

Quelques "Channel"

l  FileChannel

l  ServerSocketChannel

l  SocketChannel

l  DatagramChannel

l  SelectableChannel

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 117 -

Les threads

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 118 -

Les threads

Un thread est une unité d’exécution au sein d’un même processus (ce n’est pas un autre processus).

Tous les threads d’un même processus partagent la même zone mémoire.

La programmation multithreads donne l’illusion de la simultanéité.

La gestion des threads est dépendante de la JVM (problème pour la portabilité). Les threads peuvent être préemptifs ou coopératifs.

Un thread possède un nom et une priorité.

Un thread s’exécute jusqu’au moment où:Un thread de plus grande priorité devient exécutable.

•  Une méthode wait (), yield () ou sleep () est lancée.

•  Son quota de temps a expiré dans un système préemptif.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 119 -

Création d’un thread

Une classe est un thread si elle remplit une des deux conditions:

•  Elle étend la classe .Thread

•  Elle implémente l’interface .Runnable

Le corps du thread est contenu dans une méthode:public void run ()

Un thread est lancé par appel d’une méthode start ()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 120 -

Premier exemple de création d’un thread

class MyThread extends Thread

{

// Constructeur,données membres, méthodes éventuels

public void run ()

{

// corps du thread

}

}

MyThread thread = new MyThread () ;       // Création du thread

thread.start () ;                                          // Appelle la méthode run ()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 121 -

Deuxième exemple de création

d’un thread

class MyClass extends classe implements Runnable

{

// Constructeur,données membres, méthodes éventuels

public void run ()

{



// corps du thread

}

}

MyClass objet = new MyClass () ;               // Création d'un objet MyClass Thread thread = new Thread (objet) ;            // Récupération du thread

thread.start () ;                                         // Appelle la méthode run ()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 122 -

Quelques méthodes de la classe .Thread

start ()

Rend un thread exécutable en lançant la méthode run ().

sleep (i)

Endort le thread pour i millisecondes.

wait ()*

Suspend le thread.

notify ()*

Place le thread dans un état exécutable.

notifyAll ()

Réveille tous les threads en attente.

yield ()

Place le thread de l’état « en cours d’exécution » à l’état « exécutable ».

setPriority (i)

Modifie la priorité d’un thread (i est compris entre MIN_PRIORITY et MAX_PRIORITY).

join () join (long)

Pour qu'un deuxième thread attende la fin d'exécution d'un premier thread, il suffit d'appeler la méthode join sur le premier thread. Un paramètre de temps (en millisecondes) peut être spécifié.

Cycle de vie d’un thread

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 124 -

Arrêt d’un thread

l  La méthode stop () est dépréciée.

l  Un thread s’arrête lorsqu’il n’y a plus d’instruction à exécuter dans la méthode run ().

l  Une solution possible:

public class ThreadTest extends Thread

{

private boolean bKillThread = false;

public void run()

{

while (bKillThread == false)

.println( getName() ) ;

}

public void stopThread()

{

bKillThread = true;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 125 -

Synchronisation

Plusieurs threads accédant à une même donnée doivent être synchronisés

La synchronisation peut se faire sur un objet (pas de synchronisation possible pour une variable d'un type de base).

Mot clé: synchronized

Si un thread invoque une méthode "synchronized" d'un objet, celui-ci est verrouillé pour toutes ses méthodes "synchronized".

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 126 -

Premier exemple de synchronisation

class Compteur

{

private int valeur ;

// Si plusieurs threads dispose d’une référence sur un // objet de classe « Compteur », un seul thread à la fois // pourra pénétrer dans la méthode incrémente de cet objet. synchronized void incremente ()

{

valeur += 1 ;

}

int Combien ()

{

return valeur ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 127 -

Deuxième exemple de synchronisation

class Point

{

private float x,y ;

float x () { return x ; }           // ne nécessite pas de synchronized float y () { return y ; ]  // idem

void print ()

{

float safeX,safeY ;

synchronized (this)

{

safeX = x ; safeY = y ;

}

.print ("voilà x et y : " + safeX + safeY) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 128 -

Synchronisation sur une variable de classe

Dans les exemples précédents, synchronized ne protégeait que l'instance d'une classe.

Une variable de classe peut appartenir à plusieurs instances.

Il faut dans ce cas protéger une classe et pas seulement une instance de classe.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 129 -

Exemple de synchronisation sur une variable de classe

class Compteur

{

private static int valeur ;

void incremente ()

{

synchronized (getClass ()) { valeur += 1 ; }

}

int Combien () { return valeur ; }

}

public final Class getClass(): renvoie la classe de l’objet.

Tous les objets de classe Compteur seront bloqués dans la méthode incremente().

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 130 -

Les collections

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 131 -

Les collections

l  Les collections sont des objets permettant de gérer des ensembles d'objets avec éventuellement la possibilité de gérer les doublons, les ordres de tri, etc.

l  La version 1 de Java proposait:

•    .Vector, .Stack, .Hashtable

•    Une interface .iterator permettant de parcourir ces objets

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 132 -

Exemple de la collection "stack"

package teststack; import .* public class ExempleStack

{ private Stack pile ;

public ExempleStack ()

{ pile = new Stack () ;

("Je suis ") ; ("Un exemple ") ; ("de pile") ;

Iterator iter = pile.iterator () ; while (iter.hasNext())

{

.println (()) ; }

Je suis

Un exemple de pile

}

public static void main(String[] args)

{

new ExempleStack () ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 133 -

Interfaces de collections

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 134 -

Collection à partir de java 2

Collection : interface qui est implémentée par la plupart des objets qui gèrent des collections.

Map : interface qui définit des méthodes pour des objets qui gèrent des collections sous la forme clé/valeur

Set : interface pour des objets qui n'autorisent pas la gestion des doublons dans l'ensemble

List : interface pour des objets qui autorisent la gestion des doublons et un accès direct à un élément

SortedSet : interface qui étend l'interface Set et permet d'ordonner l'ensemble

SortedMap : interface qui étend l'interface Map et permet d'ordonner l'ensemble

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 135 -

Implémentation des interfaces

Interface

Implémentation

Set

HashSet

SortedSet

TreeSet

List

ArrayList, LinkedList, Vector

Map

HashMap, Hashtable

SortedMap

TreeMap

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 136 -

Exemple "TreeMap"

package exempletreemap;

import .* ;

public class ExempleTreeMap

{

public ExempleTreeMap ()

{

TreeMap tree = new TreeMap () ; ("zzzz",new Integer (26)); ("aaaa", new Integer (1)) ; ("bbbb", new Integer (2)) ;

Iterator itercle = tree.keySet().iterator() ;

Iterator itervaleurs = tree.values().iterator() ;

                 ;                    while (itercle.hasNext())

{

aaaa --> 1 bbbb --> 2 zzzz --> 26

.println (() + " --> " + ()) ;

}

}

public static void main(String[] args)

{

new ExempleTreeMap () ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 137 -

Collections et threads

l  Si plusieurs threads peuvent accéder à un objet collection, il y a nécessité de synchroniser avec une des méthodes statiques de la classe .Collections:

static Collection  synchronizedCollection (Collection c) static List  synchronizedList (List list) static Map  synchronizedMap (Map m) static Set  synchronizedSet (Set s)

static SortedMap  synchronizedSortedMap (SortedMap m) static SortedSet synchronizedSortedSet (SortedSet s)

l  Les méthodes précédentes ne synchronisent pas les itérateurs. Il faut donc le faire manuellement:

synchronized (objet)

{

Iterator iter = objet.iterator () ;

{

// travailler avec l'iterateur

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 138 -

Collections et threads

l Modifications de l'exemple précédent:

SortedMap tree = Collections.synchronizedSortedMap(new TreeMap ()) ;

…..

synchronized (tree)

{

Iterator itercle = tree.keySet().iterator() ; Iterator itervaleurs = tree.values().iterator() ; while (itercle.hasNext())

{

.println (() + " --> " + ()) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 139 -

Une table particulière: .Properties

l  La classe .Properties est une table de hachage pour définir des variables d'environnement sous la forme (nom_variable, valeur)

Exemple:

Properties props = new Properties () ; ("monApp.xSize","50") ;

l  La méthode statique System.getProperties () retourne les variables d'environnement définies telles que:

java.vendor

file.separator path.separator

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 140 -

Collection et java 1.5

l   Jusqu'à la version 1.4, on stockait et récupérait des "Object" d'une collection.

l   Exemple:

ArrayList liste = new ArrayList () ; (new MaClasse ()) ;

MaClasse obj = (MaClasse) (0) ;

l   Depuis la version 1.5, on spécifie la nature des objets stockés.

l   Exemple:

ArrayList liste = new ArrayList () ; (new MaClasse ()) ; MaClasse obj = (0) ;

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 141 -

Les nouveautés de la version 1.5

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 142 -

Nouveautés de la version 1.5

l  La version 1.5 (nom de code Tiger) est une évolution majeure du langage Java.

l  Les évolutions précédentes (hormis la 1.1) n'apportaient en général que des nouvelles classes internes.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 143 -

Autoboxing/Unboxing

l  L'autoboxing permet de transformer automatiquement une variable de type scalaire en un objet du type correspondant (exemple: int à Integer).

l  L'Unboxing est l'opération inverse (exemple: Integer à int).

l  Ces propriétés sont définies dans la JSR 201.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 144 -

Exemple AutoBoxing/UnBoxing

import .* ;

public class AutoBoxing

{         public static void main (String args [])

{ new AutoBoxing () ;

}

public AutoBoxing ()

{

Vector liste = new Vector () ;

for (int i = 1 ; i <= 5 ; i++) { (i) ; }  // (new Integer (i)); for (int i = 0 ; i < () ; i++) .println ( (i)) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 145 -

L'importation statique

l L'importation statique allège l'écriture pour l'accès aux données et aux méthodes statiques d'une classe. Elle est définie par la JSR 201

import static .* ;    // Nouveauté: mot clé static

public class TestStaticImport

{ public static void main (String args [])

{

new TestStaticImport () ;

}

public TestStaticImport ()

{

.println (PI) ;    // Remplace grâce à l'importation statique

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 146 -

Boucles évoluées

l  La syntaxe des boucles a été simplifiée pour le parcours des éléments d'un tableau ou d'une collection.

Exemple:

int tableau [] = {0,1,2,3,4,5} ; for (int i : tableau) .println (i) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 147 -

Les arguments variables

l  Cette fonctionnalité, définie par la JSR 201,permet de transmettre un nombre variable d'arguments d'un type donné à une fonction.

l  Les arguments seront transmis comme un tableau. On peut transmettre soit un tableau, soit une liste unitaire mais pas les deux en même temps.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 148 -

Exemples de liste variable d'arguments

public class VarArgs

{

public static void main(String[] args)

{

new VarArgs () ;

}

public VarArgs ()

{

.println(additionner (1,2,3)) ;

.println (additionner (4,5,6,7,8,9)) ;

}

public int additionner (int valeurs)  // …    indique une liste variable d'entiers

{ int total = 0 ;

for (int val : valeurs) total += val ; return total ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 149 -

Le type énuméré

l  Défini par la JSR 201, le type énuméré permet de définir un ensemble fini de valeurs.

Exemple de type énuméré:

public enum MaCouleur { BLEU , BLANC , ROUGE } ;

l  Le compilateur créera une classe avec les caractéristiques suivantes:

•  Un champ static pour chaque élément de la déclaration.

•  Une méthode values() qui renvoie un tableau avec les éléments définis.

•  Une méthode valueOf(String) qui retourne la valeur correspondante à la chaîne.

•  La classe implémente les interfaces Comparable et Serializable

•  Les méthodes toString(), equals(), hashCode() et compareTo() sont redéfinies.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 150 -

Exemple de type énuméré

public class TestEnum

{ private String Objet ;

private enum MaCouleur { BLEU , BLANC , ROUGE } ;

private MaCouleur Couleur ; public static void main(String[] args)  { new TestEnum ("voiture",MaCouleur.ROUGE) ; } public TestEnum (String obj, MaCouleur c)

{

Objet = obj ; Couleur = c ; afficherObjet () ;

.println (c) ;   // Affichera "ROUGE"

}

void afficherObjet ()

{

switch (Couleur)

{ case BLEU : .println (Objet + " de couleur bleue") ; break ; case BLANC: .println (Objet + " de couleur blanche") ; break ; case ROUGE: .println (Objet + " de couleur rouge") ; break ; default: .println (Objet + " de couleur inconnue") ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 151 -

Affichage formaté

l  La classe dispose maintenant d'une méthode printf analogue à celle du langage C.

l  Les caractères de formatage sont similaires au langage C à l'exception du \n remplacé par %n (pour des questions de portabilité).

Exemple:

public class IOFormatted

{

public static void main(String[] args)

{

new IOFormatted () ;

}

public IOFormatted ()

{

String chaine = "Bonjour" ; int i = 1 ;

.printf ("la chaine vaut %s%n",chaine) ;

.printf ("l'entier vaut %10d%n",i) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 152 -

Saisie formatée

l   La classe .Scanner permet des entrées formatées similaires à la fonction scanf du langage C.

l   Exemple:

import .* ;

public class IOFormatted

{ public static void main(String[] args)  { new IOFormatted () ; } public IOFormatted ()

{

String chaine ; int i = 0 ;

Scanner clavier = new Scanner () ;

chaine = () ;

try { i = clavier.nextInt() ;

} catch (InputMismatchException e)

{

.println("l'entier saisi est incorrect") ; }

.printf ("la chaine vaut %s%n",chaine) ;

.printf ("l'entier vaut %d%n",i) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 153 -

Quelques utilisations de .Scanner

Exemple 1 :

String chaine ;

Scanner clavier = new Scanner () ; try { chaine = (.regex.Pattern.compile("[Oo]")) ;

} catch (InputMismatchException e)

{

.println ("O ou o attendu") ;

}

Exemple 2: Scanner versus StringTokenizer

String chaine ;

chaine = "1 test 2 test rouge test bleu test " ;

Scanner s = (new Scanner (chaine)).useDelimiter ("\\stest\\s") ;

.println (s.nextInt ()) ;

.println (s.nextInt ()) ;

.println (s.next ()) ;

.println (s.next ()) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 154 -

Les types génériques

l  Les types génériques, définis par la JSR 14, permettent de spécifier le type d'objets que l'on va placer dans une collection d'objets (List, Vector)

Avantages:

•  meilleure lisibilité: on connaît à la lecture du programme quel type d'objets seront placés dans la collection.

•  La vérification peut être fait à la compilation.

•  Le cast pour récupérer un objet de la collection est devenu implicite (sans cette fonctionnalité, il fallait faire un cast explicite, sachant que celui-ci peut échouer mais cela n'était détectable qu'à l'exécution).

l  La syntaxe pour utiliser les types génériques utilise les symboles < et >.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 155 -

Exemple de type générique

import .* ; public class TestGenerique

{ public static void main(String[] args)  { new TestGenerique () ; } public TestGenerique ()

{

String chaine,str ;    boolean bFinBoucle = false ;   List liste = new ArrayList () ; Scanner clavier = new Scanner () ;

while (bFinBoucle == false)  

{ chaine = () ;

if (chaine.equalsIgnoreCase("quit") == false) (chaine) ;    // on ne peut stocker que des Strings

else bFinBoucle = true ;

}

for (Iterator iter = liste.iterator (); iter.hasNext () ;)

{ str = () ; // Pas de cast ici

.println (str) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 156 -

Les classes génériques

public class TestClasseGenerique

{ public static void main(String[] args)

{

new TestClasseGenerique () ;

}

public TestClasseGenerique ()

{

new MaClasseGenerique<String,Integer> ("Dupont",33) ;

}

}

class MaClasseGenerique<T1,T2>

{

private T1 param1 ; private T2 param2 ;

public MaClasseGenerique (T1 param1,T2 param2)

{

this.param1 = param1 ;

}

public T1 getParam1 () { return param1 ; } public T2 getParam2 () { return param2 ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 157 -

Les annotations

l  Une annotation permet de marquer certains éléments du langage.

l  Une annotation pourra ensuite être utilisée à la compilation ou à l'exécution pour automatiser certaines tâches.

l  Création d'une annotation:

public @interface MonAnnotation

{

}

l  Utilisation d'une annotation:

@MonAnnotation

l  Une annotation peut être utilisée sur différents types d'éléments du langage: package, class, interface, enum, annotation, méthodes paramètre, champs d'une classe, variables locales

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 158 -

Les annotations standards

@Deprecated

Indique au compilateur que l'élément marqué est déprécié et ne devrait plus être utilisé.

@Override

Indique que l'élément marqué est une surcharge d'une méthode héritée

@SuppressWarnings

Indique au compilateur de

ne pas afficher certains messages d'avertissement.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 159 -

Exemple @Deprecated

public class MaClasse

{ private int annee ;

public MaClasse () { annee = 2007 ; } public int getYear () { return annee ; }

@Deprecated

public int getAnnee () { return annee ; }

}

public class Test

{

static public void main (String args [])

{

.println ( new MaClasse ().getAnnee ()) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 160 -

Exemple @SuppressWarnings

l  Liste des avertissements:

all,deprecation,unchecked,fallthrough,path,serial,finally, deprecation -unchecked,-fallthrough,-path,-serial,-finally

Exemples:

@SuppressWarnings ("deprecation") public class VieilleClasse { … }

@SuppressWarnings ("deprecation") public int methode () { … }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 161 -

Exemple @Override

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 162 -

Les meta-annotations

l  Une méta annotation permet d'annoter une autre annotation afin d'indiquer au compilateur des informations supplémentaires.

l  Les méta annotations sont dans le package .annotation:

•    @Documented

•    @Inherited

•    @Retention

•    @Target

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 163 -

Les méta annotations

@Documented

Indique au générateur de documentation que l'annotation doit être présente dans la documentation.

@Inherited

L'annotation sera héritée par tous les descendants de l'élément marqué (classe uniquement).

@Retention

Indique la durée de vie de l'annotation:

RetentionPolicy.SOURCE

RetentionPolicy.CLASS (défaut)

RetentionPolicy.RUNTIME

@Target

Limite le type d'éléments sur lesquels l'annotation peut être utilisée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 164 -

Exemple @Documented

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 165 -

Exemple @Inherited

import .annotation.Inherited ;

@Inherited

public @interface Annotation1

{

}

@Annotation1

public class MaClasse

{

}

Toutes les classes étendant MaClasse hériteront de l'annotation

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 166 -

Exemple @Retention

public static void main (String args [])

{

for (Annotation a : TestAnnotation.class.getAnnotations ())

{

.println (a.annotationType().getSimpleName ()) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 167 -

Exemple @Target

l  Exemple d'une annotation ne pouvant être utilisée que sur un constructeur:

@Target(ElementType.CONSTRUCTOR)

public @interface ConstructeurAnnotation {}

l  Liste des éléments pouvant être annotées:

ElementType.ANNOTATION

ElementType.CONSTRUCTOR

ElementType.FIELD

ElementType.LOCAL_VARIABLE

ElementType.METHOD

ElementType.PACKAGE

ElementType.PARAMETER

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 168 -

Exemple d'annotation personnalisée (1/2)

package testannotation ; import .annotation.* ;

@Documented

@Retention(RetentionPolicy.SOURCE) public @interface TODO

{

public static enum Level { LOW, MEDIUM, HIGH } ;

String detail () ;

Level niveau () default Level.MEDIUM ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 169 -

Exemple d'annotation personnalisée(2/2)

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 170 -

Les applets

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 171 -

Applet

•   Une applet sera téléchargée à partir d’un site web et sera exécutée dans une machine virtuelle java incorporée aux navigateurs

(netscape, internet explorer, mozilla, opera, …)

•   Pas de méthode main()

•   La classe principale d’une applet doit étendre la classe java.applet.Applet.

•   Quelques fonctions importantes de la classe  java.applet.Applet:

•   public void init()

•   public void start ()

•   public void stop ()

•   public void destroy ()

•   public void paint (Graphics g)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 172 -

Exemple d'Applet

package hello ;

import .* ; import java.applet.* ;

public class Hello extends Applet

{

public void paint (Graphics g)

{

g.drawString ("Hello World",10,30) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 173 -

La balise

L'applet nécessite un fichier HTML contenant une balise pour être exécutée.Exemple :

CODE       indique le nom du fichier qui chargera l'applet

WIDTH, HEIGHT     Taille nécessaire pour l'applet en pixels dans la fenêtre du navigateur

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp         - 174 -

Exécution de l'applet

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 175 -

La balise

•D'autres attributs pour la balise existent :

ALIGN Définit comment l'applet doit être alignée sur la Page. Les valeurs possibles sont:

LEFT,RIGHT,TOP,TEXTTOP,MIDDLE,ABSMIDDLE,

BASELINE,BOTTOM,ABSBOTTOM

CODEBASE  Permet de définir le répertoire ou le serveur

                                      •PARAM          Permet de définir des paramètres dans le

fichier HTML qui seront récupérés dans l'Applet grâce à la méthode java.applet.Applet.getParameter ( )

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 176 -

Exemple de CODEBASE

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 177 -

Exemple d'applet

package hello ;

import java.applet.* ; import .* ;

public class Hello extends Applet

{ private String chaine ;

public void init ()

{

chaine = getParameter ("welcome") ;

}

public void paint (Graphics g)

{

g.drawString (chaine, 10,30) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 178 -

Exemple d'applet

CODE="hello.Hello.class"

ALIGN=LEFT

WIDTH=200 HEIGHT=200>

A la gauche de ce texte, vous pouvez voir une applet affichant un texte

Ce texte s'affiche desormais en dessous de l'applet et a gauche de la fenetre du

navigateur.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 179 -

Exécution de l'applet

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 180 -

La classe .Graphics

•    Les fonctions graphiques sont utilisables à travers un objet de classe .Graphics

•    L'objet de classe .Graphics gère un contexte graphique

•    L'objet de classe .Graphics est transmis en argument des fonctions update() et paint () et peut être également créé par les méthodes getGraphics () ou create ()

•    Un objet de classe Graphics manipule une surface spécifique de l'application

•    Une surface peut être manipulée par plusieurs objets de classe Graphics

•    La classe .Graphics contient les fonctions classiques de gestion de tracés de formes, de remplissage, d'utilisation des couleurs et de fontes, …

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 181 -

Exemples de méthodes de la classe .Graphics

public void drawLine( int x1, int y1, int x2, int y2 ) public void drawPolygon( int xPoints[], int yPoints[], int nPoints ) public void drawRect( int x, int y, int width, int height ) public void fillOval( int x, int y, int width, int height ) public void fillRect( int x, int y, int width, int height ) public void setColor (Color c)

….

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 182 -

Gestion de l'affichage

L'affichage graphique est géré par un thread "Screen Updater"

Le thread d'affichage appelle la méthode update (Graphics g) des composants qui doivent être

redessinés. Tous les composants graphiques possèdent cette méthode.

Il est possible de forcer un composant graphique à être redessiné en appelant la méthode repaint () Cela positionne une variable dans le composant à destination du "screen updater" qui appellera la méthode update (Graphics g)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 183 -

Fonctionnement par défaut de la méthode update (Graphics g)

public void update (Graphics g)

{

g.setColor (getBackground ()) ;

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

g.setColor (getForeground ()) ; paint (g) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 184 -

La classe .Color

La gestion des couleurs est basée sur un modèle à 24 bits

Une couleur est définie par ses composantes RGB

Exemple :

Color BleuPale = new Color (0,0,80) ;

Certaines couleurs ont un nom symbolique (membres statiques)

Exemples :

Color.white

Color.orange

255,255,255

255,0,0

255,200,0

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp

- 185 -

Manipulation des couleurs

Quelques méthodes de gestion de couleurs héritées de la classe .Component:

public void setBackground(Color c ) public Color getBackground() :

Quelques méthodes de gestion de couleurs appartenant à la classe .Graphics:

public void setColor (Color c ) public Color getColor()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 186 -

La classe

•    La classe permet de définir des objets représentants des polices de caractères caractérisées par leur nom, leur style et leur taille en points

•    Exemple :

Font f = new Font ("Monospaced", , 24) ;Les spécifications du langage java fournissent 5 polices universelles:

Dialog

SansSerif (anciennement Helvetica)

Serif (anciennement TimesRoman)

Monospaced (anciennement Courier)

Symbol

•    En fonction de la plate forme utilisée, d'autres polices peuvent être disponibles.

•    Styles disponibles:

Font.ITALIC

Font.PLAIN

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 187 -

Exemple d'utilisation de la classe

package exemplefont ;

import java.applet.* ; import .* ;

public class Fontes extends Applet

{

public void paint (Graphics g)

{

String FontListe [] ;

FontListe = getToolkit().getFontList () ;

for (int i = 0 ; i != FontListe.length ; i++)

{

g.setFont (new Font (FontListe[i],Font.PLAIN,12)) ;

g.drawString (FontListe [i],0,20*(i+1)) ;

}

}

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 188 -

Les interfaces utilisateurs avec le package

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 189 -

Les interfaces utilisateurs avec le package

•  Le package propose des classes graphiques permettant de concevoir facilement une interface utilisateur

.Button .CheckBox .Choice .Label .Scrollbar .TextArea .TextField

•  Tous les objets s'appuient sur les objets natifs de la plate forme utilisée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 190 -

Exemple de création d'une interface utilisateur

package exempleawt ;

import java.applet.* ; import .* ;

public class Composants extends Applet

{ private Label label ; private Button button ; private Checkbox checkbox ; private Choice choice ; private Scrollbar h_scrollbar ; private TextArea textarea ; private TextField textfield ; private List list ;

public void init ()

{

label = new Label ("Label") ; add (label); button = new Button ("Button") ;   add (button)

checkbox = new Checkbox ("Checkbox") ;  add

(checkbox) ; choice = new Choice () ; choice.addItem ("1") ; choice.addItem ("2") ; add (choice) ; h_scrollbar = new

Scrollbar(Scrollbar.HORIZONTAL,50,10,0,1000); add (h_scrollbar) ; textarea = new TextArea ("TextArea",3,30) ; add

(textarea) ; textfield = new TextField ("TextField",30) ; add

(textfield) ; list = new List () ;

("chaine 1") ;  ("chaine 2") ; add (list) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 191 -

Exemple d'affichage des composants

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 192 -

Les classes de mise en page

La fenêtre du navigateur sert de containerPour disposer les composants graphiques, on utilise des classes de mise en page :

•  .FlowLayout

•  .BorderLayout

•  .CardLayout

•  .GridLayout

•  .GridBagLayout

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 193 -

La classe .FlowLayout

•  Cette classe dispose les objets par ordre d'ajout. C'est le layout par défaut pour les containers de type .Panel.

•  Plusieurs constructeurs:

public FlowLayout () ;

public FlowLayout (int align) ;

public FlowLayout (int align, int hgap, int vgap) ;

•  Le paramètre align peut prendre les valeurs:

FlowLayout.CENTER

FlowLayout.RIGHT

•  hgapet vgap correspondent à l'espacement horizontal et vertical des objets en pixels.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 194 -

Exemple de FlowLayout

package flow ;

import java.applet.*; import .*;

public class Flow extends Applet

{ public void init()

{

setLayout (new FlowLayout (FlowLayout.CENTER,30,40)) ;

add (new Button ("Test")) ; add (new Button ("de")) ; add (new Button ("la")) ; add (new Button ("classe")) ;

add (new Button ("FlowLayout")) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 195 -

Exécution de l'applet "Flow"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 196 -

La classe .BorderLayout

Les composants graphiques sont ajoutés en spécifiant une position géographique :

North, South, East, West, Center

C'est le layout par défaut des containers .Frame.

Plusieurs constructeurs:

public BorderLayout () ;

public BorderLayout (int hgap, int vgap) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 197 -

Exemple de BorderLayout

package border;

import java.applet.*; import .*;

public class Border extends Applet

{ public void init()

{

setLayout (new BorderLayout (30,40)) ; add ("North",new Button ("Test")) ; add ("East",new Button ("de")) ; add ("South",new Button ("la")) ; add ("West",new Button ("classe")) ;

add ("Center",new Button ("BorderLayout")) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 198 -

Exécution de l'applet "Border"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 199 -

La classe .GridLayout

La classe .GridLayout définit un quadrillage dans lequel les composants graphiques seront placés de la gauche vers la droite et du haut vers le bas.

Plusieurs constructeurs:

public GridLayout (int rows, int cols) ;

public GridLayout (int rows, int cols, int hgap, int vgap) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 200 -

Exemple de GridLayout

package grid ;

import java.applet.*; import .*;

public class Grid extends Applet

{ public void init()

{

setLayout (new GridLayout (3,2,30,40)) ; add (new Button ("Test")) ; add (new Button ("de")) ; add (new Button ("la")) ; add (new Button ("classe")) ;

add (new Button ("GridLayout")) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 201 -

Exécution de l'applet "Grid"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 202 -

La classe .GridBagLayout

•   La classe .GridBagLayout définit un quadrillage analogue à GridLayout mais les composants n'ont pas forcément une taille identique et peuvent occuper une ou plusieurs cases de la grille.

•   Un seul constructeur:

public GridBagLayout () ;

•   Chaque composant graphique sera ajouté en spécifiant les contraintes souhaitées grâce à un objet de classe .GridBagConstraints.

•   Mise en œuvre :

•   Création d'un objet GridBagLayout

•   Création d'un objet GridBagConstraints

•   Fixation des contraintes d'un composant

•   Enregistrement des contraintes auprès du gestionnaire

•   Ajout du composant

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 203 -

Principales données membres de .GridBagConstraints

public int gridx ; public int gridy ;

Définissent les coordonnées de la cellule dans la partie supérieure gauche de la zone d'affichage. La valeur par défaut est GridBagConstraints.RELATIVE

public int gridwidth; public int gridheight;

Nombre de cellules en colonnes et en ligne du composant courant. La valeur par défaut est 1.

public int fill ;

Détermine comment utiliser l'espace libre disponible lorsque la taille du composant ne correspond pas à celle qui est offerte.

GridBagConstraints.HORIZONTAL

GridBagConstraints.VERTICAL

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 204 -

Principales données membres de .GridBagConstraints

public int ipadx ; public int ipady ;

Définit la taille horizontale et verticale (internal padding)  à ajouter aux composants si la valeur fill n'est pas spécifiée.

public Insets insets

Définit l'espacement autour du composant (external padding). La classe Insets est défini par : public Insets (int top,int left,                           int bottom,int right)

public int anchor

Positionne le composant lorsque la taille de la cellule est plus grande que la taille du composant. Valeurs possibles :

NORTH, NORTHWEST, NORTHEAST,

SOUTH, SOUTHWEST, SOUTHEAST,

WEST, EAST

public double weightx public double weighty

Définit la répartition de l'espace en cas de changement de dimension (en proportion)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 205 -

Exemple de GridBagLayout

package gridbag ; import java.applet.*; import .*;

public class GridBag extends Applet

{ public void init() {

Button b1 = new Button ("Bouton 1") ; Button b2 = new Button ("Bouton 2") ;

Button b3 = new Button ("Bouton 3") ;

GridBagLayout gbl=new GridBagLayout ();GridBagConstraints gbc=new GridBagConstraints () ; setLayout (gbl) ; gbc.insets = new Insets (10,10,10,10) ;  = ; gbc.weightx = 2 ; gbc.weighty = 2 ; gbl.setConstraints (b1,gbc) ; add (b1) ; gbc.weightx = 1 ; gbc.weighty = 1 ; gbl.setConstraints (b2,gbc) ; add (b2) ;

gbc.gridx = 1 ; gbc.gridy = 1 ; = GridBagConstraints.HORIZONTAL ; gbl.setConstraints (b3,gbc) ; add (b3) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 206 -

Exécution de l'applet "GridBag"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 207 -

La classe .CardLayout

La classe .CardLayout définit des objets qui ne sont pas visibles simultanément mais consécutivement.

Plusieurs constructeurs:

public CardLayout () ;

•public CardLayout (int hgap, int vgap) ;

Quelques méthodes pour passer d'un composant à un autre :

first ()

Affiche le premier composant

last ()

Affiche le dernier composant

previous ()

Affiche le composant précédent

next ()

Affiche le composant suivant

show ()

Affiche le composant spécifié dans le 2ème argument

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 208 -

Exemple de CardLayout

package card ; import java.applet.*; import .*; import .event.* ;

public class Card extends Applet implements ActionListener

{

CardLayout cl           = new CardLayout (30,40) ;

Button Test               = new Button ("Test") ;    Button De           = new Button ("de") ;

Button La                  = new Button ("la") ;        Button Classe     = new Button ("classe") ;

Button Cardlayout     = new Button ("CardLayout") ; public void init()

{ setLayout (cl) ; add ("Test",Test) ; Test.addActionListener (this) ; add ("de",De) ;   De.addActionListener (this) ; add ("la",La) ;   La.addActionListener (this) ; add ("classe",Classe) ; Classe.addActionListener (this) ;

add ("CardLayout",Cardlayout);Cardlayout.addActionListener (this) ;

}

public void actionPerformed (ActionEvent evt)  { (this) ;  } }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 209 -

Exécution de l'applet "Card"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 210 -

Layout personnalisé

l  On peut ne pas utiliser de layout (setLayout (null)) et positionner les composants en fonction de leurs coordonnées. Cette méthode est adaptée uniquement pour les conteneurs non redimensionnables.

l  On peut définir une classe de layout en implémentant l'interface .LayoutManager.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 211 -

l Layout pour disposer au maximum quatre composants de taille 100x100 aux quatre coins d'un conteneur.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 212 -

import .* ;

public class MyLayout implements LayoutManager

{

public void addLayoutComponent(String name, Component comp)  { } public void layoutContainer(Container parent)

{

Component comp [] = parent.getComponents() ; Rectangle rect = parent.getBounds() ; for (int i = 0 ; i != comp.length && i != 4 ; i++)

{

switch (i)

{

case 0: comp [i].setBounds(0,30,100,100) ; break ; case 1: comp [i].setBounds(rect.width-100, 30, 100, 100) ; break ; case 2: comp [i].setBounds(0, rect.height-100, 100, 100) ; break ;

case 3: comp [i].setBounds(rect.width-100, rect.height-100, 100, 100) ; break ;

}

}

}

public Dimension minimumLayoutSize(Container parent)  { return parent.getSize() ;} public Dimension preferredLayoutSize(Container parent)  { return parent.getSize () ; } public void removeLayoutComponent(Component comp)  { }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 213 -

import ..*;

public class TestLayout extends Frame

{ public static void main(String[] args)

{

new TestLayout().setVisible (true) ;

}

public TestLayout()

{

super("Exemple layout"); initGUI();

}

private void initGUI()

{ try {

setLayout(new MyLayout ()) ; add (new Button ("bouton 1")) ; add (new Button ("bouton 2")) ; add (new Button ("bouton 3")) ; add (new Button ("bouton 4")) ; pack(); setSize(400, 300);

} catch (Exception e) { }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 214 -

Les conteneurs

Panel

Conteneur sans fenêtre propre. Permet d'ordonner les composants graphiques.

Window

Fenêtre principale sans cadre ni menu.

Frame

Fenêtre possédant toutes les fonctionnalités (barre de titre, barre de menus, forme du curseur, etc.)

Dialog

Permet de réaliser des boîtes de dialogue. Nécessite une frame

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 215 -

La classe .Panel

Un "Panel" est un container sans fenêtre propre.Il dispose de son propre layout (.FlowLayout par défaut).

Son utilisation facilite la conception d'interface utilisateur.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 216 -

Exemple de Panel

package panel; import java.applet.* ; import .* ;

public class Panel extends Applet

{ public void init ()

{

setLayout (new BorderLayout ()) ;

Panel Haut = new Panel () ;  Panel Milieu = new Panel () ;

Haut.setLayout (new FlowLayout ()) ; // Valeur par defaut (new Label ("Entrer les valeurs RGB")) ;

Milieu.setLayout (new FlowLayout ()) ;  // Valeur par defaut

(new Label ("R")) ;  (new TextField (5)) ;

(new Label ("G")) ;  (new TextField (5)) ; (new Label ("B")) ;   (new TextField (5)) ;

add ("North",Haut) ;

add ("Center",Milieu) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 217 -

Exécution de l'appel "Panel"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 218 -

La classe .Frame

Un objet "Frame" est une fenêtre flottante (indépendante de la fenêtre du navigateur dans le cas particulier des applets).

La fenêtre dispose de ses propres caractéristiques

(barre de titre, barre de menu, curseur, etc.)La fenêtre dispose de son propre layout (.BorderLayout par défaut).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 219 -

Exemple de Frame

package frame ; import java.applet.* ; import .* ;

public class ExempleFrame extends Applet

{ public void init ()

{

new MyFrame ("Exemple de Frame") ;

}

}

class MyFrame extends Frame

{

public MyFrame (String title)

{ super (title) ;

setLayout (new FlowLayout ()) ;

add (new Label ("Voila une nouvelle fenetre")) ; add (new Button ("Quit")) ; setSize (400,200) ; setVisible (true) ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 220 -

Exécution de l'applet

"ExempleFrame"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 221 -

Les boîtes de dialogues

Les boîtes de dialogue s'appuie sur les frames pour disposer de leur propre fenêtre.

Une boîte de dialogue peut être modale ou non

S'appuyant sur une frame, une boîte de dialogue dispose de son propre layout

(.BorderLayout par défaut).

Les constructeurs de la classe .Dialog:

public Dialog (Frame parent, boolean modal)

public Dialog (Frame parent, String title ,boolean modal) - Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp - 222 -

Exemple de Dialog

package dialog; import java.applet.*; import .*;

public class ExempleDialog extends Applet

{ public void init ()

{

ErrorDialog error = new ErrorDialog ("Permission denied") ; error.setVisible (true) ;

}

}

class ErrorDialog extends Dialog

{

ErrorDialog (String message)

{

super (new Frame (),"Error",true) ; add ("Center",new Label (message)) ; add ("South", new Button ("OK")) ;   // Il faudrait armer l'evenement du bouton

setSize (200,200) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 223 -

Exécution de l'applet

"ExempleDialog"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 224 -

Les menus

•  Le package propose des classes permettant de créer des barres de menu dans des frames et des "Popup Menu"

•  Classes du package à utiliser :

Menu, MenuItem, MenuBar, PopupMenu,CheckBoxMenuItem, MenuShortCut

•  Une barre de menu est positionnée par la méthode setMenuBar () de la classe .Frame.

•  Un "popup menu" est ajouté à un composant grâce à la méthode void add (Popup menu) de la classe .Component et est rendu visible grâce à la méthode void show (Component origin, int x, int y) de la classe .PopupMenu.

•  La méthode setEnabled (boolean) de la classe .Component permettent de rendre sensitif/insensitif une option ou sous option de menu.

•  Les sous options de menu peuvent être séparées par un trait horizontal par ajout d'un MenuItem spécial (new MenuItem ("-") ;) ou par les méthodes void addSeparator () ou void insertSeparator (int index) de la classe .

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 225 -

Exemple de barre de menu

package menubar ;

import java.applet.* ; import .* ;

public class ExempleMenuBar extends Applet

{ public void init () 

{

MyFrame frm = new MyFrame ("Exemple de Frame") ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 226 -

Exemple de barre de menu

class MyFrame extends Frame

{

MyFrame (String title)

{ super (title) ;

MenuBar mb = new MenuBar () ;

Menu fichier = new Menu ("Fichier") ;

MenuItem ouvrir = new MenuItem ("Ouvrir") ; MenuItem quitter = new MenuItem ("Quitter") ; (ouvrir) ;  (new MenuItem ("-")) ; // Separateur (quitter) ; (fichier) ;

Menu couleur = new Menu ("Couleur") ;

CheckboxMenuItem rouge = new CheckboxMenuItem ("Rouge");  (rouge) ;

CheckboxMenuItem noir = new CheckboxMenuItem ("Noir") ;  (noir) ; noir.setState (true) ; (couleur) ;

Menu help = new Menu ("Help") ; mb.setHelpMenu (help) ;

MenuItem apropos = new MenuItem ("A Propos") ; ("A Propos") ; (help) ; setSize (400,100) ; setMenuBar (mb) ; setVisible (true) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 227 -

Exécution de l'applet

"ExempleMenuBar"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 228 -

Exemple de popup menu

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 229 -

Gestion des événements

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 230 -

Gestion des événements

Permet de définir un comportement en réponse à une action d'un utilisateur ou du système.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 231 -

Les Méthodes de .EventObject

Méthodes

Description

public EventObject (Object source)

Constructeur; prend en paramètre l’objet source de l’événement.

public Object getSource ()

Renvoie l’objet qui a généré l’événement.

public String toString ()

Renvoie une chaîne de caractères caractérisant l’objet.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 232 -

Gestion des Evénements

La réception et le traitement des événements sont clairement séparés :

Certains    objets         sont  à        même        d'émettre   des événements

Un objet écouteur pourra recevoir ces événements si:

il implémente l'interface listener correspondant au type de l'événement.

il s'est enregistré auprès d'un émetteur.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 233 -

Exemple d'événement

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 234 -

La classe "TempChangeEvent"

package thermometre;

public class TempChangeEvent extends .EventObject

{

protected double temperature; public TempChangeEvent(Object source, double temperature)

{

super(source); this.temperature = temperature;

}

public double getTemperature()

{

return temperature;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 235 -

L'interface "TempChangeListener"

l Un objet récepteur de l'événement TempChangeEvent doit implémenter cette interface.

package thermometre;

public interface TempChangeListener extends .EventListener

{

void tempChange(TempChangeEvent evt);

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 236 -

La classe "Temperature" 1/3

package thermometre;

import .*;

public class Temperature extends Thread

{

protected double TemperatureCourante = 0 ;

// Stockage des récepteurs

private Vector TempChangeListeners = new Vector (); 

public synchronized void addTempChangeListener(TempChangeListener l)

{

if ( ! TempChangeListeners.contains(l)) TempChangeListeners.addElement(l);

}

public synchronized void removeTempChangeListener(TempChangeListener l)

{

if (TempChangeListeners.contains(l)) TempChangeListeners.removeElement(l);

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 237 -

La classe «Temperature» 2/3

protected void notifyTemperatureChange()

{

TempChangeEvent evt = new TempChangeEvent (this,TemperatureCourante);

Vector recepteursClone;

synchronized(this)

{

recepteursClone = (Vector) TempChangeListeners.clone();

}

Iterator Iter = recepteursClone.iterator(); while (Iter.hasNext())

{

TempChangeListener Thermometre =  ();

Thermometre.tempChange(evt);

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 238 -

La classe "Temperature" 3/3

//Thread pour modifier la température et

//générer des événements TempChangeEvent

public void run ()

{ while (true)

{ try {

TemperatureCourante = 20 * Math.random() ; notifyTemperatureChange () ; Thread.sleep (60000) ;

} catch (InterruptedException e) {}

TemperatureCourante += 1 ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 239 -

La classe "Thermometre"

package thermometre;

public class Thermometre implements TempChangeListener

{

public Thermometre ()

{

Temperature Temp = new Temperature () ;

Temp.addTempChangeListener (this);

Temp.start () ;  // On lance le Thread de Temperature }

public void tempChange (TempChangeEvent evt)

{

.println (evt.getTemperature()) ; }

static public void main (String args [])

{

new Thermometre () ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 240 -

Gestion des événements pour l'AWT

Tous les événements et les interfaces listener sont déjà répertoriés et dépendent du type de composants graphiques utilisés.Toutes les classes et interfaces sont définies dans le package .event.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 241 -

Les listeners disponibles dans le package

ActionListener

Action spécifique effectuée sur un composant

AdjustmentListener

Evénement généré quand un composant est ajusté (barre de défilement, …)

FocusListener

Focus clavier. Généré lorsqu'un composant reçoit ou perd le focus

ItemListener

Evénement généré quand un élément tel qu'une case à cocher a été modifiée

KeyListener

Evénement quand un utilisateur entre du texte au clavier

MouseListener

Evénement généré par la souris

MouseMotionListener

Evénement générés quand la souris se déplace sur un composant

WindowListener

Evénement de gestion fenêtre

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 242 -

Les méthodes définies dans les interfaces listeners

ActionListener

public void actionPerformed (ActionEvent)

AdjustmentListener

public void adjustmentValueChanged (AdjustmentEvent)

FocusListener

public void focusGained (FocusEvent)public void focusLost (FocusEvent)

ItemListener

public void itemStateChanged (ItemEvent)

KeyListener

public void keyPressed (KeyEvent) public void keyReleased (KeyEvent) public void keyTyped (KeyEvent)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 243 -

Les méthodes définies dans les interfaces listeners

MouseListener

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

MouseMotionListener



public void mouseDragged (MouseEvent) public void mouseMoved (MouseEvent)

WindowListener

public void windowActivated (WindowEvent) public void windowClosed (WindowEvent) public void windowClosing (WindowEvent) public void windowDeactivated (WindowEvent) public void windowDeiconified (WindowEvent) public void windowIconified (WindowEvent) public void windowOpened (WindowEvent)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 244 -

Association source-récepteur

•    L'association source-récepteur se fait par l'une des méthodes suivantes :

•    addActionListener (.event.ComponentListener )

•    addAdjustmentListener (.event.AdjustmentListener )

•    addFocusListener (.event.FocusListener)

•    addItemListener (.event.ItemListener)

•    addKeyListener (.event.KeyListener)

•    addMouseListener (.event.MouseListener)

•    addMouseMotionListener (.event.MouseMotionListener)

•    addWindowListener (.event.WindowListener)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 245 -

Exemple de gestion d'événement 1/2

package evenement ;

import java.applet.* ; import .* ; import .event.* ;

public class ExempleEvenement extends Applet

{

Button IciOuLa = new Button ("ici") ; TextField saisie = new TextField (20) ;

Recepteur recepteur = new Recepteur () ;

public void init ()

{ add (saisie) ; add (IciOuLa) ; 

saisie.addActionListener (recepteur) ;  IciOuLa.addActionListener (recepteur) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 246 -

Exemple de gestion d'événement 2/2

class Recepteur implements ActionListener

{

public void actionPerformed (ActionEvent evt)

{

Object src = evt.getSource () ;

if (src instanceof TextField)  ((TextField) src).setText (""); else if (src instanceof Button) if ( ((Button) src).getLabel ().equals ("ici"))

((Button) src).setLabel ("la") ; else ( (Button) src).setLabel ("ici") ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 247 -

Exécution de l'applet

"ExempleEvenement"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 248 -

Adaptateurs d'événements

Implémenter un écouteur oblige à surcharger toutes les méthodes de l'interface

Exemple:

class MonApplet extends Applet implements MouseListener, KeyListener

{

// 8 fonctions événements à écrire

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 249 -

Les adaptateurs

•  Le package .event contient des adaptateurs (adapters) qui sont des classes implémentant les écouteurs et fournissant des amorces vides des méthodes :

•  MouseAdapter implémente    MouseListener

•  MouseMotionAdapter implémente    MouseMotionListener

•  KeyAdapter implémente    KeyListenerExemple :

import .event.* ; class GestionSouris extends MouseAdapter

{

public void mousePressed (MouseEvent e) {…}

// On n'est pas obligé d'écrire les autres méthodes }

•  L'absence d'héritage multiple limite l'utilisation des adaptateurs

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 250 -

Exemple d'utilisation d'un adaptateur

import java.applet.* ; import .event.* ;

public class event11 extends Applet

{

public void init ()

{

GestionSouris mouse = new GestionSouris () ; addMouseListener (mouse) ;

}

}

class GestionSouris extends MouseAdapter

{

public void mouseClicked (MouseEvent e)

{

.println ("je suis dans mouseClicked") ;

}

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 251 -

Le package javax.swing

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 252 -

Présentation de Swing

l  Swing propose de nouvelles classes et interfaces pour construire des interfaces graphiques.

l  Le package javax.swing est inclus dans la jdk depuis la version 1.2 de Java.

l  Swing utilise le même mécanisme de gestion d'événement que le package .

l  Swing propose de très nombreux composants et une apparence modifiable à la volée (Windows, Motif, Metal).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 253 -

Quelques apparences

UIManager.setLookAndFeel (".motif.MotifLookAndFeel") ;

UIManager.setLookAndFeel (".metal.MetalLookAndFeel") ;

UIManager.setLookAndFeel (".windows.WindowsLookAndFeel") ; Connaître les "look and feel" disponibles sur la plate forme:

UIManager.LookAndFeelInfo [] info = UIManager.getInstalledLookAndFeels () ; for (int i = 0 ; i != info.length ; i++) .println (info [i]) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 254 -

Extrait de l'arborescence swing

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 255 -

Caractéristiques des composants

l  La racine de l'arborescence des classes et interfaces de Swing est la classe JComponent (analogue et héritant de .Component).

l  Les composants sont des beans.

l  Les composants n'ont pas de partie native (sauf JApplet, JDialog, JFrame, JWindow).

l  Le bord des composants peut être changé.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 256 -

Architecture d'une interface Swing

l Une interface sera composée:

•   D'un composant racine (toplevel)

•   D'un ou de plusieurs containers

•   De composants au sein des containers

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 257 -

Composants racines de Swing

l Il existe trois composants racines principaux:

JApplet, JFrame, JDialog

toplevel

Menu Bar

Content Pane

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 258 -

Quelques Containers sans fenêtre propre

JPanel

JScrollPane

JSplitPane

JTabbedPane

JToolBar

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 259 -

Disposition des composants

l  Les composants utilisent les mêmes classes de layout que les composants AWT.

l  Un nouveau Layout: javax.swing.BoxLayout qui permet de placer des composants en ligne ou en colonne, chaque composant pouvant avoir sa propre largeur et sa propre hauteur.

l  Un nouveau container: utilisant le layout précédent proposant des méthodes statiques de création de composant invisible redimensionnable ("glue") ou non redimensionnable ("strut").

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 260 -

Exemple Container Box

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 261 -

Exemple container Box

public class NewJFrame extends javax.swing.JFrame

{ public static void main(String[] args) {

NewJFrame inst = new NewJFrame(); inst.setVisible(true);

}

public NewJFrame()

{ super(); initGUI();

}

private void initGUI()

{ try {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); pack(); setSize(400, 300);

Container box = Box.createHorizontalBox () ; (new JButton ("bouton1")) ; (Box.createHorizontalGlue()) ; (new JButton ("bouton2")) ; (Box.createHorizontalStrut(50)) ; (new JButton ("bouton3"))  ; this.getContentPane().add("Center",box) ;

} catch (Exception e) { }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 262 -

Le modèle MVC

l Swing est bâti sur une architecture Model/View/Controller:

•    Model: contient les données et fournit pour y accéder en consultation et modification.

•    View: représentation graphique des données et réception d'événements

•    Controler: gestion des événements

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 263 -

Le modèle MVC

l  Les composants Swing vont souvent proposer des interfaces spécifiques pour stocker les données.

Exemples:

•    JList propose ListModel

•    JTextComponent et ses sous-classes proposent Document

•    JTree propose TreeModel

•    JTable propose TableModel

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 264 -

Exemple de modèle avec JTable

tutorial à l'adresse: #data

                                   Vue et contrôleur                                                         Modèle

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 265 -

Exemple de TableModel

package testswing;

public class Employe

{

private String nom ; private float salaire ; private boolean marital ;

public Employe(String nom, float salaire,boolean marital) { super(); = nom; this.salaire = salaire; this.marital = marital ;

}

public boolean getMarital() { return marital; }

public void setMarital(boolean marital) { this.marital = marital; } public String getNom() { return nom; } public void setNom(String nom) { = nom;}

public float getSalaire() { return salaire;}

public void setSalaire(float salaire) { this.salaire = salaire; } }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 266 -

Exemple de TableModel

package testswing; import .ArrayList;

import javax.swing.table.AbstractTableModel; public class TableauModel extends AbstractTableModel {

ArrayList donnees ;

String [] ColumnNames = { "Nom Employe", "Salaire", "Etat Marital" } ; Class ColumnTypes [] = { String.class, Float.class, Boolean.class } ; public TableauModel () { donnees = new ArrayList () ; initialiser () ; } private void initialiser (){ (new Employe ("Dupont Marcel",1500.0f,true)) ; (new Employe ("Durand Pascal",2000.0f,false)) ;

}

public int getColumnCount()  { return ColumnNames.length; } public int getRowCount() { return () ; } public String getColumnName (int col) { return ColumnNames [col] ; } public Class getColumnClass (int col)  { return ColumnTypes [col] ; } public Object getValueAt(int row, int col) { switch (col)

{

case 0: return (row) .getNom() ; case 1: return (row) .getSalaire () ;

case 2: return (row).getMarital () ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 267 -

Exemple de TableModel

l Inclusion de la JTable dans une JFrame (extrait):

private void initGUI() { try {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(null);

{

TableauModel jTable1Model = new TableauModel () ; jTable1 = new JTable(jTable1Model); jTable1.setBounds(63, 14, 245, 161); jTable1.setPreferredSize(new .Dimension(252, 105)); JScrollPane scrollpane = new JScrollPane (jTable1) ; getContentPane().add(scrollpane); scrollpane.setBounds(0, 0, 329, 182);

}

pack();

this.setSize(351, 240);

} catch (Exception e) {

e.printStackTrace();

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 268 -

TableModel: modification à partir de la vue

l Modification de la classe TableauModel pour rendre la colonne

"Etat Marital" modifiable et répercuter la valeur saisie à l'objet Employe:

public boolean isCellEditable (int row, int col)

{ if (col == 2) return true ; return false ;

}

public void setValueAt (Object value, int row, int col)

{

if (col == 2) (row).setMarital( (Boolean) value) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 269 -

TableModel: Actualisation de la vue à partir d'une modification externe

l  Un objet TableModel peut avoir des listeners implémentant TableModelListener.

l  L'interface TableModelListener possède les méthodes suivantes:

fireTableCellUpdated

Mise à jour de la cellule spécifiée

fireTableRowsUpdates

Mise à jour de la ligne spécifiée

fireTableDataChanged

Mise à jour de la table complète

fireTableRowsInserted

Nouvelles lignes insérées

fireTableRowsDeleted

Lignes existantes supprimées

fireTableStructureChanged

Invalide la table entière (données et structures)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 270 -

Modification de la classe

TableauModel

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 271 -

Gestion d'une modification externe

package testswing;

import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel;

public class RAZEtatMarital implements TableModelListener

{

public void tableChanged(TableModelEvent evt) { int row = evt.getFirstRow() ; int col = evt.getColumn() ;

TableModel model = (TableModel) evt.getSource() ; model.setValueAt(false, row, col) ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 272 -

Personnaliser l'apparence avec les "renderers"

l  Les vues permettent de dessiner des données.

l  Exemple précédent:

Case à cocher String

l  Pour des raisons de performances on n'alloue pas n composants graphiques pour un tableau de n cellules.

l  Le tableau va consulter un renderer pour savoir comment dessiner la cellule (i,j).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 273 -

Les renderers par défaut

l  Les composants complexes JList, JTable, JTree possèdent un renderer par défaut:

•  JList: DefaultListCellRenderer (implémentant ListCellRenderer)

•  JTable: DefaultTableCellRenderer (implémentant TableCellRenderer)

•  JTree: DefaultTreeCellRenderer (implémentant TreeCellRenderer).

l  Les principaux types ont un renderer par défaut:

Boolean

JCheckBox

Number

JLabel justifié à droite (ou JTextField si la cellule est éditable)

Double, Float

Comme Number avec vérification du format

Date

JLabel avec vérification du format

ImageIcon, Icon

JLabel centré

Object

JLabel affichant la chaîne de caractères représentant l'objet

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 274 -

Définition d'un renderer personnalisé

l Sur la 1ère colonne du tableau, on souhaite n'afficher que le nom de famille en majuscule, le nom complet dans une infobulle et des caractères rouge quand la cellule est sélectionnée.   

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 275 -

Définition d'un renderer personnalisé

package testswing; import .* ; import .StringTokenizer; import javax.swing.*;

import javax.swing.table.TableCellRenderer;

public class NomRenderer extends JLabel implements TableCellRenderer

{

public NomRenderer () { super () ; setOpaque (true) ; }

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)

{

if (isSelected) { setBackground (SystemColor.textHighlight) ; setForeground () ; }

else { setBackground (Color.white) ; setForeground (Color.black) ; }

String nom = (String) value ;

StringTokenizer st = new StringTokenizer (nom," ") ; this.setText(st.nextToken ().toUpperCase()) ; this.setToolTipText(nom) ;

return this;

}

}

Application du renderer à l'objet JTable:

TableColumn col0 = jTable1.getColumnModel().getColumn(0) ; col0.setCellRenderer(new NomRenderer ()) ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 276 -

Swing et Threads

l Une application/applet java utilisant des interfaces graphiques met en œuvre plusieurs threads:

•    Thread initial (Initial thread) en charge de la construction de l'interface.

•    Thread de travail (worker thread) tournant en arrière plan pour la récupération de la mémoire (garbage collector).

•    Thread de gestion d'événements et de réaffichage des composants (event dispatch thread).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 277 -

Swing et threads

l  Un composant swing peut être manipulé par n'importe quel thread tant qu'il n'a pas été réalisé (pack ou setVisible (true)).

l  Ensuite toutes les modifications doivent être effectuées par le thread de gestion d'événements (la plupart des méthodes de swing ne sont pas "thread safe").

l  Problèmes:

•    Une application peut être nativement multithread. Comment un thread peut modifier un composant swing ?

•    Si un événement déclenche un traitement très long, il faut le déporter dans un thread pour ne pas geler l'interface; ce thread peut ensuite avoir besoin de modifier un composant swing.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 278 -

Swing et threads

l La classe javax.swing.SwingUtilities propose des méthodes statiques permettant d'exécuter du code dans le thread de gestion d'événement:

•   invokeLater (Runnable)

•   invokeAndWait (Runnable)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 279 -

Exemple Swing et threads

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 280 -

Exemple Swing et threads

l On modifie l'événement du bouton "jBloque":

jBloque.addActionListener(new ActionListener()  {

}

} ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 281 -

La classe SwingWorker

l La version 6 de Java propose la classe abstraite SwingWorker proposant 2 types paramétrés pour faciliter l'écriture des applications swing multithread. Quelques méthodes intéressantes:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 282 -

Utilisation de SwingWorker

class MySwingWorker extends SwingWorker <Void,Void>

{

@Override

protected Void doInBackground() throws Exception

{

jBloque.setText("en cours") ;

try { Thread.sleep (3000) ; } catch (Exception e) {} jBloque.setText("bloque") ;

return null ;

}

}

jBloque.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

new MySwingWorker ().execute() ;

}

});

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 283 -

Java et la sécurité

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 284 -

Java et la sécurité

•  La sécurité a toujours été présente dans la conception de Java.

•  Quelques points de sécurité à prendre en compte:

1)  Se prémunir des programmes malveillants (virus, chevaux de troie)

2)  Pas d'intrusion (pas d'accès à des informations privées)

3)  Authentification des parties en cours

4)  Cryptage

5)  Audit

6)  

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 285 -

Java et la sécurité

Les points 1 et 2 sont pris en compte dès la norme 1.0 de Java

Le point 3 a été pris en compte par la norme 1.1

Le point 4 a été pris en compte par la norme 1.2

Le point 5 peut être pris en compte dans la norme 1.2 par ajout d'un module

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 286 -

La "sandbox" java

•  La sécurité java est axée autour d'une "sandbox" qui va établir le contour de l'environnement auquel peut accéder l'application.

•  La notion de sécurité dans les applications et les applets est très différente:

Une application peut définir sa politique de sécurité

Une applet est tributaire de la politique de sécurité définie par le navigateur qui l'a chargée.

•  Une "sandbox" peut être le CPU et la mémoire centrale de la machine cliente et le serveur web de téléchargement de l'applet.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 287 -

La sécurité des applets java

Les applets sont soumises à de nombreuses restrictions:

Pas d'accès au disque dur local de l'utilisateur.Pas de connexion sur une machine autre que le serveur WWW d'origine de l'applet.

Pas         de        lancement     de        programme   sur      la         machine         de l'utilisateur.

Pas de chargement de programmes stockés sur la machine de l'utilisateur (exécutable, bibliothèque partagée).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 288 -

java 1.0

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 289 -

java 1.1

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 290 -

java 1.2

code local ou distant, signé ou non signé

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 291 -

Résumé des différents modèles

l  java 1.0: sandbox très restrictive.

l  java 1.1: principe du tout ou rien selon que la signature électronique est utilisée ou non.

l  java 1.2: principe du moindre privilège. Une stratégie de sécurité pourra être appliquée à une application ou à une applet en fonction de son origine, de l'identité du tiers certificateur.

•    Exemple:

•    Accorder à toutes les applets de la permission de lire les fichiers du répertoire c:\temp.

•    Accorder à toutes les applets la permission de se connecter sur n'importe quelle machine.

•    etc.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 292 -

Quelques types de permissions

(read,write,delete,execute)   (accept,connect,listen,resolve)     (accessClipboard, …)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 293 -

Spécification de la stratégie de

sécurité

l  Créer ou modifier le fichier de stratégie système <>\lib\security\java.policy.

l  Donner à la propriété système java.policy le nom d'un autre fichier de stratégie de sécurité.

l  Créer ou modifier le fichier de stratégie utilisateur dans <>\java.policy.

l  Définir une autre valeur pour la propriété java.policy en utilisant l'option -D de la ligne de commande:

java -Djava.policy="test.policy" Test

l  Changer la classe utilisée dans le fichier <>\lib\security\java.security en changeant la ligne policy.provider=java.security.PolicyFile en policy.provider=AutreClasse.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 294 -

Contenu du fichier de stratégie

de sécurité

grant [SignedBy "nom_signataires] [, CodeBase "URL] { rubriques permissions

} ;

Exemple:

grant SignedBy "Jean,Fred", CodeBase

{

permission .permission "c:\\temp\\*", "read" ;

} ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 295 -

Exemple d'applet

package ecritfichier; import java.applet.Applet; import .* ;

public class EcritFichier extends Applet

{ public void init ()

{ try {

FileWriter fichier = new FileWriter ("c:\\temp\\") ; BufferedWriter buffer = new BufferedWriter (fichier) ;

fichier.write("test ecriture") ;

fichier.flush() ; fichier.close () ;

} catch (IOException e)  { .println ("Erreur fichier: " + e.getMessage () ) ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 296 -

Exécution de l'applet

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 297 -

Création d'une stratégie de sécurité

l  Création du fichier jar:

jar cvf ecritfichier\*.class

l  Dans <>\lib\security\java.security, ajout de la ligne: .3=file:${}/lib/security/ecritfichier.policy

l  Création du fichier <>\lib\security\ecritfichier.policy, soit manuellement, soit avec l'outil policytool de la jdk:

/* AUTOMATICALLY GENERATED ON Mon Apr 04 16:52:09 CEST 2005*/

/* DO NOT EDIT */

grant { permission .FilePermission "c:\\temp\\*", "write";

};

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 298 -

Signature de l'applet

l  Génération d'une paire de clés:

keytool -genkey -alias TestCle -keystore trousseau

l  Signature de l'applet:

•  Signature de la clé publique par un tiers certificateur (moyennant finance), par exemple:

Verisign           

Thawte              

On extrait le certificat qui pourra être authentifié:

keytool -export -keystore trousseau -alias TestCle -file

•  Auto signature du fichier jar à des fins de test: jarsigner -keystore trousseau TestCle

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 299 -

Exécution de l'applet signée

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 300 -

Obfuscation de code

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 301 -

Obfuscation de code

l  Après compilation d'un fichier source java, beaucoup d'informations sont stockées dans les fichier de bytecode.

l  La décompilation permet de récupérer le code source intégralement (sans les commentaires ;)

l  Il est donc nécessaire de brouiller le code avant diffusion de celui-ci. l Des exemples de décompilateurs:

•    Historiquement, mocha en 1996 par Hanpeter Van Vliet

•    JAD:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 302 -

Exemple code source Java

/**

*    Classe Thermometre:

*    - Affiche la temperature a chaque mofigication de la temperature

*    - Implemente l'interface TempChangeListener pour s'abonner aupres des objets Temperature

*/

public class Thermometre implements TempChangeListener

{

public Thermometre ()

{

/**

*    Constructeur:

*    - Creation d'un objet temperature

*    - Enregistrement de l'ecouteur d'evenement

*    - Lancement du thread pour test

*/

Temperature Temp = new Temperature () ; Temp.addTempChangeListener (this);  Temp.start () ;  // On lance le Thread de Temperature

}

/**

*    Methode appelee a chaque modification de la temperature

*/

public void tempChange (TempChangeEvent evt) {  .println (evt.getTemperature()) ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 303 -

Code après décompilation

public class Thermometre

implements TempChangeListener

{

public Thermometre()

{

Temperature Temp = new Temperature();

Temp.addTempChangeListener(this); Temp.start(); }

public void tempChange(TempChangeEvent evt)

{

.println(evt.getTemperature());

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 304 -

Des exemples d'obfuscateur

l  Zelix Class Master:

•    Obfuscation des noms et du code.

•    Cryptage des chaînes.

•    Suppression des classes, méthodes, données non utilisées.

•    Interface graphique et langage de script

l  ProGuard:

l  yGuard:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 305 -

Classe après obfuscation (zkm)

public class b

implements a

{

public b()

{ int i = c.c; super(); c c1 = new c(); c1.a(this); c1.start(); if(d.b != 0)

c.c = ++i; }

public void a(d d1)

{

.println(d1.a());

}

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 306 -

Programmation réseau

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 307 -

Modèle Client/Serveur en mode connecté

Serveur

-Création d’un objet ServerSocket pour l’ouverture du service -Attente d’une demande de connexion (méthode accept () qui retourne une socket de service) -Facultativement: création d’un thread pour gérer les échanges avec le client -Echange d’informations avec le client (InputStream,OutputStream) avec le client.

-Fermeture socket (méthode close()).

Client

-Création d’un objet Socket.

-Connexion sur le serveur.

-Echange d’informations avec le serveur (InputStream, OutputStream)

-Fermeture socket (méthode close ()).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 308 -

Les sockets en mode connecté côté client

•     Utilisation de la classe .Socket.

•     Quelques constructeurs:

•     public Socket (String host, int port) throws UnknownHostException, IOException ;

•     public Socket (InetAddress address, int port) throws IOException ;

•     host :        Nom du serveur

•     port :        Numéro de port

•     address : Classe contenant l'adresse IP • Quelques méthodes:

•     public void close();

•     public InetAddress getInetAddress();

•     public InputStream getInputStream();

•     public int getLocalPort();

•     public OutputStream getOutputStream();

•     public int getPort();

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 309 -

Exemple de client en mode connecté

package socket; import .* ; import .* ;

public class Heure

{ public static void main (String args [])

{

Socket s = null;    PrintStream flux = null; try {

s = new Socket ("",2000) ;

flux = new PrintStream (s.getOutputStream (),true) ;  flux.println ("heure") ;

BufferedReader reponse = new BufferedReader (new InputStreamReader (s.getInputStream ())); .println (reponse.readLine ()) ;

} catch (IOException e)

{

.println (""Erreur: " + e.getMessage ()) ; (1) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 310 -

Les sockets en mode connecté côté serveur

•  Utilisation la classe .ServerSocket.Quelques constructeurs:

•  public ServerSocket (int port) throws IOException ;

•  public ServerSocket (int port, int count) throws IOException ;

•  port :    port d’écoute

•  count : taille de la file d'attente (50 par défaut)

•  Quelques méthodes:

public Socket accept() ;public void close() ;

public InetAddress getInetAddress() ;

public int getLocalPort() ;

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 311 -

Exemple de serveur en mode connecté 1/2

package socket;

import .* ; import .* ; import ;

public class ServeurHeure

{ public static void main (String args [])

{

ServerSocket s = null; PrintStream flux = null;

try { s = new ServerSocket (2000) ;

} catch (IOException e)

{

.println ("Erreur socket " + e) ; (1) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 312 -

Exemple de serveur en mode connecté 2/2

while (true)

{ try {

Socket service = s.accept () ;

BufferedReader requete = new BufferedReader (new InputStreamReader (service.getInputStream ()));

if (requete.readLine ().equals ("heure"))

{

Date date = new Date () ;

flux = new PrintStream (service.getOutputStream (),true) ; flux.println (date) ;

}

} catch (IOException e) { .println (e.getMessage()); (1) ; }

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 313 -

Les sockets en mode non connecté

l  Utilisation de la classe .DatagramSocket l Les constructeurs:

•  public DatagramSocket () ;

•  public DatagramSocket (int port) ;

•  public DatagramSocket (int port, InetAddr laddr) ;

l  Quelques méthodes:

•  public void receive (DatagramPacket p) ;

•  public void send (DatagramPacket p) ;

l  La classe .DatagramPacket contient les données reçues ou à envoyer (tableau de bytes) et l'adresse (.InetAddress) de l'expéditeur ou du destinataire.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 314 -

Exemple de client en mode non connecté 1/2

public class HeureUDP {

static public void main (String args [])

{ final int port = 2000 ;

DatagramSocket socket = null ; DatagramPacket PacketRequest,PacketResponse ;

InetAddress address = null ; byte [] reponse = new byte [30] ; String requete = "heure";

try {

socket = new DatagramSocket () ;

} catch (SocketException e)

{

.println ("Erreur socket " + e) ;

(1) ;

} try {

address = InetAddress.getByName ("localhost") ;

} catch (IOException e)

{

.println ("serveur inconnu") ; (1) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 315 -

Exemple de client en mode non connecté 2/2

PacketRequest = new DatagramPacket (requete.getBytes(),requete.length(),address,port);

PacketResponse = new DatagramPacket (reponse,reponse.length) ; try {

(PacketRequest) ; socket.receive(PacketResponse);

.println ( new String (PacketResponse.getData())) ;

} catch (IOException e)

{

.println ("Erreur  de lecture ou d'ecriture " + e) ; (1) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 316 -

Exemple de serveur en mode non connecté 1/2

package socket;

import .* ; import .* ; import ; public class ServeurHeureUDP {

public static void main (String args [])

{

DatagramSocket socket = null ; byte buffer [] = new byte [30] ;

DatagramPacket packet = new DatagramPacket (buffer,buffer.length) ; try {

socket = new DatagramSocket (2000) ;

} catch (SocketException e)

{

.println ("Erreur socket " + e.getMessage ()) ; (1) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 317 -

Exemple de serveur en mode non connecté 2/2

while (true)

{ try {

socket.receive(packet);

String requete = new String (packet.getData()); requete = requete.substring (0,packet.getLength()) ; if ( requete.equalsIgnoreCase("heure") == true)

{

String date = (new Date ()).toString() ;

packet.setData (date.getBytes()); packet.setLength(date.length()); (packet) ;

}

} catch (IOException e)

{

.println ("Erreur reception " + e) ; (1) ;

}

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 318 -

Une classe évoluée:

Quelques Constructeurs:

•   public URL (String spec) ;

•   public URL (String protocol, String host, int port, String file) ;specProtocole + Nom machine + Nom fichier protocol http,ftp,gopher,file host Nom de la machine distante port Port de communication file Nom complet du document

Quelques méthodes:

•   public InputStream openStream () ;

•   public URLConnection openConnection () ; .URLConnection est une classe abstraite qui est utilisée comme classe de base de .HttpURLConnection

Remarque:Les méthodes getCodeBase () et  getDocumentBase () de la classe java.applet.Applet retournent des objets .

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 319 -

Exemple d'utilisation de la classe URL

import .* ; import .* ;

public class LireURL

{ static public void main (String args [])

{ try {

URL url = new URL ("") ;

InputStream is = url.openStream () ;

InputStreamReader ir = new InputStreamReader (is) ; BufferedReader br = new BufferedReader (ir) ; while (br.ready () == true)

.println (br.readLine ()) ; br.close () ; ir.close () ; is.close () ;

} catch (Exception e)

{

.println ("Erreur " + e) ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 320 -

Flux mis en œuvre dans l'exemple

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 321 -

Extrait de l'exécution de l'application "LireURL"

D:\travail>java LireURL

content="Sommaire: ENSICAEN, Ecole Nationale Superieure d'Ingenieurs de Caen et Centre de Recherche">

ENSICAEN

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 322 -

Remote Method Invocation

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 323 -

Généralités

l  Les approches traditionnelles pour développer des applications réseaux à base de sockets sont lourdes.

l  Les RMI vont permettre de distribuer une application sur plusieurs machines.

l  Une application fera appel à des méthodes sur des objets localisés sur des machines distantes.

l  RMI se charge de faire transiter les paramètres et la valeur de retour.

l  Les communications pourront être sécurisées grâce à un objet RMISecurityManager.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 324 -

Architecture

Architecture RMI

Architecture locale

Application (client)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 325 -

Architecture RMI

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 326 -

Stub

l  Classe spéciale générée par la commande rmic.

l  Transforme un appel de méthode en une suite d'octets à envoyer sur le réseau (marshaling).

l  Reconstruit le résultat reçu sous le même format

(unmarshaling) l Format d'un appel de méthode:

•    identificateur de l'objet distant

•    identificateur de la méthode

•    paramètres sérialisés

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 327 -

Skeleton

l  Classe spéciale générée par la commande rmic

(cette classe n'est plus générée depuis la version 1.2 du protocole).

l  Reçoit la demande d'invocation distante.

l  Reconstruit les paramètres.

l  Trouve l'objet distant et appelle la méthode.

l  Retourne le résultat.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 328 -

Propriétés d'un objet distant

l  Un objet distant se manipule comme un objet local.

l  L'invocation d'une méthode distante est identique à l'invocation d'une méthode locale.

l  Les paramètres d'un appel distant et le résultat renvoyé sont transmis:

•    par valeur pour les types scalaires

•    par recopie sous format sérialisés pour les objets

l  Si le fichier .class correspondant à un type de paramètre ou de la valeur de retour n'est pas disponible localement, il est chargé dynamiquement (RMIClassLoader).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 329 -

Chargement dynamique des classes

l  Si le client est une applet, toutes les classes apparaissant dans le code du client sont chargées depuis le codebase spécifié par la propriété .server.codebase.

l  Si le client est une application, les classes seront recherchées:

•    dans le CLASSPATH

•    à l'URL spécifiée par .server.codebase

l  Une classe peut être chargée explicitement:

•    class c = RMIClassLoader.loadClass (http://xxxxx,"nom_classe) ;

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 330 -

Interface.Remote

l  L’interface distante doit être publique et hériter de .Remote

l  Chaque méthode de l’interface distante  doit déclarer .RemoteException dans sa clause throws.

l  Un objet distant passé en argument ou en valeur de retour doit être déclaré en tant qu’interface distante.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 331 -

Interface .Remote

l  Définition d’une interface déclarant les méthodes distantes exposées:

import .* ;

public interface Hello extends Remote

{

public String envoieHello () throws RemoteException;

}

l  L’interface étendant l’interface .Remote permet de marquer les méthodes distantes mises à disposition du client.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 332 -

l  Le serveur doit contenir une classe qui étende .server.UnicastRemoteObject (qui utilise les classes Socket et ServerSocket) et qui implémente l’interface précédente.

l  Le constructeur de cet objet distant doit être défini explicitement (il doit émettre .RemoteException).

l  Une ou plusieurs instances de l’objet distant doivent être créés.

l  Les instances créées doivent être enregistrées auprès du registre d’objets distants.

l  La classe .Naming permet d’archiver, de lister, et de récupérer des objets auprès d’un registre. Lorsque qu’un client transmet une URL « rmi://domaine/ObjetDistant », une référence est transmise en retour (en fait une référence sur une portion de code local capable de communiquer à travers le réseau).

l  Création des « stubs » et « skeletons » .

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 333 -

l  Définition d’une classe implémentant cette interface:

import .server.* ; import .* ; import .* ;

public class serHello extends UnicastRemoteObject implements Hello

{

public serHello () throws RemoteException { super () ; } public String envoieHello () throws RemoteException { return "Hello World" ; }

public static void main (String args [])

{

System.setSecurityManager(new RMISecurityManager ()) ; try { serHello h = new serHello () ;

Naming.rebind (“bonjour",h) ;

.println ("Serveur pret") ;

} catch (RemoteException e) { .println ("RemoteException "+e) ; } catch (MalformedURLException e) { .println ("Malformed "+e) ;}

}

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 334 -

l   Compilation:

javac l  Génération du stub et du squelette: rmic serHello

l   Fichiers générés:

                         Hello.class                       serHello.class [serHello_Skel.class]   serHello_Stub.class

l   Lancement du registre Naming (port par défaut: 1099): start rmiregistry       (windows)

rmiregistry & (unix)

Par programme: LocateRegistry.createRegistry (port)

l   Lancement de l’application:

java -Djava.security.policy=java.policy serHello

l   Fichier java.policy:

grant {

permission .SocketPermission "*:1024-65535", "accept, listen, connect, resolve";

} ;

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 335 -

RMI côté client

l  Le programme client doit rechercher et rapatrier l’interface distante.

l  Les méthodes distantes peuvent ensuite être exécutées.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 336 -

RMI côté client

import .* ;

public class cliHello

{ public static void main (String args [])

{

System.setSecurityManager(new RMISecurityManager ()) ; try {

Hello h = (Hello) Naming.lookup (“;) ; String message = h.envoieHello () ;

.println ("recu : " + message) ;

} catch (Exception e)

{

.println ("Exception : " + e) ; }

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 337 -

Interaction client/serveur

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 338 -

ANT

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 339 -

ANT

l  Projet du groupe Apache-Jakarta pour permettre la construction d'applications (compilation, déploiement, …).

l  Site officiel:

l  Ant s'inspire des Makefile d'unix mais est multi plateforme et ne propose pas le "syndrome de la tabulation" en utilisant des fichiers de configuration au format XML.

l  Exécution de ant:

ant [-buildfile ]  [cible]

l  Variables d'environnement nécessaires à l'exécution de ant:

ANT_HOME                             JAVA_HOME                        PATH

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 340 -

Ant: fichier de configuration

l  Le fichier de configuration propose un ensemble de cibles.

l  Une cible contient une ou plusieurs tâches à exécuter.

l  Les cibles peuvent être dépendantes entre elles.    

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 341 -

ANT: fichier de configuration

l  Le fichier de configuration commence par le préfixe:

test ant

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 349 -

Interaction

Java/bases de données

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                     - 350 -

JDBC: Java DataBase Connectivity

l  C’est une API java qui permet aux applications java de communiquer avec les gestionnaires de base de données dans un langage universel (comparable à ODBC).

l  Les applications peuvent ainsi être indépendantes de la base de données utilisées.

l  Un pilote JDBC permet:

•    Etablir une connexion avec une base de données.

•    Envoyer des requêtes SQL.

•    Traiter les résultats.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 351 -

Architecture d’utilisation

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 352 -

Le package

l Les interfaces

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 353 -

Le package

l Les classes

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 354 -

Pilotes JDBC

l  Il est nécessaire de disposer du pilote JDBC pour interagir avec la base de données.

l  Un pilote JDBC peut être commercial (exemple: Oracle) ou gratuit.

l  Une liste de pilotes est disponible à l’adresse:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 355 -

Pilotes JDBC

l Il existe 4 types de pilote JDBC:

type 1

Pilotes accédant aux bases de données grâce à une technologie de ponts. Exemple: le pont ODBC. Cela requiert en général d’installer du code natif sur le poste client.

type 2

Le code Java appellent les méthodes C/C++ natives livrées par les éditeurs de base de données. Cela requiert d’installer du code natif sur le poste client.

type 3

Ces pilotes fournissent au client une API générique. Le pilote JDBC sur le client communique au moyen de sockets avec une application intermédiaire sur le serveur qui convertit les requêtes du client en appel API spécifique du pilote souhaité.

type 4

Via des sockets java, ces pilotes interagissent directement avec le gestionnaire de la base de données.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 356 -

Connexion à la base de données

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 357 -

Classes de connexion

.Driver

Interface devant être implémentée par les classes de chargement des pilotes JDBC.

.DriverManager

Un objet DriverManager va tenter de localiser le pilote JDBC et charger les classes correspondantes.

.Connection

Un objet Connection représente le lien entre l’application et la base de données. Toutes les requêtes SQL transmises et le retour des résultats s’effectueront à travers cet objet.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 358 -

Exemple de connexion

private Connection Conn ;

try {

Class.forName(".mysql.Driver").newInstance();

}

catch (Exception e)

{

.println(" Probleme avec le driver JDBC: "  + e); return ; }

try {

Conn = DriverManager.getConnection(";,,) ;

}

catch (SQLException e)

{

.println("Probleme ouverture: "  + e) ; return ; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 359 -

Classes d’accès à la base de données

.Statement

Classe à utiliser pour les requêtes SQL élémentaires. Quelques méthodes:

public ResultSet executeQuery (String sql) throws SQLException public int executeUpdate (String sql) throws SQLException public boolean execute(String sql) throws SQLException

.ResultSet

Une instance de cette classe contient une rangée de données extraite de la base par une requête SQL et offre plusieurs méthodes chargées d’en isoler les colonnes. La notation suivante est utilisée: get (int | String)

Exemple: String getString (« title »)

A un instant donné, un objet ResultSet ne peut contenir plus d’une rangée mais propose une méthode next() permettant de référencer la rangée suivante.

.PreparedStatement

Cette classe est utilisée pour pouvoir envoyer au gestionnaire de base de données une requête SQL pour interprétation mais non pour exécution. Cette requête peut contenir des paramètres qui seront renseignés ultérieurement.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 360 -

Exemple de code

Statement stmt = conn.createStatement () ;

ResultSet rs = stmt.executeQuery (« SELECT a,b,c FROM Table1 ») ;

while ( ())

{ int x = rs.getInt ("a") ; String s = rs.getString ("b") ; float f = rs.getFloat ("c") ; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 361 -

Exemple de code

PreparedStatement inst = con.preparedStatement ("UPDATE comptes SET solde = ? Where id = ?") ;

for (int i = 0 ; i < comptes.length ; i++)

{ inst.setFloat (1,comptes [i].extraitSolde ()) ; inst.setFloat (2,comptes [i].extraitIdf ()) ;

inst.execute ()

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 362 -

Aspect transactionnel

l  Par défaut, les opérations sur la base de données sont en mode auto-commit. Dans ce mode, chaque opération est validée unitairement pour former la transaction.

l  Pour rassembler plusieurs opérations en une seule transaction:

•    connection.setAutoCommit(false);

•    connection.commit () ;

l  Retour en arrière:

•    connection.rollback ();

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 363 -

JavaBeans

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 364 -

Programmation Traditionnelle

l  Limites:

•    Tout est à la charge du programmeur

•    Peu d’abstraction pour limiter la complexité

•    Maintenance et évolution difficiles

l  Conséquences:

•    Besoins de compétences techniques

•    Fiabilité incertaine

•    Accroissement du temps de développement et de maintenance

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 365 -

Programmation par objet

l  La programmation par objet améliore la situation:

•    Modules réutilisables

•    Les constituants sont représentés en classes

•    Héritage entre classes

l  Certaines limites demeurent:

•    La réutilisation des modules demandent des connaissances techniques

•    Le code explicite les interconnexions entre modules - Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp - 366 -

Programmation par composant

l  Un composant est une pièce logicielle autonome.

l  Une application pourra être conçue par assemblage de composants.

l  Une application pourra être construite par des non-informaticiens.

l  Évolution plus rapide des applications.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 367 -

Programmation par composant

l  Son implémentation n’est pas requise (boîte noire).

l  Il exporte les interfaces fournies et requises.

l  Interconnectable avec d’autres composants (inconnus à priori).

l  Configurable, diffusable.

l  Autodescriptif.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 368 -

Le modèle JavaBean

l  Un JavaBean est un modèle de composants logiciels pour plate-formes JAVA.

l  Un Javabean est réutilisable et peut être manipulé visuellement par un outil de construction de programmes.

l  Un JavaBean est simple à créer et à utiliser.

l  Un JavaBean est portable sur toute plateforme supportant l’environnement JAVA.

l  Ce modèle est disponible depuis la JDK 1.1

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 369 -

Type de beans

l  Bean Visuel • Boutons, icônes, …

l  Bean non visuel

•   Accès à une base de données, …

l  Bean composite

•   Grapheur, feuille de calcul …

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 370 -

Caractéristiques d'un bean

l  Un bean est caractérisé par:

•   Ses propriétés

•   Les méthodes exportées

•   Les événements qu’il peut émettre et recevoir

l  Un bean peut être connecté à d’autres beans

l  La communication entre beans repose sur le modèle événement/action

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 371 -

Caractéristiques d'un bean

l Un bean doit être:

•   Introspectable

•   Sérialisable (persistance)

•   Distribuable • Editable visuellement l Un bean doit:

•   Respecter les règles de sécurité

•   S’adapter au multithreading

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 372 -

Exemple: la beanbox

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 373 -

Descriptif d’un bean

l  Un bean doit au minimum implémenter:

•   Une classe java respectant quelques conventions d’écriture.

•   Éventuellement une classe sans convention d’écriture mais implémentant l’interface java.beans.BeanInfo

l  Un bean visuel doit hériter de .Component (ou une sous classe).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 374 -

Exemple de bean (1/2)

import .*; import .*; import java.beans.*;

public class CounterBean extends Canvas implements Serializable

{ protected boolean stopped; protected int value; public CounterBean()

{ stopped = true; setSize(60,40); setBackground(Color.white);

} public int value() { return value; } public void reset() { value = 0; } public void start() { stopped = false ; } public void stop() {stopped = true; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 375 -

Exemple de bean (2/2)

public void step() { if (stopped == false) { value++;

repaint () ;

}

}

public void paint(Graphics g) {

FontMetrics fm; Dimension dim;

int strWidth, strAscent, centerBoxX, centerBoxY; String str = Integer.toString(value); dim = getSize(); fm = g.getFontMetrics();

strWidth = fm.stringWidth(str);strAscent = fm.getAscent(); centerBoxX = dim.width/2 - strWidth/2; centerBoxY = dim.height/2 + strAscent/2;

g.drawString(str, centerBoxX, centerBoxY);

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 376 -

Empaquetage des beans

l  Un bean peut être constitué de plusieurs fichiers:

•    Fichiers .class (classe du bean, classe beaninfo, …)

•    Fichiers d’aide en html

•    Fichiers de ressources (icônes, sons, images, …)

•    …

l  Les beans sont distribués sous forme d’archives java.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 377 -

Archive java

l  Une archive java est fichier .jar au format Zip contenant des fichiers compressés de natures diverses et un fichier . l Caractéristiques des archives java:

•    Multi-plateforme

•    Auto-descriptif

•    Sécurité et authentification

•    Téléchargeable par navigateur

l  Il existe des API pour gérer des fichiers archives java

(depuis la version 1.1)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 378 -

Le fichier

l  Le fichier est constitué:

•    D’un numéro de version

•    D’une liste d’informations pour chaque version respectant la structure suivante:

Name : Nom_Fichier

Attribut1 : valeur1

Attribut2 : valeur2

l  Le fichier est construit de façon automatique par l’outil d’archivage, éventuellement à partir d’un autre fichier renseignant des attributs spécifiques.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 379 -

Exemple de fichier

Manifest-Version: 1.0

Created-By: Signtool (signtool 1.1)

Comments: PLEASE DO NOT EDIT THIS FILE. YOU WILL BREAK IT.

Name: k.class

Digest-Algorithms: MD5 SHA1

MD5-Digest: Gqz1Sya8TSAtHZPTEJomXg==

SHA1-Digest: f6KORQq/qBWAoblMsRzJUgzs4Qo=

Name: b.class

Digest-Algorithms: MD5 SHA1

MD5-Digest: wB5eyVTEAbVXU1IRykAK9g==

SHA1-Digest: ydSJ2/aK8Oz0BZY1gTUy2D98trw=

Name: y.class

Digest-Algorithms: MD5 SHA1

MD5-Digest: VIlRykROkOnofxP5Hdgawg==

SHA1-Digest: gsFMaM16H/L0TmTCEp959N6ZVIQ=

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 380 -

Fichier & Beans

l 3 Attributs supplémentaires: • Java-Bean: attribut booléen permettant d’indiquer si la classe représente un bean. • Design-Time-Only: attribut booléen permettant d’indiquer si le fichier est seulement utile pour les environnements. • Depends-On: attribut permettant de spécifier une liste de fichiers associés avec un bean.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 381 -

Exemple: CounterBean

Fichier:

Manifest-Version: 1.0

Name: counterbean/CounterBean.class Java-Bean: True

Commande d’archivage:

jar cvfm counterbean/*.class

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 382 -

Manipulation de CounterBean

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 383 -

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 384 -

l  Possibilités offertes:

•    Un bean peut émettre plusieurs types d’événements différents.

•    Un bean récepteur peut s’abonner auprès de plusieurs beans.

•    Un bean peut être à la fois émetteur et récepteur d’événements.

l  Deux types de communications:

•    Unicast: un émetteur et un seul récepteur

•    Multicast: un émetteur et plusieurs récepteurs

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 385 -

l  Les événements émis par un bean sont définis par l’existence de méthodes d’abonnement/désabonnement respectant des conventions précises d’écriture.

l  Les événements sont représentés par des objets.

l  La notification d’un événement à un bean récepteur est réalisée par envoi de messages.

l  La signature de la méthode invoquée lorsqu’un événement survient est spécifiée par une interface Java que doivent implanter les beans intéressés.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 386 -

Mise en œuvre

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 387 -

Déclaration d’événements émis par un bean

l  La classe du bean doit comporter deux méthodes publiques pour l’abonnement et le désabonnement des autres beans.

l  La signature de ces deux méthodes doit respecter les conventions d’écritures suivantes:

•    Si E est un événement multicast:

•    void addEListener (EListener l)

•    void removeEListener (EListener l)

•    Si E est un événement monocast:

•    void addEListener (EListener l) throws .TooManyListenerException

•    void removeEListener (EListener l)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 388 -

Exemple sur CounterBean

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 389 -

Méthodes d’abonnement/désabonnement

private MaxCounterEventListener maxCounterListener ;

public void addMaxCounterEventListener (MaxCounterEventListener mcel) throws .TooManyListenersException

{

if (maxCounterListener != null)

throw new .TooManyListenersException ("Un listener est deja en place") ;

else

maxCounterListener = mcel ;



}

public void removeMaxCounterEventListener (MaxCounterEventListener mcel) throws IllegalArgumentException

{

if (maxCounterListener == null || maxCounterListener != mcel)

throw new IllegalArgumentException ("Le listener ne peut etre detruit") ;

else

maxCounterListener = null ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 390 -

Les événements

l  Un événement émis par un bean est représenté par un objet

l  Règles pour la définition d’une classe d’événement:

•   Le nom de la classe est suffixé par Event

•   La classe doit hériter de .EventObject

l  Dans le cas d’un bean visuel, les événements peuvent être ceux de l’awt.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                    - 391 -

Exemple d’événement

import .EventObject;

public class MaxCounterEvent extends EventObject

{

private int CurrentValue ;

public MaxCounterEvent(Object source,int cv)

{

super (source) ; CurrentValue = cv ; }

public int getValue ()

{

return CurrentValue ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 392 -

Notification de l’événement

public void step() {

if (stopped == false)

{

value++; if (value >= max) fireMaxCounterEvent () ; repaint () ;

}

}

private void fireMaxCounterEvent ()

{

if (maxCounterListener != null)

{

MaxCounterEvent evt = new MaxCounterEvent (this,value) ; maxCounterListener.maxReached (evt);

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 393 -

Interface de notification

l  Une interface de notification sert à spécifier la signature de la méthode invoquée par le bean émetteur lorsque l’événement se produit.

l  Règles pour la définition de l’interface:

•    Le nom de l’interface est composé du nom de l’événement suffixé par le mot Listener

•    L’interface doit hériter de .EventListener

•    L’événement correspondant peut être transmis en paramètre (pas obligatoire).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 394 -

Exemple d’interface

import .EventListener;

public interface MaxCounterEventListener extends EventListener

{

public void maxReached (MaxCounterEvent e) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 395 -

Bean récepteur

l Un bean intéressé par un type d’événement doit:

•   Implémenter l’interface de notification

•   S’enregistrer auprès du bean émetteur

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 396 -

Exemple de bean récepteur

import .* ; import .*;

public class AlertBean extends Label implements Serializable, MaxCounterEventListener

{

public AlertBean()

{

setBackground(Color.green); setText ("    OK     ") ;

}

public void maxReached (MaxCounterEvent evt)

{

setBackground () ;

setText ("Alerte " + evt.getValue()) ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 397 -

CounterBean

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 398 -

CounterBean

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 399 -

Interactions

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 400 -

Propriétés de beans

l  Les propriétés d’un bean sont des attributs

•    Affectant son comportement ou son apparence

•    Reconnus par les environnements d’assemblage visuel

•    Manipulables par programme en invoquant les méthodes

l  Les propriétés font généralement partie de l’état persistant d’un objet.

l  Une propriété est définie par l’existence de méthodes publiques respectant des conventions précises d’écriture.

l  3 modes d’accès possibles aux propriétés: lecture, écriture, lecture/écriture.

l  4 types de propriétés disponibles:

•    Propriétés scalaires, propriétés indexées

•    Propriétés liées, propriétés contraintes

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 401 -

Propriété scalaire

l  Une propriété scalaire représente une valeur simple d’un certain type.

l  Méthodes d’accès pour une propriété P de type T:

•   public T getP ( )    Lecture

•   public void setP (T valeur)  Ecriture

•   Si T est boolean, la méthode de lecture peut s’écrire:  public boolean isP ( )

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 402 -

Exemple CounterBean

private int max = 5 ;

public int getMax () { return max ; }

public void setMax (int m) { max = m ; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 403 -

Exemple CounterBean

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 404 -

Propriété indexée

l  Une propriété indexée représente un tableau de valeurs ayant le même type

l  Méthodes d’accès pour une propriété P de type T:

•   public T getP (int index)

•   public void setP (int index, T valeur)

•   public T [ ] getP ( )

•   public void setP (T [] valeurs)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 405 -

Propriété liée

l  Une propriété liée est une propriété d’un bean dont le changement de valeur est notifié par événement à des beans abonnés.

l  L’événement émis est PropertyChangeEvent

l  Un bean supportant des propriétés liées doit implanter les méthodes d’abonnement et de désabonnement:

•  void addPropertyChangeListener (PropertyChangeListener l)

•  void removePropertyChangeListener (PropertyChangeListener l)

l  Les beans notifiés doivent implanter l’interface suivante:

public interface PropertyChangeListener extends .EventListener

{ public void propertyChange (PropertyChangeEvent e)

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 406 -

Notification des changements

l  Lors du changement d’une propriété, les méthodes propertyChange des beans abonnés est invoquée avec en argument un objet PropertyChangeEvent.

l  Cet événement encapsule le nom de la propriété, l’ancienne et la nouvelle valeur.

public class PropertyChangeEvent extends EventObject

{ public PropertyChangeEvent(Object source, String propertyName,

Object oldValue, Object newValue)

public String getPropertyName(); public Object getNewValue();

public Object getOldValue();

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 407 -

Gestion de la notification

l  Au niveau du bean émetteur, la notification peut être déléguée à une instance de la classe PropertyChangeSupport. l Aspects gérés:

•    Méthodes d’abonnement/désabonnement

•    Création de l’événement et invocation des beans abonnés.

l  Aperçu de la classe:

public class PropertyChangeSupport extends Object implementsSerializable

{

public PropertyChangeSupport(Object sourceBean) ; public synchronized voidaddPropertyChangeListener(PropertyChangeListenerl); public synchronized voidremovePropertyChangeListener(PropertyChangeListener 1);

public void firePropertyChange(String propertyName, Object oldValuObject newValue);

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 408 -

Interactions

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 409 -

CounterBean

l  La propriété Max devient une propriété liée.

l  Si Max change, le compteur (variable value) revient à 0.

l  Dans cet exemple, le bean CounterBean est à la fois émetteur et récepteur.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 410 -

CounterBean

public class CounterBean extends Canvas implements Serializable,PropertyChangeListener private PropertyChangeSupport changes ; changes = new PropertyChangeSupport (this) ;  // dans constructeur

public void setMax (int m)

{

changes.firePropertyChange("Changement de Max",max,m); max = m ;

}

public void propertyChange (PropertyChangeEvent evt)

{

value = 0 ; repaint () ; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 411 -

Propriété contrainte

l  Une propriété contrainte est une propriété d’un bean dont le changement de valeur est soumis à d’autres beans abonnés ayant un droit de véto.

l  Le propriétaire doit déclencher un VetoableChangeEvent avant de modifier la propriété. Si aucun bean ne la rejette, la propriété peut être changée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 412 -

Propriété contrainte

l  Un bean supportant les propriétés contraintes doit implanter les méthodes d’abonnement/désabonnement:

•  void addVetoableChangeListener (VetoableChangeListener l)

•  void removeVetoableChangeListener (VetoableChangeListener l)

l  Les beans notifiés doivent implémenter l’interface PropertyChangeListener et l’interface:

public interface VetoableChangeListener extendsEventListener

{

public void vetoableChange(PropertyChangeEvent ev) throws PropertyVetoException

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 413 -

Demande de changement

l  Avant le changement de valeur, la méthode vetoableChange des beans abonnés est invoquée avec un événement de type PropertyChangeEvent.

l  Si l’un des beans lève une exception de type PropertyVetoException, la propriété n’est pas changée.

l  Classe PropertyVetoException:

public class PropertyVetoException extends Exception

{

public PropertyVetoException(String msg,PropertyChangeEvent e);

public PropertyChangeEvent getPropertyChangeEvent();

}

l  Dans le cas contraire, la valeur de la propriété est changée et la méthode propertyChange des beans abonnés est invoquée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 414 -

Implémentation de la demande

l  Le bean détenant la propriété contrainte peut déléguer à une instance de VetoableChangeSupport. l Aspects gérés:

•    Méthodes d’abonnement/désabonnement.

•    Création de la classe et invocations des beans abonnés.

l  Aperçu de la classe:

public class VetoableChangeSupport extends Object implementsSerializable

{

public VetoableChangeSupport(Object sourceBean) ;

public synchronized voidaddVetoableChangeListener(PropertyChangeListenerl);

public synchronized voidremoveVetoableChangeListener(PropertyChangeListener 1); public void fireVetoableChange(String propertyName, ObjectoldValue,

Object newValue) throws PropertyVetoException;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 415 -

Aperçu des interactions

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 416 -

Introspection

l  Un bean expose ses propriétés, méthodes et événements.

l  Une instance de la classe java.beans.Introspector va inspecter le bean sur 2 niveaux:

•    Recherche d’une classe nommée

BeanInfo (par exemple, CounterBeanBeanInfo)

•    Sinon, le mécanisme de la réflexion de Java va être utilisé pour obtenir la liste des méthodes du bean.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                 - 417 -

L’interface BeanInfo

l  La classe BeanInfo doit implémenter l’interface BeanInfo.

l  Cette classe ne sert qu’à décrire la classe .

l  Les méthodes de BeanInfo

Méthode

Description

getAdditionalBeanInfo ()

Retourne tous les objets concernant le bean associé

getBeanDescriptor ()

Retourne l’objet descripteur du bean

getDefaultEventIndex ()

Retourne l’index des événements par défaut

getDefaultPropertyIndex ()

Retourne l’index des propriétés par défaut

getEventSetDescriptors ()

Retourne les descripteurs de l’ensemble des événements

getIcon ()

Retourne l’icône spécifiée pour le bean

getMethodDescriptors ()

Retourne les descripteurs de méthodes

getPropertyDescriptors ()

Retourne les descripteurs de propriétés

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 418 -

Les servlets

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 419 -

Les servlets Java

•   Programmes java s'exécutant sur le serveur www et non pas sur la machine cliente.

•   Nécessite un serveur www incluant un moteur de servlets (exemple: apache + tomcat).

•   Une servlet est chargée lorsque le serveur est mis en route ou lorsque le premier client fait appel aux services de la servlet. Une fois chargée, une servlet reste active dans l'attente de nouvelles requêtes.

•   Une servlet va pouvoir utiliser des ressources du serveur (base de données, …) et renvoyer une page HTML au navigateur.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 420 -

Les servlets java

•  Les servlets utilisent des classes et interfaces issues des packages javax.servlet (servlets indépendantes d'un protocole) et (servlets spécifiques au protocole http).

•  Une servlet doit soit implémenter l'interface javax.servlet.Servlet ou étendre soit la classe javax.servlet.GenericServlet soit .HttpServlet.

•  Une servlet n'a ni de méthode main () ni constructeur.

•  Les initialisations peuvent se faire dans une des  méthodes init () héritées de javax.servlet.GenericServlet:

public void init () throws ServletException public void init (ServletConfig) throws ServletException

•  La méthode destroy () permet de libérer les ressources acquises et éventuellement d'écrire des informations persistantes qui pourront être lues au prochain chargement de la servlet par l'une des méthodes init ().

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 421 -

Servlet étendant la classejavax.servlet.GenericServlet

•  Une servlet générique doit surcharger une méthode service (), méthode abstraite de la classe javax.servlet.GenericServlet.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 422 -

Servlet étendant la classe.HttpServlet

•  Une servlet http doit surcharger une méthode doGet() ou doPost() en fonction du type de requête qu'elle aura à traiter.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 423 -

Exemple de servlet: formulaire HTML

ExempleServlet

Entrer votre nom:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 424 -

Exemple de servlet: le code JAVA

package exempleservlet;

import javax.servlet.*; import .*; import .*;

public class ExempleServlet extends HttpServlet

{

private static final String CONTENT_TYPE = "text/html"; public void init(ServletConfig config) throws ServletException { (config); }

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

response.setContentType(CONTENT_TYPE);

PrintWriter out = response.getWriter();

out.println("

Bonjour " + request.getParameter("nom") + ".

");

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 425 -

Exécution de la servlet

"ExempleServlet"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 426 -

Serveur d'application

l Une servlet est une application web devant être déployée sur un serveur d'application (exemple: Tomcat).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 427 -

Application web

l  Quand une application web est finalisée, on la place dans un fichier d'archive web (extension war).

l  Un fichier d'archive est créé avec la commande jar et possède une architecture précise.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 428 -

Architecture d'un fichier war

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 429 -

: le fichier de déploiement

l  Le descripteur de déploiement contient toutes les informations de configuration du fichier archive.

l  Dans le cas des servlets, il va permettre de définir la classe contenant la servlet, le nom de la servlet , les paramètres d'initialisation, le chemin virtuel d'accès, …

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 430 -

Exemple

Test servlet Formulaire 

A web app 

FormServlet

formservlet.FormServlet

FormServlet

/formulaire 

Contexte de l'application web

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 431 -

Déploiement de l'archive avec

tomcat

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 432 -

Déploiement de l'archive avec

tomcat

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 433 -

Quelques balises pour

l  Paramètres d'initialisation consultable par la méthode: getInitParameter ("nom_parametre") ;

nom_parametre

valeur_parametre

description du parametre

l  Gestion des erreurs:

404

javax.servler.ServletException

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 434 -

Suivi de session

l  Le protocole http est sans état.

l  Le suivi de session peut être simulé:

•  cookies (classe .Cookie)

•  utilisation de la classe j.HttpSession qui va permettre de stocker des objets plutôt que des chaînes de caractères comme les cookies.

l  La durée de session peut être définie dans le fichier de déploiement (valeur en minute):

10 

ou par appel de la méthode de HttpSession setMaxInactiveInterval (int time) définissant le temps maximal en secondes entre deux requêtes avant que la session n'expire.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 435 -

Cookies

l  Quelques méthodes de .Cookie: Cookie (String name, String Value)

String getName () String getValue () setValue (String value) setMaxAge (int expiry)

l  Création d'un cookie: méthode de HttpServletResponse response.addCookie (Cookie cookie)

l  Récupération de cookies: méthode de HttpServletRequest Cookie [] getCookies ()

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 436 -

La classe

.HttpSession

l  Création, méthodes de HttpServletRequest:

HttpSession getSession ()

HttpSession getSession (boolean p)

l  Destruction, méthode de HttpSession:

invalidate ()

l  Gestion de la session, méthodes de HttpSession:

Enumeration getAttributNames () Object getAttribut (String name) setAttribut (String name, Object value) removeAttribut (String name)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 437 -

Exemple HttpSession

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

response.setContentType(CONTENT_TYPE); HttpSession session = request.getSession() ;

Integer count = (Integer) session.getAttribute("count") ;

if (count == null) count = new Integer (1) ; else count = new Integer (count.intValue() + 1) ;

if (count.intValue () == 5) session.invalidate() ; else session.setAttribute("count", count) ;

PrintWriter out = response.getWriter();

out.println (chaine + "  " + count) ; }

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 438 -

Collaboration entre servlets

l Des servlets s'exécutant sur le même serveur web peuvent collaborer:

•   Par partage d'informations

•   Par partage du contrôle (une servlet peut recevoir une requête et laisser une autre servlet la traiter).

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 439 -

Partage d'informations entre servlets

l Les servlets peuvent partager de l'information:

•  à travers un conteneur externes (base de données).

•  à travers l'utilisation des contextes:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 440 -

servlet1

package servletscommunication;

import javax.servlet.* ; import .*; import .* ;

public class Servlet1 extends HttpServlet

{

public void doGet (HttpServletRequest request, HttpServletResponse response)

{

PrintWriter out = null ;

response.setContentType("text/plain") ; try { out = response.getWriter () ;

} catch (IOException e) {}

ServletContext contexte = this.getServletContext() ; contexte.setAttribute ("chaine1", "chaine deposee par servlet1") ; out.println ("la chaine est deposee") ;

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 441 -

servlet2

package servletscommunication;

import javax.servlet.* ; import .*; import .* ;

public class Servlet2 extends HttpServlet

{

public void doGet (HttpServletRequest request, HttpServletResponse response)

{

PrintWriter out = null ;

response.setContentType("text/plain") ; try { out = response.getWriter () ; } catch (IOException e) {}

ServletContext moncontexte = this.getServletContext() ;

ServletContext servlet1 = moncontexte.getContext("/Servlets/servlet1") ; if (servlet1 == null) out.println ("Pas de contexte trouve") ; else

{

String chaine = (String) servlet1.getAttribute ("chaine1") ; if (chaine == null) out.println ("Aucune chaine trouvee") ; else out.println ("chaine trouvee:" + chaine) ;

}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 442 -

Collaboration servlets 

Collaboration de servlets 

Servlet1

servletscommunication.Servlet1

Servlet1

/Servlet1 

Servlet2

servletscommunication.Servlet2

Servlet2

/Servlet2 

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 443 -

résultat

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 444 -

Collaboration de servlets par partage du contrôle

l Les servlets peuvent partager ou distribuer le contrôle d'une requête grâce à l'interface javax.servlet.RequestDispatcher

• par renvoi: une servlet peut renvoyer une requête entière sur une servlet, page jsp ou html par la méthode:

void forward (ServletRequest req, ServletResponse res) • par inclusion: une servlet peut inclure du contenu généré.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 445 -

Exemple de distribution de

renvoi

package servletscollaboration;

import javax.servlet.* ; import .*;

public class ServletMain extends HttpServlet

{

public void doGet (HttpServletRequest request, HttpServletResponse response)

{

response.setContentType("text/plain") ;

request.setAttribute("chaine1","argument1") ;  // on transmet un objet try {

RequestDispatcher dispat = // on transmet une chaine request.getRequestDispatcher("?chaine2=argument2") ;

dispat.forward(request, response) ;

} catch (Exception e) {}

}

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 446 -

Exemple de distribution de

renvoi

<%= request.getAttribute ("chaine1") %>

<%= request.getParameter ("chaine2") %>

fichier:

Résultat

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 447 -

Exemple d'inclusion

package servletscollaboration;

import javax.servlet.* ; import .*; import .* ;

public class ServletInclude extends HttpServlet

{

public void doGet (HttpServletRequest request, HttpServletResponse response)

{

PrintWriter out = null ;

response.setContentType("text/plain") ;

request.setAttribute("chaine1","argument1") ;  // on transmet un objet try { out = response.getWriter() ;

RequestDispatcher dispat = // on transmet une chaine

request.getRequestDispatcher("?chaine2=argument2") ; dispat.include(request, response) ;

} catch (Exception e) {}

out.println ("inclusion effectuee") ; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 448 -

Java Server Pages

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                    - 449 -

Avantages JSP

l  Les JSP permet de créer des pages webs dynamiques en mélangeant:

•  du code HTML.

•  des balises JSP spéciales.

•  du code java (scriptlet) directement dans la page.

l  Les JSP sont multi plate formes (Write Once, Run Anywhere).

l  Les parties traitements statiques (accès à des bases de données, …) peuvent être déportées dans des java beans.

l  Les JSP permettent de retourner le code HTML aux navigateurs de manière plus élégante que les servlets.

l  Une balise JSP est une balise XML associée à une classe java.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 450 -

Principe JSP

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 451 -

Exemple code JSP

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 452 -

Commentaires

l  Syntaxe: <%--     ……. --%>

l  Les commentaires JSP ne seront pas visibles par l'option "affichage source" des navigateurs, contrairement aux commentaires HTML:  <!-- … ->

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                    - 453 -

Balise de déclaration

l  Syntaxe:        <%!            %>

l  Cette balise permet de déclarer des variables et des méthodes.

Exemple:

<%!

private int counter = 0 ;

private String getAccount (int accountNo) ;

%>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 454 -

Balise d'expression

l  Syntaxe:      <%= …         %>

l  Cette balise d'évaluer et d'afficher la valeur d'une expression (appel simplifié de out.println () )

Exemple:

La date du jour est <%= new ()  %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 455 -

Balise de directive

l  Syntaxe: <%@directive %>

l  La balise de directive donne des informations concernant la page jsp au moteur de jsp.

l  Trois directives possibles:

•   include       fichier à inclure

•   page information concernant cette page

•   tag library définition de balises personnalisées - Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp - 456 -

La directive include

l  Cette directive permet d'inclure un fichier.

Exemples:

<%@include file=" %>

<%@include file="" %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 457 -

La directive "page"

language

langage utilisé: <%@page language="java" %>

extends

super classe utilisée pour la servlet générée: <%@page extends="com.taglib "  %>

import

importation d'un package. <%@page import .*; %>

session

Par défaut, toutes les données sont disponible le temps de la session. Cette valeur peut être mise à "false" pour des raisons de performances.

buffer

Définit la taille du cache en sortie (8kb par défaut).

autoFlush

Vide le cache de sortie lorsqu'il est plein.

isThreadSafe

Si active, un thread sera créé pour gérer la requête autorisant ainsi la servlet générée de traiter de multiples requêtes simultanément (voir transparent suivant).

info

Permet de mettre des informations sur la page (auteur, copyright, date, …).

errorPage

Indique l'url d'une page à afficher en cas d'exception non traitée (voir exemple)

isErrorPage

Si true, la page pourra accéder à l'objet implicite "exception" (voir exemple)

contentType

Indique le type mime et le jeu de caractères.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 458 -

Les problèmes de synchronisation

l  Les servlets générées sont multi threads par défaut; cela peut engendrer des conflits d'accès à des données partagées.

Solution 1: <%@page isThreadSafe="false" %>

Solution 2:

<% synchronized (application) {

SharedObject foo = (SharedObject) application.getAttribute("sharedObject"); foo.update(someValue);

application.setAttribute("sharedObject",foo);

} %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 459 -

Gestion des exceptions

l  Il est important d'intercepter les exceptions non traitées, notamment les "run time exceptions":

<%@page isErrorPage="false" errorPage="" %>

l  Pour accéder à l'objet implicite "exception", la page doit implémenter la balise:

<%@ page isErrorPage="true" %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 460 -

Exemple de gestion d'exceptions

l  Fichier jsp:

<%@page isErrorPage="false" errorPage="" %>

<%= .Integer.parseInt ("2.34")  %> l Fichier :

<%@page isErrorPage = "true" %>

Une erreur fatale est intervenue: <%= exception.getMessage () %>

Résultat:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 461 -

Scriplets

l Syntaxe: <%    ……     %> l Exemple:

<%for (int i = 1 ; i < 4 ; i++) { %> <H<%= i %>>Bonjour <%= i %>>

<%} %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 462 -

Balise de redirection

l Exemple:

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 463 -

Portées des objets

l Les objets créés au sein d'une page JSP peuvent avoir différentes portées:

application

Objets accessibles aux pages appartenant à la même application

session

Objets accessibles aux pages appartenant à la même session que les pages où ils ont été créés.

request

Objets accessibles uniquement dans les pages exécutant la requête qui les ont créées.

page

objets accessibles uniquement dans la page où ils ont été créés.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 464 -

Portée des objets

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 465 -

Les objets JSP implicites

Nom objet

classe java

Portée

request

HttpServletRequest

request

response

HttpServletResponse

page

pageContext

PageContext

page

application

ServletContext

application

out

JspWriter

page

config

ServletConfig

page

page

HttpJspPage

page

session

HttpSession

page

exception

Throwable

page

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 466 -

Exemple d'objet implicite

<% if(request.getHeader ("User-Agent").indexOf ("MSIE") != -1) { %>

Vous utilisez Internet Explorer

<% } else if(request.getHeader ("User-Agent").indexOf ("Mozilla") != -1) {

%>

Vous utilisez Netscape

<% } else { %>

Le navigateur m'est inconnu

<% } %>

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 467 -

JSP et les JavaBeans

l  Rappel: un javabean est une classe java:

•  sérialisable

•  disposant de méthodes get/set pour accéder à des propriétés.

Exemple:

package testpackage ;

public class InfoBean implements .Serializable

{

private String nom ; public InfoBean ()   {  nom = null ; } public InfoBean (String n) { nom = n  ; } public String getNom() { return nom; }

public void setNom(String nom) { = nom; }

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 468 -

La balise

l Association d'une instance de bean avec un identificateur et définition de la portée:

body

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 469 -

La balise

l  où prop_expr vaut une des valeurs:

•   property="*"

•   property="propertyName"

•   property="propertyName" param="parameterName"

•   property="propertyName" value="propertyValue"

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 470 -

Exemple

                                 Identification du champ nom du formulaire avec la propriété nom de

                     Bonjour <%= InfoBeanId.getNom () %>                      InfoBean

Salut

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 471 -

Exécution de l'exemple

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 472 -

Remarque sur la syntaxe

Le setProperty sera exécuté uniquement au moment de l'instanciation du bean (dans cet exemple une fois au cours de la session compte tenu de la valeur de scope).

Le setProperty est exécuté ici inconditionnellement.

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 473 -

Java Native

Interface

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 474 -

Pourquoi JNI

l  Certaines fonctionnalités peuvent être inaccessibles à JAVA:

•    Les bibliothèques java ne supporte pas les fonctionnalités dépendantes de la plate forme et requises par l’application (adressage physique, accès au matériel, interruption, …).

•    Développer en C/C++ tout en bénéficiant de l’IHM java.

•    Rendre accessible au code java une bibliothèque existante dans un autre langage.

•    Utiliser du code natif pour accélérer le temps d’exécution.

l  Quelques conséquences:

•    La portabilité est annulée.

•    La sécurité et la robustesse deviennent moindres.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 475 -

Présentation de JNI

l  Il est possible:

•    D’appeler des fonctions C/C++ depuis Java.

•    D’accéder à des objets Java depuis le C/C++.

l  JNI permet:

•    D’écrire des méthodes natives

•    D’appeler des méthodes java

•    De capturer et de déclencher des exceptions

•    De charger des classes • …

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 476 -

De Java vers C/C++

l Méthodologie:

•   Utilisation du mot clé native

•   Génération d’un fichier d’entête .h (avec javah)

•   Ecrire du code natif et génération d’une bibliothèque (.dll, .so)

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 477 -

public class JavaVersC

{ public native void bonjour () ;

public static void main (String args [])

{

new JavaVersC ().bonjour () ;

}

static

{ try {

System.loadLibrary ("JavaVersC") ;

} catch (UnsatisfiedLinkError e)

{

.println ("Erreur bibliotheque " + e) ; (1) ;

}

}

}

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 478 -

l      javah -jni JavaVersC l      Génération fichier JavaVersC.h:

/* Header for class JavaVersC */

#ifndef _Included_JavaVersC

#define _Included_JavaVersC

#ifdef __cplusplus extern "C" {

#endif

/*

* Class:     JavaVersC

* Method:    bonjour

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_JavaVersC_bonjour  (JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 479 -

#include

#include "JavaVersC.h"

JNIEXPORT void JNICALL Java_JavaVersC_bonjour (JNIEnv *env, jobject j)

{ printf ("Bonjour tout le monde") ;

}

bonjour.c

-    JNIEnv *env

Ce pointeur est un point d’entrée dans le thread courant au sein de la machine Java

-    jobject j

Référence sur l’objet qui a appelé la méthode native.

-    Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp    - 480 -

lCompilation sous Solaris:

javac

gcc -c bonjour.c -I /usr/java1.2/include -I /usr/java1.2/include/solaris -o

lCompilation sous Linux

javac

gcc -shared bonjour.c -I /usr/local/java/include -I /usr/local/java/include/linux -o

-    Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp    - 481 -

l Compilation sous Windows (Visual C++ 6.0)

@ECHO OFF

SET DEVSTUDIO=c:\Program Files\Microsoft Visual Studio\VC98

SET JDK13=c:\JDK1.3

@ECHO ON

%JDK13%\bin\javac

%JDK13%\bin\javah -classpath . JavaVersC

@ECHO OFF

SET COMPILE_CMD="%DEVSTUDIO%\bin\cl"

SET COMPILE_CMD=%COMPILE_CMD% bonjour.c

SET COMPILE_CMD=%COMPILE_CMD% -I"%JDK13%\INCLUDE" SET COMPILE_CMD=%COMPILE_CMD% -I"%JDK13%\INCLUDE\WIN32"

SET COMPILE_CMD=%COMPILE_CMD% -I"%DEVSTUDIO%\Include"

SET COMPILE_CMD=%COMPILE_CMD%

SET COMPILE_CMD=%COMPILE_CMD% -MD -LD /link

SET COMPILE_CMD=%COMPILE_CMD% /libpath:"\"%JDK13%\lib\""

SET COMPILE_CMD=%COMPILE_CMD% /libpath:"\"%DEVSTUDIO%\lib"" SET COMPILE_CMD=%COMPILE_CMD%

@ECHO ON

%COMPILE_CMD%

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 482 -

l Exécution:

java –cp . =. JavaVersC

Résultat: à Bonjour tout le monde

-  Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp  - 483 -

Correspondance type de données

l JNI établit une correspondance entre les types java et les types natifs:

Type Java

Type natif

Description

boolean

jboolean

unsigned 8 bits

byte

jbyte

signed 8 bits

char

jchar

unsigned 16 bits

short

jshort

signed 16 bits

int

jint

signed 32 bits

long

jlong

signed 64 bits

float

jfloat

32 bits

double

jdouble

64 bits

void

void

---

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 484 -

Exemple échange de types de données

l  Soit la fonction native suivante:

public class test

{ public native long calcul (long valeur) ; }

l  Le code natif sera défini par:

JNIEXPORT jlong JNICALL Java_test_calcul (JNIEnv *, jobject, jlong);

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 485 -

De C/C++ vers Java

l  Accéder aux variables d’instance

l  Accéder aux variables de classe

l  Accéder aux méthodes d’instance

l  Accéder aux méthodes de classe

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                                    - 486 -

Le pointeur JNIEnv

l JNIEnv *env

Ce pointeur permet d’accéder à l’environnement de la machine java associée.

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 487 -

Accès aux variables d’instance

l  jclass GetObjectClass (JNIEnv *env, jobject obj) ;

l  jfieldID GetFieldID (JNIEnv *env,jclass clazz,const char *name,const char *sig) ;

NativeType GetField (JNIEnv *env, jobject obj, jfieldID fieldID) ;

l  void SetField (JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value) ;

class Exemple

{ int x ;

public native void setX (int val) ;

}

JNIEXPORT void JNICALL Java_Exemple_setX (JNIEnv *env, jobject obj,jint valeur)

{

jclass classe = (*env)->GetObjectClass (env,obj) ; jfieldID fid = (*env)->GetFieldID (env,classe,"x","I") ;

(*env)->SetIntField (env,obj,fid,valeur) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 488 -

Accès aux variables de classe

l  jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ;

NativeType GetStaticField (JNIEnv *env, jclass clazz, jfieldID fieldID) ;

l  void SetStaticField (JNIEnv *env, jclass clazz, jfieldID fieldID, NativeType value) ;

class Exemple

{ static int x ;

public native void setX (int val) ;

}

JNIEXPORT void JNICALL Java_Exemple_setX (JNIEnv *env, jobject obj,jint valeur)

{

jclass classe = (*env)->GetObjectClass (env,obj) ; jfieldID fid = (*env)->GetStaticFieldID (env,classe,"x","I") ;

(*env)->SetStaticIntField (env,obj,fid,valeur) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 489 -

Appels de méthodes d’instance

l   jmethodID GetMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ;

l   NativeType CallMethod (JNIEnv *env, jobject obj, jmethodID methodId, …) ;

l   NativeType CallMethodA (JNIEnv *env, jobject obj, jmethodID methodId, jvalue *args) ; l    NativeType CallMethod (JNIEnv *env, jobject obj, jmethodID methodId, va_list args) ;

class Exemple

{ int x ;

public void afficheX () { .println ("X vaut : " + x) ; } public native void setX (int val) ;

}

JNIEXPORT void JNICALL Java_Exemple_setX (JNIEnv *env, jobject obj,jint valeur)

{

jclass classe = (*env)->GetObjectClass (env,obj) ;

jfieldID fid = (*env)->GetFieldID (env,classe,"x","I") ;

jmethodID mid = (*env)->GetMethodID (env,classe,"afficheX","()V") ; (*env)->SetIntField (env,obj,fid,valeur) ;

(*env)->CallVoidMethod (env,obj,mid) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 490 -

Appel de méthodes de classe

l   jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ;

l   NativeType CallStaticMethod (JNIEnv *env, jobject obj, jmethodID methodId, …) ;

l   NativeType CallStaticMethodA (JNIEnv *env, jobject obj, jmethodID methodId, jvalue *args) ;

l   NativeType CallStaticMethod (JNIEnv *env, jobject obj, jmethodID methodId, va_list args) ;

class Exemple

{

public static void affiche () { .println ("Affiche est une methode statique") ; } }

JNIEXPORT void JNICALL Java_Exemple_setX (JNIEnv *env, jobject obj,jint valeur)

{

jclass classe = (*env)->GetObjectClass (env,obj) ; jfieldID fid = (*env)->GetFieldID (env,classe,"x","I") ;

jmethodID mid = (*env)->GetStaticMethodID (env,classe,"affiche","()V") ;

(*env)->CallStaticVoidMethod (env,obj,mid) ;

}

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 491 -

Type signatures

l JNI utilise la représentation de la JVM pour les types de signature:

Type Signature

Java Type

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

L fully-qualified-class;

fully-qualified-class

[ type

type [ ]

( arg-types ) ret-type

method type

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 492 -

Type Signature

l  Signature de la méthode java suivante:

long f (int n, String s, int [] arr) ;

(.String;[I)J

l  Obtention des signatures avec le désassembleur javap:

javap –s –private JavaVersC

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 493 -

Bibliographie

Titre

Auteurs

Editeur

Java source book

Ed Anuff

Wiley computer publishing

Teach yourself Java in 21 days

Laura Lemay, Charles L. Perkins

Samsnet

Livre d’or de Java

Patrick Longuet

Sybex

PC Poche JAVA

Rolf Maurers

Micro application

Apprenez Java 1.1 en 21 jours

Laura Lemay, Charles L. Perkins

Simon & Schuster Macmillan

Java 1.2

Laura Lemay, Roger Cadenhead

Simon & Schuster Macmillan

Java Security

Scott Oaks

O'Reilly

Java Servlets

Jason Hunter, William Crawford

O'Reilly

Programmation java côté serveur

Andrew Patzer

Eyrolles

Le dictionnaire officiel Java 2

Patrick Chan

Eyrolles

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 494 -



                      Méthodes héritées de la classe .Object

- Ecole Nationale Supérieure d'Ingénieurs de Caen - © dp                                               - 123 -



2516