Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. – Comment concevoir les écrans? – Comment programmer les évènements? – Comment développer une application en java? Les Threads ou les processus légers – Qu’est ce que la programmation parallèle. – Comment programmer les processus en java Les Applets : java sur le Web. – Comment utiliser java pour programmer vos pages. Exemple Entrée/Sortie Sérialisation problématique La portée de chaque variable est limitée au bloc de déclaration. A la fin de l’application, les variables (objets) sont détruites par le GarbageCollector (perte de données). Certaines variables ou objets (pour des raisons applicatives) doivent persister à la fin du programme. Exemple: gestion des employés On veut écrire un programme de saisie d’employés. Solution: pile tas Public static void main(String[] args) base {ListPersonel base= new ListPersonel(); Class Employé ListEmployé Nom liste Prénom boolean fin=false; Adress …. While(!fin) {// lire les données de l’employé data base.add(new Employé(data)); Employé[] list // lire décision de poursuite de l’utilisateur fin= decision; }// fin main } Employé[] ListPersonnels Employé ….. Add(Employé) Remove(Employé) Solution: Trouver le moyen de persister les données. Solution : utiliser un fichier pour stocker les données: – Définir un modèle de stockage des Objets – Définir le moyen de restauration des Objets – Exemple: InputStream ou FileWriter public class MyClass { public void saveYourself(Writer o) OutputStream ou FileReade throws IOException { … } public static MyClass loadYourself(Reader r) throws IOException { … } } Limite de cette solution Le stockage de l’objet passe par le stockage de ses données membres. Chaque Objet membre doit appartenir à une classe qui implémente le même mécanisme. Impossible de passer par les interfaces (la méthode de restauration doit être static). La solution devient très complexe pour gérer les références Problème de reférence employé1 Employé1 …… employé3 Patron: Employé3 employé1 …….. employé2 employé3 Employé2 Emp1. saveYourself(Writer…… o) Emp2. saveYourself(WriterPatron: o) Emp2. saveYourself(Writer o) employé2 Employé3 …….. employé3 Employé3 …….. Emp1=Employé.loadYourself(Reader r) Emp2=Employé.loadYourself(Reader r) Emp3=Employé.loadYourself(Reader r) employé4 employé3 La sérialisation Le mécanisme offert par Java pour persister les données. Un format uniforme pour formater les objets sous forme d’une séquence d’octets. Il gère le problème de référence. Offre d’autres mécanismes de personnalisation Les Conditions nécessaires Le type de l’objet (Class) doit être déclaré public La classe doit disposer d’un constructeur à zéro paramètres La classe doit implémenter l’interface Serialisable Toutes les données membre doivent être « sérialisable »: type primitive ou des classes qui implémentent Serialisable . Les données membres static et static final ne sont pas sauvegardées Implémentation de l’interface Serializable Implémenter une interface induit à l’implémentation de ses méthodes, Mais… Serializable ne définit aucune méthode. – Question1: A quoi sert une interface sans méthodes? – Réponse: Serialisable est une interface drapeau qui informe l’environnement Java pour traiter la Classe de manière particulière. – Question2: pourquoi toutes les classes n’implémentent pas Serializable par défaut ? – Réponse: problème de sécurité (voire la suite). Sérialiser un Object La Classe ObjectOutputStream. Elle prend en paramètre un OutputStream Utilise la méthode writeObject(Object) public class employé implements Serializable{………} ……… public class Sauvgarder{ public static void main(){ Employé emp1=new Employé(………); ObjectOutputStream out=new ObjectOutputStream( new FileOutputStream(fileName)) out.writeObject(emp1); Out.close …………}} Restaurer un objet (« de-sérialiser ») Faut savoir à l’avance le type de l’objet. Utilisé la classe ObjectInputStream. ObjectInputStream in= Prend un object InputStream. new ObjectInputStream( new FileInputStream(fileName)); Utilise la méthode readObject(). Type de retour Object. Employé emp1=((Employé)in.readObject() Il faut savoir le type (pour le transtypage). Vous pouvez utiliser la méthode. getClass() pour savoir le type effectif. Exemple: problème de référence emp1 employé1 Employé1 employé3 1 employé1 …… employé3 Patron: 2 emp3 employé2 Employé3 2 …….. Patron:null Employé2 3 …… Patron: emp2 2 ObjectOutputStream out=new ObjectOutputStream( ObjectInputStream in=new ObjectOutputStream( FileOutputStream(fileName)) new FileInputStream(fileName)) out.writeObject(emp1); emp1= ((Employé)in.readObject()); out.writeObject(emp2); emp2= ((Employé)in.readObject());// ne crée pas d’objet out.writeObject(emp3); emp3= ((Employé)in.readObject()); employé2 Aspects avancés Sécurité: – Une objet sérialisé est un fichier UTF(texte). – Un objet sérialisé peut être lu et modifié. le mot clé transient – Certaines données (non static) ne doivent pas être stockées (les valeurs calculées, mot de passe) – Le mot clé transient informe java de ne pas sérialiser la variable en question. public class Employé implements Serializable { ……………… private transient double salaire; // le salaire ne sera pas sérialisé} En résumé: Désormais, il est possible de sauvegarder les variables objets. Implémenter l’interface Serialisable Utilisez ObjectInputStream & ObjectOutputStream pour stocker et restaurer les objets. Les objets restaurés sont de type Object (transtypage). Faites attention lors de l’héritage, les classes mères doivent avoir des contructeurs à zéro paramètres…… Les Interfaces graphiques Les Swing Les interfaces graphiques: Introduction Une application est une boîte noire. Prend des entrées et produit des sorties. Les utilisateurs ne sont pas des programmeurs. Nécessité d’un mécanisme d’interaction entre l’utilisateur et l’application: – Echanger les données. – Echange de contrôle. Solution la plus basique: les Intput/output Stream Vous pouvez passer par des objets de gestion de flux ou de données pour interagir avec l’utilisateur. Saisir les données dans un fichier ou à partir du clavier (System.in, InputStream). affichage des résultats sur la console ou dans des fichiers (System.out et OutputStream). Inconvénients: Très lourde (beaucoup de code pour peut de chose). Peu adaptée pour les interactions de type contrôle. Pas du tout intuitive: il faut connaître pour pouvoir l’utiliser certains types de données ne peuvent être gérés en tant que flux. Solution : Les interfaces graphiques Faire une interface graphique... Comment construire un écran graphique ? Comment gérer les événements ? Comment maintenir la cohérence entre les objets applicatifs / objets graphiques ? Définition des écrans ! Une application = plein d ’écrans graphiques Un écran graphique = 1 arbre de composants graphiques La racine = La fenêtre Les feuilles = des composants atomiques (button, List, TextField…) Les nœuds = des conteneurs (des zones pour mettre des composants atomiques) Exemple: très simple fenêtre :Frame Caption: Label Bouton de commande: Button Zone de texte:TextField Exemple : un arbre de composant graphique Racine est écran Les nœuds des saisir: Frame containeurs ????? nom : Label ajout : Buttonl post: TextField Les feuilles composants atomiques Étape1: Comment construire des écrans Graphiques ? Java offre une « pléthora » de composantes graphiques. Deux packages java.awt.*; javax.swing.*; Le package swing est une extension de awt On peut les classer selon trois catégories – Les composantes écrans – Les composantes de gestion d’emplacement: les containers – Les composantes graphiques atomiques. – Les composantes de type menus. Une vue partielle sur le modèle de classe du package swing Les composants atomiques JButton Une classe abstraite! JComponent (from awt) component[] Container TextComponent (from awt) Les composants composites ! (from awt) (from awt) JTextField JWindow Panel (from awt) JList JFrame Pas de nouvelles fenêtres La classe JFrame La classe qui permet de créer des fenêtres C’est l’objet racine Sous classe de la classe Frame de awt. Elle maintient un objet de gestion de composants. Frame (awt) « Interface » WindowConstants JFrame JRootPane « Interface » RootPaneContainer Les constructeurs de JFrame Deux constructeurs: 1. 2. public JFrame() public JFrame(String titre) Exemple: public static void main(String[] args) { //mode d’affichage par défaut (mode java) JFrame.setDefaultLookAndFeelDecorated(true); Jframe e= new JFrame(« Ecran de saisie Employé"); e.setSize(300,40);//spécification de la taille e. show(); //affiche la composante de type écran en mode java } Largeur=300 Hauteur=40