Introduction aux composants logiciels : JavaBeans http://java.sun.com/products/javabeans/ Master des Technologies de l'internet



Documents pareils
Programmation par composants (1/3) Programmation par composants (2/3)

Applet pour visualiser les variables «automate» notifiées

Programmer en JAVA. par Tama

Auto-évaluation Programmation en Java

Création d un service web avec NetBeans 5.5 et SJAS 9

Développement Logiciel

Remote Method Invocation (RMI)

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Alfstore workflow framework Spécification technique

Composants Logiciels. Le modèle de composant de CORBA. Plan

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

as Architecture des Systèmes d Information

Programmation Par Objets

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Héritage presque multiple en Java (1/2)

TP1 : Initiation à Java et Eclipse

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Bases Java - Eclipse / Netbeans

2 Chapitre 1 Introduction

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

RMI le langage Java XII-1 JMF

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

1. Installation d'un serveur d'application JBoss:

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Plan du cours. Historique du langage Nouveautés de Java 7

INITIATION AU LANGAGE JAVA

Les Utilisateurs dans SharePoint

Chapitre VI- La validation de la composition.

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Généralités sur le Langage Java et éléments syntaxiques.

Android 4 Les fondamentaux du développement d'applications Java

Création d une application JEE

Programmation MacOSX / ios

Desktop Intégration. Rémi Forax

Projet Active Object

TP SIN Programmation sur androïde Support : eclipse

INTRODUCTION AUX TESTS DE PERFORMANCE ET DE CHARGE

LOG4430 : Architecture logicielle et conception avancée

Reporting Services - Administration

.NET - Classe de Log

Création d'une interface graphique

Remote Method Invocation Les classes implémentant Serializable

Ingénierie des Modèles. Méta-modélisation

Design patterns. Design patterns - définition. Design patterns - avantages

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Objets et Programmation. origine des langages orientés-objet

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Mise en œuvre des serveurs d application

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Application web de gestion de comptes en banques

Interfaces graphiques avec l API Swing

Maîtriser le menu contextuel dans un OfficeBean

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Flux de données Lecture/Ecriture Fichiers

Introduction à JDBC. Accès aux bases de données en Java

UTILISATION DE L'APPLICATION «PARTAGE DE FICHIERS EN LIGNE»

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

Programmation en Java IUT GEII (MC-II1) 1

Chapitre 10. Les interfaces Comparable et Comparator 1

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Synchro et Threads Java TM

Tutoriel d installation de Hibernate avec Eclipse

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

Java pour le Web. Cours Java - F. Michel

TD/TP PAC - Programmation n 3

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Cours 1: Java et les objets

Applications distribuées: le retour du client "riche"

Package Java.util Classe générique

Education Delivery Intelligent Tool

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Programmation par les Objets en Java

Introduction à Expression Web 2

Java Aspect Components (JAC)

Modélisation et Gestion des bases de données avec mysql workbench

Atelier «personnaliser l environnement de l ordinateur mai 2015

Langage Java. Classe de première SI

Compte Rendu d intégration d application

PROGRAMMATION PAR OBJETS

italc supervision de salle

Une introduction à la technologie EJB (2/3)

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application

< Atelier 1 /> Démarrer une application web

Le langage C. Séance n 4

Créer un rapport pour Reporting Services

CTIconnect PRO. Guide Rapide

Transcription:

Introduction aux composants logiciels : JavaBeans http://java.sun.com/products/javabeans/ Franck.Barbier@FranckBarbier.com Pauware Research Group Master des Technologies de l'internet Université de Pau et des Pays de l'adour

( Components are for composition, Szyperski et al.) JavaBeans Component Model Inspiration de Model-View-Controller (MVC) Modèle de composant technologique ou industriel (monde Java) Modèle de composant canonique permettant : manipulation uniforme dans outillage : Beans Development Kit (BDK) http://java.sun.com/products/javabeans/software/bdk_download.html The Bean Builder https://bean-builder.dev.java.net/ Instrumentation et support pour la composabilité

MVC Classes abstraites Model, View et Controller de Smalltalk-80 Patron Observer de Gamma et al. Classes CDocument et CView de Visual C++ Programmation événementielle, notion de callback Librairie Swing de Java Note : MVC ne se limite à la programmation des interfaces homme/machine (IHM) bien que sa création soit justifiée par cela

Architecture MVC en IHM Model : une instance de classe Java dans lequel des états sont maintenus, des constantes sont définies... sans préjuger de la façon dont ces données sont affichées View : une ou plusieurs instances de classes graphiques qui incarne(nt) une représentation sur écran du modèle Controller : une instance de classe chargée d'écouter des événements tiers en relation avec le système de fenêtrage (clic souris, entrée clavier...)

Peut-on faire sans MVC? Agglomérer dans un même objet données graphiques et données business (i.e. métier ) rend les objets difficilement maintenables. Avec MVC, les vues, qui sont propres aux applications, peuvent changer sans changer les modèles qui sont partagés par les applications (réutilisation). Finalement, MVC encourage un regroupement logique lui même engendrant une meilleure isolation des objets aux fautes (fiabilité). En conclusion, MVC est un bon support de la maintenabilté, la réutilisabilité et la fiabilité

Physics Model (analyse, conception et programmation) «create» Temperature ascelsius() : Real asfahrenheit() : Real askelvin() : Real increment() decrement() =(t : Temperature) : Boolean <(t : Temperature) : Boolean <=(t : Temperature) : Boolean >(t : Temperature) : Boolean >=(t : Temperature) : Boolean Temperature() Temperature(value : Real,unit : Symbol) {asfahrenheit() = (ascelsius() + 32.) * 9. / 5. askelvin() = ascelsius() - (-273.15) Physics::Temperature «refine» Temperature -_value : Real = 0. -_step : Real = 0.1 «const» -Min : Real = -273.15 #LiteralCelsius : String = " C" #LiteralFahrenheit : String = " F" #LiteralKelvin : String = " K" +ascelsius() : Real +asfahrenheit() : Real +askelvin() : Real +increment() +decrement() +equals(t : Temperature) : Boolean {redefines = +lessthan(t : Temperature) : Boolean {redefines < +lessthanorequal(t : Temperature) : Boolean {redefines <= +greaterthan(t : Temperature) : Boolean {redefines > +greaterthanorequal(t : Temperature) : Boolean {redefines >= +asstringcelsius() : String +asstringfahrenheit() : String +asstringkelvin() : String «create» Temperature() Temperature(value : Real,unit : Symbol) public final class Temperature implements Cloneable { public static final byte Celsius = 0; public static final byte Fahrenheit = 1; public static final byte Kelvin = 2; protected static String[] _Literals = new String[3]; static { _Literals[Celsius] = new String(" C"); _Literals[Fahrenheit] = new String(" F"); _Literals[Kelvin] = new String(" K"); private final static float Min = -273.15F; // in Celsius private float _value; // in Celsius private float _step; // creation public Temperature() { _value = 0.F; _step = 0.1F;... Le code qui précède est hétéroclite au sens où sa forme est libre et plus précisément ne se conforme pas au modèle JavaBeans. Néanmoins, la classe Temperature ne comporte aucune donnée liée à des formes et/ou contraintes d'affichage

View et Controller Représentation Données propres à la vue qui graphique de données du contraint les possibilités modèle (champ _value) d'évolution des données, le genre de données que l'on veut afficher... Slider assurant la connexion entre le système de fenêtrage et le modèle (événements temp down et temp up)

Flot d'interaction Model Mettre à jour l'ihm car la nouvelle valeur de Target temperature enregistrée dans Model n'est pas celle actuellement affichée Slider a bougé (événement). Voici la nouvelle valeur de Target temperature dans l'intervalle 40 F et 90 F imposé par View View Controller En fonction du mode d'affichage, de ce qui est affiché à un instant t et de contraintes imposées à l'écran, envoyer ces types d'événements et des types d'information à Model

JavaBeans et Swing Swing dispose d'une architecture MVC particulière (i.e. la distinction conceptuelle entre View et Controller, contrairement à Smalltalk-80, est faible ) et assez déconnectée de JavaBeans JavaBeans est foncièrement dédié à la fabrication de classes Model Note : la difficulté de compréhension de MVC provient de son instanciation sur les cas particuliers VVC (Swing sans nécessité absolue de JavaBeans) et MMC (JavaBeans sans Swing purement et simplement)

Paradigmes VVC et MMC Métaphore VVC : à l'écran, si telle option est choisie alors telle option est indisponible, si tel choix est fait alors tel bouton doit être inhibé (look grisé/opaque)... Métaphore MMC : e.g. communication EJB -> Message-Driven Bean (Controller) -> EJB (voir cours EJB à suivre)

JavaBeans : principe Modèle de composant canonique signifie que JavaBeans offre un cadre structurant de programmation (patron, formatage, accès via outil...) des composants mais le principe peut être mis en oeuvre de façon légère. Ex. classe Run_indicator : public interface Run_indicator_client extends java.beans.propertychangelistener { public class Programmable_thermostat extends implements Run_indicator_client, { public class Run_indicator implements java.io.serializable { public Run_indicator(Run_indicator_client programmable_thermostat) throws Statechart_exception { propertysupport = new java.beans.propertychangesupport(this); propertysupport.addpropertychangelistener(programmable_thermostat); public void off() throws Statechart_exception { _Run_indicator.fires(_Something_on,_Everything_off); _Run_indicator.run_to_completion(); setstatus(_run_indicator.current_state()); private void setstatus(string newvalue) { String oldvalue = status; status = newvalue; propertysupport.firepropertychange("run indicator status",oldvalue,newvalue);

JavaBeans, éléments clefs, persistance Les JavaBeans sont persistants et donc implémentent l'interface java.io.serializable Attention à des champs qui référencent d'autres JavaBeans (marqueur transient utile) Attention à la gestion de version au moment du chargement dynamique des JavaBeans (cf. static final long Serial_version_id =...L;) Rappel : en stockage binaire supporté par java.io.serializable, les champs indiqués static et transient ne sont pas sauvegardés

JavaBeans, éléments clefs, encodage/décodage XML Les JavaBeans sont persistants de façon binaire (fichier sérializé.ser obtenu via java.io.objectoutputstream et désérializé via java.io.objectinputstream) ou de façon textuelle grâce aux classes java.beans.xmlencoder et java.beans.xmldecoder XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new FileOutputStream ("JOL_ball.xml"))); e.writeobject(_jol_ball); e.close(); XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream ("JOL_ball"))); JOL_ball _jol_ball = (JOL_ball)d.readObject(); d.close();

Types de propriété Simple ou indexée (tableau Java) De façon orthogonale : liée (bound) et éventuellement contrainte Liée : nécessité d'une notification aux écouteurs Contrainte : possibilité de refus de changement à la notification

Propriété liée, exemple Dans le jeu JOL, la classe JOL_meteorite a un champ _shape de type java.awt.polygon. La zone de jeu (_jol_space) de la fenêtre globale du jeu faisant apparaître à l'écran la météorite doit être prévenue lorsque _shape voit ses coordonnées modifiées (chute de la météorite régulée par un timer) -> recoloriage

Propriété contrainte Les objets intéressés par les changements d'état d'une propriété contrainte peuvent poser un veto au changement Ils écoutent, s'ils refusent le changement, ils lèvent une exception de type java.beans.propertyvetoexception L'émetteur est notifié du refus dans la clause catch (java.beans.propertyvetoexception pve) { ou alors c'est qu'il y a eu acceptation du changement

Propriété contrainte, exemple Dans le jeu JOL, la classe JOL_ball a un champ _shape de type java.awt.polygon. La zone de jeu (_jol_space) de la fenêtre globale du jeu faisant apparaître à l'écran la balle, l'empêche, contrairement aux météorites, de descendre au delà du sol. La balle se déplace en haut, à gauche et à droite en fonction du joueur mais se déplace en bas (i.e., retombe), inexorablement (timer), si le joueur ne l'utilise pas

JavaBeans, éléments clefs, type d'écouteur Interfaces java.beans.propertychangelistener java.beans.vetoablechangelistener Lien Swing : des composants Swing de base et par défaut implémentent l'interface PropertyChangeListener La classe java.beans.propertychangeevent porte les attributs des événements

JavaBeans, éléments clefs, utilitaires Des implémentations par défaut des interfaces incontournables de JavaBeans permettent de gagner du temps si l'on rentre dans le moule standard : java.beans.propertychangesupport java.beans.vetoablechangesupport Exemple en multicast sans veto : private java.beans.propertychangesupport propertychangesupport = new java.beans.propertychangesupport(this); public void addpropertychangelistener(java.beans.propertychangelistener listener) {propertychangesupport.addpropertychangelistener(listener); public void removepropertychangelistener(java.beans.propertychangelistener listener) {propertychangesupport.removepropertychangelistener(listener);

JavaBeans, éléments clefs, abonnement/désabonnement Unicast : un seul écouteur (avec veto ci-dessous) private transient java.beans.vetoablechangelistener vetoablechangelistener = null; public synchronized void addvetoablechangelistener(java.beans.vetoablechangelistener listener) throws java.util.toomanylistenersexception { if(vetoablechangelistener!= null) throw new java.util.toomanylistenersexception(); vetoablechangelistener = listener; public synchronized void removevetoablechangelistener(java.beans.vetoablechangelistener listener) { vetoablechangelistener = null; Multicast : plusieurs écouteurs (transparent précédent)

JavaBeans, éléments clefs, notification Unicast, propriété contrainte private void firevetoablechangelistenervetoablechange(java.beans.propertychangeevent event) throws java.beans.propertyvetoexception { if(vetoablechangelistener == null) return; vetoablechangelistener.vetoablechange(event); // la balle JOL est translatée de _offset pixels en descente : down() java.awt.polygon shape = new java.awt.polygon(_shape.xpoints,_shape.ypoints,_shape.npoints); _shape.translate(0,_offset); // on descend de _offset pixels try { firevetoablechangelistenervetoablechange(new java.beans.propertychangeevent (this,"_shape",shape,_shape)); catch(java.beans.propertyvetoexception pve) { _shape.translate(0,-_offset); // on remonte de _offset pixels Multicast sur base utilitaire, propriété liée java.awt.polygon shape = new java.awt.polygon(_shape.xpoints,_shape.ypoints,_shape.npoints); _shape.translate(0,1); propertychangesupport.firepropertychange("_shape",shape,_shape);

JavaBeans, éléments clefs, capture La fenêtre de jeu se déclare écouteur des mouvements de la balle JOL et définit la méthode de l'écouteur, jusqu'ici abstraite, informant d'un changement : _jol_ball.addvetoablechangelistener(new java.beans.vetoablechangelistener() { public void vetoablechange(java.beans.propertychangeevent propertychangeevent) throws java.beans.propertyvetoexception { // handling code here... );

Code se trouvant dans le détecteur d'événement (i.e. Controller) : private transient java.util.arraylist _jol_ball_crashes_jol_meteorite_listeners; public synchronized void add_jol_ball_crashes_jol_meteorite_listener(jol_ball_crashes_jol_meteorite_listener listener) { if(_jol_ball_crashes_jol_meteorite_listeners == null) _jol_ball_crashes_jol_meteorite_listeners = new java.util.arraylist(); _jol_ball_crashes_jol_meteorite_listeners.add(listener); public synchronized void remove_jol_ball_crashes_jol_meteorite_listener(jol_ball_crashes_jol_meteorite_listener listener) { if(_jol_ball_crashes_jol_meteorite_listeners!= null) _jol_ball_crashes_jol_meteorite_listeners.remove(listener); private void crash(jol_ball_crashes_jol_meteorite_event event) { java.util.arraylist copy_of_jol_ball_crashes_jol_meteorite_listeners; synchronized(this) { if(_jol_ball_crashes_jol_meteorite_listeners == null) return; // avoiding timing race: copy_of_jol_ball_crashes_jol_meteorite_listeners = (java.util.arraylist)_jol_ball_crashes_jol_meteorite_listeners.clone(); for(int i = 0;i < copy_of_jol_ball_crashes_jol_meteorite_listeners.size();i++) ((JOL_ball_crashes_JOL_meteorite_listener)copy_of_jOL_ball_crashes_JOL_meteorite_listeners.get(i)).crash(event); JavaBeans, interaction avancée public class JOL_ball_crashes_JOL_meteorite_event extends java.util.eventobject { public JOL_ball_crashes_JOL_meteorite_event(JOL_ball source) { super(source); public interface JOL_ball_crashes_JOL_meteorite_listener extends java.util.eventlistener { void crash(jol_ball_crashes_jol_meteorite_event event);

Eléments de Java sur lesquels s'adosse JavaBeans «class» java::util::eventobject «class» java::beans::propertychangeevent «class» java::awt::actionevent «interface» java::util::eventlistener «interface» java::awt::event::actionlistener actionperformed(ae : ActionEvent) «interface» javax::swing::action «interface» java::beans::propertychangelistener propertychange(pce : PropertyChangeEvent) «class» javax::swing::abstractaction

Documentation programmatique Interface fondamentale java.beans.beaninfo Classe utilitaire java.beans.simplebeaninfo Principe : documenter un JavaBean X via une classe Java héritant le plus souvent de java.beans.simplebeaninfo. Cette classe nommée par convention XBeanInfo établit, à l'exécution (pour des outils en fait) et à la demande (choix de ce qui est documenté ou non) : les champs et leurs propriétés (getter, setter...) les méthodes et leurs propriétés les événements et leurs modalités... Mode de documentation fixé pour chaque catégorie dans la classe XBeanInfo Introspection, voire aussi classe java.beans.introspectionexception Lazy initialization

Bean: Documentation programmatique, exemple public class JOL_ meteorite extends com. FranckBarbier. Java._ Composytor. Timer_ monitor implements Serializable {... BeanInfo: public class JOL_ meteoritebeaninfo extends SimpleBeanInfo { // lazy initialization ( la convention de nommage peut sauter car la classe du Bean est donnée) private static BeanDescriptor getbdescriptor() { BeanDescriptor beandescriptor = new BeanDescriptor ( JOL_ meteorite. class, null); // Here you can add code for customizing the BeanDescriptor. return beandescriptor; // introspection pour les champs private static PropertyDescriptor[] properties = null; private static PropertyDescriptor[] getpdescriptor() { return properties; // informations récupérables au niveau instance public BeanDescriptor getbeandescriptor() { return getbdescriptor(); public PropertyDescriptor[] getpropertydescriptors() { return getpdescriptor();...

Documentation de JOL_ball, champs en mode lazy initialization // Property identifiers private static final int PROPERTY color = 0; // Property array private static PropertyDescriptor[] properties = new PropertyDescriptor[1]; private static PropertyDescriptor[] getpdescriptor() {return properties; static { try { properties[property color] = new PropertyDescriptor ( "_color", WYX_ball.class, "get_color", null); properties[property color].setdisplayname ( "_color" ); properties[property color].setshortdescription ( "WYX ball color" ); catch(introspectionexception ie) { // Here you can add code for customizing the properties array. public PropertyDescriptor[] getpropertydescriptors() {return getpdescriptor();

Compléments La classe java.beans.beans fournit des facilités de contrôle (e.g., création) de JavaBeans. Ex. : instantiate La classe java.beans.introspector crée automatiquement des informations de JavaBeans (cf. getbeaninfo) Interface java.beans.propertyeditor et classe java.beans.propertyeditorsupport fournissent des composants graphiques pour manipuler les champs des JavaBeans La classe utilitaire java.beans.propertyeditormanager enregistre et localise les éditeurs PropertyEditor pe = PropertyEditorManager.findEditor(java.awt.Color); // OK car type connu PropertyEditorManager.registerEditor (an_instance_of_a_type.class,an_instance_of_my_property_editor.class);

Déploiement Packaging dans fichier.jar pour déploiement avec avec fichier manifest optionnel et fichiers divers (.ser, icon 16x16, HTML, audio, vidéo...) Exemple de contenu de fichier manifest : Java- Bean: True Exemple : glisser/lâcher Timer (composant logiciel offert par www.netbeans.org) dans l'ide NetBeans

Technologies connexes JavaBeans Activation Framework (JAF) Génération automatique de JavaBeans à partir de sources de données hétérogènes : classe DataHandler, interfaces DataSource et CommanMap JAF s'appuie sur le format MIME pour caractériser (typer) la nature profonde des sources de données Adresse Web de JAF : http://java.sun.com/products/javabeans/jaf/index.jsp JavaBeans Bridge for ActiveX ActiveX est le modèle de composants logiciels de Microsoft http://java.sun.com/products/javabeans/software/bridge/