Académique Documents
Professionnel Documents
Culture Documents
programmation objet
Patrick Ducrot
patrick.ducrot@ensicaen.fr
http://www.ducrot.org/java/PolycopieJAVA.pdf
-1-
-2-
-3-
Gnralits
-4-
Gnralits
l
-5-
Gnralits
Simple
d'hritage
Orient objet
La
Distribu
-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.
U n d b o r d e m e n t d e t a b l e a u d c l e n c h e r a
automatiquement une exception.
L absence darithmtique de pointeur vite les
malversations.
-7-
Gnralits
Portable
Les
Haute performance
Java est un langage pseudo interprt
Techniques
-8-
Gnralits
Multi thread
Une application
Dynamique
Les classes Java peuvent tre modifies sans avoir
modifier le programme qui les utilise.
-9-
septembre 2004) ,1.6 (mustang, 11 dcembre 2006), 1.7 le 28 juillet 2011 (OpenSource
et sous lre Oracle).
- 10 -
- 11 -
L'environnement J2SE
l
- 12 -
Utilisation de JAVA
l
- 13 -
- 14 -
Code
Source
Code
Objet
Compilation
Code
Source
Edition de liens
Code
Excutable
Code
Objet
- 15 -
Rapidit dexcution
Ncessit de recompiler lors du portage dun logiciel sur
une autre architecture/systme dexploitation
- 16 -
Code
objet .class
Code
source .java
Compilation
javac
JVM
Code
source .java
Excution
Code
objet .class
- 17 -
Compilateur
sous windows
Compilateur
sous linux
Compilateur
sous solaris
Bytecode
Interprte
sous Mac OS
Interprte sous
Windows
Interprte
sous linux
Interprte
sous solaris
- 18 -
Avantages/Inconvnients du
bytecode
l
- 19 -
Exemple dapplication
l
Fichier: First.java
public class First
{
Compilation:
javac First.java
Cration de First.class
l
Excution:
java First
- 20 -
Syntaxe de base
- 21 -
- 22 -
Nombres entiers
byte
short
int
long
-2^63 , (2^63) - 1
9223372036854775808, 9223372036854775807
- 23 -
Nombres rels
float
- 24 -
boolean
char
Une variable de type char contient un seul caractre cod sur 16 bits (jeu de
caractres 16 bits Unicode contenant 34168 caractres).
\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 -
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:
- 26 -
Les tableaux
l
Exemples :
int table [ ] ;
double [ ] d1,d2 ;
- 27 -
Les tableaux
- 28 -
- 29 -
- 30 -
Exemple
Nom classe
Numero : entier
Solde : nombre rel
initialise (numero,montant)
deposer (montant)
Utilisateur
retirer (montant)
consulterSolde ()
afficher ()
- 31 -
- 32 -
- 33 -
Reprsentation mmoire
co2
co1
numero
numero
solde
solde
- 34 -
Reprsentation mmoire
l
co1 et co2 contiennent l'adresse des zones mmoires alloues par l'oprateur
new pour stocker les informations relatives ces objets.
La rfrence dun objet est utilise pour accder aux donnes et fonctions
membres de lobjet.
- 35 -
Constructeur de classe
l
- 36 -
Exemple de constructeur
class Compte
{
public Compte (int num,float s)
{
numero = num ;
solde = s ;
}
.
}
Compte co1 = new Compte (1234, 1000,00f) ;
- 37 -
Destructeur de classe
l
- 38 -
Surcharge de mthodes
l
- 39 -
Exemples de surcharge de
mthodes
l
Exemple1:
class BarreDeProgression
{
private float pourcent;
- 40 -
Exemples de surcharge de
mthodes
l
Exemple 2:
- 41 -
Comparaison dobjets
l
Exemple1 :
- 42 -
Comparaison d'objets
Exemple 2:
Comparaison de chanes de caractres:
String s1 = "Bonjour" ;
String s2 = "Bonjour" ;
if (s1.equals (s2))
if (s1.equalsIgnoreCase (s2))
// Compare le contenu de s1 et s2
// sans tenir compte des majuscules
// et minuscules.
Remarque: dans le cas des chanes de caractres, il est malgr tout possible
dutiliser:
if (s1 == s2) pourvu que s1 est s2 aient t dfinies avec les
mmes valeurs littrales ou avec la mthode intern ().
- 43 -
Hritage, interface,
package, droits
d'accs
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 44 -
Hritage de classe
l
Une classe peut hriter dune autre classe et apporter ses propres spcificits.
Classe A
Classe B
Classe C
Classe D
Classe E
- 45 -
Hritage de classe
l
- 46 -
- 47 -
- 48 -
- 49 -
La classe de base
l
- 50 -
- 51 -
// Constructeur
MaFrame ( String title)
{
super ( title) ;
// Appel du constructeur de Frame
// Si cet appel est utilis, cest toujours
// la premire instruction du constructeur
}
}
- 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 -
Interface
Une interface ne peut contenir que des variables constantes ou statiques et des
enttes de mthodes (attention: java 8 a modifi la dfinition des interfaces).
Toutes les signatures de mthodes dune interface ont une visibilit publique.
Une classe implmentant une interface sengage surcharger toutes les mthodes
dfinies dans cette interface (contrat) (en java 8: toutes les mthodes abstraites).
- 54 -
Exemple dinterface
interface Drawable
{
void drawMe (int x, int y);
}
class GraphicObject implements Drawable
{
- 55 -
Packages
Les classes java stockes dans la bibliothques de classe ne sont
pas automatiquement disponibles.
- 56 -
Interface graphique
Classes de base pour la
ralisation d'une applet
- 57 -
Exemple de manipulation de
packages
Exemple dutilisation de packages:
// Le package java.lang.* est importe implicitement
import java.awt.* ;
import java.util.* ;
Exemple de cration dun nouveau package:
package monpackage;
import java.awt.* ;
public class MaClasse
{
void test ( )
{
System.out.println ("test");
}
}
- 58 -
Droits daccs
Toutes les mthodes et donnes membres dfinies au sein
dune classe sont utilisables par toutes les mthodes de la
classe.
Lors
- 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 -
Variables de classe
Une variable de classe est une variable associe une classe et
non aux instances de cette classe.
- 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 -
Mthodes de classe
Une mthode de classe est une mthode associe une
classe et non une instance de cette classe.
- 63 -
Exemples de mthodes de
classe
Exemple 1:
La classe java.lang.Math contient beaucoup de mthodes static
class Math
{
}
Utilisation: Math.sqrt (3.678) ;
Exemple 2:
class MathStuff
{
static int halfInt (int x) { return x/2 ; }
}
Utilisation: MathStuff.halfInt (10) ;
- 64 -
Conversion de
types, gestion des
exceptions
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 65 -
Conversions de type
- 66 -
}
try {
entier = Integer.parseInt (chaine) ;
} catch (NumberFormatException e)
{
// Si la variable chaine n'est pas convertible on vient ici
}
- 67 -
Les exceptions
Le traitement des exceptions permet une application davoir un
comportement adquat une situation inattendue.
Beaucoup
- 68 -
Exception
java.io.IOException
java.io.FileNotFoundException
NullPointerException
RuntimeException
IllegalArgumentException
NumberFormatException
- 69 -
La clause try/catch
try <instruction>;
catch (<type exception1> ex1) instruction;
catch (<type exception2> ex2) instruction;
.
finally <instruction>;
- 70 -
Exemples de gestion
dexceptions
try a = tab [i];
catch (ArrayIndexOutOfBoundsException ex) a = 0 ;
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 -
Gestion dexceptions
l
try {
valeur = Integer.parseInt (chaine);
FileInputStream fichier = new FileInputStream ("c:\\texte.txt") ;
} catch (NumberFormatException | FileNotFoundException e)
{
System.err.println ( Une erreur est survenue ");
}
- 72 -
Gnration d'exception
On indique quune mthode m peut gnrer une exception
(par exemple IllegalArgumentException) par le mot cl
throws (obligatoire pour les exceptions sous contrle)
void m () throws IllegalArgumentException {
Exemple:
if (x<0)
{
throw new IllegalArgumentException ("x doit etre positif");
// ne mettre aucune instruction en dessous du throw
}
- 73 -
Exemple de gnration
d'exception
class Test
{
public String getNom (String key) throws NullPointerException
{
if (key == null) throw new NullPointerException ("cle nulle") ;
else return "OK" ;
}
}
public class Exemple
{
public static void main (String args []) { new Exemple () ; }
public Exemple ()
{
Test test = new Test () ;
try {
System.out.println (test.getNom (null)) ;
} catch (NullPointerException e)
{
System.err.println (e.getMessage ()) ;
}
}
}
- 74 -
- 75 -
Classe PileException et
utilisation
public class PileException extends Exception
{
public PileException(String m)
{
super (m) ;
}
}
Utilisation:
Pile pile = new Pile () ;
try {
System.out.println (pile.removeValue()) ;
} catch (PileException e)
{
System.out.println (e.getMessage()) ;
}
- 76 -
javadoc:
le gnrateur de
documentation
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 77 -
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 -
Exemple de gnration
- 79 -
Commentaire javadoc:
/**
* Voil un exemple de <B> commentaire </B>
* javadoc
*/
-
-
-
"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 -
classe et interface
1.0
@deprecate
d
1.1
{@docRoot}
@exception
mthode
1.0
{@link}
1.2
@param
constructeur, mthode
1.0
@see
1.0
@since
1.1
@throws
identique @exception
mthode
1.2
@version
classe et interface
1.0
@return
mthode
1.0
1.3
- 81 -
- 82 -
Le format d'archive
JAR
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 83 -
L e s
Exemples:
jar cvf applet.jar *.class
jar tvf applet.jar
jar xvf applet.jar
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 84 -
Manifest-Version: 1.0
Main-Class: bibliotheque.Main
- 85 -
Gestion de fichiers,
flux d'entres/
sortie, srialisation
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 86 -
Gestion de fichiers
- 87 -
- 88 -
- 89 -
Les flux
Difficult dun langage davoir un bon systme dentres/sorties.
Beaucoup de sources dE/S de natures diffrentes (console, fichier,
socket,).
- 90 -
Toutes
Toutes
- 91 -
Flux
dentre
Flux de
sortie
Flux doctets
Flux de caractres
java.io.InputStream
java.io.Reader
java.io.OutputStream
java.io.Writer
- 92 -
OutputStream
InputStream
FileInputStream
FileOutputStream
PipedInputStream
PipedOutputStream
ByteArrayInputStream
ByteArrayOutputStream
SequenceInputStream
ObjectOutputStream
StringBufferInputStream
FilterOutputStream
ObjectInputStream
DataOutputStream
FilterInputStream
BufferedOutputStream
DataInputStream
PrintStream
BufferedInputStream
PushBackInputStream
- 93 -
La classe java.io.InputStream
l
Exemple :
InputStream s = .. ;
byte buffer [ ] = new byte [1024] ;
try {
s.read (buffer) ;
} catch (IOException e)
{
}
- 94 -
La classe java.io.InputStream
l
- 95 -
- 96 -
La classe java.io.OutputStream
l
- 97 -
- 98 -
etc.
- 99 -
Exemples de lecture/criture
volue
InputStream s = new FileInputStream ("fichier") ;
DataInputStream data = new DataInputStream (s) ;
double valeur = data.readDouble () ;
- 100 -
Writer
BufferedReader
LineNumberReader
CharArrayReader
InputStreamReader
FileReader
FilterReader
PushBackReader
PipedReader
BufferedWriter
CharArrayWriter
OutputStreamWriter
FileWriter
FilterWriter
PipedWriter
StringWriter
PrintWriter
StringReader
- 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 -
Java 7: try-with-ressources
l
Les ressources( fichiers, flux, connexion, ) doivent tre fermes explicitement par le
dveloppeur.
La clause finally peut tre utilise cet effet mais:
La ressource doit tre dclare en dehors du bloc try pour tre utilisable dans la
clause finally
Une mthode close () peut elle-mme gnrer une exception entrainant une
complexit dans le code
Java 7 propose le mcanisme ARM (Automatic Resource Management) applicable sur les
objets qui implmentent linterface AutoCloseable (une ressource non utilise sera
automatiquement ferme).
try (BufferedReader bufferedReader = new
BufferedReader(new FileReader("C:/Temp/fichier.txt")))
{
String ligne=null;
while ((ligne = bufferedReader.readLine()) != null) { System.out.println(ligne);}
} catch (IOException e) {e.printStackTrace(); }
- 103 -
La srialisation
l
- 104 -
Pourquoi srialiser ?
l
La plupart des classes de base (mais pas toutes) du langage Java sont
srialisables.
- 105 -
Comment srialiser
Les donnes membres que lon ne souhaite pas sauvegarder doivent tre dclares
transient.
- 106 -
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 ;
}
- 107 -
Exemple Srialisation/
Dsrialisation
public class ExempleSerialisation
{
static public void main (String args [])
{
new ExempleSerialisation () ;
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) ;
}
}
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 ()) ;
}
}
// Fin classe ExempleSerialisation transparent
// suivant
- 108 -
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
- 109 -
Le package java.nio
l
- 110 -
L'objet "Buffer"
l
- 111 -
position
limit
capacity
- 112 -
flip ()
clear ()
mark ()
reset ()
rewind ()
- 113 -
Fonctionnement d'un
"ByteArrayBuffer"
put ()
flip ()
clear ()
- 114 -
Quelques mthodes de
manipulation d'un objet "Buffer"
l
- 115 -
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(); }
}
- 116 -
- 117 -
Quelques "Channel"
FileChannel
l ServerSocketChannel
l SocketChannel
l DatagramChannel
l SelectableChannel
l
- 118 -
Les threads
- 119 -
Les threads
l
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 gestion des threads est dpendante de la JVM (problme pour la portabilit). Les
threads peuvent tre premptifs ou coopratifs.
- 120 -
- 121 -
- Classe anonyme
Thread thread = new Thread(){
public void run(){
// corps du thread
}
}
thread.start();
- 122 -
- Classe anonyme
Runnable myRunnable = new Runnable(){
public void run(){
// corps du thread
}
}
Thread thread = new Thread(myRunnable);
thread.start();
// Appel de la mthode run ()
- 123 -
sleep (i)
wait ()*
Suspend le thread.
notify ()*
notifyAll ()*
yield ()
setPriority (i)
join ()
join (long)
- 124 -
fin du run
Excutable
Excutable
Thread courant
wait ou sleep
notify, notifyAll
ou fin de sleep
Non excutable
- 125 -
- 126 -
Synchronisation
Plusieurs
Mot cl:
synchronized
Si
- 127 -
Premier exemple de
synchronisation
class Compteur
{
private int valeur ;
// Si plusieurs threads dispose dune rfrence sur un
// objet de classe Compteur , un seul thread la fois
// pourra pntrer dans la mthode incrmente de cet objet.
synchronized void incremente ()
{
valeur += 1 ;
}
int Combien ()
{
return valeur ;
}
}
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 128 -
Deuxime exemple de
synchronisation
class Point
{
private float x,y ;
float x () { return x ; }
float y () { return y ; ]
void print ()
{
float safeX,safeY ;
synchronized (this)
{
safeX = x ; safeY = y ;
}
System.out.print ("voil x et y : " + safeX + safeY) ;
}
- 129 -
- 130 -
- 131 -
Les collections
- 132 -
Les collections
l
- 133 -
public ExempleStack ()
{
pile = new Stack () ;
pile.push("Je suis ") ; pile.push("Un exemple ") ; pile.push("de pile") ;
Iterator iter = pile.iterator () ;
while (iter.hasNext())
{
System.out.println (iter.next()) ;
}
}
public static void main(String[] args)
{
new ExempleStack () ;
}
Je suis
Un exemple
de pile
- 134 -
Interfaces de collections
- 135 -
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
- 136 -
Implmentation
Set
HashSet
SortedSet
TreeSet
List
Map
HashMap, Hashtable
SortedMap
TreeMap
- 137 -
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)) ;
aaaa --> 1
bbbb --> 2
zzzz --> 26
- 138 -
Collections et threads
l
Les mthodes prcdentes ne synchronisent pas les itrateurs. Il faut donc le faire
manuellement:
synchronized (objet)
{
Iterator iter = objet.iterator () ;
{
// travailler avec l'iterateur
}
}
- 139 -
Collections et threads
l
- 140 -
Exemple:
Properties props = new Properties () ;
props.put ("monApp.xSize","50") ;
- 141 -
l
l
- 142 -
Les nouveauts de
la version 5
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 143 -
Nouveauts de la version 5
l
- 144 -
Autoboxing/Unboxing
l
- 145 -
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)) ;
}
}
- 146 -
L'importation statique
l
- 147 -
Boucles volues
La syntaxe des boucles a t simplifie
pour le parcours des lments d'un
tableau ou d'une collection.
l Exemple:
l
- 148 -
- 149 -
- 150 -
Le type numr
l
- 151 -
- 152 -
Affichage format
l
La classe System.out dispose maintenant d'une mthode printf analogue celle du langage C.
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) ;
}
}
- 153 -
Saisie formate
l
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) ;
}
}
- 154 -
Quelques utilisations de
java.util.Scanner
l
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") ;
}
Exemple 2:
String chaine ;
chaine = "1 test 2 test rouge test bleu test " ;
Scanner s = (new Scanner (chaine)).useDelimiter ("\\stest\\s") ;
System.out.println (s.nextInt ()) ;
System.out.println (s.nextInt ()) ;
System.out.println (s.next ()) ;
System.out.println (s.next ()) ;
- 155 -
Avantages:
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
>.
- 156 -
- 157 -
- 158 -
Les annotations
l
- 159 -
Indique au compilateur
que l'lment marqu est
dprci et ne devrait plus
tre utilis.
@Override
@SuppressWarnings
Indique au compilateur de
ne pas afficher certains
messages
d'avertissement.
- 160 -
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 ()) ;
}
}
- 161 -
Exemple @SuppressWarnings
l
Exemples:
@SuppressWarnings ("deprecation")
public class VieilleClasse { }
@SuppressWarnings ("deprecation")
public int methode () { }
- 162 -
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) ;
}
}
- 163 -
Les meta-annotations
l
@Documented
@Inherited
@Retention
@Target
- 164 -
@Inherited
@Retention
@Target
- 165 -
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 ; }
}
- 166 -
Exemple @Inherited
import java.lang.annotation.Inherited ;
@Inherited
public @interface Annotation1
{
}
@Annotation1
public class MaClasse
{
- 167 -
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 ()) ;
}
}
}
- 168 -
Exemple @Target
l
- 169 -
Exemple d'annotation
personnalise (1/2)
package testannotation ;
import java.lang.annotation.* ;
@Documented
@Retention(RetentionPolicy.SOURCE)
public @interface TODO
{
public static enum Level { LOW, MEDIUM, HIGH } ;
String detail () ;
Level niveau () default Level.MEDIUM ;
}
- 170 -
Exemple d'annotation
personnalise(2/2)
package testannotation;
import static testannotation.TODO.Level.* ;
public class MaClasse
{
private int annee ;
@TODO (detail="Terminer le constructeur",niveau=HIGH)
public MaClasse ()
{
annee = 2007 ;
}
@TODO (detail="Ameliorer cette fonction")
public int getYear ()
{
return annee ;
}
}
- 171 -
Quelques
nouveauts de la
version 8
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 172 -
Nouveauts Java 8
l
Les interfaces, les expressions lambdas, les streams (vus en dtail aux pages suivantes).
Meilleure gestion des processus du systme dexploitation (par ajout des mthodes destroyForcibly,
isALive et waitFor la classe Process).
Meilleure gestion des rfrences nulles (NullPointer) par utilisation de la classe Optional (exemple
en fin de chapitre).
- 173 -
Les interfaces
l
Exemple:
public interface MonInterface
{
public void methode () ;
public default void affiche ()
{
System.out.println ( je suis dans linterface ) ;
}
}
- 174 -
Interfaces fonctionnelles
l
Exemples:
@FunctionalInterface
public interface Runnable
{
void run () ;
}
@FunctionalInterface
public interface java.util.function.IntPredicate
{
default IntPredicate and (IntPredicate other) ;
default IntPredicate negate () ;
default IntPredicate or (IntPredicate other) ;
boolean test (int value) ;
}
- 175 -
Rle
Predicate
Consumer
Function
Manipule un T et retourne un U
Supplier
UnaryOperator
BinaryOperator
- 176 -
Syntaxe:
(paramtres) -> expression_simple
ou
- 177 -
- 178 -
package testjdk8;
@FunctionalInterface
public interface Calculator
{
int calcul (int x,int y) ;
}
}
private void faitCalcul (Calculator calculator)
{
System.out.println(calculator.calcul(10,5));
}
public static void main(String[] args)
{
new Calc () ;
}
}
- 179 -
Exemple IntPredicate
package testjdk8;
import java.util.function.IntPredicate;
public class TestPredicate
{
public TestPredicate()
{
IntPredicate i = (x) -> x <= 0 ;
IntPredicate j = (x) -> x == 0 ;
System.out.println( i.and (j).test(-1) );
}
public static void main(String[] args)
{
new TestPredicate () ;
}
}
- 180 -
Les streams
l
l
Pour cela:
Un stream ne possde ni ne modifie les donnes quil traite
- 181 -
Les streams
l
- 182 -
Stream: exemple 1
package testjdk8;
import java.util.Arrays;
import java.util.List;
public class TestStream
{
public static void main(String[] args)
avion
velo
{
voiture
List<String> locomotions =
Arrays.asList("velo","voiture","bus","camion","train","avion","bateau") ;
locomotions.stream().filter(x -> x.contains("v")).sorted().forEach(System.out::println);
}
Consumer
Predicat
Streams intermdiaires
Stream terminal
- 183 -
stream ne peut tre rutilis; il est ferm ds quune opration terminale a t effectue:
utiliser plusieurs fois un stream, il faut le recrer pour chaque opration terminale:
- 184 -
Stream: exemple 2
package testjdk8;
public class Personne
{
private String nom ;
private int age ;
public Personne(String nom, int age) {
super();
this.nom = nom;
this.age = age;
}
// ajouter accesseurs .
@Override
public String toString() {
return "Personne [nom=" + nom + ", age=" + age + "]";
}
}
- 185 -
Stream: exemple 2
ArrayList<Personne> liste = new ArrayList<Personne> () ;
liste.add (new Personne ("Jean",15)) ;liste.add (new Personne ("Pierre",22)) ;
liste.add (new Personne ("Paul",24)) ;
// Function manipule un objet de type Personne et retourne une String
Function <Personne,String> f = p -> { return p.getNom () + ":" + p.getAge(); };
for (Personne p:liste) System.out.println(f.apply(p));
// Calcul de la somme des ages
int somme = liste.stream().mapToInt(p ->p.getAge()).sum () ;
// calcul de la moyenne des ages
OptionalDouble moyenne = liste.stream().mapToInt(p ->p.getAge()).average () ;
// calcul de la moyenne des ages pour les personnes > 20 ans
double moyenne2 = liste.stream().filter (p -> p.getAge() > 20).
mapToInt(p ->p.getAge()).average ().getAsDouble() ;
}
- 186 -
Exemple Optional
package testjava8;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class TestOptional
{
private List<String> liste = Arrays.asList("Pierre", "Paul", "Jacques");
Consumer
public TestOptional ()
{
getString ("Pierre").ifPresent(nom -> System.out.println (nom));
getString ("Pierre").ifPresent(System.out::println);
// utilisation oprateur ::
}
Optional<String> getString (String nom)
{
if (liste.contains(nom)) return Optional.of (nom.toUpperCase());
return Optional.empty () ;
}
public static void main(String[] args) { new TestOptional () ; }
}
- 187 -
- 188 -
- 189 -
Les applets
- 190 -
Applet
Une applet sera tlcharge partir dun site web et sera excute
java.applet.Applet:
- 191 -
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) ;
}
}
- 192 -
La balise <APPLET>
L'applet ncessite un fichier HTML contenant une
balise <APPLET> pour tre excute.
Exemple :
<HTML>
<APPLET CODE = "hello.Hello.class" WIDTH=200 HEIGHT=200>
</APPLET>
</HTML>
- CODE
- WIDTH, HEIGHT
- 193 -
Excution de l'applet
- 194 -
La balise <APPLET>
D'autres attributs pour la balise <APPLET> existent :
LEFT,RIGHT,TOP,TEXTTOP,MIDDLE,ABSMIDDLE,
BASELINE,BOTTOM,ABSBOTTOM
CODEBASE
serveur
PARAM
- 195 -
Exemple de CODEBASE
- 196 -
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) ;
}
}
- 197 -
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>
- 198 -
Excution de l'applet
- 199 -
La classe java.awt.Graphics
Les fonctions graphiques sont utilisables travers un objet de classe
java.awt.Graphics
Un
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,
- 200 -
Exemples de mthodes de la
classe java.awt.Graphics
public void drawLine( int x1, int y1, int x2, int y2 )
public void drawPolygon( int xPoints[], int yPoints[], int nPoints )
public void drawRect( int x, int y, int width, int height )
public void fillOval( int x, int y, int width, int height )
public void fillRect( int x, int y, int width, int height )
public void setColor (Color c)
.
- 201 -
Gestion de l'affichage
L'affichage graphique est gr par un thread "Screen
Updater"
- 202 -
- 203 -
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) ;
255,255,255
255,0,0
255,200,0
- 204 -
- 205 -
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
- 206 -
Exemple d'utilisation de la
classe java.awt.Font
package exemplefont ;
import java.applet.* ;
import java.awt.* ;
public class Fontes extends Applet
{
public void paint (Graphics g)
{
String FontListe [] ;
FontListe = getToolkit().getFontList () ;
for (int i = 0 ; i != FontListe.length ; i++)
{
g.setFont (new Font (FontListe[i],Font.PLAIN,12)) ;
g.drawString (FontListe [i],0,20*(i+1)) ;
}
}
}
- 207 -
Les interfaces
utilisateurs avec le
package java.awt
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 208 -
- 209 -
import java.applet.* ;
import java.awt.* ;
public class Composants extends Applet
{
private Label label ;
private Button button ;
private Checkbox checkbox ;
private Choice choice ;
private Scrollbar h_scrollbar ;
private TextArea textarea ;
private TextField textfield ;
private List list ;
- 210 -
- 211 -
java.awt.FlowLayout
java.awt.BorderLayout
java.awt.CardLayout
java.awt.GridLayout
java.awt.GridBagLayout
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 212 -
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
- 213 -
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")) ;
}
}
- 214 -
- 215 -
La classe
java.awt.BorderLayout
public BorderLayout () ;
public BorderLayout (int hgap, int vgap) ;
- 216 -
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")) ;
}
}
- 217 -
- 218 -
La classe java.awt.GridLayout
Plusieurs constructeurs:
public GridLayout (int rows, int cols) ;
public GridLayout (int rows, int cols, int hgap, int vgap) ;
- 219 -
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")) ;
}
}
- 220 -
- 221 -
La classe
java.awt.GridBagLayout
La classe java.awt.GridBagLayout dfinit un quadrillage
- 222 -
- 223 -
- 224 -
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) ;
}
}
- 225 -
- 226 -
La classe java.awt.CardLayout
La classe java.awt.CardLayout dfinit des objets qui
ne sont pas visibles simultanment mais
conscutivement.
Plusieurs constructeurs:
public CardLayout () ;
public CardLayout (int hgap, int vgap) ;
first ()
last ()
previous ()
next ()
show ()
- 227 -
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) ; }
}
- 228 -
- 229 -
Layout personnalis
l
- 230 -
- 231 -
- 232 -
- 233 -
Les conteneurs
Panel
Window
Frame
Dialog
- 234 -
La classe java.awt.Panel
Un "Panel" est un container sans fentre propre.
Il dispose de son propre layout
- 235 -
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) ;
}
}
- 236 -
- 237 -
La classe java.awt.Frame
Un objet "Frame" est une fentre flottante
- 238 -
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) ;
}
}
- 239 -
Excution de l'applet
"ExempleFrame"
- 240 -
- 241 -
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) ;
}
}
- 242 -
Excution de l'applet
"ExempleDialog"
- 243 -
Les menus
Le package java.awt propose des classes permettant de crer des barres de menu
dans des frames et des "Popup Menu"
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.
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.
- 244 -
- 245 -
- 246 -
Excution de l'applet
"ExempleMenuBar"
- 247 -
popup menu
- 248 -
Gestion des
vnements
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 249 -
(3)
(1) Abonnement/
Dsabonnement
Objet gnrant un
vnement
(2)
- 250 -
Les Mthodes de
java.util.EventObject
Mthodes
Description
- 251 -
C ertains
- 252 -
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
- 253 -
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;
}
}
- 254 -
L'interface
"TempChangeListener"
l
package thermometre;
public interface TempChangeListener extends java.util.EventListener
{
void tempChange(TempChangeEvent evt);
}
- 255 -
La classe "Temperature"
1/3
package thermometre;
import java.util.*;
public class Temperature extends Thread
{
protected double TemperatureCourante = 0 ;
// Stockage des rcepteurs
private Vector<TempChangeListener> TempChangeListeners = new Vector<TempChangeListener> ();
public synchronized void addTempChangeListener(TempChangeListener l)
{
if ( ! TempChangeListeners.contains(l)) TempChangeListeners.addElement(l);
}
public synchronized void removeTempChangeListener(TempChangeListener l)
{
if (TempChangeListeners.contains(l)) TempChangeListeners.removeElement(l);
}
- 256 -
- 257 -
La classe "Temperature"
3/3
- 258 -
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 () ;
}
}
- 259 -
Tous
- 260 -
AdjustmentListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
WindowListener
- 261 -
AdjustmentListener
FocusListener
ItemListener
KeyListener
- 262 -
MouseMotionListener
WindowListener
- 263 -
Association source-rcepteur
L'association source-rcepteur se fait par l'une des
mthodes suivantes :
addActionListener (java.awt.event.ComponentListener )
addAdjustmentListener (java.awt.event.AdjustmentListener )
addFocusListener (java.awt.event.FocusListener)
addItemListener (java.awt.event.ItemListener)
addKeyListener (java.awt.event.KeyListener)
addMouseListener (java.awt.event.MouseListener)
addMouseMotionListener (java.awt.event.MouseMotionListener)
addWindowListener (java.awt.event.WindowListener)
- 264 -
Exemple de gestion
d'vnement 1/2
package evenement ;
import java.applet.* ;
import java.awt.* ;
import java.awt.event.* ;
public class ExempleEvenement extends Applet
{
Button IciOuLa = new Button ("ici") ; TextField saisie = new TextField (20) ;
Recepteur recepteur = new Recepteur () ;
public void init ()
{
add (saisie) ; add (IciOuLa) ;
saisie.addActionListener (recepteur) ; IciOuLa.addActionListener (recepteur) ;
}
}
- 265 -
Exemple de gestion
d'vnement 2/2
class Recepteur implements ActionListener
{
public void actionPerformed (ActionEvent evt)
{
Object src = evt.getSource () ;
if (src instanceof TextField) ((TextField) src).setText ("");
else if (src instanceof Button)
if ( ((Button) src).getLabel ().equals ("ici"))
((Button) src).setLabel ("la") ;
else ( (Button) src).setLabel ("ici") ;
}
}
- 266 -
Excution de l'applet
"ExempleEvenement"
- 267 -
Adaptateurs d'vnements
l
Exemple:
class MonApplet extends Applet implements MouseListener, KeyListener
{
// 8 fonctions vnements crire
}
- 268 -
Les adaptateurs
MouseAdapter
implmente MouseListener
MouseMotionAdapter implmente MouseMotionListener
KeyAdapter
implmente KeyListener
Exemple :
import java.awt.event.* ;
class GestionSouris extends MouseAdapter
{
public void mousePressed (MouseEvent e) {}
// On n'est pas oblig d'crire les autres mthodes
}
- 269 -
- 270 -
Le package
javax.swing
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 271 -
Prsentation de Swing
l
- 272 -
Quelques apparences
UIManager.setLookAndFeel ("com.sun.java.swing.plaf.motif.MotifLookAndFeel") ;
UIManager.setLookAndFeel ("javax.swing.plaf.metal.MetalLookAndFeel") ;
UIManager.setLookAndFeel ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel") ;
- 273 -
- 274 -
Caractristiques des
composants
l
- 275 -
- 276 -
toplevel
Menu Bar
Content Pane
- 277 -
- 278 -
- 279 -
- 280 -
- 281 -
Le modle MVC
l
- 282 -
Le modle MVC
l
Exemples:
- 283 -
Vue et contrleur
Modle
demande donnes
TableModel
renvoie donnes
support externe
- 284 -
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; }
}
- 285 -
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 () ;
}
}
}
- 286 -
Exemple de TableModel
l
- 287 -
TableModel: modification
partir de la vue
l
- 288 -
fireTableRowsUpdates
fireTableDataChanged
fireTableRowsInserted
fireTableRowsDeleted
fireTableStructureChanged
- 289 -
Modification de la classe
TableauModel
public TableauModel ()
{
donnees = new ArrayList<Employe> () ;
initialiser () ;
this.addTableModelListener(new RAZEtatMarital ()) ;
}
- 290 -
- 291 -
Case cocher
String
- 292 -
Les composants complexes JList, JTable, JTree possdent un renderer par dfaut:
JCheckBox
Number
Double, Float
Date
ImageIcon, Icon
JLabel centr
Object
- 293 -
- 294 -
- 295 -
Swing et Threads
l
- 296 -
Swing et threads
l
Problmes:
- 297 -
Swing et threads
l
La classe javax.swing.SwingUtilities
propose des mthodes statiques
permettant d'excuter du code dans le
thread de gestion d'vnement:
invokeLater (Runnable)
invokeAndWait (Runnable)
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 298 -
bloque interface
- 299 -
La modification du
texte de jBloque se
fera par le thread de
gestion
d'vnements
- 300 -
La classe SwingWorker
l
- 301 -
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() ;
}
});
- 302 -
Java et la scurit
- 303 -
Java et la scurit
La scurit a toujours t prsente dans la conception de
Java.
- 304 -
Java et la scurit
Les points 1 et 2 sont pris en compte ds la norme 1.0
de Java
- 305 -
La "sandbox" java
La scurit java est axe autour d'une "sandbox" qui va
- 306 -
L e s
Pas
- 307 -
code local
code distant
sandbox
JVM
Ressources (fichiers, )
- 308 -
code local
sandbox
JVM
Ressources (fichiers, )
- 309 -
rgles
loader
sandbox
JVM
Ressources (fichiers, )
- 310 -
Exemple:
- 311 -
java.io.FilePermission
(read,write,delete,execute)
java.net.SocketPermission
(accept,connect,listen,resolve)
java.awt.AWTPermission
(accessClipboard, )
- 312 -
Spcification de la stratgie de
scurit
l
- 313 -
};
Exemple:
grant SignedBy "Jean,Fred", CodeBase http://www.trusted.com {
permission java.io.permission "c:\\temp\\*", "read" ;
};
- 314 -
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 () ) ; }
}
}
<HTML>
<APPLET CODE="ecritfichier.EcritFichier.class" ARCHIVE="ecritfichier.jar" WIDTH=50 HEIGHT=50>
</APPLET>
</HTML>
- 315 -
Excution de l'applet
- 316 -
- 317 -
Signature de l'applet
l
Signature de l'applet:
Signature
http://www.verisign.com
http://www.thawte.com
- 318 -
- 319 -
Obfuscation de
code
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 320 -
Obfuscation de code
l
- 321 -
- 322 -
- 323 -
ProGuard: http://proguard.sourceforge.net
yGuard: http://www.yworks.com/en/products_yguard_about.htm
- 324 -
- 325 -
Programmation
rseau
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 326 -
Client
-Cration
-Connexion
sur le serveur.
-Echange
- 327 -
Quelques mthodes:
public void close();
public InetAddress getInetAddress();
public InputStream getInputStream();
public int getLocalPort();
public OutputStream getOutputStream();
public int getPort();
- 328 -
- 329 -
Quelques constructeurs:
port dcoute
taille de la file d'attente (50 par dfaut)
Quelques mthodes:
- 330 -
- 331 -
- 332 -
public DatagramSocket () ;
public DatagramSocket (int port) ;
public DatagramSocket (int port, InetAddr laddr) ;
Quelques mthodes:
- 333 -
- 334 -
- 335 -
- 336 -
- 337 -
Quelques mthodes:
- 338 -
Exemple d'utilisation de la
classe URL
import java.io.* ;
import java.net.* ;
public class LireURL
{
static public void main (String args [])
{
try {
URL url = new URL ("http://www.ensicaen.fr") ;
InputStream is = url.openStream () ;
InputStreamReader ir = new InputStreamReader (is) ;
BufferedReader br = new BufferedReader (ir) ;
while (br.ready () == true)
System.out.println (br.readLine ()) ;
br.close () ; ir.close () ; is.close () ;
} catch (Exception e)
{
System.err.println ("Erreur " + e) ;
}
}
}
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 339 -
URL
InputStream
InputStreamReader
BufferedReader
readLine ()
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 340 -
Extrait de l'excution de
l'application "LireURL"
D:\travail>java LireURL
<html>
<script language="JavaScript">
</script>
<head>
<meta name="description"
content="Sommaire: ENSICAEN, Ecole Nationale Superieure d'Ingenieurs de Caen et Centre de
Recherche">
<meta name="keywords"
content="ENSICAEN,ISMRA,I.S.M.R.A,ENSI CAEN,ENSI CAEN
ISMRA,CAEN,NORMANDIE,ensicaen,ismra,ENSI CAEN
ISMRA,ENSI,Informatique,Microelectronique,Instrumentation,Chimie fine,Genie
Informatique,latems,monetique,Instru,Micro,Genie Chimique,Ecole,Ingenieur,Generaliste,Ensi
Caen,CAEN,Normandie,Ecole Nationale Superieure d'Ingenieurs de
Caen,ISMRA,ENSICAEN,ISMRA-ENSICAEN,CAEN ENSI,I.S.M.R.A.,Institut desSciences de la
Matiere et du Rayonnement,ENSI CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI
CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI
CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI CAEN,ISMRA,ENSI CAEN,Engineer,Engineering
school,Computer Science,Electronics,Chemistry,Instrumentation,France">
<title>ENSICAEN</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
- 341 -
Remote Method
Invocation
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 342 -
Gnralits
l
Une application fera appel des mthodes sur des objets localiss sur
des machines distantes.
- 343 -
Architecture
Architecture RMI
Architecture locale
Application (client)
Application
couche intermdiaire
Rseau
Objet
couche intermdiaire
Objet (serveur)
- 344 -
Architecture RMI
- 345 -
Stub
l
- 346 -
Skeleton
l
Retourne le rsultat.
- 347 -
- 348 -
- 349 -
Interface java.rmi.Remote
l
- 350 -
Interface java.rmi.Remote
l
- 351 -
RMI ct serveur
l
Le constructeur de cet objet distant doit tre dfini explicitement (il doit mettre
java.rmi.RemoteException).
- 352 -
RMI ct serveur
l
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
- 353 -
RMI ct serveur
l
Compilation:
javac serHello.java
Lancement de lapplication:
java -Djava.security.policy=java.policy serHello
Fichier java.policy:
grant {
permission java.net.SocketPermission "*:1024-65535", "accept, listen, connect, resolve";
};
- 354 -
RMI ct client
l
- 355 -
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) ;
}
}
}
- 356 -
Interaction client/serveur
Client
Client Hello
Serveur
Lookup(): o est Hello ?
ici
Il est
Envoyer le stub
si non prsent
sur le client
Registre
HelloImpl_Stub.class
il
Le vo
stub
envoieHello ()
HelloImpl_Skel.class
Hello world
HelloImpl.class
- 357 -
ANT
- 358 -
ANT
l
Excution de ant:
ant [-buildfile fichier.xml] [cible]
JAVA_HOME
PATH
- 359 -
- 360 -
Les cibles
Les proprits
Les tches
- 361 -
La balise <project>
l
Exemple:
<project name="nomprojet" default="compile" basedir=".">
- 362 -
Les commentaires
l
Exemple:
- 363 -
Les proprits
l
Exemple:
<property name="repertoire" value="travail" />
<property file="proprietes.properties />
- 364 -
Proprits prdfinies
basedir
ant.file
ant.java.version
- 365 -
Les cibles
l
name
description
if
- 366 -
Les tches
l
- 367 -
Exemple de fichier de
configuration
<?xml version="1.0"?>
<project name="project" default="runchatclient">
<description>
test ant
</description>
<property name="src" value="src" />
<property name="dst" value="classes" />
<target name="chatclient" description="Client chat RMI">
<javac srcdir="${src}/rmichat" destdir="${dst}" />
<rmic classname="rmichat.ClientRMI" base="${dst}" />
</target>
<target name="runchatclient">
<java classname="rmichat.ChatClient" classpath="${dst}" fork="true" >
<arg value="localhost" />
<sysproperty key="java.security.policy" value="java.policy" />
</java>
</target>
<target name="archive" >
<jar destfile="chat.jar" basedir="${dst}" />
</target>
</project>
- 368 -
Interaction Java/
bases de donnes
- 369 -
- 370 -
Architecture dutilisation
Application Java
Application/Applet
java
http, rmi, corba
JDBC
Protocole
propritaire
Base de
donnes
Modle 2/3
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
Serveur
JDBC
Base de
donnes
Protocole
propritaire
Modle 3/3
- 371 -
Le package java.sql
l
Les interfaces
Driver
Statement
Connection
ResultSet
ResultSetMetaData
DatabaseMetaData
PreparedStatement
CallableStatement
- 372 -
Le package java.sql
l
Les classes
java.lang.Object
java.util.Date
Date
Time
DriverManager
DriverPropertyInfo
Types
TimeStamp
- 373 -
Pilotes JDBC
l
type 2
type 3
type 4
- 374 -
Application
DriverManager
Pilote Oracle
Oracle
Pilote MySql
MySql
- 375 -
Classes de connexion
java.sql.Driver
java.sql.DriverManager
java.sql.Connection
- 376 -
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 ;
}
- 377 -
java.sql.ResultSet
java.sql.PreparedStatement
- 378 -
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") ;
}
- 379 -
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 ()
}
- 380 -
Aspect transactionnel
l
Retour en arrire:
connection.setAutoCommit(false);
connection.commit () ;
connection.rollback ();
- 381 -
JavaBeans
- 382 -
Programmation Traditionnelle
l
Limites:
Consquences:
- 383 -
Modules rutilisables
Les constituants sont reprsents en classes
Hritage entre classes
connaissances techniques
Le code explicite les interconnexions entre modules
- 384 -
- 385 -
- 386 -
Le modle JavaBean
l
l
l
l
l
- 387 -
Type de beans
l
Bean Visuel
Bean composite
Boutons, icnes,
Accs une base de donnes,
Grapheur, feuille de calcul
- 388 -
Ses proprits
Les mthodes exportes
Les vnements quil peut mettre et recevoir
- 389 -
Un bean doit:
Introspectable
Srialisable (persistance)
Distribuable
Editable visuellement
Respecter les rgles de scurit
Sadapter au multithreading
- 390 -
Exemple: la beanbox
Feuilles de proprits
Conteneur de beans
Palette de beans
- 391 -
conventions dcriture.
ventuellement une classe sans convention
dcriture mais implmentant linterface
java.beans.BeanInfo
l
- 392 -
- 393 -
- 394 -
- 395 -
Archive java
l
Multi-plateforme
Auto-descriptif
Scurit et authentification
Tlchargeable par navigateur
- 396 -
Le fichier MANIFEST.MF
l
- 397 -
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
- 398 -
Manipulation de CounterBean
- 399 -
Abonnement
Bean
Rcepteur
Bean
Rcepteur
Bean
Emetteur
Notification dvnement
Bean
Rcepteur
- 400 -
Possibilits offertes:
diffrents.
Un bean rcepteur peut sabonner auprs de plusieurs
beans.
Un bean peut tre la fois metteur et rcepteur
dvnements.
l
- 401 -
- 402 -
Mise en uvre
public interface EventListener {
void handleEvent (Event e) ; }
Source
implmente
Rcepteur
Source.addListener (this) ;
ArrayList<EventListener>
handleEvent (e)
Event
Object
- 403 -
- 404 -
Abonnement
MaxCounterEvent
AlertBean
- 405 -
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 ;
}
- 406 -
Les vnements
l
- 407 -
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 ;
}
}
- 408 -
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);
}
}
- 409 -
Interface de notification
l
- 410 -
Exemple dinterface
import java.util.EventListener;
public interface MaxCounterEventListener extends EventListener
{
public void maxReached (MaxCounterEvent e) ;
}
- 411 -
Bean rcepteur
l
- 412 -
- 413 -
CounterBean
- 414 -
CounterBean
MaxCounterEvent
- 415 -
Interactions
AlertBean
CounterBean
addMaxCounterEventListener
maxReached (MaxCounterEvent)
removeMaxCounterEventListener
- 416 -
Proprits de beans
l
- 417 -
Proprit scalaire
Une proprit scalaire reprsente une
valeur simple dun certain type.
l Mthodes daccs pour une proprit P
de type T:
l
public T getP ( )
Lecture
public void setP (T valeur)
Ecriture
Si T est boolean, la mthode de lecture peut
scrire: public boolean isP ( )
- 418 -
Exemple CounterBean
private int max = 5 ;
public int getMax () { return max ; }
public void setMax (int m) { max = m ; }
- 419 -
Exemple CounterBean
- 420 -
Proprit indexe
Une proprit indexe reprsente un
tableau de valeurs ayant le mme type
l Mthodes daccs pour une proprit P
de type T:
l
- 421 -
Proprit lie
l
l
l
- 422 -
- 423 -
Gestion de la notification
l
Aspects grs:
Mthodes dabonnement/dsabonnement
Cration de lvnement et invocation des beans abonns.
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);
}
- 424 -
Interactions
new
PropertyChangeSupport
bean
Bean
rcepteur
addPropertyChangeListener
addPropertyChangeListener
setP (v)
firePropertyChange
propertyChange (PropertyChangeEvent)
removePropertyChangeListener
removePropertyChangeListener
- 425 -
CounterBean
La proprit Max devient une proprit
lie.
l Si Max change, le compteur (variable
value) revient 0.
l Dans cet exemple, le bean CounterBean
est la fois metteur et rcepteur.
l
- 426 -
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 () ;
}
- 427 -
Proprit contrainte
l
Dclenche
PropertyVetoException si la
modification est rejete
Dclenche
PropertyVetoException si la
modification est rejete
vetoableChange ( )
VetoableChangeListeners
- 428 -
Proprit contrainte
l
- 429 -
Demande de changement
l
l
l
- 430 -
Implmentation de la demande
Aperu de la classe:
Mthodes dabonnement/dsabonnement.
Cration de la classe et invocations des beans abonns.
- 431 -
bean
VetoableChan
geListener
addPropertyChangeListener
addPropertyChangeListener
setP (v)
firePropertyChange
propertyChange (PropertyChangeEvent)
removePropertyChangeListener
removePropertyChangeListener
- 432 -
Introspection
l
l
- 433 -
Linterface BeanInfo
l
l
l
Mthode
Description
getAdditionalBeanInfo ()
getBeanDescriptor ()
getDefaultEventIndex ()
getDefaultPropertyIndex ()
getEventSetDescriptors ()
getIcon ()
getMethodDescriptors ()
getPropertyDescriptors ()
- 434 -
Les servlets
- 435 -
- 436 -
Les servlets utilisent des classes et interfaces issues des packages javax.servlet (servlets
indpendantes d'un protocole) et javax.servlet.http (servlets spcifiques au protocole
http).
Les initialisations peuvent se faire dans une des mthodes init () hrites de
javax.servlet.GenericServlet:
public void init () throws ServletException
public void init (ServletConfig) throws ServletException
- 437 -
Sous classe de
GenericServlet
service ()
- 438 -
- 439 -
<form action="http://localhost:8080/FormServlet/formulaire">
Entrer votre nom:
<input type=text name=nom>
<input type=submit value="ok">
</form>
</body>
</html>
- 440 -
- 441 -
Excution de la servlet
"ExempleServlet"
- 442 -
Serveur d'application
l
- 443 -
Application web
l
- 444 -
- 445 -
web.xml: le fichier de
dploiement
l
- 446 -
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>
- 447 -
- 448 -
- 449 -
- 450 -
Suivi de session
l
- 451 -
Cookies
l
- 452 -
La classe
javax.servlet.http.HttpSession
l
- 453 -
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
- 454 -
- 455 -
contexte web
servlet 1
servlet2
servlet3
servlet4
- 456 -
Exemple de communication:
servlet1
package servletscommunication;
import javax.servlet.* ;
import javax.servlet.http.*;
import java.io.* ;
public class Servlet1 extends HttpServlet
{
public void doGet (HttpServletRequest request, HttpServletResponse response)
{
PrintWriter out = null ;
response.setContentType("text/plain") ;
try {
out = response.getWriter () ;
} catch (IOException e) {}
ServletContext contexte = this.getServletContext() ;
contexte.setAttribute ("chaine1", "chaine deposee par servlet1") ;
out.println ("la chaine est deposee") ;
}
}
- 457 -
Exemple de communication:
servlet2
package servletscommunication;
import javax.servlet.* ;
import javax.servlet.http.*;
import java.io.* ;
public class Servlet2 extends HttpServlet
{
public void doGet (HttpServletRequest request, HttpServletResponse response)
{
PrintWriter out = null ;
response.setContentType("text/plain") ;
try { out = response.getWriter () ; } catch (IOException e) {}
ServletContext moncontexte = this.getServletContext() ;
ServletContext servlet1 = moncontexte.getContext("/Servlets/servlet1") ;
if (servlet1 == null) out.println ("Pas de contexte trouve") ;
else
{
String chaine = (String) servlet1.getAttribute ("chaine1") ;
if (chaine == null) out.println ("Aucune chaine trouvee") ;
else out.println ("chaine trouvee:" + chaine) ;
}
}
}
- 458 -
Exemple de communication:
web.xml
<web-app>
<display-name> Collaboration servlets </display-name>
<description> Collaboration de servlets </description>
<servlet>
<servlet-name> Servlet1 </servlet-name>
<servlet-class> servletscommunication.Servlet1 </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> Servlet1 </servlet-name>
<url-pattern> /Servlet1 </url-pattern>
</servlet-mapping>
<servlet>
<servlet-name> Servlet2 </servlet-name>
<servlet-class> servletscommunication.Servlet2 </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> Servlet2 </servlet-name>
<url-pattern> /Servlet2 </url-pattern>
</servlet-mapping>
</web-app>
- 459 -
Exemple de communication:
rsultat
- 460 -
- 461 -
Exemple de distribution de
renvoi
package servletscollaboration;
import javax.servlet.* ;
import javax.servlet.http.*;
public class ServletMain extends HttpServlet
{
public void doGet (HttpServletRequest request, HttpServletResponse response)
{
response.setContentType("text/plain") ;
request.setAttribute("chaine1","argument1") ; // on transmet un objet
try {
RequestDispatcher dispat = // on transmet une chaine
request.getRequestDispatcher("/process.jsp?chaine2=argument2") ;
dispat.forward(request, response) ;
} catch (Exception e) {}
}
}
- 462 -
Exemple de distribution de
renvoi
<HTML>
<%= request.getAttribute ("chaine1") %><br>
<%= request.getParameter ("chaine2") %><br>
</HTML>
fichier: process.jsp
Rsultat
- 463 -
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") ;
}
}
- 464 -
Java
Server
Pages
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 465 -
Avantages JSP
l
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).
Une balise JSP est une balise XML associe une classe java.
- 466 -
Principe JSP
- 467 -
conteneur de servlet
compilation
servlet
- 468 -
Commentaires
l
Syntaxe:
<%--
. --%>
- 469 -
Balise de dclaration
l
Syntaxe:
<%! ...
%>
Exemple:
<%!
private int counter = 0 ;
private String getAccount (int accountNo) ;
%>
- 470 -
Balise d'expression
l
Syntaxe:
<%=
%>
Exemple:
La date du jour est <%= new java.util.Date () %>
- 471 -
Balise de directive
l
include
page
tag library
fichier inclure
information concernant cette page
dfinition de balises personnalises
- 472 -
La directive include
l
Exemples:
<%@include file="exemple.html %>
<%@include file="menu.jsp" %>
- 473 -
La directive "page"
language
extends
import
session
Par dfaut, toutes les donnes sont disponible le temps de la session. Cette valeur peut
tre mise "false" pour des raisons de performances.
buffer
autoFlush
isThreadSafe
Si active, un thread sera cr pour grer la requte autorisant ainsi la servlet gnre de
traiter de multiples requtes simultanment (voir transparent suivant).
info
errorPage
Indique l'url d'une page afficher en cas d'exception non traite (voir exemple)
isErrorPage
contentType
- 474 -
Les problmes de
synchronisation
l
Les servlets gnres sont multi threads par dfaut; cela peut engendrer des conflits
d'accs des donnes partages.
Solution 1:
Solution 2:
- 475 -
- 476 -
Exemple de gestion
d'exceptions
l
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:
- 477 -
Scriplets
l
Syntaxe: <%
Exemple:
%>
- 478 -
Balise de redirection
<jsp:forward page= nom_page" />
l
Exemple:
<jsp:forward page="retry.jsp" />
- 479 -
session
request
page
- 480 -
page 1
page 2
porte de page
page 3
porte de page
porte de page
porte de requte
client 2
page 4
porte de page
porte de requte
porte de session
porte application
- 481 -
classe java
Porte
request
HttpServletRequest
request
response
HttpServletResponse
page
pageContext
PageContext
page
application
ServletContext
application
out
JspWriter
page
config
ServletConfig
page
page
HttpJspPage
page
session
HttpSession
page
exception
Throwable
page
- 482 -
- 483 -
Srialisable
Disposante dun constructeur par dfaut
disposant de mthodes get/set pour accder des proprits.
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; }
}
- 484 -
La balise <jsp:useBean>
l
- 485 -
La balise <jsp:setProperty>
l
property="*"
property="propertyName"
property="propertyName" param="parameterName"
property="propertyName" value="propertyValue"
- 486 -
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
- 487 -
Excution de l'exemple
- 488 -
- 489 -
Java Native
Interface
- Ecole Nationale Suprieure d'Ingnieurs de Caen - dp
- 490 -
Pourquoi JNI
l
Quelques consquences:
- 491 -
Prsentation de JNI
l
Il est possible:
JNI permet:
- 492 -
Mthodologie:
- 493 -
JavaVersC.java
- 494 -
- 495 -
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.
- 496 -
sous Solaris:
javac JavaVersC.java
gcc -c bonjour.c -I /usr/java1.2/include -I /usr/java1.2/include/
solaris -o libJavaVersC.so
l Compilation
sous Linux
javac JavaVersC.java
gcc -shared bonjour.c -I /usr/local/java/include
-I /usr/local/java/include/linux -o libJavaVersC.so
- 497 -
- 498 -
Excution:
java cp . -Djava.library.path=. JavaVersC
- 499 -
JNI tablit une correspondance entre les types java et les types natifs
Type Java
Type natif
Description
boolean
jboolean
unsigned 8 bits
byte
jbyte
signed 8 bits
char
jchar
unsigned 16 bits
short
jshort
signed 16 bits
int
jint
signed 32 bits
long
jlong
signed 64 bits
float
jfloat
32 bits
double
jdouble
64 bits
void
void
---
- 500 -
- 501 -
- 502 -
Le pointeur JNIEnv
l
JNIEnv *env
associe
Env
Variables
dinstance
Source C
jni.h
Mthodes
Byte
code
classes
Variables
de classe
- 503 -
class Exemple
{
int x ;
public native void setX (int val) ;
}
JNIEXPORT void JNICALL Java_Exemple_setX (JNIEnv *env, jobject obj,jint valeur)
{
jclass classe = (*env)->GetObjectClass (env,obj) ;
jfieldID fid = (*env)->GetFieldID (env,classe,"x","I") ;
(*env)->SetIntField (env,obj,fid,valeur) ;
}
- 504 -
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) ;
}
- 505 -
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) ;
}
- 506 -
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) ;
}
- 507 -
Type signatures
l
Java Type
boolean
byte
char
short
int
long
float
double
L fully-qualified-class;
fully-qualified-class
[ type
type [ ]
( arg-types ) ret-type
method type
- 508 -
Type Signature
l
- 509 -
Bibliographie
Titre
Auteurs
Editeur
Ed Anuff
Samsnet
Patrick Longuet
Sybex
PC Poche JAVA
Rolf Maurers
Micro application
Java 1.2
Java Security
Scott Oaks
O'Reilly
Java Servlets
O'Reilly
Programmation java ct
serveur
Andrew Patzer
Eyrolles
Patrick Chan
Eyrolles
- 510 -