Les Java Beans - PowerPoint PPT Presentation

1 / 43
About This Presentation
Title:

Les Java Beans

Description:

Pourquoi d velopper et utiliser des composants. R utilisation optimale ... Assemblage. de composants. Application. 1. 1. 2. 4. 3. 5. Outils mis en uvre ... – PowerPoint PPT presentation

Number of Views:178
Avg rating:3.0/5.0
Slides: 44
Provided by: i3s
Category:
Tags: assemblage | beans | java | les

less

Transcript and Presenter's Notes

Title: Les Java Beans


1
Les Java Beans
  • daprès un cours de Peter Sander et Michel Buffa

2
Pourquoi des composants logiciels ?
  • Passage du logiciel à lère industrielle
  • Quest-ce qu un composant ?
  • Un composant doit être commercialisable
  • Communiquer avec dautres composants
  • Utilisé dans une application complexe
  • Il ne constitue pas une application complète
  • Cest plus quun  objet 

3
Pourquoi développer et utiliser des composants
  • Réutilisation optimale
  • La notion de composant logiciel permet
  • A un non informaticien de développer des
    applications
  • A un développeur isolé de vendre du logiciel
    utilisable par dautres
  • A une entreprise de développer rapidement des
    applications complexes et évolutives

4
Production d un composant
1
1
2
Assemblage de composants
4
3
Application
5
Outils mis en uvre
  • Un outil IDE java
  • Borland Jbuilder...
  • Un outil dassemblage de composants
  • Java Studio
  • Autres
  • Palette de composants
  • Un bon éditeur de texte suffit (vi)

6
Exemples de java Beans
  • Objets simples
  • boutons, icônes, composants AWT, Swing
  • Objets composés
  • Accès à une base de données, calendrier, etc...
  • Applications complètes
  • Feuille de calcul, visualisateurs déquations,
    grapheurs

7
Interopérabilité des Beans
  • Modèle portable (java oblige)
  • Ponts disponibles vers
  • OLE/COM/ActiveX (microsoft)
  • Corba

8
Toute classe est un Bean
  • Juste des règles de nommage
  • Les fonctionnalités de base proviennent de Java
    (introspection)
  • Mais il faut aussi respecter certaines règles de
    programmation
  • facilement configurable sans programmation
  • Ne pas manger tout le CPU
  • Persistance des attributs (serialisable)

9
Le Bean le plus simple !
  • import java.Beans.
  • import javax.swing.
  • public class MonBouton extends JButton

10
Deux modes dutilisation
  • Design-Time
  • Je développe mon Bean, je lintègre avec dautres
    pour composer un Bean composite
  • A laide dun outil spécialisé
  • Run-Time
  • Exécution dans une application normale

11
Caractéristiques techniques
  • Un Bean dévoile son comportement de 3 manières
  • Par ses propriétés (attributs)
  • int x
  • int getX() ...
  • void setX(int x) ???
  • Par certaines méthodes quil décide dexposer
    (par défaut les méthodes publiques)
  • Par les événements qu il peut émettre ou
    recevoir (modèle JDK 1.1)

12
Caractéristiques techniques
  • Introspection
  • Personnalisation
  • Édition graphique des propriétés, à laide
    déditeurs de propriétés
  • Persistance
  • Cycle de vie celle dun objet
  • Auto-installation dans un IDE

13
Caractéristiques techniques
  • Les beans sont distribués sous forme de fichier
    dachive .jar
  • Semblable au tar unix, mais peut être compressé
  • Possibilité de  signer  des .jar
  • keytool pour générer la signature
  • jarsigner pour lassigner au jar
  • Un .jar contient
  • des classes, des classes qui sont des beans, des
    icônes, des sons, des images, un fichier
    manifeste pour s y retrouver

14
Les options de jar
  • c création
  • x extraction
  • f spécification du nom de larchive
  • v  verbose  (sortie textuelle)
  • 0 (zéro) ne pas compresser pour classpath
  • m le 1er argument (après le nom du .jar) sera
    un  manifest 
  • M non création automatique de  manifest 

15
Le manifest
  • Fichier texte
  • Manifest-Version 1.0
  • Created-By 1.5.0_06 (Sun Microsystems Inc.)
  • Main-Class MainClass
  • Pour un bean
  • Name dansPackage/NomClasse.java
  • Java-Bean True

16
Comment écrire un bean
  • Commencez par écrire votre Bean comme vous
    écririez une classe normale
  • Un Bean bouton dérivera de Button, un Bean
    composite de Panel, etc...
  • Respectez quelques règles de nommage
  • Propriétés, Méthodes, Evénements
  • Adaptez votre classe pour en faire un Bean
    facilement utilisable
  • BeanInfo, icônes,(Cuztomier) etc...

17
Propriétés
  • Propriétés attributs exposé ou exporté
  • peuvent être visualisées et modifiées par
    lutilisateur à laide de feuilles de propriétés
  • idem, mais par programmation
  • idem mais par un langage de script extérieur
    (javascript monObjet.maPropriete valeur)
  • Elles sont persistantes sauvegardables sur
    disque

18
Propriétés
  • En outre, les propriétés peuvent
  • Être liées entre elles dans un même Bean ou entre
    deux Bean (bound properties)
  • Modifiables sous certaines conditions
    (constrained properties)

19
Propriétés
  • Ce qui distingue un attribut dune propriété
  • La présence daccesseurs et de modifieurs
  • Respect dune convention de nommage
  • La propriété toto est implicitement définie par
    ses méthodes getToto() et setToto()

20
Propriétés
  • Public class MonBean extends Component
  • Color couleurFond // est une propriété
  • int x, y // pas une propriété
  • ...
  • public void setCouleurFond(Color couleur)
  • couleurFond couleur
  • public Color getCouleurFond()
  • return couleurFond

21
Propriétés
  • Le respect de la convention de nommage nest pas
    obligatoire
  • Il faudra alors utiliser une classe BeanInfo
    descriptive du Bean
  • Étendre SimpleBeanInfo
  • Surcharger que le nécessaire
  • Remplacement au run-time de linstrospection si
    linformation retournée nest pas nulle
  • Recherche du BeanInfo au même endroit que le Bean
    (ou dans BeanInfoSearchPath, cf Instrospector)

22
Propriétés liées
  • Changer toto provoque un changement de hop, pas
    forcément dans le même Bean
  • Méthodologie par délégation
  • hop sinscrit auprès de toto pour certains
    changements
  • toto envoie une notification du changement à une
    méthode de hop

23
Propriétés liées
  • La source définit des méthodes qui permettent à
    un Bean extérieur de sabonner
  • public void addPropertyChangeListener(PropertyChan
    geListener l)
  • public void removePropertyChangeListener(PropertyC
    hangeListener l)
  • Labonné, doit implémenter linterface
    PropertyChangeListener
  • public void propertyChange(PropertyChangeEvent
    evt)

24
Propriétés liées
  • La source utilise une classe PropertyChangeSupport
    pour stocker les abonnés et les avertir
  • Cette classe définit
  • public void addPropertyChangeListener(PropertyChan
    geListener)
  • public void removePropertyChangeListener(PropertyC
    hangeListener)
  • public void firePropertyChange(String
    nomProp,Object ancValeur, Object
    nouvValeur)

25
Exemple de source
  • import java.beans.
  • public class Hari
  • private String hariProp "au début y avait les
    haricots"
  • private PropertyChangeSupport abonnes new
    propertyChangeSupport(this)
  • public String getHariProp() return hariProp
  • public void setHariProp(String s)
  • String ancHariProp hariProp
  • hariProp s
  • abonnes.firePropertyChange("hariProp",
    ancHariProp, hariProp)
  • public void addPropertyChangeListener(PropertyCha
    ngeListener l) abonnes.addPropertyChangeList
    ener(l)
  • public void removePropertyChangeListener(Property
    ChangeListener l)
  • abonnes.removePropertyChangeListener(l)

26
Exemple dabonné
  • import java.beans.
  • public class Cassoulet implements
    PropertyChangeListener
  • private Hari cot new Hari()
  • public Cassoulet(String s)
  • cot.addPropertyChangeListener(this)
  • cot.setHariProp(s)
  • public void propertyChange(PropertyChangeEvent
    evt)
  • System.out.println("Propriété "
    evt.getPropertyName()
  • "\nancienne valeur " evt.getOldValue()
  • "\nnouvelle valeur " evt.getNewValue())
  • public static void main(String args)
  • String s "au début y avait les haricots"
  • new Cassoulet (args.length1 ? args0 s)

27
Résultat
  • Propriété changée
  • prompt java Cassoulet haricotblanc
  • Propriété hariProp
  • ancienne valeur au début y avait les haricots
  • nouvelle valeur haricotblanc
  • prompt
  • Propriété inchangée
  • prompt java Cassoulet
  • prompt

28
Les propriétés contraintes
  • Similaires aux propriétés liées mais
  • permettent à un Bean externe de valider ou
    dempêcher une modification
  • Gestion du droite de  veto 
  • Dans le source
  • public void setHariProp(String s) throws
    PropertyVetoException ...
  • public void addVetoableChangeListener(VetoableChan
    geListener l)
  • public void removeVetoableChangeListener(VetoableC
    hangeListener l)

29
Les propriétés contraintes
  • La source doit appeler
  • VetoableChangeSupport vetos new
    vetoableChangeSupport(this)
  • public void setHariProp(String s) throws
    PropertyVetoException
  • String ancHariProp hariProp
  • vetos.fireVetoableChange("hariProp", hariProp,
    s)
  • hariProp s
  • ...
  • La destination doit implémenter
    VetoableChangeListener
  • void vetoableChange(ProperChangeEvent e) throws
    PropertyVetoException

30
Les événements
  • Pour quun Bean expose un événement il doit
    possèder des méthodes de ce type
  • public void addltTypeEventListenergt(TypeEventListen
    er l)
  • public void removeltTypeEventListenergt(TypeEventLis
    tener l)
  • Exemple
  • public void addActionListener(ActionListener l)
  • public void removeActionListener(ActionListener
    l)
  • Diffusion multicast, sauf si la méthode d ajout
    lève TooManyListenerException

31
Les méthodes
  • Les méthodes public sont considérées comme
    méthodes accessibles de lextérieur pour le Bean
    introspecté
  • BeanInfo (via SimpleBeanInfo) recommandé pour une
    utilisation facile

32
Introspection
  • Caractèristique essentielle des Beans !
  • Permet à un environnement externe (à l exécution
    ou à la conception) de connaître les propriétés,
    les événements et méthodes exposés d un Bean,
    sans disposer des sources
  • Une classe est un Bean
  • Introspection dans java (API reflection)
  • Aucun ajout de code nécessaire

33
Introspection
  • Pour des Beans complexes
  • Ne pas tout exposer, juste les caractéristiques
    essentielles
  • Donner des noms externes plus parlants (en
    français)
  • On sappuie alors sur une interface BeanInfo
  • La classe Introspector fournit aux outils
    externes un moyen unique d interroger des Bean,
    quils utilisent une BeanInfo ou non

34
Linterface BeanInfo
  • Manière de renseigner  à la main  le Bean
  • Permet de donner d autres informations que les
    simples règles de nommage
  • icône du Bean java.awt.Image getIcone(), noms
    externes pour les propriétés, événements,
    méthodes exposées
  • Association avec un Customizer
  • public BeanDescriptor getBeanDescriptor()
  • return new BeanDescriptor(beanClass,
    customizerClass)
  • private final static Class beanClass
    ltBeangt.class
  • private final static Class customizerClass
    ltBeanCustomizergt.class

35
Linterface BeanInfo
  • Dans la pratique écrire une classe qui hérite
    de SimpleBeanInfo et de nom nomDuBeanADecrireBeanI
    nfo et située au même endroit
  • import java.Beans.
  • public class ClockBeanInfo implements
    SimpleBeanInfo
  • Cette classe na pas besoin de tout renseigner,
    elle cohabite avec la méthode de nommage standard

36
Linterface BeanInfo
  • import java.Beans.
  • public class ClockBeanInfo extends SimpleBeanInfo
  • public BeanDescriptor getBeanDescriptor()
  • BeanDescriptor bd new BeanDescriptor(Clock.cla
    ss, ClockWizard.class)
  • bd.setDisplayName("Horloge par M. Buffa")
  • return bd
  • public PropertyDescriptor getPropertyDescriptor
    ()
  • Class maClasse Clock.class
  • try
  • PropertyDescriptor background
  • new PropertyDescriptor("Couleur fond",
    maClasse)
  • PropertyDescriptor prop background
  • return prop
  • catch(IntrospectionException e) throws new
    Error(e.toString())

37
Persistance
  • Permettre à un Bean de sauvegarder son état actif
  • Indipensable pour la personnalisation (taille,
    couleur) et au stockage de données (feuille de
    calcul)
  • La sérialisation est le support de la persistance

38
serialization
  • Quasi-automatique, utilisation des
    ObjectOutput/Input (interfaces de java.io)
  • En profondeur
  • Tous les objets
  • Références partagées conservées si sérialisées
    dans le même flux
  • Processus inverse pas de nouvelle instance
  • Cependant
  • Pas de sauvegarde des modifications des champs
    static
  • Tout nest pas sérialisable (thread)

39
Contrôler la sérialisation
  • Il est possible d éviter qu un champs soit
    stocké (mot de passe)
  • private transient String password
  •  écriture  de méthode retrouver par réflexivité
  • private void readObject(ObjectInputStream s)
    throws IOException
  • private void writeObject(ObjectOutputStream s)
    throws IOException
  • Possibilité dappeler s.defaultWriteObject() et
    s.defaultReadObject()
  • Respect de lordre décriture et de chargement

40
Interface Externalizable
  • Alternative linterface hérite de Serializable
  • Méthodes public void writeExternal(ObjectOutput
    out) throws IOException et readExternal(ObjectInpu
    t in) une série de writeObject ou readObject
  • Problème ré-instantiation (constructeur par
    défaut)

41
Packaging
  • les Beans se distribuent sous la forme de
    fichiers .jar
  • Ils peuvent contenir
  • Des classes dont certaines sont des beans
  • Des prototypes sérialisés de Beans (.ser),
    nécessaires à l initialisation du Bean lors du
    chargement
  • Fichier help html, icônes (fichier .icon au
    format gif), sons, images, etc...

42
Fichiers de ressources
  • Si un Bean a besoin de lire un fichier de
    ressources (texte, image, etc...) contenu dans le
    .jar
  • Class c Class.forName("Clock")
  • InputStream is c.getResourceAsStream("maResource
    .txt")

43
Faire des plug-ins
  • Si on est dans une Applet par exemple
  • ...
  • ClassLoader cl ltMaClass.classgt.getClassLoader()
  • Component Bean (Component) Beans.instanciate(cl,
    "Clock")
  • add(Bean)
  • Bean.setSize(ltUne taillegt)
  • if(Beans.isInstanceOf(Bean, Applet.class))
  • Applet apl (Applet) Beans.getInstanceOf(Bean,
    Applet.class)
  • apl.start()
Write a Comment
User Comments (0)
About PowerShow.com