Title: Evnements Java Beans Java RMI
1Evénements Java BeansJava RMI
- X. BLANC J. DANIEL
- Xavier.Blanc_at_lip6.fr , Jerome.Daniel_at_der.edf.fr
2Les événements dans Java
- X. BLANC J. DANIEL
- Xavier.Blanc_at_lip6.fr , Jerome.Daniel_at_der.edf.fr
3Le modèle événementiel
- Les événements sont un moyen de communication
alternatif entre deux objets. - Les communications par événements sont
asynchrones. Un objet lance un événement et un
autre objet attrape cet événement. - Exemples dévénements click de sourie,
changement dune base de donnée
4Le modèle événementiel
5Le modèle événementiel
- Le modèle événement de Java est tout objet.
- Le lanceur dévénement est un objet
- Le receveur dévénement est un objet
- Lévénement est un objet.
6Exemple d'événement
- La classe JButton est capable de lancer
lévénement java.awt.Event.ActionEventCet
événement est lancé lorsque lon clique sur un
bouton. - Les classes capables de recevoir cet événement
doivent implanter linterfacejava.awt.event.Actio
nListener - Pour quun receveur (listener) se connecte à un
lanceur, il doit appeler la méthodeaddActionListe
ner()du lanceur. - Lorsque le lanceur lance un événement, il appelle
les méthodesactionPerformed(ActionEvent e)de
l interface ActionListener
7Exemple dévénement
- // la classe receveur
- public class MonListener implements
java.awt.event.ActionListener - public void actionPerformed(ActionEvent e)
- System.out.println(evenement recu !)
-
-
-
- // quelque part dans le programme, le lien entre
le receveur et le lanceur - java.swing.JButton button new
java.swing.JButton(click) -
- button.addActionListener(new MonListener())
8Le Lanceur dévénements
- Un objet qui lance des événements doit proposer
des méthodes pour que des receveurs puissent
denregistrer.Ces méthodes sont toujours sous la
formeaddXXXListener()Où XXX est le type
dévénement lancé. - Lorsquil jette un événement, le lanceur le jette
vers tout les objets qui se sont enregistrés. - Les méthodesremoveXXXListener() Permettent de
ne plus enregistrer des objets.
9L'événement
- Les événements doivent tous hériter de la
classejava.util.Event - Cette classe dispose de deux méthodes
- public String toString()Cette méthode donne une
représentation de l événement sous forme de
chaîne de caractère (inintéressant). - public Object getSource()Cette méthode donne une
référence vers lobjet qui a crée cet événement
(très intéressant)
10Le receveur dévénements
- Le receveur dévénement doit implanter
linterface correspondant à lévénement.XXXListen
er - Cette interface contient les méthodes appelées
lorsque lévenement est jeté. - Toutes ces interfaces héritent de
linterfacejava.util.EventListenerCette
interface na aucune méthode.
11Architecture
- Il y a différents choix darchitecture possibles.
- Soit une classe qui centralise tous les
événements. Cette classe est le recepteur, elle
implante toute les interface Listener. - Soit plusieurs classes receveur. Chaque receveur
est lié avec un certain nombre de lanceur. - Soit une classe interne pour chaque événement.
12ActionListener
- Cette interface doit être implantée par les
receveurs dévénement Action - public void actionPerformed(ActionEvent e) est
la seule méthode de cette interface. - ActionEvent est lobjet représentant un
événement de type action. - Ces événements sont jetés par les Button, List,
Menu, ...
13WindowListener
- Cette interface doit être implantée par les
receveurs dévénement Window - public void windowActivated(WindowEvent e)
public void windowClosed(WindowEvent e) public
void windowIconified(WindowEvent e) ... Sont
des méthodes de cette interface. - WindowEvent est lobjet représentant un
événement de type window. - Ces événements sont jeté par les Window, Frame
...
14MouseListener
- Cette interface doit être implantée par les
receveurs dévénement Mouse - public void mousePressed(MouseEvent e) public
void mouseClicked(MouseEvent e) public void
mouseExited(MouseEvent e) ... Sont des
méthodes de cette interface. - MouseEvent est lobjet représentant un événement
de type mouse. - Ces événements sont jeté par les Window, Button,
...
15MouseMotionListener
- Cette interface doit être implantée par les
receveurs dévénement MouseMotion - public void mouseDragged(MouseEvent e) public
void mouseMoved(MouseEvent e) ...Sont des
méthodes de cette interface. - MouseEvent est lobjet représentant un événement
de type sourie. - Ces événements sont jeté par les Component,
Button, ...
16KeyListener
- Cette interface doit être implantée par les
receveurs dévénement Key - public void keyPressed(KeyEvent e) public void
keyReleased(KeyEvent e) ...Sont des méthodes
de cette interface. - KeyEvent est lobjet représentant un événement
de type key. - Ces événements sont jeté par les List, Button,
Frame ...
17FocusListener
- Cette interface doit être implantée par les
receveurs dévénement Focus - public void focusGained(FocusEvent e) public
void FocusLost(FocusEvent e) ...Sont des
méthodes de cette interface. - FocusEvent est lobjet représentant un événement
de type focus. - Ces événements sont jeté par les Component,
Button, ...
18AdjustmentListener
- Cette interface doit être implantée par les
receveurs dévénement Adjustement - public void adjustmentValueChanged(AdjustmentEven
t e) est la seule méthode de cette interface. - AdjustmentEvent est lobjet représentant un
événement de type adjustment. - Ces événements sont jeté par les Scrollbar ...
19Les Adapter
- Lorsque lon veut créer un Listener il faut que
la classe du listener implante toutes les
méthodes de linterface. - Cependant, il nest pas dit que toutes les
méthodes nous intéresse. - Ex WindowListener (iconified, closed )
- Les classes Adapter sont des classes abstraites
qui implantent les interface Listener.
20Exemple MouseAdapter
- La classe java.awt.event.MouseAdapter implante
linterface MouseListener - Ainsi pour créer un recepteur de MouseEvent, il
suffit de créer une classe qui hérite de
MouseAdapter. - Les autres adapter
- KeyAdapter
- MouseAdpter
- WindowAdapter
- ContainerAdapter
- ...
21Construire ses événements
- Le modèle événementiel de Java nest quune
architecture. - Pour créer ses propres événements il faut
- Créer sa classe événement qui hérite de
java.util.Event - Créer linterface Listener qui hérite de
java.util.EventListener - Dans la classe lanceur créer les méthode pour
inscrire les receveur. - Gérer le fait de lancer un événement.
22Construire ses événements
- On ne peut pas créer de nouveaux événements
graphiques. - Le seul moyen est de les utiliser.
- Ou, en hériter.
23Exercice
- Construire une classe Pile qui génère un
événement de NewItem dès quun nouvel élément est
inséré dans la pile.
24Attention ce modèle est celui de AWT 1.1
- Le modèle événementiel présenté ici est celui
définie dans AWT 1.1 - Le modèle événementiel de AWT 1.0 est tout à fait
différent. - Doù utilisation de jdk1.1.x ou jdk1.2.x
25Java Beans
- X. BLANC J. DANIEL
- Xavier.Blanc_at_lip6.fr , Jerome.Daniel_at_der.edf.fr
26Java Beans
- Modèle de Composant
- auto-descriptif
- réutilisable
- principalement visuel
- java
27Java Beans
- Construction dun Beans
- Modèle Beans
- Règles syntaxiques
- Pacquage
- Déploiement dun Beans
- Utilisation doutils graphiques
- Exécution dun Beans
- programme classique
28Construction dun Beans
- Modèle Beans et Règles de syntaxes
29Modèle Beans
- Un Bean est une classe
- Cette classe doit être conforme au modèle Beans
- Ce modèle permet aux outils de découvrir les
Beans - Un Bean encapsule sa propre description
gtPropriété générale des COMPOSANTS
30Modèle Beans
- Un Beans est une classe Java
- Implante linterface java.io.Serializable
- Fournir un constructeur public sans argument
- Possède des propriétés
- Peu envoyer des événements
31Propriétés du Bean
- Un Beans possède des propriétés
- Les propriétés dun Beans sont les aspects du
Beans qui pourront être modifier lors du
déploiement du Bean - Ex couleurDeFond, typeDeFont ...
32Propriétés Simples
- Laccès aux propriétés se fait par des méthodes
set / get. - Example
- private int toto // La propriete public int
gettoto() return toto //La syntaxe doit être
respectée public void settoto(int value)
totovalue //idem - Ces règles syntaxiques permettent aux outils de
découvrir les méthodes.
33Propriétés Indexées
- Les propriétés indexées
-
- public void setXXX(int index, type
value) public void setXXX(type
values) public type getXXX(int
index) public type getXXX()
34Propriétés Liées
- Les propriétés peuvent être liées un changement
dune propriété dun Beans entraîne un changement
dune propriété dun autre Beans. - Le lien entre deux propriétés est
unidirectionnel. Il y a donc la propriété
dépendante et la propriété lié. - En fait, il y a la propriété lié et le bean qui
contient la propriété dépendante. - L utilisation dune propriété liée consiste plus
particulièrement à notifier divers événements aux
beans intéresséS.
35Propriétés Liées
- Le Beans contenant la propriété liée
- import java.beans.private PropertyChangeSuppor
t changes new PropertyChangeSupport(this) - public void addPropertyChangeListener(
PropertyChangeListener l) changes.addPropertyC
hangeListener(l) -
- public void removePropertyChangeListener(Property
ChangeListener l) - changes.removePropertyChangeListener(l)
- public void setLabel(String newLabel)
- String oldLabel label
- label newLabel
- sizeToFit()
- changes.firePropertyChange("label",
oldLabel, newLabel) -
36Propriétés Liées
- Le Beans contenant la propriété dépendante
- public class MyClass implements
java.beans.PropertyChangeListener,
java.io.Serializable - public void propertyChange(PropertyChangeEvent
evt) -
- ...
-
37Propriétés Contraintes
- Un propriété de Beans peut être contrainte.
- Les contraintes sont un cas particulier des
propriétés liées, un bean peu émettre un veto sur
le changement dune propriété contrainte. - Les mécanismes de propriété contrainte sont
similaires aux propriétés liées. - Les méthodes set doivent générer lexception
PropertyVetoException
38Propriétés Contraintes
- Le Beans qui contient la propriété
contrainteimport java.beans. - private VetoableChangeSupport vetos new
VetoableChangeSupport(this) - public void addVetoableChangeListener(VetoableCha
ngeListener l) - vetos.addVetoableChangeListener(l)
- public void removeVetoableChangeListener(Vetoable
ChangeListener l) - vetos.removeVetoableChangeListener(l)
- public void setPriceInCents(int newPriceInCents)
throws PropertyVetoException - int oldPriceInCents ourPriceInCents
- vetos.fireVetoableChange("priceInCents",new
Integer(oldPriceInCents), - new Integer(newPriceInCents))
- ourPriceInCents newPriceInCents
- changes.firePropertyChange("priceInCents",new
Integer(oldPriceInCents), - new Integer(newPriceInCents))
-
39Propriétés Contraintes
- Beans émettant le veto
- public class MyClass implements
VetoableChangeListener interface - .
- void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException . -
-
40Exercice
- Créer un Bean possédant les propriétés
- int a
- String b
- Puis faite que a soit une propriété contrainte
41Communication par événements
- Les Java Beans communique par événements.
- Un bean envoie un événement vers un bean capable
de comprendre ce type dévénement - Lorsquun bean génère des événements, il faut
quil possède ces méthodes pour chacun des
événements quil est capable de générer. - public void addltEventListenerTypegt(ltEventListenerT
ypegt a) - public void removeltEventListenerTypegt(ltEventListen
erType a)
42Méthodes du bean
- Pour quun bean puisse offrir ces services, il
faut que les méthodes soient public. - public type nom_methode(parametre)
43Introspection
- Comment connaître un Java Bean
44Principe
- Un bean est un composant qui va être manipulé par
des outils graphiques. - Le bean doit donc permettre à ces outils de
savoir comment le bean fonctionne. - Lintrospection permet de connaître les
propriétés, les méthodes et les événements que
manipule le bean.
45Le package reflect
- Java propose une API pur découvrir une classe
lors de lexécution. - Ce qui permet dexécuter dynamiquement une
méthode sur une classe. - Le package reflect peut être utilisé pour
n importe quelle classe Java, donc aussi pour
les bean.
46La classe Introspector
- Le package java.beans propose une autre manière
de découvrir une classe - Cette manière se fait à travers la classe
Introspector. - Lintrospection de Java Bean utilise la réflexion
mais aussi les règles syntaxiques de Java Beans - Lintrospection permet aussi dutiliser la classe
BeanInfo pour décrire un Java Bean
47Obtenir la référence vers un BeanInfo
- Si aucun BeanInfo na été proposé par le
constructeur de bean, il en sera généré un
automatiquement. - MonBean mb new MonBean()
- BeanInfo bi Introspector.getBeanInfo(mb.getClass
())
48La classe BeanInfo
- La classe BeanInfo est une interface qui contient
toute les méthodes permettant de connaître un
Bean. - Un objet de type BeanInfo est retourné lors de
lappel à lintrospector. - Si, le bean possède un BeanInfo qui lui est
propre, cette objet sera de ce type.
49Des méthodes de la classe BeanInfo
- public MethodDescriptor getMethodDescriptors()
- public PropertyDescriptor getPropertyDescriptors
() - public EventSetDescriptor getEventSetDescriptors
() - public BeanDescriptor getBeanDescriptor()
50Des méthodes de PropertyDescriptor
- public Class getPropertyType()
- public boolean isConstrained()
- ...
51Création dun BeanInfo
- Le nom de la classe BeanInfo doit être le nom du
bean précédé de BeanInfoEx MonBeanBeanInfo - Cette classe doit hériter de SimpleBeanInfo
- Re-écrire les méthodes que lon veut modifier.
52Property Editors / Customizers
- Les Beans sont manipulés par un outil graphique.
Cet outil va permettre de saisir les valeurs de
bases des propriétés. - Les Property Editors permettent de paramètrer la
façon de saisir les informations dans loutil
graphique. - Les Customizers sont des composants graphiques
qui vont être intégrés dans loutil pour la
saisie des propriétés.
53Exercice
- Proposer une méthode qui prend le nom dun Bean
et qui affiche à lécran le nom de toutes les
méthodes du bean.
54Déploiement de Beans
- Utilisation de la Bean Box
55Principe
- Nous avons vu quun bean était constitué de
plusieurs classe Java. - Cependant, ces classes forment un tout le bean.
- Voilà pourquoi il faut archiver toutes les
classes dans un seul fichier. Un fichier .jar
56Le manifest du fichier Jar
- Dans tout archive .jar, il y a un fichier
manifest.mnf qui décrit le contenu de larchive. - Pour les Java Beans le manifest doit contenir
- Name toto.class
- Java-Bean True
57Le fichier Jar
- Pour archiver des classes dans un fichier Jar
-
- jar cfm fichier.jar fichier.mnf liste_fichier
- exjar cfm toto.jar toto.mnf .class
-
58Java RMI
- X. BLANC J. DANIEL
- Xavier.Blanc_at_lip6.fr , Jerome.Daniel_at_der.edf.fr
59Principe de Java RMI
- Java RMI pour Java Remote Method Invocation
- Cest un façon pour faire communiquer deux
classes situés sur deux machines différentes. - Une classe située dans une machine virtuelle
appelle la méthode dune classe située dans une
autre machine virtuelle. - Java RMI est une architecture Sun (contrairement
à CORBA
60Architecture de Java RMI
61Obtention du stub à lexécution
- Il faut disposer du stub de lobjet pour pouvoir
invoquer des méthodes à distance. - Si on ne dispose pas du stub, il est possible de
lobtenir au moment de lutilisation de lobjet. - La classe implantant le stub est rechercher en
locale - Si la classe nest pas trouvée en locale, on la
cherche sur le site distant - Le stub est transmis au poste client puis chargé
par le client lui-même - Ce mécanisme est automatiquement géré par Java.
62Définir une interface distante Java
- Une interface distante décrit un objet distant.
Elle doit hériter de java.rmi.Remote - Cette interface identifie le décrit le type des
objets répartis - Toute les méthodes qui constituent linterface
distante doivent pouvoir générer une exception de
type RemoteException
63Exemple dinterface
- Import java.rmi.
- public interface Calculatrice extends Remote
- public add(int a, int b) throws RemoteException
64Implanter une interface
- On définie une classe qui implante linterface
distante. Cette classe doit hériter de
UnicastRemoteObject - import java.rmi.
- import java.rmi.server.
- public class CalculatriceImpl extends
UnicastRemoteObject Implements Calculatrice - public int add(int a, int b) throws
RemoteException return ab
65Rendre accessible un serveur
- Pour cela on doit
- créer un manager de sécurité
- ajouter le serveur a ceux disponible sous Java
RMI (bind) - public static void main(String args)
- try
- System.setSecurityManager(new
RMISecurityManager()) - CalculatriceImpl calc new CalculatriceImpl()
- String nom "Calculatrice"
- Naming.rebind(nom.calc)
-
- catch (Exception ex)
-
66Générer le stub et le skeleton
- Pour cela, on utilise le compilateur rmic fourni
avec Java. - Les arguments de rmic sont identiques à ceux de
javac - La génération du stub et du skeleton s effectue
à partir de la classe dimplantation - rmic CalculatriceImpl
67Développer un client
- Le client est une classe traditionnelle qui va
utiliser le service de désignation de Java RMI
pour retrouver le serveur auquel il souhaite
accéder. - Le service de désignation va retourner une
référence sur lobjet (RemoteObject) qui devra
être convertie vers lobjet que lon souhaite
utiliser (cast). - Lopération qui retourne le serveur prend en
paramètre une sorte d URL (//host/name).
68Exemple de client
- Import java.rmi.
- public class CalculatriceClient
- public static void main(String args)
- String serverName "Calculatrice"
- CalculatriceInterface calc
- try
- calc (CalculatriceInterface)
Naming.lookup(serveurName.toString()) - System.out.println(" 62 "calc.add(6,2)
-
- catch (RemoteException ex)
- catch (Exception e)
-
-
69Exécuter lapplication répartie
- On doit en premier lieux, lancer le service de
désignation de Java RMI (rmiregistry) sur la
machine ou se situ le serveur - Ce service doit connaître lendroit où les
classes sont accessibles (cest à dire que le
CLASSPATH doit être positionné avent le lancement
de lutilitaire. - On lance ensuite le serveur, puis le client
70Exercice
- Créer une classe accessible à distance. Cette
classe sera une pile.
71Sérialisation des objets
- La sérialisation est un mécanisme utilisé pour
lencodage et décodage des paramètres lors dun
appel distant. - En particulier, dans le cas ou lon devrait
passer une structure de données particulière lors
dun appel, notre structure devrait supporter la
notion de sérialisation pour pouvoir être
transmise (c est à dire implanter linterface
java.io.Serializable).
72Les exceptions avec Java RMI
- Toutes les méthodes dune interface doivent
signaler lexception RemoteException car - il peut survenir un problème lors dune
communication client/serveur dans ce cas, cest
RMI qui généra cette exception. - Toutes les exceptions définies par lutilisateur
devront hériter de la classe RemoteException.
73Garbage collector dobjets distants
- De façon à maintenir une cohérence dans la modèle
Java. Java RMI dispose dun mécanisme de garbage
collection dobjets distants - Ce mécanisme utilise un algorithme complexe qui
maintient un liste de toutes les références à des
objets distants. Un protocole entre les
références d objets permet lincrémentation et
la décrémentation des références. Ainsi, RMI
assure un compteur de référence pour chaque objet
distant, lorsque le compteur arrive à 0, lobjet
est alors détruit. - La méthode finalize est bien entendue appelée au
moment de la destruction de l objet.