Академический Документы
Профессиональный Документы
Культура Документы
Patrick Ducrot
dp@ensicaen.fr http://www.ducrot.org/java/PolycopieJAVA.pdf
-1-
-2-
-3-
Gnralits
-4-
Gnralits
Langage conu par les ingnieurs de SUN Microsystem (socit rachete par Oracle en avril 2009) Dfinition de SUN : "Java est un langage simple, orient objet, distribu, robuste, sr, indpendant des architectures matrielles, portable, de haute performance, multithread et dynamique"
-5-
Gnralits
Simple
Inspir du C++, Fortran, Lisp, Smalltalk Pas de pointeur; pas de surcharge d'oprateurs; pas
multiple Prsence d'un "garbage collector"
d'hritage
Orient objet
La
Distribu
programmation objet modlise des objets ayant un tat (ensemble de variables) et des mthodes (fonctions) qui leur sont propres. Lunit de base en Java est la classe. Un des intrts de Java est de disposer de nombreuses classes dj faites. Un objet cr partir dune classe est une instance. plus courants sont intgrs.
-6-
Gnralits
Robuste Typage des donnes trs strict Pas de pointeur Sr Java nest pas compil destination
dun processeur particulier mais en byte code qui pourra tre ensuite interprt sur une machine virtuelle Java (JVM = Java Virtual Machine). Le "byte code" gnr est vrifi par les interprtateurs java avant excution. Un dbordement de tableau dclenchera automatiquement une exception. Labsence darithmtique de pointeur vite les malversations.
-7-
Gnralits Portable
Les
types de donnes sont indpendants de la plate forme (par exemple les types numriques sont dfinis indpendamment du type de plate forme sur laquelle le byte code sera interprte).
Haute performance
Java est un langage pseudo interprt Techniques
de "Just in Time" (JIT) amliorent ces performances
-8-
-9-
Java 1.0 (23 janvier 1996) 8 Packages 212 Classes et Interfaces 1545 Mthodes Java 1.1 (19 fvrier 1997) 23 Packages 504 Classes et Interfaces 3 851 Mthodes Java 1.2 (Java 2) (9 dcembre 1998) 60 Packages 1 781 Classes et Interfaces 15 060 Mthodes Et bien plus dans les versions 1.3 (8 mai 2000), 1.4 (6 fvrier 2002), 1.5 (tiger, 30 septembre 2004) ,1.6 (mustang, 11 dcembre 2006) Dernire version: 1.7, le 28 juillet 2011 (OpenSource et sous lre Oracle).
- 10 -
10
- 11 -
11
L'environnement J2SE
Loutil de base : le JDK (Java Development Kit) de SUN : http://java.sun.com (lien redirig sur le site dOracle). gratuit comprend de nombreux outils : le compilateur : javac linterprteur dapplication : java linterprteur dapplet : appletviewer le dbogueur : jdb le gnrateur de documentation : javadoc etc. Des environnements de dveloppement: http://www.eclipse.org http://www.netbeans.org/
- 12 -
12
Utilisation de JAVA
- 13 -
13
14
Code Objet
Edition de liens
Code Excutable
Code Objet
- 15 -
15
- 16 -
16
Excution
:
Code objet .class
JVM
- 17 -
17
Bytecode
- 18 -
18
Avantages/Inconvnients du bytecode
Code portable au niveau binaire Moins efficace que du code natif (mais compens par la technologie JIT)
- 19 -
19
Exemple dapplication
Fichier: First.java
public class First {
public static void main (String args []) { System.out.println ("Premier exemple") ; }
}
Compilation : Excution :
Cration de First.class
- 20 -
20
Syntaxe de base
- 21 -
21
- 22 -
22
Nombres entiers
-2^7 , (2^7 )-1 -128,127 -2^15 , (2^15) -1 -32768,32767 -2^31 , (2^31) - 1 -2147483648, 2147483647 -2^63 , (2^63) - 1 9223372036854775808, 9223372036854775807
23
Nombres rels
float
simple prcision sur 32 bits 1.4023984 e-45 3.40282347 e38 double double prcision sur 64 bits 4.94065645841243544 e-324 1.79769313486231570 e308 Reprsentation des rels dans le standard IEEE 754Un suffixe f ou d aprs une valeur numrique permet de spcifier le type. Exemples : double x = 145.56d ; float y = 23.4f ; float f = 23.65 ; // Erreur
- 24 -
24
boolean
Un entier non nul est galement assimil true Un entier nul est assimil false
char
Une variable de type char contient un seul caractre cod sur 16 bits (jeu de caractres 16 bits Unicode contenant 34168 caractres). Des caractres d'chappement existent :
\b Backspace \t Tabulation horizontale \n Line Feed \f Form Feed \r Carriage Return \" Guillemet \' Apostrophe \\ BackSlash \xdd Valeur hexadcimale \ddd Valeur octale \u00xx Caractre Unicode (xx est compris entre 00 et FF)
- 25 -
25
Chanes de caractres Les chanes de caractres sont manipules par la classe String ; ce n'est donc pas un
type scalaire, mais il sen approche beaucoup dans son utilisation. Exemple : String str = "exemple de chane de caractres" ; String chaine = "Le soleil " + "brille" ; // Oprateur de concatnation
Remarque: Depuis la version 1.7, il est possible dutiliser les chanes de caractres dans les structures switch/case Exemple:
String chaine= " " ; switch (chaine) { case "Bonjour" : default: }
System.out.println (" Je suis poli ") ; break ; System.out.println(" Je suis impoli ") ;
- 26 -
26
Les tableaux
Les tableaux peuvent tre dclars suivant les syntaxes suivantes : type [ ] nom ; type nom [ ] ;
Exemples :
Pas de tableau statique. La taille d'un tableau est alloue dynamiquement par loprateur new
table = new int [10] ; int table2 [ ] = new int [20] ; int table3 [ ] = {1,2,3,4,5} ;
- 27 -
27
Les tableaux
- 28 -
28
29
Concept de base de la programmation oriente objet : la classe Une classe modlise la structure statique (donnes membres) et le comportement dynamique (mthodes) des objets associs cette classe. Un objet dune classe est appel une instance. Une classe est la description dun objet. Chaque objet est cr partir dune classe (avec loprateur new).
- 30 -
30
Exemple
Nom classe
Numero : entier Solde : nombre rel initialise (numero,montant) deposer (montant) Utilisateur retirer (montant) consulterSolde () afficher ()
- 31 -
31
- 32 -
32
- 33 -
33
Reprsentation mmoire
co1
co2
numero solde
numero solde
- 34 -
34
Reprsentation mmoire
co1 et co2 contiennent l'adresse des zones mmoires alloues par l'oprateur new pour stocker les informations relatives ces objets. co1 et co2 sont des rfrences. La rfrence dun objet est utilise pour accder aux donnes et fonctions membres de lobjet. Un objet peut accder sa propre rfrence grce la valeur this (variable en lecture seule). Une rfrence contenant la valeur null ne dsigne aucun objet. Quand un objet nest plus utilis (aucune variable du programme ne contient une rfrence sur cet objet), il est automatiquement dtruit et la mmoire rcupre (garbage collector).
- 35 -
35
Constructeur de classe
Un constructeur est une mthode automatiquement appele au moment de la cration de lobjet. Un constructeur est utile pour procder a toutes les initialisations ncessaires lors de la cration de la classe. Le constructeur porte le mme nom que le nom de la classe et na pas de valeur de retour.
- 36 -
36
Exemple de constructeur
class Compte { public Compte (int num,float s) { numero = num ; solde = s ; } . } Compte co1 = new Compte (1234, 1000,00f) ;
- 37 -
37
Destructeur de classe
Un destructeur peut tre appel lorsquun objet est dtruit. Le destructeur peut tre utilis pour librer des ressources spcifiques(dconnexion d'une base de donnes, fermeture d'un fichier, ). Il sera appel lorsque le garbage collector rcuprera la mmoire. Un destructeur est une mthode:
public void finalize ()
- 38 -
38
Surcharge de mthodes
Une mthode (y compris le constructeur) peut tre dfinie plusieurs fois avec le mme nom condition de se diffrencier par le nombre et/ou le type des paramtres transmis (polymorphisme). Le compilateur dcidera de la bonne mthode utiliser en fonction des paramtres dappel. Java ne supporte pas la surcharge des oprateurs (diffrence avec le C++)
- 39 -
39
Exemple 1:
class BarreDeProgression { private float pourcent ; public void setPourcent (float valeur) { pourcent = valeur ;} public void setPourcent (int effectue, int total) { pourcent = total/effectue ; } }
- 40 -
40
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; } }
- 41 -
41
Comparaison dobjets
Exemple 1 :
r1 = new Rectangle (10,20) ; r2 = new Rectangle (30,40) ; r3 = new Rectangle (10,20) ; Comparaison des variables dinstance: r1 == r2 false r1 == r3 false Comparaison avec une mthode equals incluse dans la classe Rectangle r1.equals (r2) false r1.equals (r3) true
- 42 -
42
if (s1.equalsIgnoreCase (s2))
Remarque: dans le cas des chanes de caractres, il est malgr tout possible dutiliser: if (s1 == s2)
- 43 -
43
44
Hritage de classe
Concept trs important dans la programmation objet. Une classe peut hriter dune autre classe et apporter ses propres spcificits.
Classe A
Classe B
Classe C
Classe D
Classe E
- 45 -
45
Hritage de classe
Le mot cl pour dclarer une classe drive est extends. Java ne supporte que lhritage simple.
- 46 -
46
47
- 48 -
48
- 49 -
49
La classe de base
Toute classe java hrite implicitement de la classe java.lang.Object. Quelques mthodes de la classe java.lang.Object:
public boolean equals( Object obj ) ; public String toString() ;
- 50 -
50
Une mthode peut tre prfixe par abstract. Dans ce cas, la classe est abstraite. Aucun objet ne peut tre instanci dune classe abstraite et les classes drives devront dfinir compltement les mthodes abstraites. Le mot cl final interdit la drivation dune classe (par exemple, la classe String est final) ; appliqu une variable, celle ci ne peut pas tre modifie (constante) ; appliqu une mthode, celle ci ne peut pas tre surcharge.
- 51 -
51
Il est possible daccder aux donnes/mthodes de la classe de base grce au mot cl super.
Exemple 1 : {
- 52 -
52
Exemple 2 :
class HouseCat extends Feline { void speak ( ) { System.out.println (Meow !!!) ; } } class MagicCat extends HouseCat { boolean people_present ; void speak ( ) { if (people_present) super.speak ( ) ; else System.out.println (Hello) ; } }
- 53 -
53
Interface
Les interfaces compensent un peu labsence dhritage multiple. Le mot cl interface remplace le mot cl class en tte de dclaration. Une interface ne peut contenir que des variables constantes ou statiques et des enttes de mthodes. Toutes les signatures de mthodes dune interface ont une visibilit publique. Le mot cl pour implmenter une interface est implements. Une classe implmentant une interface sengage surcharger toutes les mthodes dfinies dans cette interface (contrat). Une interface permet dimposer un comportement une classe Une classe peut implmenter autant dinterfaces qu'elle le souhaite.
- 54 -
54
Exemple dinterface
interface Drawable { void drawMe (int x, int y) ; } class GraphicObject implements Drawable { void drawMe (int x,int y) { // Code de la fonction drawMe } }
- 55 -
55
Packages
Les classes java stockes dans la bibliothques de classe ne sont
pas automatiquement disponibles.
Le mot cl pour importer un package est import De nouveaux packages peuvent tre dfinis rendant le langage
trs extensible (exemple : package java3d pour des classes graphiques en 3 dimensions).
- 56 -
56
- 57 -
57
- 58 -
58
Droits daccs
Toutes les mthodes et donnes membres dfinies au sein
dune classe sont utilisables par toutes les mthodes de la classe.
Lors
de la conception dune classe, il faut dcider des mthodes/variables qui seront visibles lextrieur de cette classe.
- 59 -
59
La protection des 4 P
private : visible uniquement au sein de la classe. public : visible partout Le
droit par dfaut est une visibilit des classes/donnes/membres pour toutes les classes au sein dun mme package. Il ny a hlas pas de mot cl pour prciser explicitement cet accs.
- 60 -
60
Variables de classe
Une variable de classe est une variable associe une classe et
non aux instances de cette classe.
Une variable static est partage par toutes les instances de la Les variables de classe sont prfixes par le mot cl static. On accde une variable de classe en faisant prcder le nom de
cette variable par le nom de la classe suivi dun point.
- 61 -
61
counter += 1 ;
Exemple 2: La classe java.lang.Math contient la valeur de PI class Math { public static final double PI=3.141592653589793d ; } Utilisation: Math.PI
- 62 -
62
Mthodes de classe
Une mthode de classe est une mthode associe une
classe et non une instance de cette classe.
Les mthodes de classe sont prfixes par le mot cl static. Une mthode de classe est appelable sans avoir crer
dobjet de cette classe.
- 63 -
63
- 64 -
64
65
Conversions de type
- 66 -
66
- 67 -
67
Les exceptions
Le traitement des exceptions permet une application davoir un
comportement adquat une situation inattendue.
Beaucoup
de mthodes sont susceptibles de dclencher une exception (comme par exemple lexemple prcdent).
Une exception peut tre leve par une clause try/catch . L'utilisation d'une clause try/catch est obligatoire pour les
exceptions sous contrles (une exception sous contrle est une sous classe de Exception mais pas de RunTimeException). exceptions pour ne pas dsemparer les utilisateurs.
- 68 -
68
java.io.FileNotFoundException
IllegalArgumentException
NullPointerException
NumberFormatException
- 69 -
69
La clause try/catch
try <instruction> ; catch (<type exception1> ex1) instruction ; catch (<type exception2> ex2) instruction ; . finally <instruction> ;
- 70 -
70
String chaine ; int valeur ; try { valeur = Integer.parseInt (chaine) ; FileInputStream fichier = new FileInputStream ("c:\\texte.txt " ); } catch (NumberFormatException e1) { System.err.println ("mauvais format ") ; } catch (FileNotFoundException e2) { System.err.println ("Fichier non trouve " ); }
- 71 -
71
Gestion dexceptions
Depuis la version 1.7, on peut grer plusieurs exceptions dans une seule clause catch:
try { valeur = Integer.parseInt (chaine); FileInputStream fichier = new FileInputStream ("c:\\texte.txt") ; } catch (NumberFormatException | FileNotFoundException e) { System.err.println ( Une erreur est survenue "); }
- 72 -
72
Gnration d'exception
On indique quune mthode m peut gnrer une exception
void m () throws MyException { }
MyException par le mot cl throws (obligatoire pour les exceptions sous contrle)
Exemple: if (x<0) { throw new IllegalArgumentException ("x doit etre positif"); // ne mettre aucune instruction en dessous du throw }
- 73 -
73
- 74 -
74
- 75 -
75
- 76 -
76
77
Outils prsent dans la jdk de Sun. Par dfaut, la documentation gnre est au format HTML. Toute la documentation des API java de SUN a t gnre grce javadoc. La documentation gnre contient les fichiers suivants:
Un fichier html par classe ou interface contenant le dtail de chaque classe ou interface. Un fichier html par package Un fichier overview-summary.html Un fichier deprecated.html Un fichier serialized-form.html Un fichier overview-frame.html Un fichier all-classes.html Un fichier package-summary.html pour chaque package. Un fichier package-frame.html pour chaque package. Un fichier package-tree.html pour chaque package.
- 78 -
78
Exemple de gnration
- 79 -
79
Commentaire javadoc:
/** * Voil un exemple de <B> commentaire </B> * javadoc */
javadoc utilise des "tags" pour prciser le rle de certains composants d'un lment:
"tag" standard: @tag "tag" remplac par une valeur: {@tag} Liste complte des tags et l'utilisation de javadoc l'adresse http://java.sun.com/j2se/javadoc/
- 80 -
80
- 81 -
81
- 82 -
82
83
Exemples:
jar cvf applet.jar *.class jar tvf applet.jar jar xvf applet.jar
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 84 -
84
- 85 -
85
86
Gestion de fichiers
87
java.io.File
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 ()
- 88 -
88
java.io.File
import java.io.* ; 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 [] = dir.list () ; for (int i = 0 ; i != fichiers.length ; i++) System.out.println (fichiers [i]) ; } else { System.err.println (dir + " n'est pas un repertoire") ; } } }
- 89 -
89
Les flux
Difficult dun langage davoir un bon systme dentres/sorties. Beaucoup de sources dE/S de natures diffrentes (console, fichier, socket,). Beaucoup daccs diffrents (accs squentiel, accs alatoire, mise en mmoire tampon, binaire, caractre, 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 connatre la source de son information; un processus producteur n'a pas besoin de connatre la destination
- 90 -
90
Toutes
Toutes
- 91 -
91
Flux dentre
java.io.InputStream
java.io.Reader
Flux de sortie
java.io.OutputStream
java.io.Writer
- 92 -
92
InputStream FileInputStream PipedInputStream ByteArrayInputStream SequenceInputStream StringBufferInputStream ObjectInputStream FilterInputStream DataInputStream BufferedInputStream PushBackInputStream
- 93 -
93
La classe java.io.InputStream
Les mthodes 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) { }
- 94 -
94
La classe java.io.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 () ;
- 95 -
95
- 96 -
96
La classe java.io.OutputStream
- 97 -
97
- 98 -
98
Ces deux classes servent de classes de base des classes de gestion dentres/sorties plus volues:
BufferedInputStream et BufferedOutputStream permettent de lire et crire des donnes travers un tampon de lecture/criture pour amliorer les performances. DataInputStream et DataOutputStream permettent de lire/crire des donnes formates (byte, int, char, float, double, etc.) etc.
- 99 -
99
PrintStream s = new PrintStream (new FileOutputStream ("resultat")) ; s.println ("On ecrit dans le fichier resultat") ;
- 100 -
100
Reader BufferedReader LineNumberReader CharArrayReader InputStreamReader FileReader FilterReader PushBackReader PipedReader StringReader
- 101 -
101
Exemple de BufferedReader
import java.io.*; public class TestBufferedReader { public static void main(String args[]) { try { String ligne ; BufferedReader fichier = new BufferedReader (new FileReader("data.txt")); while ((ligne = fichier.readLine()) != null) System.out.println(ligne); fichier.close(); } catch (IOException e) { System.err.println ("Erreur lecture") ; } } }
- 102 -
102
La srialisation
La srialisation est un mcanisme permettant de rendre un objet persistant. Il peut tre ensuite:
Le processus inverse est la dsrialisation. Un objet srialis est dit persistant. Cette fonctionnalit est apparue dans la version 1.1 de Java.
- 103 -
103
Pourquoi srialiser ?
Rendre un objet persistant ncessite une convention de format pour la lecture/criture (cela peut tre une opration complexe et difficile maintenir) ou transmettre un objet via le rseau une application distante. La srialisation permet de rendre un objet persistant de manire simple et naturelle. Si un objet contient dautres objets srialisables, ceux-ci seront automatiquement srialiss. La plupart des classes de base (mais pas toutes) du langage Java sont srialisables. Si la classe a t modifie entre la srialisation et la dsrialisation, lexception java.io.InvalidClassException est dclenche.
- 104 -
104
Comment srialiser
Une classe est srialisable si elle implmente linterface java.io.Serializable. Des objets de type java.io.ReadObjectStream et java.io.WriteObjectStream vont permettre de srialiser/dsrialiser. Les donnes membres que lon ne souhaite pas sauvegarder doivent tre dclares transient. Des mthodes de lecture/criture peuvent tre redfinies le cas chant: private void writeObject (java.io.ObjectOutputStream out) throws IOException ; private void readObject (java.io.ObjectInputStream in) throws IOException,ClassNotFoundException ;
- 105 -
105
Exemple Srialisation/Dsrialisation
import java.io.* ; 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 ; }
- 106 -
106
Exemple Srialisation/Dsrialisation
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) System.out.println ("nom = " + User.getNom () + " mot de passe = " + User.getPassword ()) ; } void Ecrire (Info user) { try { FileOutputStream file = new FileOutputStream ("c:\\travail\\info.txt") ; ObjectOutputStream out = new ObjectOutputStream (file) ; out.writeObject (user) ; out.flush () ; out.close () ; file.close () ; } catch (IOException ex) { System.err.println ("Erreur d'ecriture " + ex) ; } } // Fin classe ExempleSerialisation transparent // suivant
- 107 -
107
Exemple Srialisation/Dsrialisation
Info Lire () { Info User = null ; try { FileInputStream file = new FileInputStream ("c:\\travail\\info.txt") ; ObjectInputStream in = new ObjectInputStream (file) ; User = (Info) in.readObject() ; } catch (Exception ex) { System.err.println ("Erreur de lecture " + ex) ; } return User } } // Fin classe ExempleSerialisation
- 108 -
108
Le package java.nio
Nouveau package de gestion des entres/sorties introduit par la version 1.4. NIO permet d'utiliser des entres/sorties plus rapides en grant des blocs plutt que des bytes ou caractres. Les objets de base pour ce type d'entre sortie sont: Buffer et Channel. Un "Buffer" contient les donnes lire ou crire, un "Channel" dsigne la source ou la destination de l'information. Une entre/sortie sur un objet "Channel" transite obligatoirement par un objet "Buffer".
- 109 -
109
L'objet "Buffer"
Un "Buffer" est un objet contenant les informations crire ou recevant les informations lues. Le mme objet "Buffer" peut tre utilis en entre et en sortie. Outre le stockage, un objet "Buffer" fournit des informations sur l'opration d'entre sortie.
- 110 -
110
position
indique la 1re position libre dans la zone de stockage. quantit d'information restant envoyer (criture) ou espace restant disponible (lecture) taille maximale d'information pouvant tre stocke dans un objet buffer
limit
capacity
- 111 -
111
flip ()
clear ()
positionne "limit" capacity, remet "position" a 0 et efface la marque.
mark ()
Utilise "position" comme la marque courante
reset ()
Place "position" la marque courante
rewind ()
Place 0 dans "position" et efface la marque
Les diffrentes forme des mthodes get() et put () permettent d'obtenir ou d'initialiser la zone de stockage d'un objet "Buffer".
- 112 -
112
flip () clear ()
- 113 -
113
- 114 -
114
Exemple java.nio
import java.io.*; import java.nio.*; import java.nio.channels.*; public class Test1Nio { Test1Nio() { try { FileInputStream fin = new FileInputStream("d:\\travail\\image.jpg"); FileOutputStream fout = new FileOutputStream("d:\\travail\\image2.jpg"); ByteBuffer buffer = ByteBuffer.allocate(512); FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); while (fcin.read(buffer) != -1) { buffer.flip() ; fcout.write(buffer); buffer.clear () ; } fin.close () ; fout.close () ; } catch (Exception e) { System.err.println(e); } } public static void main(String[] args) { new Test1Nio(); } }
- 115 -
115
- 116 -
116
Quelques "Channel"
- 117 -
117
Les threads
- 118 -
118
Les threads
Un thread est une unit dexcution au sein dun mme processus (ce nest pas un autre processus). Tous les threads dun mme processus partagent la mme zone mmoire. La programmation multithreads donne lillusion de la simultanit. La gestion des threads est dpendante de la JVM (problme pour la portabilit). Les threads peuvent tre premptifs ou coopratifs. Un thread possde un nom et une priorit. Un thread sexcute jusquau moment o:
Un thread de plus grande priorit devient excutable. Une mthode wait (), yield () ou sleep () est lance. Son quota de temps a expir dans un systme premptif.
- 119 -
119
Une classe est un thread si elle remplit une des deux conditions:
- 120 -
120
- 121 -
121
MyClass objet = new MyClass () ; Thread thread = new Thread (objet) ; thread.start () ;
- 122 -
122
- 123 -
123
- 124 -
124
La mthode stop () est dprcie. Un thread sarrte lorsquil ny a plus dinstruction excuter dans la mthode run (). Une solution possible:
public class ThreadTest extends Thread { private boolean bKillThread = false; public void run() { while (bKillThread == false) System.out.println( getName() ) ; } public void stopThread() { bKillThread = true; } }
- 125 -
125
Synchronisation Plusieurs
threads accdant une mme donne doivent tre synchroniss
Mot cl: Si
un thread invoque une mthode "synchronized" d'un objet, celui-ci est verrouill pour toutes ses mthodes "synchronized".
- 126 -
126
127
void print () { float safeX,safeY ; synchronized (this) { safeX = x ; safeY = y ; } System.out.print ("voil x et y : " + safeX + safeY) ; }
- 128 -
128
Dans les exemples prcdents, synchronized ne protgeait que l'instance d'une classe. Une variable de classe peut appartenir plusieurs instances. Il faut dans ce cas protger une classe et pas seulement une instance de classe.
- 129 -
129
public final Class getClass(): renvoie la classe de lobjet. Tous les objets de classe Compteur seront bloqus dans la mthode incremente().
- 130 -
130
Les collections
- 131 -
131
Les collections
Les collections sont des objets permettant de grer des ensembles d'objets avec ventuellement la possibilit de grer les doublons, les ordres de tri, etc. La version 1 de Java proposait:
java.util.Vector, java.util.Stack, java.util.Hashtable Une interface java.util.iterator permettant de parcourir ces objets
- 132 -
132
- 133 -
133
Interfaces de collections
- 134 -
134
Collection : interface qui est implmente par la plupart des objets qui grent des collections. Map : interface qui dfinit des mthodes pour des objets qui grent 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 accs direct un lment 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
- 135 -
135
Implmentation
HashSet TreeSet ArrayList, LinkedList, Vector HashMap, Hashtable TreeMap
- 136 -
136
Exemple "TreeMap"
package exempletreemap; import java.util.* ; public class ExempleTreeMap { public ExempleTreeMap () { TreeMap tree = new TreeMap () ; tree.put ("zzzz",new Integer (26)); tree.put ("aaaa", new Integer (1)) ; tree.put ("bbbb", new Integer (2)) ; Iterator itercle = tree.keySet().iterator() ; Iterator itervaleurs = tree.values().iterator() ; while (itercle.hasNext()) { System.out.println (itercle.next() + " --> " + itervaleurs.next()) ; } } public static void main(String[] args) { new ExempleTreeMap () ; } }
- 137 -
137
Collections et threads
Si plusieurs threads peuvent accder un objet collection, il y a ncessit de synchroniser avec une des mthodes statiques de la classe java.util.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) Les mthodes prcdentes ne synchronisent pas les itrateurs. Il faut donc le faire manuellement: synchronized (objet) { Iterator iter = objet.iterator () ; { // travailler avec l'iterateur } }
- 138 -
138
Collections et threads
- 139 -
139
java.util.Properties
La classe java.util.Properties est une table de hachage pour dfinir des variables d'environnement sous la forme (nom_variable, valeur) Exemple:
Properties props = new Properties () ; props.put ("monApp.xSize","50") ;
La mthode statique System.getProperties () retourne les variables d'environnement dfinies telles que:
java.vendor java.home file.separator path.separator user.name user.home user.dir
- 140 -
140
Jusqu' la version 1.4, on stockait et rcuprait des "Object" d'une collection. Exemple:
ArrayList liste = new ArrayList () ; liste.add (new MaClasse ()) ; MaClasse obj = (MaClasse) liste.get (0) ;
- 141 -
141
142
La version 1.5 (nom de code Tiger) est une volution majeure du langage Java. Les volutions prcdentes (hormis la 1.1) n'apportaient en gnral que des nouvelles classes internes.
- 143 -
143
Autoboxing/Unboxing
L'autoboxing permet de transformer automatiquement une variable de type scalaire en un objet du type correspondant (exemple: int Integer). L'Unboxing est l'opration inverse (exemple: Integer int). Ces proprits sont dfinies dans la JSR 201.
- 144 -
144
Exemple AutoBoxing/UnBoxing
import java.util.* ; public class AutoBoxing { public static void main (String args []) { new AutoBoxing () ; } public AutoBoxing () { Vector<Integer> liste = new Vector<Integer> () ; for (int i = 1 ; i <= 5 ; i++) { liste.add (i) ; } // liste.add (new Integer (i)); for (int i = 0 ; i < liste.size () ; i++) System.out.println (liste.get (i)) ; } }
- 145 -
145
L'importation statique
L'importation statique allge l'criture pour l'accs aux donnes et aux mthodes statiques d'une classe. Elle est dfinie par la JSR 201
// Nouveaut: mot cl static
public class TestStaticImport { public static void main (String args []) { new TestStaticImport () ; } public TestStaticImport () { System.out.println (PI) ; } }
- 146 -
146
Boucles volues
La syntaxe des boucles a t simplifie pour le parcours des lments d'un tableau ou d'une collection. Exemple:
int tableau [] = {0,1,2,3,4,5} ; for (int i : tableau) System.out.println (i) ;
- 147 -
147
Cette fonctionnalit, dfinie par la JSR 201,permet de transmettre un nombre variable d'arguments d'un type donn une fonction. Les arguments seront transmis comme un tableau. On peut transmettre soit un tableau, soit une liste unitaire mais pas les deux en mme temps.
- 148 -
148
- 149 -
149
Le type numr
Dfini par la JSR 201, le type numr permet de dfinir un ensemble fini de valeurs. Exemple de type numr: public enum MaCouleur { BLEU , BLANC , ROUGE } ; Le compilateur crera une classe avec les caractristiques suivantes:
Un champ static pour chaque lment de la dclaration. Une mthode values() qui renvoie un tableau avec les lments dfinis. Une mthode valueOf(String) qui retourne la valeur correspondante la chane. La classe implmente les interfaces Comparable et Serializable Les mthodes toString(), equals(), hashCode() et compareTo() sont redfinies.
- 150 -
150
- 151 -
151
Affichage format
La classe System.out dispose maintenant d'une mthode printf analogue celle du langage C. Les caractres 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 ; System.out.printf ("la chaine vaut %s%n",chaine) ; System.out.printf ("l'entier vaut %10d%n",i) ; } }
- 152 -
152
Saisie formate
La classe java.util.Scanner permet des entres formates similaires la fonction scanf du langage C. Exemple: import java.util.* ; public class IOFormatted { public static void main(String[] args) { new IOFormatted () ; } public IOFormatted () { String chaine ; int i = 0 ; Scanner clavier = new Scanner (System.in) ; chaine = clavier.next () ; try { i = clavier.nextInt() ; } catch (InputMismatchException e) { System.err.println("l'entier saisi est incorrect") ; } System.out.printf ("la chaine vaut %s%n",chaine) ; System.out.printf ("l'entier vaut %d%n",i) ; } }
- 153 -
153
Quelques utilisations de
java.util.Scanner
Exemple 1 :
String chaine ; Scanner clavier = new Scanner (System.in) ; try { chaine = clavier.next (java.util.regex.Pattern.compile("[Oo]")) ; } catch (InputMismatchException e) { System.err.println ("O ou o attendu") ; }
- 154 -
154
Les types gnriques, dfinis par la JSR 14, permettent de spcifier le type d'objets que l'on va placer dans une collection d'objets (List, Vector) Avantages:
meilleure lisibilit: on connat la lecture du programme quel type d'objets seront placs dans la collection. La vrification peut tre fait la compilation. Le cast pour rcuprer 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 dtectable qu' l'excution).
La syntaxe pour utiliser les types gnriques utilise les symboles < et >.
- 155 -
155
- 156 -
156
- 157 -
157
Les annotations
Une annotation permet de marquer certains lments du langage. Une annotation pourra ensuite tre utilise la compilation ou l'excution pour automatiser certaines tches. Cration d'une annotation:
public @interface MonAnnotation { }
Une annotation peut tre utilise sur diffrents types d'lments du langage: package, class, interface, enum, annotation, mthodes paramtre, champs d'une classe, variables locales
- 158 -
158
@Override
@SuppressWarnings
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 []) { System.out.println ( new MaClasse ().getAnnee ()) ; } }
- 160 -
160
Exemple @SuppressWarnings
Exemples:
@SuppressWarnings ("deprecation") public class VieilleClasse { } @SuppressWarnings ("deprecation") public int methode () { }
- 161 -
161
Exemple @Override
public class MaClasse { private int annee ; public MaClasse () { annee = 2007 ; } public int getYear () { return annee ; } @Override public String ToString () { return String.valueOf (annee) ; } }
- 162 -
162
Les meta-annotations
Une mta annotation permet d'annoter une autre annotation afin d'indiquer au compilateur des informations supplmentaires. Les mta annotations sont dans le package java.lang.annotation:
163
@Inherited
@Retention
@Target
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 164 -
164
Exemple @Documented
public @interface Annotation1 { } import java.lang.annotation.Documented ; @Documented public @interface Annotation2 { } public class MaClasse { @Annotation1 public int getYear () { return annee ; } @Annotation2 public int getAnnee () { return annee ; } }
- 165 -
165
Exemple @Inherited
import java.lang.annotation.Inherited ; @Inherited public @interface Annotation1 { } @Annotation1 public class MaClasse { }
- 166 -
166
Exemple @Retention
import java.lang.annotation.* ; @Retention(RetentionPolicy.SOURCE) @interface SourceAnnotation {} @Retention(RetentionPolicy.CLASS) @interface ClassAnnotation {} @Retention(RetentionPolicy.RUNTIME) @interface RuntimeAnnotation {} @SourceAnnotation @ClassAnnotation @RuntimeAnnotation public class TestAnnotation { public static void main (String args []) { for (Annotation a : TestAnnotation.class.getAnnotations ()) { System.out.println (a.annotationType().getSimpleName ()) ; } } }
- 167 -
167
Exemple @Target
- 168 -
168
- 169 -
169
- 170 -
170
Les applets
- 171 -
171
Applet
Une applet sera tlcharge partir dun site web et sera excute
dans une machine virtuelle java incorpore aux navigateurs (netscape, internet explorer, mozilla, opera, )
Pas de mthode main() La classe principale dune applet doit tendre la classe
java.applet.Applet.
java.applet.Applet:
- 172 -
172
Exemple d'Applet
package hello ; import java.awt.* ; import java.applet.* ; public class Hello extends Applet { public void paint (Graphics g) { g.drawString ("Hello World",10,30) ; } }
- 173 -
173
Exemple :
- CODE
- WIDTH, HEIGHT
indique le nom du fichier qui chargera l'applet Taille ncessaire pour l'applet en pixels dans la fentre du navigateur
- 174 -
174
Excution de l'applet
- 175 -
175
CODEBASE
serveur
PARAM
Permet de dfinir des paramtres dans le fichier HTML qui seront rcuprs dans l'Applet grce la mthode java.applet.Applet.getParameter ( )
- 176 -
176
Exemple de CODEBASE
- 177 -
177
Exemple d'applet
package hello ; import java.applet.* ; import java.awt.* ; public class Hello extends Applet { private String chaine ; public void init () { chaine = getParameter ("welcome") ; } public void paint (Graphics g) { g.drawString (chaine, 10,30) ; } }
- 178 -
178
Exemple d'applet
<HTML> <APPLET CODEBASE="http://www.ecole.ensicaen.fr/~dp" CODE="hello.Hello.class" ALIGN=LEFT WIDTH=200 HEIGHT=200> <PARAM NAME="welcome" VALUE="Bonjour a tous"> </APPLET> A la gauche de ce texte, vous pouvez voir une applet affichant un texte <BR CLEAR=ALL> Ce texte s'affiche desormais en dessous de l'applet et a gauche de la fenetre du navigateur. </HTML>
- 179 -
179
Excution de l'applet
- 180 -
180
La classe java.awt.Graphics
Les fonctions graphiques sont utilisables travers un objet de classe java.awt.Graphics L'objet de classe java.awt.Graphics gre un contexte graphique L'objet de classe java.awt.Graphics est transmis en argument des fonctions update() et paint () et peut tre galement cr par les mthodes getGraphics () ou create () Un objet de classe Graphics manipule une surface spcifique de l'application Une surface peut tre manipule par plusieurs objets de classe Graphics La classe java.awt.Graphics contient les fonctions classiques de gestion de tracs de formes, de remplissage, d'utilisation des couleurs et de fontes,
- 181 -
181
- 182 -
182
Gestion de l'affichage
L'affichage graphique est gr par un thread "Screen
Updater"
update (Graphics g) des composants qui doivent tre redessins. Tous les composants graphiques possdent cette mthode.
redessin en appelant la mthode repaint () Cela positionne une variable dans le composant destination du "screen updater" qui appellera la mthode update (Graphics g)
- 183 -
183
- 184 -
184
La classe java.awt.Color
La gestion des couleurs est base sur un modle 24 bits Une couleur est dfinie par ses composantes RGB Exemple :
Color BleuPale = new Color (0,0,80) ;
- 185 -
185
- 186 -
186
La classe java.awt.Font
La classe java.awt.Font permet de dfinir des objets reprsentants des polices de caractres caractrises par leur nom, leur style et leur taille en points Exemple : Font f = new Font ("Monospaced", font.BOLD, 24) ; Les spcifications du langage java fournissent 5 polices universelles:
Dialog SansSerif (anciennement Helvetica) Serif (anciennement TimesRoman) Monospaced (anciennement Courier) Symbol
En fonction de la plate forme utilise, d'autres polices peuvent tre disponibles. Styles disponibles:
Font.BOLD Font.ITALIC Font.PLAIN
- 187 -
187
- 188 -
188
189
190
- 191 -
191
- 192 -
192
Les classes de mise en page La fentre du navigateur sert de container Pour disposer les composants graphiques, on utilise
des classes de mise en page :
193
La classe java.awt.FlowLayout
Cette classe dispose les objets par ordre d'ajout. C'est le
layout par dfaut pour les containers de type java.awt.Panel. Plusieurs constructeurs:
public FlowLayout () ; public FlowLayout (int align) ; public FlowLayout (int align, int hgap, int vgap) ;
Le paramtre align peut prendre les valeurs:
FlowLayout.LEFT FlowLayout.CENTER FlowLayout.RIGHT
- 194 -
194
Exemple de FlowLayout
package flow ; import java.applet.*; import java.awt.*; 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")) ; } }
- 195 -
195
- 196 -
196
La classe java.awt.BorderLayout
- 197 -
197
Exemple de BorderLayout
package border; import java.applet.*; import java.awt.*;
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")) ; } }
- 198 -
198
- 199 -
199
La classe java.awt.GridLayout
quadrillage dans lequel les composants graphiques seront placs 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) ;
- 200 -
200
Exemple de GridLayout
package grid ; import java.applet.*; import java.awt.*;
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")) ; } }
- 201 -
201
- 202 -
202
La classe java.awt.GridBagLayout
La classe java.awt.GridBagLayout dfinit un quadrillage
analogue GridLayout mais les composants n'ont pas forcment une taille identique et peuvent occuper une ou plusieurs cases de la grille. Un seul constructeur: public GridBagLayout () ; Chaque composant graphique sera ajout en spcifiant les contraintes souhaites grce un objet de classe java.awt.GridBagConstraints. Mise en uvre :
Cration d'un objet GridBagLayout Cration d'un objet GridBagConstraints Fixation des contraintes d'un composant Enregistrement des contraintes auprs du gestionnaire Ajout du composant
- 203 -
203
- 204 -
204
Dfinit l'espacement autour du composant (external padding). La classe Insets est dfini par : public Insets (int top,int left, int bottom,int right) 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 Dfinit la rpartition de l'espace en cas de changement de dimension (en proportion)
- 205 -
205
Exemple de GridBagLayout
package gridbag ; import java.applet.*; import java.awt.*; 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.fill = GridBagConstraints.BOTH ; 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 ; gbc.fill = GridBagConstraints.HORIZONTAL ; gbl.setConstraints (b3,gbc) ; add (b3) ; } }
- 206 -
206
- 207 -
207
La classe java.awt.CardLayout
ne sont pas visibles simultanment mais conscutivement. Plusieurs constructeurs:
208
Exemple de CardLayout
package card ; import java.applet.*; import java.awt.*; import java.awt.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) { cl.next (this) ; } }
- 209 -
209
- 210 -
210
Layout personnalis
On peut ne pas utiliser de layout (setLayout (null)) et positionner les composants en fonction de leurs coordonnes. Cette mthode est adapte uniquement pour les conteneurs non redimensionnables. On peut dfinir une classe de layout en implmentant l'interface java.awt.LayoutManager.
- 211 -
211
Layout pour disposer au maximum quatre composants de taille 100x100 aux quatre coins d'un conteneur.
- 212 -
212
- 213 -
213
- 214 -
214
Les conteneurs
Panel Conteneur sans fentre propre. Permet d'ordonner les composants graphiques. Fentre principale sans cadre ni menu.
Window
Frame
Fentre possdant toutes les fonctionnalits (barre de titre, barre de menus, forme du curseur, etc.) Permet de raliser des botes de dialogue. Ncessite une frame
- 215 -
Dialog
215
La classe java.awt.Panel Un "Panel" est un container sans fentre propre. Il dispose de son propre layout
(java.awt.FlowLayout par dfaut).
- 216 -
216
Exemple de Panel
package panel; import java.applet.* ; import java.awt.* ; 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 Haut.add (new Label ("Entrer les valeurs RGB")) ; Milieu.setLayout (new FlowLayout ()) ; // Valeur par defaut Milieu.add (new Label ("R")) ; Milieu.add (new TextField (5)) ; Milieu.add (new Label ("G")) ; Milieu.add (new TextField (5)) ; Milieu.add (new Label ("B")) ; Milieu.add (new TextField (5)) ; add ("North",Haut) ; add ("Center",Milieu) ; } }
- 217 -
217
- 218 -
218
- 219 -
219
Exemple de Frame
package frame ; import java.applet.* ; import java.awt.* ; 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) ; } }
- 220 -
220
- 221 -
221
Les botes de dialogues Les botes de dialogue s'appuie sur les frames pour
disposer de leur propre fentre.
Une bote de dialogue peut tre modale ou non S'appuyant sur une frame, une bote de dialogue
dispose de son propre layout (java.awt.BorderLayout par dfaut).
public Dialog (Frame parent, boolean modal) public Dialog (Frame parent, String title ,boolean modal)
- 222 -
222
Exemple de Dialog
package dialog; import java.applet.*; import java.awt.*; 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) ; } }
- 223 -
223
- 224 -
224
Les menus
Le package java.awt propose des classes permettant de crer des barres de menu dans des frames et des "Popup Menu" Classes du package java.awt utiliser : Menu, MenuItem, MenuBar, PopupMenu,CheckBoxMenuItem, MenuShortCut Une barre de menu est positionne par la mthode setMenuBar () de la classe java.awt.Frame. Un "popup menu" est ajout un composant grce la mthode void add (Popup menu) de la classe java.awt.Component et est rendu visible grce la mthode void show (Component origin, int x, int y) de la classe java.awt.PopupMenu. La mthode setEnabled (boolean) de la classe java.awt.Component permettent de rendre sensitif/insensitif une option ou sous option de menu. Les sous options de menu peuvent tre spares par un trait horizontal par ajout d'un MenuItem spcial (new MenuItem ("-") ;) ou par les mthodes void addSeparator () ou void insertSeparator (int index) de la classe java.awt.Menu.
- 225 -
225
- 226 -
226
- 227 -
227
- 228 -
228
popup menu
- 229 -
229
230
(3)
(2)
- 231 -
231
java.util.EventObject
Mthodes
public EventObject (Object source)
Les Mthodes de
Description
Constructeur; prend en paramtre lobjet source de lvnement. Renvoie lobjet qui a gnr lvnement. Renvoie une chane de caractres caractrisant lobjet.
- 232 -
232
Certains
233
Exemple d'vnement
L'objet thermomtre s'enregistre auprs de l'objet temprature pour tre inform des changements. Objet thermomtre; actualise son affichage chaque vnement TempChangeEvent reu
- 234 -
234
La classe "TempChangeEvent"
package thermometre; public class TempChangeEvent extends java.util.EventObject { protected double temperature; public TempChangeEvent(Object source, double temperature) { super(source); this.temperature = temperature; } public double getTemperature() { return temperature; } }
- 235 -
235
L'interface "TempChangeListener"
package thermometre; public interface TempChangeListener extends java.util.EventListener { void tempChange(TempChangeEvent evt); }
- 236 -
236
- 237 -
237
- 238 -
238
La classe "Temperature"
//Thread pour modifier la temprature et //gnrer des vnements TempChangeEvent public void run () { while (true) { try { TemperatureCourante = 20 * Math.random() ; notifyTemperatureChange () ; Thread.sleep (60000) ; } catch (InterruptedException e) {} TemperatureCourante += 1 ; } } }
3/3
- 239 -
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) { System.out.println (evt.getTemperature()) ; } static public void main (String args []) { new Thermometre () ; } }
- 240 -
240
Tous
les vnements et les interfaces listener sont dj rpertoris et dpendent du type de composants graphiques utiliss.
- 241 -
241
242
KeyListener
- 243 -
243
MouseMotionListener
WindowListener
244
Association source-rcepteur
- 245 -
245
- 246 -
246
- 247 -
247
- 248 -
248
Adaptateurs d'vnements
- 249 -
249
Les adaptateurs
Le package java.awt.event contient des adaptateurs (adapters) qui sont des classes implmentant les couteurs et fournissant des amorces vides des mthodes :
Exemple :
import java.awt.event.* ; class GestionSouris extends MouseAdapter { public void mousePressed (MouseEvent e) {} // On n'est pas oblig d'crire les autres mthodes }
- 250 -
250
251
Le package javax.swing
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 252 -
252
Prsentation de Swing
Swing propose de nouvelles classes et interfaces pour construire des interfaces graphiques. Le package javax.swing est inclus dans la jdk depuis la version 1.2 de Java. Swing utilise le mme mcanisme de gestion d'vnement que le package java.awt. Swing propose de trs nombreux composants et une apparence modifiable la vole (Windows, Motif, Metal).
- 253 -
253
Quelques apparences
- 254 -
254
- 255 -
255
La racine de l'arborescence des classes et interfaces de Swing est la classe JComponent (analogue et hritant de java.awt.Component). Les composants sont des beans. Les composants n'ont pas de partie native (sauf JApplet, JDialog, JFrame, JWindow). Le bord des composants peut tre chang.
- 256 -
256
D'un composant racine (toplevel) D'un ou de plusieurs containers De composants au sein des containers
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 257 -
257
- 258 -
258
259
Les composants utilisent les mmes classes de layout que les composants AWT. 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. Un nouveau container: javax.swing.box utilisant le layout prcdent proposant des mthodes statiques de cration de composant invisible redimensionnable ("glue") ou non redimensionnable ("strut").
- 260 -
260
- 261 -
261
- 262 -
262
Le modle MVC
Model: contient les donnes et fournit pour y accder en consultation et modification. View: reprsentation graphique des donnes et rception d'vnements Controler: gestion des vnements
- 263 -
263
Le modle MVC
Les composants Swing vont souvent proposer des interfaces spcifiques pour stocker les donnes. Exemples:
JList propose ListModel JTextComponent et ses sous-classes proposent Document JTree propose TreeModel JTable propose TableModel
- 264 -
264
Vue et contrleur
demande donnes
Modle TableModel
renvoie donnes
support externe
- 265 -
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(); this.nom = 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) { this.nom = nom;} public float getSalaire() { return salaire;} public void setSalaire(float salaire) { this.salaire = salaire; } }
- 266 -
266
Exemple de TableModel
package testswing; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class TableauModel extends AbstractTableModel { ArrayList<Employe> donnees ; String [] ColumnNames = { "Nom Employe", "Salaire", "Etat Marital" } ; Class ColumnTypes [] = { String.class, Float.class, Boolean.class } ; public TableauModel () { donnees = new ArrayList<Employe> () ; initialiser () ; } private void initialiser (){ donnees.add (new Employe ("Dupont Marcel",1500.0f,true)) ; donnees.add (new Employe ("Durand Pascal",2000.0f,false)) ; } public int getColumnCount() { return ColumnNames.length; } public int getRowCount() { return donnees.size () ; } 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 donnees.get(row) .getNom() ; case 1: return donnees.get(row) .getSalaire () ; case 2: return donnees.get(row).getMarital () ; } } }
- 267 -
267
Exemple de TableModel
- 268 -
268
Modification de la classe TableauModel pour rendre la colonne "Etat Marital" modifiable et rpercuter 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) donnees.get(row).setMarital( (Boolean) value) ; }
- 269 -
269
Un objet TableModel peut avoir des listeners implmentant TableModelListener. L'interface TableModelListener possde les mthodes suivantes:
Mise jour de la cellule spcifie Mise jour de la ligne spcifie Mise jour de la table complte Nouvelles lignes insres Lignes existantes supprimes Invalide la table entire (donnes et structures)
- 270 -
270
public void actionPerformed(ActionEvent arg0) { for (int i = 0 ; i != donnees.size() ; i++) { donnees.get(i).setMarital (false) ; this.fireTableChanged(new TableModelEvent (this,i)); } }
- 271 -
271
- 272 -
272
Pour des raisons de performances on n'alloue pas n composants graphiques pour un tableau de n cellules. Le tableau va consulter un renderer pour savoir comment dessiner la cellule (i,j).
- 273 -
273
Les composants complexes JList, JTable, JTree possdent un renderer par dfaut:
JList: DefaultListCellRenderer (implmentant ListCellRenderer) JTable: DefaultTableCellRenderer (implmentant TableCellRenderer) JTree: DefaultTreeCellRenderer (implmentant TreeCellRenderer).
- 274 -
274
Sur la 1re colonne du tableau, on souhaite n'afficher que le nom de famille en majuscule, le nom complet dans une infobulle et des caractres rouge quand la cellule est slectionne.
- 275 -
275
- 276 -
276
Swing et Threads
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 arrire plan pour la rcupration de la mmoire (garbage collector). Thread de gestion d'vnements et de raffichage des composants (event dispatch thread).
- 277 -
277
Swing et threads
Un composant swing peut tre manipul par n'importe quel thread tant qu'il n'a pas t ralis (pack ou setVisible (true)). Ensuite toutes les modifications doivent tre effectues par le thread de gestion d'vnements (la plupart des mthodes de swing ne sont pas "thread safe"). Problmes:
Une application peut tre nativement multithread. Comment un thread peut modifier un composant swing ? Si un vnement dclenche un traitement trs long, il faut le dporter dans un thread pour ne pas geler l'interface; ce thread peut ensuite avoir besoin de modifier un composant swing.
- 278 -
278
Swing et threads
La classe javax.swing.SwingUtilities propose des mthodes statiques permettant d'excuter du code dans le thread de gestion d'vnement:
279
public void actionPerformed(ActionEvent evt) { jBloque.setText("en cours") ; try { Thread.sleep (3000) ; } catch (Exception e) {} jBloque.setText("bloque") ; } - Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
bloque interface
- 280 -
280
try { Thread.sleep (3000) ; } catch (Exception e) {} Runnable modifiejBloque = new Runnable () { public void run () { jBloque.setText("bloque") ; } }; SwingUtilities.invokeLater(modifiejBloque) ; } }
281
La classe SwingWorker
La version 6 de Java propose la classe abstraite SwingWorker proposant 2 types paramtrs pour faciliter l'criture des applications swing multithread. Quelques mthodes intressantes:
- 282 -
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() ; } });
- 283 -
283
Java et la scurit
- 284 -
284
Java et la scurit
La scurit a toujours t prsente dans la conception de
Java.
- 285 -
285
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
- 286 -
286
La "sandbox" java
La scurit java est axe autour d'une "sandbox" qui va
tablir le contour de l'environnement auquel peut accder l'application.
Une application peut dfinir sa politique de scurit Une applet est tributaire de la politique de scurit
dfinie par le navigateur qui l'a charge.
287
Les
applets sont soumises nombreuses restrictions: Pas d'accs au disque dur local de l'utilisateur. Pas
de
de connexion sur une machine autre que le serveur WWW d'origine de l'applet. de lancement de programme sur la machine de l'utilisateur.
Pas
288
code local
code distant
sandbox
JVM
Ressources (fichiers, )
- 289 -
289
code local
sandbox
JVM
Ressources (fichiers, )
- 290 -
290
rgles
loader
sandbox
JVM
Ressources (fichiers, )
- 291 -
291
java 1.0: sandbox trs restrictive. java 1.1: principe du tout ou rien selon que la signature lectronique est utilise ou non. java 1.2: principe du moindre privilge. Une stratgie de scurit pourra tre applique une application ou une applet en fonction de son origine, de l'identit du tiers certificateur.
Exemple:
Accorder toutes les applets de http://www.trusted.com la permission de lire les fichiers du rpertoire c:\temp. Accorder toutes les applets la permission de se connecter sur n'importe quelle machine. etc.
- 292 -
292
java.io.FilePermission (read,write,delete,execute)
java.net.SocketPermission (accept,connect,listen,resolve)
java.awt.AWTPermission (accessClipboard, )
- 293 -
293
Crer ou modifier le fichier de stratgie systme <java.home>\lib\security\java.policy. Donner la proprit systme java.policy le nom d'un autre fichier de stratgie de scurit. Crer ou modifier le fichier de stratgie utilisateur dans <user.home>\java.policy. Dfinir une autre valeur pour la proprit java.policy en utilisant l'option -D de la ligne de commande:
java -Djava.policy="test.policy" Test
Changer la classe utilise dans le fichier <java.home>\lib\security\java.security en changeant la ligne policy.provider=java.security.PolicyFile en policy.provider=AutreClasse.
- 294 -
294
}; Exemple: grant SignedBy "Jean,Fred", CodeBase http://www.trusted.com { permission java.io.permission "c:\\temp\\*", "read" ; };
- 295 -
295
Exemple d'applet
package ecritfichier; import java.applet.Applet; import java.io.* ; public class EcritFichier extends Applet { public void init () { try { FileWriter fichier = new FileWriter ("c:\\temp\\test.txt") ; BufferedWriter buffer = new BufferedWriter (fichier) ; fichier.write("test ecriture") ; fichier.flush() ; fichier.close () ; } catch (IOException e) { System.err.println ("Erreur fichier: " + e.getMessage () ) ; } } }
- 296 -
296
Excution de l'applet
- 297 -
297
Cration du fichier <java.home>\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 java.io.FilePermission "c:\\temp\\*", "write"; };
- 298 -
298
Signature de l'applet
Signature de l'applet:
Signature
- 299 -
299
- 300 -
300
Obfuscation de code
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 301 -
301
Obfuscation de code
Aprs compilation d'un fichier source java, beaucoup d'informations sont stockes dans les fichier de bytecode. La dcompilation permet de rcuprer le code source intgralement (sans les commentaires ;) Il est donc ncessaire de brouiller le code avant diffusion de celui-ci. Des exemples de dcompilateurs:
- 302 -
302
- 303 -
303
- 304 -
304
Zelix Class Master: http://www.zelix.com Obfuscation des noms et du code. Cryptage des chanes. Suppression des classes, mthodes, donnes non utilises. Interface graphique et langage de script ProGuard: http://proguard.sourceforge.net yGuard: http://www.yworks.com/en/products_yguard_about.htm
- 305 -
305
- 306 -
306
Programmation rseau
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 307 -
307
Client
dun objet Socket. sur le serveur.
-Connexion
-Fermeture
- 308 -
308
Quelques mthodes:
public void close(); public InetAddress getInetAddress(); public InputStream getInputStream(); public int getLocalPort(); public OutputStream getOutputStream(); public int getPort();
- 309 -
309
- 310 -
310
Quelques constructeurs:
port : count :
public ServerSocket (int port) throws IOException ; public ServerSocket (int port, int count) throws IOException ;
Quelques mthodes:
public Socket accept() ; public void close() ; public InetAddress getInetAddress() ; public int getLocalPort() ;
- 311 -
311
- 312 -
312
- 313 -
313
public DatagramSocket () ; public DatagramSocket (int port) ; public DatagramSocket (int port, InetAddr laddr) ;
Quelques mthodes:
La classe java.net.DatagramPacket contient les donnes reues ou envoyer (tableau de bytes) et l'adresse (java.net.InetAddress) de l'expditeur ou du destinataire.
- 314 -
314
- 315 -
315
- 316 -
316
- 317 -
317
- 318 -
318
public URL (String spec) ; public URL (String protocol, String host, int port, String file) ;
Protocole + Nom machine + Nom fichier http,ftp,gopher,file Nom de la machine distante Port de communication Nom complet du document
Quelques mthodes:
java.net.URLConnection est une classe abstraite qui est utilise comme classe de base de java.net.HttpURLConnection
- 319 -
319
320
URL
readLine ()
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 321 -
321
- 322 -
322
323
Gnralits
Les approches traditionnelles pour dvelopper des applications rseaux base de sockets sont lourdes. Les RMI vont permettre de distribuer une application sur plusieurs machines. Une application fera appel des mthodes sur des objets localiss sur des machines distantes. RMI se charge de faire transiter les paramtres et la valeur de retour. Les communications pourront tre scurises grce un objet RMISecurityManager.
- 324 -
324
Architecture
Architecture RMI Architecture locale Application (client) Application
Objet
couche intermdiaire
Objet (serveur)
- 325 -
325
Architecture RMI
- 326 -
326
Stub
Classe spciale gnre par la commande rmic. Transforme un appel de mthode en une suite d'octets envoyer sur le rseau (marshaling). Reconstruit le rsultat reu sous le mme format (unmarshaling) Format d'un appel de mthode: identificateur de l'objet distant identificateur de la mthode paramtres srialiss
- 327 -
327
Skeleton
Classe spciale gnre par la commande rmic (cette classe n'est plus gnre depuis la version 1.2 du protocole). Reoit la demande d'invocation distante. Reconstruit les paramtres. Trouve l'objet distant et appelle la mthode. Retourne le rsultat.
- 328 -
328
Un objet distant se manipule comme un objet local. L'invocation d'une mthode distante est identique l'invocation d'une mthode locale. Les paramtres d'un appel distant et le rsultat renvoy sont transmis:
par valeur pour les types scalaires par recopie sous format srialiss pour les objets
Si le fichier .class correspondant un type de paramtre ou de la valeur de retour n'est pas disponible localement, il est charg dynamiquement (RMIClassLoader).
- 329 -
329
Si le client est une applet, toutes les classes apparaissant dans le code du client sont charges depuis le codebase spcifi par la proprit java.rmi.server.codebase. Si le client est une application, les classes seront recherches: dans le CLASSPATH l'URL spcifie par java.rmi.server.codebase Une classe peut tre charge explicitement:
- 330 -
330
Interface java.rmi.Remote
Linterface distante doit tre publique et hriter de java.rmi.Remote Chaque mthode de linterface distante doit dclarer java.rmi.RemoteException dans sa clause throws. Un objet distant pass en argument ou en valeur de retour doit tre dclar en tant quinterface distante.
- 331 -
331
Interface java.rmi.Remote
Linterface tendant linterface java.rmi.Remote permet de marquer les mthodes distantes mises disposition du client.
- 332 -
332
RMI ct serveur
Le serveur doit contenir une classe qui tende java.rmi.server.UnicastRemoteObject (qui utilise les classes Socket et ServerSocket) et qui implmente linterface prcdente. Le constructeur de cet objet distant doit tre dfini explicitement (il doit mettre java.rmi.RemoteException). Une ou plusieurs instances de lobjet distant doivent tre crs. Les instances cres doivent tre enregistres auprs du registre dobjets distants. La classe java.rmi.Naming permet darchiver, de lister, et de rcuprer des objets auprs dun registre. Lorsque quun client transmet une URL rmi://domaine/ObjetDistant , une rfrence est transmise en retour (en fait une rfrence sur une portion de code local capable de communiquer travers le rseau).
- 333 -
333
RMI ct serveur
import java.rmi.server.* ; import java.rmi.* ; import java.net.* ; 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) ; System.out.println ("Serveur pret") ; } catch (RemoteException e) { System.err.println ("RemoteException "+e) ; } catch (MalformedURLException e) { System.err.println ("Malformed "+e) ;} } } - Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 334 -
334
RMI ct serveur
Compilation: javac serHello.java Gnration du stub et du squelette: rmic serHello Fichiers gnrs: Hello.class serHello.class
[serHello_Skel.class] serHello_Stub.class
Lancement du registre Naming (port par dfaut: 1099): start rmiregistry (windows) rmiregistry & (unix) Par programme: LocateRegistry.createRegistry (port) Lancement de lapplication: java -Djava.security.policy=java.policy serHello Fichier java.policy: grant { permission java.net.SocketPermission "*:1024-65535", "accept, listen, connect, resolve"; };
- 335 -
335
RMI ct client
Le programme client doit rechercher et rapatrier linterface distante. Les mthodes distantes peuvent ensuite tre excutes.
- 336 -
336
RMI ct client
import java.rmi.* ; public class cliHello { public static void main (String args []) { System.setSecurityManager(new RMISecurityManager ()) ; try { Hello h = (Hello) Naming.lookup (rmi://e450c.ecole.ensicaen.fr/bonjour") ; String message = h.envoieHello () ; System.out.println ("recu : " + message) ; } catch (Exception e) { System.err.println ("Exception : " + e) ; } } }
- 337 -
337
Interaction client/serveur
Client
Client Hello Lookup(): o est Hello ?
Serveur
Registre
HelloImpl_Stub.class
stub
envoieHello ()
HelloImpl_Skel.class
- 338 -
338
ANT
- 339 -
339
ANT
Projet du groupe Apache-Jakarta pour permettre la construction d'applications (compilation, dploiement, ). Site officiel: http://jakarta.apache.org/ant 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. Excution de ant:
ant [-buildfile fichier.xml] [cible]
- 340 -
340
Le fichier de configuration propose un ensemble de cibles. Une cible contient une ou plusieurs tches excuter. Les cibles peuvent tre dpendantes entre elles.
- 341 -
341
342
La balise <project>
name: nom du projet default: dtermine la cible par dfaut basedir: indique le rpertoire racine pour tous
les rpertoires utiliss par leur nom relatif
Exemple:
<project name="nomprojet" default="compile" basedir=".">
- 343 -
343
Les commentaires
Les commentaires sont inclus dans les balises <!-- et --> Exemple:
344
Les proprits
Les proprits permettent de dfinir des variables qui pourront tre utilises dans le projet Les proprits peuvent tre dfinies sur la ligne de commande (option -D) ou par la balise <property> Exemple:
<property name="repertoire" value="travail" /> <property file="proprietes.properties />
- 345 -
345
Proprits prdfinies
basedir ant.file ant.java.version chemin absolu du rpertoire de travail (dfini dans la balise <project>) chemin absolu du fichier de configuration numro de version de la JVM excutant ant
346
Les cibles
La balise <target> permet de dfinir une cible constitue par un certain nombre de tches. La balise <target> possde plusieurs attributs:
name description if
obligatoire. nom de la cible optionnel. description de la cible optionnel. conditionne l'excution l'existence d'une proprit
- 347 -
347
Les tches
Une tche est une unit de traitement excuter. Une tche est une classe Java implmentant l'interface org.apache.ant.Task De nombreuses tches sont dfinies dans ant (pour en connatre la liste il faut se rfrer la documentation fournie avec ant ou l'adresse http://ant.apache.org/manual/index.html). Les tches prdfinies permettent le dveloppement java, la manipulation du systme de fichiers, des archives, etc.
- 348 -
348
- 349 -
349
350
Cest une API java qui permet aux applications java de communiquer avec les gestionnaires de base de donnes dans un langage universel (comparable ODBC). Les applications peuvent ainsi tre indpendantes de la base de donnes utilises. Un pilote JDBC permet:
Etablir une connexion avec une base de donnes. Envoyer des requtes SQL. Traiter les rsultats.
- 351 -
351
Architecture dutilisation
Application Java Application/Applet java http, rmi, corba JDBC Protocole propritaire Serveur JDBC Protocole propritaire
Base de donnes
Base de donnes
Modle 2/3
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
Modle 3/3
- 352 -
352
Le package java.sql
Les interfaces
Statement Connection ResultSet ResultSetMetaData DatabaseMetaData
Driver
PreparedStatement
CallableStatement
- 353 -
353
Le package java.sql
Les classes
java.lang.Object
java.util.Date
DriverManager
DriverPropertyInfo
Types
Date
Time
TimeStamp
- 354 -
354
Pilotes JDBC
Il est ncessaire de disposer du pilote JDBC pour interagir avec la base de donnes. Un pilote JDBC peut tre commercial (exemple: Oracle) ou gratuit. Une liste de pilotes est disponible ladresse:
http://industry.java.sun.com/products/jdbc/drivers
- 355 -
355
Pilotes JDBC
- 356 -
356
Application
DriverManager
Pilote Oracle
Pilote MySql
Oracle
MySql
- 357 -
357
Classes de connexion
java.sql.Driver Interface devant tre implmente par les classes de chargement des pilotes JDBC.
java.sql.DriverManager
Un objet DriverManager va tenter de localiser le pilote JDBC et charger les classes correspondantes.
java.sql.Connection
Un objet Connection reprsente le lien entre lapplication et la base de donnes. Toutes les requtes SQL transmises et le retour des rsultats seffectueront travers cet objet.
- 358 -
358
Exemple de connexion
private Connection Conn ; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); } catch (Exception e) { System.err.println(" Probleme avec le driver JDBC: " + e); return ; } try { Conn = DriverManager.getConnection("jdbc:mysql://e450c.ecole.ensicaen.fr/",<login>,<password>) ; } catch (SQLException e) { System.err.println("Probleme ouverture: " + e) ; return ; }
- 359 -
359
java.sql.ResultSet
Une instance de cette classe contient une range de donnes extraite de la base par une requte SQL et offre plusieurs mthodes charges den isoler les colonnes. La notation suivante est utilise: <type> get<type> (int | String) Exemple: String getString ( title ) A un instant donn, un objet ResultSet ne peut contenir plus dune range mais propose une mthode next() permettant de rfrencer la range suivante. Cette classe est utilise pour pouvoir envoyer au gestionnaire de base de donnes une requte SQL pour interprtation mais non pour excution. Cette requte peut contenir des paramtres qui seront renseigns ultrieurement.
java.sql.PreparedStatement
- 360 -
360
Exemple de code
Statement stmt = conn.createStatement () ; ResultSet rs = stmt.executeQuery ( SELECT a,b,c FROM Table1 ) ; while (rs.next ()) { int x = rs.getInt ("a") ; String s = rs.getString ("b") ; float f = rs.getFloat ("c") ; }
- 361 -
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 () }
- 362 -
362
Aspect transactionnel
Par dfaut, les oprations sur la base de donnes sont en mode auto-commit. Dans ce mode, chaque opration est valide unitairement pour former la transaction. Pour rassembler plusieurs oprations en une seule transaction:
connection.setAutoCommit(false); connection.commit () ;
Retour en arrire:
connection.rollback ();
- 363 -
363
JavaBeans
- 364 -
364
Programmation Traditionnelle
Limites:
Tout est la charge du programmeur Peu dabstraction pour limiter la complexit Maintenance et volution difficiles Besoins de comptences techniques Fiabilit incertaine Accroissement du temps de dveloppement et de maintenance
Consquences:
- 365 -
365
Modules rutilisables Les constituants sont reprsents en classes Hritage entre classes La rutilisation des modules demandent des connaissances techniques Le code explicite les interconnexions entre modules
- 366 -
366
Un composant est une pice logicielle autonome. Une application pourra tre conue par assemblage de composants. Une application pourra tre construite par des non-informaticiens. volution plus rapide des applications.
- 367 -
367
Son implmentation nest pas requise (bote noire). Il exporte les interfaces fournies et requises. Interconnectable avec dautres composants (inconnus priori). Configurable, diffusable. Autodescriptif.
- 368 -
368
Le modle JavaBean
Un JavaBean est un modle de composants logiciels pour plate-formes JAVA. Un Javabean est rutilisable et peut tre manipul visuellement par un outil de construction de programmes. Un JavaBean est simple crer et utiliser. Un JavaBean est portable sur toute plateforme supportant lenvironnement JAVA. Ce modle est disponible depuis la JDK 1.1
- 369 -
369
Type de beans
Bean Visuel
Boutons, icnes,
Bean composite
- 370 -
370
Ses proprits Les mthodes exportes Les vnements quil peut mettre et recevoir
Un bean peut tre connect dautres beans La communication entre beans repose sur le modle vnement/action
- 371 -
371
Un bean doit:
372
Exemple: la beanbox
373
conventions dcriture. ventuellement une classe sans convention dcriture mais implmentant linterface java.beans.BeanInfo
374
- 375 -
375
- 376 -
376
Fichiers .class (classe du bean, classe beaninfo, ) Fichiers daide en html Fichiers de ressources (icnes, sons, images, )
- 377 -
377
Archive java
Une archive java est fichier .jar au format Zip contenant des fichiers compresss de natures diverses et un fichier MANIFEST.MF. Caractristiques des archives java:
Il existe des API pour grer des fichiers archives java (depuis la version 1.1)
- 378 -
378
Le fichier MANIFEST.MF
Dun numro de version Dune liste dinformations pour chaque version respectant la structure suivante: Name : Nom_Fichier Attribut1 : valeur1 Attribut2 : valeur2
Le fichier MANIFEST.MF est construit de faon automatique par loutil darchivage, ventuellement partir dun autre fichier MANIFEST.MF renseignant des attributs spcifiques.
- 379 -
379
- 380 -
380
3 Attributs supplmentaires:
- 381 -
381
Exemple: CounterBean
Fichier: CounterBean.mf Manifest-Version: 1.0 Name: counterbean/CounterBean.class Java-Bean: True Commande darchivage:
jar cvfm Counter.jar CounterBean.mf counterbean/*.class
- 382 -
382
Manipulation de CounterBean
Mthodes exposes par CounterBean - Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 383 -
383
- 384 -
384
Possibilits offertes:
Un bean peut mettre plusieurs types dvnements diffrents. Un bean rcepteur peut sabonner auprs de plusieurs beans. Un bean peut tre la fois metteur et rcepteur dvnements. Unicast: un metteur et un seul rcepteur Multicast: un metteur et plusieurs rcepteurs
- 385 -
385
Les vnements mis par un bean sont dfinis par lexistence de mthodes dabonnement/dsabonnement respectant des conventions prcises dcriture. Les vnements sont reprsents par des objets. La notification dun vnement un bean rcepteur est ralise par envoi de messages. La signature de la mthode invoque lorsquun vnement survient est spcifie par une interface Java que doivent implanter les beans intresss.
- 386 -
386
Mise en uvre
public interface EventListener { Source void handleEvent (Event e) ; }
implmente
- 387 -
387
La classe du bean doit comporter deux mthodes publiques pour labonnement et le dsabonnement des autres beans. La signature de ces deux mthodes doit respecter les conventions dcritures suivantes:
Si E est un vnement multicast: void addEListener (EListener l) void removeEListener (EListener l) Si E est un vnement monocast: void addEListener (EListener l) throws java.util.TooManyListenerException void removeEListener (EListener l)
- 388 -
388
MaxCounterEvent
AlertBean
- 389 -
389
Mthodes dabonnement/dsabonnement
private MaxCounterEventListener maxCounterListener ; public void addMaxCounterEventListener (MaxCounterEventListener mcel) throws java.util.TooManyListenersException { if (maxCounterListener != null) throw new java.util.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 ; }
- 390 -
390
Les vnements
Un vnement mis par un bean est reprsent par un objet Rgles pour la dfinition dune classe dvnement:
Le nom de la classe est suffix par Event La classe doit hriter de java.util.EventObject
Dans le cas dun bean visuel, les vnements peuvent tre ceux de lawt.
- 391 -
391
Exemple dvnement
import java.util.EventObject; public class MaxCounterEvent extends EventObject { private int CurrentValue ; public MaxCounterEvent(Object source,int cv) { super (source) ; CurrentValue = cv ; } public int getValue () { return CurrentValue ; } }
- 392 -
392
Notification de lvnement
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); } }
- 393 -
393
Interface de notification
Une interface de notification sert spcifier la signature de la mthode invoque par le bean metteur lorsque lvnement se produit. Rgles pour la dfinition de linterface:
Le nom de linterface est compos du nom de lvnement suffix par le mot Listener Linterface doit hriter de java.util.EventListener Lvnement correspondant peut tre transmis en paramtre (pas obligatoire).
- 394 -
394
Exemple dinterface
import java.util.EventListener; public interface MaxCounterEventListener extends EventListener { public void maxReached (MaxCounterEvent e) ; }
- 395 -
395
Bean rcepteur
- 396 -
396
- 397 -
397
CounterBean
- 398 -
398
CounterBean
MaxCounterEvent
- 399 -
399
Interactions
CounterBean addMaxCounterEventListener AlertBean
maxReached (MaxCounterEvent)
removeMaxCounterEventListener
- 400 -
400
Proprits de beans
Affectant son comportement ou son apparence Reconnus par les environnements dassemblage visuel Manipulables par programme en invoquant les mthodes
Les proprits font gnralement partie de ltat persistant dun objet. Une proprit est dfinie par lexistence de mthodes publiques respectant des conventions prcises dcriture. 3 modes daccs possibles aux proprits: lecture, criture, lecture/criture. 4 types de proprits disponibles:
- 401 -
401
Proprit scalaire
Une proprit scalaire reprsente une valeur simple dun certain type. Mthodes daccs pour une proprit P de type T:
public T getP ( ) Lecture public void setP (T valeur) Ecriture Si T est boolean, la mthode de lecture peut
scrire: public boolean isP ( )
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 402 -
402
Exemple CounterBean
private int max = 5 ; public int getMax () { return max ; } public void setMax (int m) { max = m ; }
- 403 -
403
Exemple CounterBean
- 404 -
404
Proprit indexe
Une proprit indexe reprsente un tableau de valeurs ayant le mme type Mthodes daccs pour une proprit 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 Suprieure d'Ingnieurs de Caen - dp - 405 -
405
Proprit lie
Une proprit lie est une proprit dun bean dont le changement de valeur est notifi par vnement des beans abonns. Lvnement mis est PropertyChangeEvent Un bean supportant des proprits lies doit implanter les mthodes dabonnement et de dsabonnement: void addPropertyChangeListener (PropertyChangeListener l) void removePropertyChangeListener (PropertyChangeListener l) Les beans notifis doivent implanter linterface suivante:
public interface PropertyChangeListener extends java.util.EventListener { public void propertyChange (PropertyChangeEvent e) }
- 406 -
406
Lors du changement dune proprit, les mthodes propertyChange des beans abonns est invoque avec en argument un objet PropertyChangeEvent. Cet vnement encapsule le nom de la proprit, lancienne 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(); }
- 407 -
407
Gestion de la notification
Au niveau du bean metteur, la notification peut tre dlgue une instance de la classe PropertyChangeSupport. Aspects grs:
Aperu 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); }
- 408 -
408
Interactions
new bean PropertyChangeSupport Bean rcepteur
- 409 -
409
CounterBean
La proprit Max devient une proprit lie. Si Max change, le compteur (variable value) revient 0. Dans cet exemple, le bean CounterBean est la fois metteur et rcepteur.
- 410 -
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 () ; }
- 411 -
411
Proprit contrainte
Une proprit contrainte est une proprit dun bean dont le changement de valeur est soumis dautres beans abonns ayant un droit de vto. Le propritaire doit dclencher un VetoableChangeEvent avant de modifier la proprit. Si aucun bean ne la rejette, la proprit peut tre change.
setP (v) Dtenteur de proprits Dclenche PropertyVetoException si la modification est rejete Dclenche PropertyVetoException si la modification est rejete VetoableChangeListeners
vetoableChange ( )
- 412 -
412
Proprit contrainte
Un bean supportant les proprits contraintes doit implanter les mthodes dabonnement/dsabonnement:
void addVetoableChangeListener (VetoableChangeListener l) void removeVetoableChangeListener (VetoableChangeListener l)
- 413 -
413
Demande de changement
Avant le changement de valeur, la mthode vetoableChange des beans abonns est invoque avec un vnement de type PropertyChangeEvent. Si lun des beans lve une exception de type PropertyVetoException, la proprit nest pas change. Classe PropertyVetoException:
public class PropertyVetoException extends Exception { public PropertyVetoException(String msg,PropertyChangeEvent e); public PropertyChangeEvent getPropertyChangeEvent(); }
Dans le cas contraire, la valeur de la proprit est change et la mthode propertyChange des beans abonns est invoque.
- 414 -
414
Implmentation de la demande
Le bean dtenant la proprit contrainte peut dlguer une instance de VetoableChangeSupport. Aspects grs:
Aperu 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; }
- 415 -
415
- 416 -
416
Introspection
Un bean expose ses proprits, mthodes et vnements. Une instance de la classe java.beans.Introspector va inspecter le bean sur 2 niveaux:
Recherche dune classe nomme <classe_bean>BeanInfo (par exemple, CounterBeanBeanInfo) Sinon, le mcanisme de la rflexion de Java va tre utilis pour obtenir la liste des mthodes du bean.
- 417 -
417
Linterface BeanInfo
La classe <classe_bean>BeanInfo doit implmenter linterface BeanInfo. Cette classe ne sert qu dcrire la classe <classe_bean>. Les mthodes de BeanInfo
Mthode
getAdditionalBeanInfo () getBeanDescriptor () getDefaultEventIndex () getDefaultPropertyIndex () getEventSetDescriptors () getIcon () getMethodDescriptors () getPropertyDescriptors ()
Description
Retourne tous les objets concernant le bean associ Retourne lobjet descripteur du bean Retourne lindex des vnements par dfaut Retourne lindex des proprits par dfaut Retourne les descripteurs de lensemble des vnements Retourne licne spcifie pour le bean Retourne les descripteurs de mthodes Retourne les descripteurs de proprits
- 418 -
418
Les servlets
- 419 -
419
- 420 -
420
La mthode destroy () permet de librer les ressources acquises et ventuellement d'crire des informations persistantes qui pourront tre lues au prochain chargement de la servlet par l'une des mthodes init (). - 421 -
421
javax.servlet.GenericServlet
Une servlet gnrique doit surcharger une mthode
service (), mthode abstraite de la classe javax.servlet.GenericServlet.
- 422 -
422
javax.servlet.http.HttpServlet
Une servlet http doit surcharger une mthode doGet() ou doPost() en fonction du type de requte qu'elle aura traiter.
- 423 -
423
<form action="http://localhost:8080/FormServlet/formulaire">
Entrer votre nom: <input type=text name=nom> <input type=submit value="ok"> </form> </body> </html>
- 424 -
424
- 425 -
425
- 426 -
426
Serveur d'application
Une servlet est une application web devant tre dploye sur un serveur d'application (exemple: Tomcat).
- 427 -
427
Application web
Quand une application web est finalise, on la place dans un fichier d'archive web (extension war). Un fichier d'archive est cr avec la commande jar et possde une architecture prcise.
- 428 -
428
- 429 -
429
Le descripteur de dploiement contient toutes les informations de configuration du fichier archive. Dans le cas des servlets, il va permettre de dfinir la classe contenant la servlet, le nom de la servlet , les paramtres d'initialisation, le chemin virtuel d'accs,
- 430 -
430
Exemple web.xml
<web-app> <display-name> Test servlet Formulaire </display-name> <description> A web app </description> <servlet> <servlet-name> FormServlet </servlet-name> <servlet-class> formservlet.FormServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> FormServlet </servlet-name> <url-pattern> /formulaire </url-pattern> </servlet-mapping> </web-app>
Contexte de l'application web
- 431 -
431
- 432 -
432
- 433 -
433
Paramtres d'initialisation consultable par la mthode: getInitParameter ("nom_parametre") ; <init-param> <param-name>nom_parametre</param-name> <param-value>valeur_parametre</param-value> <description> description du parametre </description> </init-param> Gestion des erreurs: <error-page> <error-code> 404 </error-code> <location> /errors/404.html </location> </error-page> <error-page> <exception-type>javax.servler.ServletException</exception-type> <location> /errors/exception.jsp </location> </error-page> - 434 -
434
Suivi de session
Le protocole http est sans tat. Le suivi de session peut tre simul:
cookies (classe javax.servlet.http.Cookie) utilisation de la classe javax.servlet.http.HttpSession qui va permettre de stocker des objets plutt que des chanes de caractres comme les cookies.
La dure de session peut tre dfinie dans le fichier de dploiement (valeur en minute):
<session-config> <session-timout> 10 </session-timout> </session-config>
ou par appel de la mthode de HttpSession setMaxInactiveInterval (int time) dfinissant le temps maximal en secondes entre deux requtes avant que la session n'expire.
- 435 -
435
Cookies
Cration d'un cookie: mthode de HttpServletResponse response.addCookie (Cookie cookie) Rcupration de cookies: mthode de HttpServletRequest Cookie [] getCookies ()
- 436 -
436
La classe javax.servlet.http.HttpSession
- 437 -
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 Suprieure d'Ingnieurs de Caen - dp - 438 -
438
439
Les servlets peuvent partager de l'information: travers un conteneur externes (base de donnes). travers l'utilisation des contextes:
ServletContext getContext (String uri)
servlet3
440
- 441 -
441
- 442 -
442
- 443 -
443
- 444 -
444
Les servlets peuvent partager ou distribuer le contrle d'une requte grce l'interface javax.servlet.RequestDispatcher
par renvoi: une servlet peut renvoyer une requte entire sur une servlet, page jsp ou html par la mthode:
void forward (ServletRequest req, ServletResponse res)
445
- 446 -
446
Rsultat
- 447 -
447
Exemple d'inclusion
package servletscollaboration; import javax.servlet.* ; import javax.servlet.http.*; import java.io.* ; 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("/process.jsp?chaine2=argument2") ; dispat.include(request, response) ; } catch (Exception e) {} out.println ("inclusion effectuee") ; } }
- 448 -
448
449
Avantages JSP
du code HTML. des balises JSP spciales. du code java (scriptlet) directement dans la page.
Les JSP sont multi plate formes (Write Once, Run Anywhere). Les parties traitements statiques (accs des bases de donnes, ) peuvent tre dportes dans des java beans. Les JSP permettent de retourner le code HTML aux navigateurs de manire plus lgante que les servlets. Une balise JSP est une balise XML associe une classe java.
- 450 -
450
Principe JSP
- 451 -
451
conteneur de servlet
compilation servlet
- 452 -
452
Commentaires
Syntaxe:
<%--
. --%>
Les commentaires JSP ne seront pas visibles par l'option "affichage source" des navigateurs, contrairement aux commentaires HTML: <!-- ->
- 453 -
453
Balise de dclaration
Syntaxe:
<%! ...
%>
- 454 -
454
Balise d'expression
Syntaxe:
<%=
%>
Cette balise d'valuer et d'afficher la valeur d'une expression (appel simplifi de out.println () ) Exemple:
La date du jour est <%= new java.util.Date () %>
- 455 -
455
Balise de directive
Syntaxe: <%@directive ... %> La balise de directive donne des informations concernant la page jsp au moteur de jsp. Trois directives possibles:
- 456 -
456
La directive include
- 457 -
457
La directive "page"
language extends import session buffer autoFlush isThreadSafe info errorPage isErrorPage contentType langage utilis: <%@page language="java" %> super classe utilise pour la servlet gnre: <%@page extends="com.taglib..." %> importation d'un package. <%@page import java.util.*; %> Par dfaut, toutes les donnes sont disponible le temps de la session. Cette valeur peut tre mise "false" pour des raisons de performances. Dfinit la taille du cache en sortie (8kb par dfaut). Vide le cache de sortie lorsqu'il est plein. Si active, un thread sera cr pour grer la requte autorisant ainsi la servlet gnre de traiter de multiples requtes simultanment (voir transparent suivant). Permet de mettre des informations sur la page (auteur, copyright, date, ). Indique l'url d'une page afficher en cas d'exception non traite (voir exemple) Si true, la page pourra accder l'objet implicite "exception" (voir exemple) Indique le type mime et le jeu de caractres.
- 458 -
458
Les servlets gnres sont multi threads par dfaut; cela peut engendrer des conflits d'accs des donnes partages. Solution 1: <%@page isThreadSafe="false" %>
Solution 2:
<% synchronized (application) { SharedObject foo = (SharedObject) application.getAttribute("sharedObject"); foo.update(someValue); application.setAttribute("sharedObject",foo); } %>
- 459 -
459
Il est important d'intercepter les exceptions non traites, notamment les "run time exceptions":
<%@page isErrorPage="false" errorPage="exception.jsp" %>
Pour accder l'objet implicite "exception", la page exception.jsp doit implmenter la balise:
<%@ page isErrorPage="true" %>
- 460 -
460
Fichier jsp:
<%@page isErrorPage="false" errorPage="error.jsp" %> <%= java.lang.Integer.parseInt ("2.34") %>
Fichier error.jsp:
<%@page isErrorPage = "true" %> <H1> Une erreur fatale est intervenue: <%= exception.getMessage () %> </H1>
Rsultat:
- 461 -
461
Scriplets
%>
<% for (int i = 1 ; i < 4 ; i++) { %> <H<%= i %>>Bonjour </H<%= i %>> <% } %>
- 462 -
462
Balise de redirection
<jsp:forward page= nom_page" />
Exemple:
<jsp:forward page="retry.jsp" />
- 463 -
463
Les objets crs au sein d'une page JSP peuvent avoir diffrentes portes:
application Objets accessibles aux pages appartenant la mme application Objets accessibles aux pages appartenant la mme session que les pages o ils ont t crs. Objets accessibles uniquement dans les pages excutant la requte qui les ont cres. objets accessibles uniquement dans la page o ils ont t crs.
session
request
page
- 464 -
464
page 1
porte de page
page 2
porte de page
page 3
porte de page
page 4
porte de page porte de requte
- 465 -
465
- 466 -
466
- 467 -
467
Exemple:
package testpackage ; public class InfoBean implements java.io.Serializable { private String nom ; public InfoBean () { nom = null ; } public InfoBean (String n) { nom = n ; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } }
- 468 -
468
La balise <jsp:useBean>
- 469 -
469
La balise <jsp:setProperty>
- 470 -
470
Exemple
<HTML> <FORM ACTION="form.jsp"> <INPUT TYPE="Text" NAME="nom" /> <INPUT TYPE="Submit" /> </FORM> </HTML> form.html <HTML> <jsp:useBean id="InfoBeanId" scope="request" class="testpackage.InfoBean"> <jsp:setProperty name="InfoBeanId" property="*"/> Identification du champ nom du </jsp:useBean> formulaire avec la proprit nom de Bonjour <%= InfoBeanId.getNom () %> InfoBean <br> Salut <jsp:getProperty name="InfoBeanId" property="nom"/> </HTML> form.jsp
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp - 471 -
471
Excution de l'exemple
- 472 -
472
<jsp:useBean id="InfoBeanId" scope="session" class="testpackage.InfoBean" /> <jsp:setProperty name="InfoBeanId" property="*"/> Le setProperty est excut ici inconditionnellement.
- 473 -
473
474
Pourquoi JNI
Les bibliothques java ne supporte pas les fonctionnalits dpendantes de la plate forme et requises par lapplication (adressage physique, accs au matriel, interruption, ). Dvelopper en C/C++ tout en bnficiant de lIHM java. Rendre accessible au code java une bibliothque existante dans un autre langage. Utiliser du code natif pour acclrer le temps dexcution. La portabilit est annule. La scurit et la robustesse deviennent moindres.
Quelques consquences:
- 475 -
475
Prsentation de JNI
Il est possible:
Dappeler des fonctions C/C++ depuis Java. Daccder des objets Java depuis le C/C++. Dcrire des mthodes natives Dappeler des mthodes java De capturer et de dclencher des exceptions De charger des classes
JNI permet:
- 476 -
476
Mthodologie:
- 477 -
477
JavaVersC.java
- 478 -
478
javah -jni JavaVersC Gnration 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
- 479 -
479
bonjour.c
-
JNIEnv *env Ce pointeur est un point dentre dans le thread courant au sein de la machine Java jobject j Rfrence sur lobjet qui a appel la mthode native.
- 480 -
480
sous Solaris:
Compilation
javac JavaVersC.java
sous Linux
- 481 -
481
- 482 -
482
Excution:
java cp . -Djava.library.path=. JavaVersC
- 483 -
483
JNI tablit une correspondance entre les types java et les types natifs
Type Java boolean byte char short int long float double void Type natif jboolean jbyte jchar jshort jint jlong jfloat jdouble void unsigned 8 bits signed 8 bits unsigned 16 bits signed 16 bits signed 32 bits signed 64 bits 32 bits 64 bits --Description
- 484 -
484
- 485 -
485
Accder aux variables dinstance Accder aux variables de classe Accder aux mthodes dinstance Accder aux mthodes de classe
- 486 -
486
Le pointeur JNIEnv
JNIEnv *env
associe
.
Env Variables dinstance jni.h Mthodes Byte code classes Variables de classe
Source C
- 487 -
487
jclass GetObjectClass (JNIEnv *env, jobject obj) ; jfieldID GetFieldID (JNIEnv *env,jclass clazz,const char *name,const char *sig) ; NativeType Get<type>Field (JNIEnv *env, jobject obj, jfieldID fieldID) ; void Set<type>Field (JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value) ;
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) ; }
- 488 -
488
jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ; NativeType GetStatic<type>Field (JNIEnv *env, jclass clazz, jfieldID fieldID) ; void SetStatic<type>Field (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) ; }
- 489 -
489
jmethodID GetMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ; NativeType Call<type>Method (JNIEnv *env, jobject obj, jmethodID methodId, ) ; NativeType Call<type>MethodA (JNIEnv *env, jobject obj, jmethodID methodId, jvalue *args) ; NativeType Call<type>Method (JNIEnv *env, jobject obj, jmethodID methodId, va_list args) ;
class Exemple { int x ; public void afficheX () { System.out.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) ; }
- 490 -
490
jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig) ; NativeType CallStatic<type>Method (JNIEnv *env, jobject obj, jmethodID methodId, ) ; NativeType CallStatic<type>MethodA (JNIEnv *env, jobject obj, jmethodID methodId, jvalue *args) ; NativeType CallStatic<type>Method (JNIEnv *env, jobject obj, jmethodID methodId, va_list args) ;
class Exemple { public static void affiche () { System.out.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) ; }
- 491 -
491
Type signatures
492
Type Signature
Signature de la mthode java suivante: long f (int n, String s, int [] arr) ; (ILjava.lang.String;[I)J
- 493 -
493
Bibliographie
Titre
Java source book Teach yourself Java in 21 days Livre dor de Java PC Poche JAVA Apprenez Java 1.1 en 21 jours Java 1.2 Java Security Java Servlets Programmation java ct serveur Le dictionnaire officiel Java 2 Ed Anuff Laura Lemay, Charles L. Perkins Patrick Longuet Rolf Maurers Laura Lemay, Charles L. Perkins Laura Lemay, Roger Cadenhead Scott Oaks Jason Hunter, William Crawford Andrew Patzer Patrick Chan
Auteurs
Editeur
Wiley computer publishing Samsnet Sybex Micro application Simon & Schuster Macmillan Simon & Schuster Macmillan O'Reilly O'Reilly Eyrolles Eyrolles
- 494 -
494