Introduction Hello World Différences API Pratique Finalisation Déploiement Les applets Java Cours Java - F. Michel 1 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Plan 1 Introduction aux applets 2 Hello World version applet 3 Différences avec les applications 4 L’API de la classe Applet/JApplet 5 Considérations pratiques 6 Finaliser une applet avant déploiement 7 Déploiement d’une applet Cours Java - F. Michel 2 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Qu’est-ce qu’une Applet Java ? Une définition C’est un programme Java qui peut être téléchargé et exécuté par un navigateur équipé d’un plugin contenant une JVM. Typiquement, une applet est exécutée dans une page web à l’intérieur du navigateur. Toute applet est obligatoirement une sous classe de java.applet.Applet, classe définissant l’interface standard entre l’applet et le navigateur. Note Swing propose une sous classe spéciale d’Applet, javax.swing.JApplet, qui doit être utilisée pour les applications contenant des composants swing (la majorité des cas). Cours Java - F. Michel 4 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Cycle de vie Une fois le constructeur appelé (généralement vide), c’est le navigateur qui gère le cycle de vie d’une applet : Cycle de vie : une applet contient 4 méthodes de base init : méthode utilisée pour réaliser toutes les initialisations nécessaires. Elle est appelée au chargement de la page. start : appelée après init. Appelée à chaque nouvelle visite de la page. stop : appelée lorsque l’utilisateur quitte la page (peut servir à arrêter une animation par exemple). destroy : lorsque le navigateur est arrêté normalement (doit être courte : aucune garantie que la méthode soit entièrement exécutée). Note Ainsi, une applet est initialisée une seule fois (à chaque rechargement de la page), démarée ou arrêtée plusieurs fois et détruite une seule fois. Cours Java - F. Michel 5 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Cycle de vie Redéfinition des méthodes du cycle de vie : Quand redéfinir les 4 méthodes de base init : init contient généralement les instructions qui se trouvent dans le constructeur car l’environnement d’exécution d’une applet n’est opérationnel à coup sûr qu’au moment où init est appelée : par exemple le chargement d’une image ne marche pas dans le constructeur. start : une applet effectuant des traitements autres que la gestion des interactions utilisateurs doit redéfinir la méthode start (lancement de threads par exemple : animation, calcul, etc.). stop : Une applet qui redéfinit start, redéfinit généralement aussi stop de manière à arrêter l’exécution des traitements en cours (animation par exemple). destroy : est très peu employée (la majorité du travail de finalisation étant effectué dans stop (appelée avant destroy). Cependant, elle peut servir à libérer des ressources additionnelles non gérées dans stop). Cours Java - F. Michel 6 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exécution d’une applet Pour charger une applet depuis une page web, il faut indiquer la classe de l’applet (avec son package) en utilisant des applet tags : charger l’applet dans le navigateur < a p p l e t code= t e s t . AppletWorld . c l a s s w i d t h = " 200 " h e i g h t = " 200 " > </ a p p l e t > Cours Java - F. Michel 7 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exécution d’une applet Pour le développement et les tests, on peut aussi utiliser l’application appletviewer fournie avec le JDK (dans le répertoire bin) Utilisation du programme appletviewer > appletviewer AppletWorld.html Très utile pour développer (la console est facile d’accès). Encore plus simple : Avec Eclipse, sans fichier html Run → Run As → Applet Cours Java - F. Michel 8 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exécution d’une applet Quoiqu’il en soit, il faut toujours finir par tester l’applet depuis un navigateur ! Ne pas oublier Si le code est modifié pendant que l’applet est chargée dans le navigateur : (1) vider le cache des classes depuis la console java ouverte par le navigateur en tapant ’x’ (2) recharger la page html (e.g. F5) Cours Java - F. Michel 9 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exemple 1 HelloWorld.java i m p o r t j a v a x . swing . J A p p l e t ; i m p o r t j a v a . awt . Graphics ; p u b l i c c l a s s H e l l o W o r l d extends J A p p l e t { p u b l i c v o i d p a i n t ( Graphics g ) { g . drawRect ( 0 , 0 , g e t S i z e ( ) . w i d t h − 1 , g e t S i z e ( ) . h e i g h t − 1 ) ; g . drawString ( " Hello world ! " , 5 , 1 5 ) ; } } Commentaires Redéfinir les méthodes de base d’une applet est optionnel. Il n’y a pas de méthode main (le navigateur gère le cycle de vie). C’est le constructeur par défaut de la classe JApplet qui déclenche l’appel à paint dans cet exemple. Cours Java - F. Michel 11 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exemple 2 : cycle de vie import java . applet . Applet ; i m p o r t j a v a . awt . Graphics ; / / No need t o extend JApplet , s i n c e we don ’ t add any components ; / / we j u s t p a i n t . p u b l i c c l a s s Simple extends A p p l e t { StringBuffer buffer ; p u b l i c v o i d i n i t ( ) { b u f f e r = new S t r i n g B u f f e r ( ) ; addItem ( " i n i t i a l i z i n g . . . " ) ; public void s t a r t ( ) { addItem ( " s t a r t i n g . . . " ) ; } p u b l i c void stop ( ) { addItem ( " s t o p p i n g . . . " ) ; } p u b l i c v o i d d e s t r o y ( ) { addItem ( " p r e p a r i n g f o r u n l o a d i n g . . . " ) ; } } p r i v a t e v o i d addItem ( S t r i n g newWord ) { System . o u t . p r i n t l n ( newWord ) ; b u f f e r . append ( newWord ) ; repaint ( ) ; } p u b l i c v o i d p a i n t ( Graphics g ) { / / Draw a Rectangle around t h e a p p l e t ’ s d i s p l a y area . g . drawRect ( 0 , 0 , getWidth ( ) − 1 , g e t H e i g h t ( ) − 1 ) ; / / Draw t h e c u r r e n t s t r i n g i n s i d e t h e r e c t a n g l e . g . drawString ( b u f f e r . t o S t r i n g ( ) , 5 , 15); } } Cours Java - F. Michel 12 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Dessin Pour dessiner la représentation de l’applet, il faut redéfinir la méthode paint : HelloWorld.java i m p o r t j a v a x . swing . J A p p l e t ; i m p o r t j a v a . awt . Graphics ; p u b l i c c l a s s H e l l o W o r l d extends J A p p l e t { p u b l i c v o i d p a i n t ( Graphics g ) { g . drawRect ( 0 , 0 , g e t S i z e ( ) . w i d t h − 1 , g e t S i z e ( ) . h e i g h t − 1 ) ; g . drawString ( " Hello world ! " , 5 , 1 5 ) ; } } paint La méthode paint est héritée de la classe java.awt.Container. Cours Java - F. Michel 13 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Gestion des événements Comme pour une application normale. . . Les applets héritent de la classe Container un certain nombre de méthodes liées à la gestion des événements. Comme pour une application normale, une applet doit redéfinir les méthodes associées aux événements qu’on souhaite gérer. Le programme suivant implémente par exemple l’interface SimpleClick.java MouseListener et redéfinit : la méthode mouseClicked Cours Java - F. Michel 14 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Ajout de composants graphiques Il est bien sûr possible de construire une interface graphique évoluée en utlisant les composants d’interface graphique définis dans le JDK : Voici une liste non exhaustive de ces composants Buttons (javax.swing.JButton), Checkboxes (javax.swing.JCheckBox) Single-line text fields (javax.swing.JTextField) Larger text display and editing areas (javax.swing.JTextArea) Labels (javax.swing.JLabel), Lists (javax.swing.JList) Pop-ups (javax.swing.Popup), Scrollbars (javax.swing.JScrollBar) Sliders (javax.swing.JSlider), Drawing areas (java.awt.Canvas) Menus (javax.swing.JMenu,javax.swing.JMenuBar javax.swing.JMenuItem, javax.swing.JCheckBoxMenuItem) Containers (javax.swing.JPanel, javax.swing.JWindow and its subclasses) Cours Java - F. Michel 15 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Ajout de composants graphiques Étant donné que JApplet hérite de la classe Container, il est aisé d’ajouter des composants et de gérer leur mise en page avec les layout managers : Une applet possède déjà les méthodes suivantes : add : ajoute le composant graphique à l’applet remove : retire le composant setLayout : spécifie le gestionnaire de mise en page Cours Java - F. Michel 16 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Conversion d’une application en applet Différences clés Une applet hérite de Applet/JApplet, une application de Frame/JFrame Il n’y a pas de méthode main : init joue son rôle (initialisation des ressources). La classe de l’applet doit être public pour pouvoir être accédée par un appletviewer. Le code du constructeur de l’application est déplacé et adapté dans les méthodes init et start. Exercice : transformer l’application suivante en applet Une application normale Cours Java - F. Michel 18 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Différences liées à la sécurité Ce que peut faire une applet Ouvrir des connexions vers l’hôte dont elle provient. Faire apparaître des pages html. Invoquer les méthodes public des autres applets se trouvant sur la même page. Cours Java - F. Michel 19 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Différences liées à la sécurité Ce que ne peut pas faire une applet charger des librairies ou utiliser des méthodes natives. (par défaut) lire et écrire de fichiers sur la machine hôte. ouvrir une connexion ailleurs que vers l’hôte dont elle provient. lancer un programme sur l’hôte. lire toutes les propriétés système. garantir le look n feel des fenêtres. Exception associée Si l’une des règles de sécurité précédentes est violée, une java.lang.SecurityException est levée. Cours Java - F. Michel 20 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Différences liées à la sécurité Attention ! Les applets chargées depuis un système de fichier local (i.e. depuis un répertoire se trouvant dans le CLASSPATH) n’ont aucune des restrictions précitées ! Cours Java - F. Michel 21 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Applet : API L’API de la classe Applet permet de tirer avantage de la relation qui existe entre celle-ci et le navigateur : l’API de la classe Applet permet à celle-ci : d’être notifiée par le navigateur des événements liés au cycle de vie. de charger des fichiers de données qui sont relatifs à l’URL de l’applet ou de la page sur laquelle elle est chargée. d’afficher son statut. de faire afficher par le navigateur un document. de trouver les autres applets chargées sur la même page. de jouer des sons. de récupérer des paramètres spécifiés dans le tag <APPLET>. Cours Java - F. Michel 23 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Trouver et charger des fichiers de données Lorsqu’une applet a besoin de charger des données depuis un fichier spécifié avec une URL relative, celle-ci utilise soit le code base ou le document base pour former l’url complète : Le code base Retourné par la méthode getCodeBase : URL spécifiant le répertoire depuis lequel les classes de l’applet ont été chargées. Le document base Retourné par la méthode getDocumentBase : URL spécifiant le répertoire de la page html qui a appelé l’applet. Remarque importante Si le tag ne spécifie pas de code base alors celui-ci et le document base pointe vers le même répertoire du même serveur. Cours Java - F. Michel 24 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Trouver et charger des fichiers de données Les données dont une applet pourrait avoir besoin (pour la sauvegarde par exemple) sont généralement relatives au code base. Les données spécifiées par le développeur (le plus souvent à travers les paramètres) sont généralement relatives au document base. Pour des raisons de sécurité Les navigateurs limitent les URLs qu’une unstrusted applet peut lire. Par exemple, la plupart des navigateurs interdisent l’utilisation de ".." : impossible d’aller dans le répertoire au dessus du code base ou du document base. conséquence : étant donné qu’une unstrusted applet ne peut lire des fichiers ailleurs que sur le serveur d’origine, le document base est totalement inutile lorsque l’applet est sur un serveur différent de celui de la page chargée. Cours Java - F. Michel 25 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Trouver et charger des fichiers de données JApplet définit des méthodes utiles pour le chargement d’images et de sons stockés relativement à l’URL de base (getImage / getAudioClip) : Exemples : avec et sans package Pour charger a.gif : Image image = getImage ( getCodeBase ( ) , " i m g D i r / a . g i f " ) ; Cours Java - F. Michel 26 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Affichage du status de l’applet Objet : informer l’utilisateur sur le status courant d’une applet Il est possible d’afficher le status de l’applet. Toutes les applets de la page et le navigateur lui-même partage cet espace. Il faut donc s’en servir modérément (pas d’info cruciale). On s’en sert généralement pour indiquer des opérations de chargement par exemple. La méthode showStatus showStatus ( " MyApplet : Loading image f i l e " + f i l e ) ; Cours Java - F. Michel 27 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Affichage de documents par le navigateur Affichage de documents Il est possible de faire afficher des documents par le navigateur aux méthodes de l’objet AppletContext (récupéré depuis le code de l’applet avec getAppletContext(). Les méthodes showDocument : p u b l i c v o i d showDocument ( j a v a . n e t . URL u r l ) p u b l i c v o i d showDocument ( j a v a . n e t . URL u r l , S t r i n g targetWindow ) Cours Java - F. Michel 28 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Affichage de documents par le navigateur showDocument avec deux arguments : p u b l i c v o i d showDocument ( j a v a . n e t . URL u r l , S t r i n g targetWindow ) Utilisation du deuxième argument : "_blank" : affiche le document dans une nouvelle fenêtre sans nom. "_windowName" : affiche le document dans une nouvelle fenêtre de nom windowName. Cette fenêtre est créée si nécessaire. "_self" : affiche le document dans la fenêtre qui contient l’applet. "_parent" : affiche le document dans la frame (html) parent. S’il n’y a pas de frame parent, le comportement est identique à "_self". "_top" : affiche le document dans la frame de plus haut niveau si elle existe ("_self" sinon). Cours Java - F. Michel 29 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Communication entre applets restrictions liées à la sécurité : de nombreux navigateurs imposent que les applets soient originaires du même serveur. de nombreux navigateurs imposent que les applets soient originaires du même répertoire, sur le même serveur : même code base. l’API java nécessite que les applets soient sur la même page (certains navigateurs l’autorisent quand même si les applets ont le même code base, mais cela n’est pas garanti). Trouver une autre applet : 1. Par son nom via la méthode getApplet de l’objet AppletContext. 2. En récupérant la liste des applets via la méthode getApplets de l’objet AppletContext. Une fois l’applet récupérée, il est possible d’invoquer ses méthodes. Cours Java - F. Michel 30 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Communication entre applets Par défaut une applet n’a pas de nom, Celui-ci peut être spécifié de deux manières : 1. En utlisant l’attribut NAME du tag <APPLET> <APPLET CODEBASE=example / CODE=Sender . c l a s s WIDTH=450 HEIGHT=200 NAME= " buddy " > . . . </APPLET> 2. En spécifiant un paramètre NAME à l’aide du tag <PARAM> <APPLET CODEBASE=example / CODE= Receiver . c l a s s WIDTH=450 HEIGHT=50> <PARAM NAME= " name " v a l u e = " o l d p a l " > . . . </APPLET> Cours Java - F. Michel 31 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Communication entre applets Exemple : l’émetteur Sender.java le receveur Receiver.java Cours Java - F. Michel 32 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Retrouver toutes les applets getApplets La méthode getApplets de l’objet AppletContext permet de retrouver toutes les applets qui se trouvent sur une page : elle retourne une liste. Exemple GetApplets.java Cours Java - F. Michel 33 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Définition et utilisation des paramètres d’une applet Les paramètres Ils sont aux applets ce que les arguments de la ligne de commande sont aux applications. Ils permettent donc d’exécuter une applet avec différents paramètres sans la recompiler. Ils sont définis grâce au tag <PARAM> qui possède 2 attributs : NAME et VALUE Tous les paramètres sont transmis à l’applet sous forme de String Attention : il faut toujours donner des valeurs par défaut à ces paramètres dans le code de l’applet (on ne sait jamais !) Cours Java - F. Michel 34 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Définition et utilisation des paramètres d’une applet Bien que les paramètres soient tous fournis à l’applet sous forme de string, celle-ci pourrat bien sûr les interpréter de multiples façons : Interprétations les plus courantes : Une URL Un integer Un flottant Une valeur booléenne : "true"/"false" ou "yes"/"no" Une String – par exemple pour spécifier le titre de la fenêtre Ou une liste de n’importe quel type précités Cours Java - F. Michel 35 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Définition et utilisation des paramètres d’une applet Exemple <APPLET CODE=SampleApplet . c l a s s CODEBASE=example WIDTH=350 HEIGHT=60> <PARAM NAME=windowClass VALUE=BorderWindow> <PARAM NAME= w i n d o w T i t l e VALUE= " BorderLayout " > <PARAM NAME= b u t t o n T e x t VALUE= " C l i c k here t o see a BorderLayout i n a c t i o n " > </APPLET> Cours Java - F. Michel 36 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Définition et utilisation des paramètres d’une applet Les applets utilise la méthode getParameter pour récupérer la valeur des paramètres : la méthode getParameter p u b l i c S t r i n g getParameter ( S t r i n g name ) Cours Java - F. Michel 37 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Définition et utilisation des paramètres d’une applet Le plus souvent, il est ensuite nécessaire de convertir le paramètre (String) au format désiré en utilisant les APIs du JDK adéquates : Conversion des paramètres : exemple i n t requestedWidth = 0 ; . . . S t r i n g windowWidthString = getParameter ( "WINDOWWIDTH" ) ; i f ( windowWidthString ! = n u l l ) { try { requestedWidth = I n t e g e r . p a r s e I n t ( windowWidthString ) ; } c a t c h ( NumberFormatException e ) { / / Use d e f a u l t w i d t h . } } Cours Java - F. Michel 38 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Associer une information aux paramètres Il faut plus que la javadoc ! Il n’est pas rare que le créateur de l’applet ne soit pas l’utilisateur, i.e. celui qui crée la page web finale. Ce n’est pas forcément un développeur Java ! Il est donc important de fournir un moyen de donner une information sur les paramètres qui peuvent être utilisés, sans avoir à regarder la javadoc ou le code. La méthode getParamterInfo permet de fournir ces informations de telle sorte que le navigateur puisse les afficher si besoin (ou appletviewer). Cours Java - F. Michel 39 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Associer une information aux paramètres Un exemple d’implémentation de getParamterInfo public String [ ] [ ] getParameterInfo ( ) { String [ ] [ ] info = { / / Parameter Name Kind o f Value { " imagesource " , "URL" , { " startup " , "URL" , { " background " , "URL" , { " startimage " , " int " , { " endimage " , " int " , { " namepattern " , "URL" , { " pause " , " int " , { " pauses " , " ints " , { " repeat " , " boolean " , { " positions " , " coordinates " , { " soundsource " , "URL" , { " soundtrack " , "URL" , { " sounds " , " URLs " , }; return info ; } Description "a directory " } , " displayed at startup " } , " d i s p l a y e d as background " } , " s t a r t index " } , " end i n d e x " } , " used t o generate indexed names " } , " milliseconds " } , " milliseconds " } , " repeat or not " } , " path " } , " audio d i r e c t o r y " } , " background music " } , " audio samples " } , Note getParameterInfo doit retourner un tableau de tableaux 3D de String Cours Java - F. Michel 40 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Utilisation du tag APPLET Forme la plus simple <APPLET CODE= Ap p le tS ub cl as s . c l a s s WIDTH= a n I n t HEIGHT= a n I n t > </APPLET> Utilisation du tag PARAM <APPLET CODE= Ap pl e tS ub cl as s . c l a s s WIDTH= a n I n t HEIGHT= a n I n t > <PARAM NAME=parameter1Name VALUE=aValue > <PARAM NAME=parameter2Name VALUE=anotherValue > </APPLET> Note Le tag PARAM doit apparaître juste après le tag APPLET Cours Java - F. Michel 41 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Utilisation du tag APPLET Utilisation du tag PARAM <APPLET CODE= " Animator . c l a s s " WIDTH=460 HEIGHT=160> <PARAM NAME= " imageSource " VALUE= " images / Beans " > <PARAM NAME= " backgroundColor " VALUE= " 0xc0c0c0 " > <PARAM NAME= " endImage " VALUE=10> <PARAM NAME= " soundSource " VALUE= " audio " > <PARAM NAME= " s o u nd t r a c k " VALUE= " spacemusic . au " > <PARAM NAME= " sounds " VALUE= " 1 . au | 2 . au | 3 . au | 4 . au | 5 . au | 6 . au | 7 . au | 8 au | 9 . au | 0 . au " > <PARAM NAME= " pause " VALUE=200> . . . </APPLET> Question : . . . : que manque-t-il ? Cours Java - F. Michel 42 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Spécification d’un texte alternatif Le navigateur ne connait pas le tag APPLET : tout texte se trouvant à l’intérieur du tag APPLET est considéré comme du code html alternatif. Navigateurs équipés de Java : on utilise l’attribut habituel ALT pour le texte alternatif. Le reste est ignoré Exemple <APPLET CODE= " Animator . c l a s s " WIDTH=460 HEIGHT=160 ALT= " I f you c o u l d run t h i s a p p l e t , you ’ d see some a n i m a t i o n " > <PARAM NAME= " imageSource " VALUE= " images / Beans " > <PARAM NAME= " backgroundColor " VALUE= " 0xc0c0c0 " > <PARAM NAME= " endImage " VALUE=10> <PARAM NAME= " soundSource " VALUE= " audio " > <PARAM NAME= " s o u n d t r a c k " VALUE= " spacemusic . au " > <PARAM NAME= " sounds " VALUE= " 1 . au | 2 . au | 3 . au | 4 . au | 5 . au | 6 . au | 7 . au | 8 au | 9 . au | 0 . au " > <PARAM NAME= " pause " VALUE=200> Your browser i s c o m p l e t e l y i g n o r i n g t h e APPLET t a g ! </APPLET> Cours Java - F. Michel 43 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Spécification du répertoire de l’applet Par défaut un navigateur, cherche les classes Java dans le répertoire où se trouve le fichier html. Tout cela en respectant le principe du classpath ! Pour que la gestion des fichiers reste claire, il est possible de spécifier un autre répertoire à l’aide de l’attribut CODEBASE. Exemple <APPLET CODE= Ap p le tS ub cl as s . c l a s s CODEBASE=aURL WIDTH= a n I n t HEIGHT= a n I n t > </APPLET> URL relative : par rapport au fichier html du serveur. URL absolue : une applet depuis n’importe quel serveur. Cours Java - F. Michel 44 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Spécification du répertoire de l’applet <APPLET CODE=Simple . c l a s s CODEBASE= " example / " WIDTH=500 HEIGHT=20> </APPLET> URL relative Cours Java - F. Michel 45 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Spécification du répertoire de l’applet URL absolue Cours Java - F. Michel 46 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement applet et fichier jar Les fichiers jars Comme pour les applications Java classiques, il est possible de réunir l’ensemble des fichiers nécessaires à l’applet dans une archive. le format jar est utilisé (plusieurs taux de compression possibles) l’attribut ARCHIVE permet de spécifier un ou plusieurs fichiers jar à utiliser Exemple <APPLET CODE= " Ap pl e tS ub cl as s . c l a s s " ARCHIVE= " f i l e 1 . j a r , f i l e 2 . j a r " WIDTH= a n I n t HEIGHT= a n I n t > </APPLET> Il existe des navigateurs (heureusement plus beaucoup) qui ne supporte pas cet attribut sous cette forme. Cours Java - F. Michel 47 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Autres attributs du tag APPLET ALIGN, VSPACE, and HSPACE (les mêmes que pour IMG) OBJECT (à la place de CODE) permet de charger une applet sérialisé. NAME permet de donner un nom à l’applet. Cours Java - F. Michel 48 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Sécurité Rappels sur le SecurityManager Une applet ne peut pas utiliser un autre code que le sien et celui l’API fournit par le navigateur via son plugin (le JDK). Les applets ne peuvent généralement pas lire/écrire de fichier sur l’hôte. Astuce : travailler côté serveur. Une applet ne peut pas ouvrir de connexion en dehors de l’hôte d’où elle provient. Astuce : idem. Une applet ne peut lire que certaines propriétés système. Cours Java - F. Michel 50 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Accès aux propriétés système Autorisées "file.separator" File separator (for example, "/") "java.class.version" Java class version number "java.vendor" Java vendor-specific string "java.vendor.url" Java vendor URL "java.version" Java version number "line.separator" Line separator "os.arch" Operating system architecture "os.name" Operating system name "path.separator" Path separator (for example, " :") S t r i n g n e w l i n e = System . g e t P r o p e r t y ( " l i n e . s e p a r a t o r " ) ; Cours Java - F. Michel 51 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Accès aux propriétés système Interdites "java.class.path" Java classpath "java.home" Java installation directory "user.dir" User’s current working directory "user.home" User home directory "user.name" User account name Exemple GetOpenProperties.java Cours Java - F. Michel 52 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Interface Graphique Les applets existent dans des fenêtres prédéfinies du navigateur. Suivant la nature du navigateur, cela peut impliquer l’utilisation de la méthode validate d’une applet pour forcer l’affichage des composants graphiques ajoutés. la couleur de l’appelt peut ne pas correspondre à la couleur de fond de la page. Astuce : utiliser un paramètre pour récupérer la couleur de fond de la page. Cours Java - F. Michel 53 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Interface Graphique la taille finale de l’applet dépend du créateur de la page web. Astuce : utiliser des gestionnaires de mise en page flexibles (BorderLayout, GridBagLayout). Une applet charge une image avec les méthodes getImage (le plus souvent par rapport au CODEBASE, i.e. serveur). Les applets (et leurs ressources : images,. . . ) sont téléchargées, ce qui peut être lent. Astuce : utiliser des threads après un premier traitement rapide. Il est notamment possible de pré-télécharger des classes en codant une utilisation fictive par exemple. Cours Java - F. Michel 54 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Travailler avec une application côté serveur Contourner les limitations liées à la sécurité Utilisation d’une application se trouvant sur le serveur d’origine. Note : en fonction du contexte de déploiment (réseau), une applet peut ne pas pouvoir ouvrir du tout de connexion (pare-feu). Récupérer l’adresse de l’hôte d’origine String host = getCodeBase().getHost() ; Cours Java - F. Michel 55 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exercice 1 Objectif : contourner les limitations de lecture/écriture Cet exercice va illustrer comment une applet peut travailler avec une application se trouvant côté serveur. Procédure Utliser les 4 fichiers suivants pour : QuoteClientApplet.java : Créer une page web contenant cette applet et l’accéder via http (il faudra lancer un serveur web) QuoteServer.java QuoteServerThread.java : Créer un autre serveur sur la machine, i.e. celui qui répondra aux requêtes de l’applet (il faudra exécuter le fichier class correspondant). one-liners.txt : Installer au bon endroit le fichier texte utilisé pour construire la réponse. Cours Java - F. Michel 56 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exercice 1 Ensuite Trouver un moyen de tester le SecurityManager en essayant du code prohibé dans l’applet. Vérifier que cette restriction n’est pas active lorsqu’on lance l’applet avec appletviewer ou lorsque la page est accédée en local (pas par http) Cours Java - F. Michel 57 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Exercice 2 Objectif : faire communiquer 2 applets ne se trouvant pas sur la même page Cet exercice va illustrer comment 2 applets peuvent communiquer sans être sur la même page. Ceci sera possible car elle proviendront du même serveur. Fichiers à utiliser Utiliser les fichiers suivant pour réaliser cette application TalkClientApplet.java TalkServer.java TalkServerThread.java Les tests Tester le résultat avec votre machine, puis avec vos voisins (en utlisant votre page web ou celle du voisin) Cours Java - F. Michel 58 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Finalisation d’une applet Avant le déploiement, il faut vérifier que : Les affichages de debug sont désactivés Les traitements effectués (threads) sont désactivés si l’applet n’a plus le focus : i.e. implémenter la méthode stop (et donc aussi start) Permettre l’arrêt des traitements par l’utilisateur (sons, animations, etc.) : Par exemple boolean f r o z e n = f a l s e ; / / an i n s t a n c e v a r i a b l e p u b l i c boolean mouseDown ( Event e , i n t x , i n t y ) { i f ( frozen ) { frozen = false ; start (); } else { frozen = true ; stop ( ) ; } return true ; } Cours Java - F. Michel 60 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Finalisation d’une applet Faire en sorte que : L’applet soit la plus flexible possible : utiliser des paramètres. Et donc implémenter la méthode getParameterInfo. Implémenter la méthode getAppletInfo : affiche une description succinte de l’applet. Par exemple boolean f r o z e n = f a l s e ; / / an i n s t a n c e v a r i a b l e p u b l i c boolean mouseDown ( Event e , i n t x , i n t y ) { i f ( frozen ) { frozen = false ; start (); } else { frozen = true ; stop ( ) ; } return true ; } Cours Java - F. Michel 61 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Déploiement d’une applet Le déploiement d’une applet dépend de 1. comment elle sera accéder : internet ou intranet 2. du type de navigateur utilisé (dans un contexte intranet) Internet et Intranet Navigateurs hétérogènes (internet ou intranet). Utiliser le tag APPLET : Cas le plus général Intranet avec navigateur spécifique : Internet Explorer : utiliser le tag OBJECT Navigateur type Mozilla : Utiliser le tag EMBED Cours Java - F. Michel 63 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Déploiement d’une applet APPLET est noté deprecated dans la W3 HTML specification Celle-ci stipule qu’il faut maintenant utiliser OBJECT. La spécification reste cependant vague : le tag APPLET est toujours recommandé. Cours Java - F. Michel 64 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Utilisation du tag OBJECT (IE) Uniquement pour Internet explorer : <OBJECT c l a s s i d = " c l s i d : 8 AD9C840−044E−11D1−B3E9−00805F499D93 " w i d t h = " 200 " h e i g h t = " 200 " > <PARAM name= " code " v a l u e = " A p p l e t 1 . c l a s s " > </OBJECT> L’attribut classid Il définit la version du plugin java à utiliser dernière version : classid="clsid :8AD9C840-044E-11D1-B3E9-00805F499D93" version spécifique : classid="clsid :CAFEEFAC-xxxx-yyyy-zzzz-ABCDEFFEDCBA" exempel version 6 : classid="clsid :CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA" Cours Java - F. Michel 65 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Utilisation du tag OBJECT (IE) Si le plugin nécessaire n’est pas installé, on utilise l’attribut codebase pour automatiser le téléchargement du bon plugin : Deux formes pour codebase codebase=<URL> : url spécifiant où le JRE peut être téléchargée s’il est n’est pas présente sur le système. codebase=<URL>Version=major,minor,micro,update : la JRE installée compare classid (la version requise) avec celle qui est installée et propose le téléchargement si nécessaire, i.e. si la version locale est antérieure. Exemple ( information sur les versions disponibles ) <object c l a s s i d = " c l s i d : 8 AD9C840−044E−11D1−B3E9−00805F499D93 " w i d t h = " 200 " h e i g h t = " 200 " codebase= " h t t p : / / j a v a . sun . com / update / 1 . 6 . 0 / . . . j i n s t a l l −6−windows−i 5 8 6 . cab# V e r s i o n =6 ,0 ,0 ,99 " > <param name= " code " v a l u e = " A p p l e t 1 . c l a s s " > </ o b j e c t > Cours Java - F. Michel 66 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Utilisation du tag EMBED (famille Mozilla uniquement) Le tag embed : <embed code= " A p p l e t 1 . c l a s s " w i d t h = " 200 " h e i g h t = " 200 " t y p e = " a p p l i c a t i o n / x−java −a p p l e t ; v e r s i o n = 1 . 6 . 0 " p lu g in s pa g e = " h t t p : / / j a v a . sun . com / j a v a s e / downloads " / > Les 2 formes de l’attribut type type="application/x-java-applet ;version=1.6.0" : utilisation de la jre la plus récente disponible, téléchargement automatique si version inférieur (à l’url pluginspage) type="application/x-java-applet ;jpiversion=1.6.00 1 : laversionexacteestrequise, 1.6.00 1danscetexemple Cours Java - F. Michel 67 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Déploiement en environnement mixte Remarques IE : reconnaît le tag OBJECT et ignore le tag COMMENT Mozilla-based : ignore le tag OBJECT ayant un attribut classid. Interpréte le contenu du tag COMMENT Solution avec html pure : <object c l a s s i d = " c l s i d : CAFEEFAC−0016−0000−0000−ABCDEFFEDCBA" <param name= " code " v a l u e = " A p p l e t 1 . c l a s s " > <comment> <embed code= " A p p l e t 1 . c l a s s " t y p e = " a p p l i c a t i o n / x−java −a p p l e t ; j p i −v e r s i o n =1.6 " > <noembed> No Java Support . </noembed> </embed> </comment> </ o b j e c t > Cours Java - F. Michel 68 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Déploiement en environnement mixte Solution avec javascript : <html > < s c r i p t language= " J a v a s c r i p t " > v a r _app = n a v i g a t o r . appName ; i f ( _app == ’ Netscape ’ ) { document . w r i t e ( ’ <embed code =" A p p l e t 1 . c l a s s " ’ , ’ w i d t h ="200" ’ , ’ h e i g h t ="200" ’ , ’ t y p e =" a p p l i c a t i o n / x−java −a p p l e t ; v e r s i o n =1.6" > ’ ) ; } e l s e i f ( _app == ’ M i c r o s o f t I n t e r n e t E x p l o r e r ’ ) { document . w r i t e ( ’ <OBJECT ’ , ’ c l a s s i d =" c l s i d : 8 AD9C840−044E−11D1−B3E9−00805F499D93 " ’ , ’ w i d t h ="200" ’ , ’ h e i g h t ="200" > ’ , ’ <PARAM name=" code " v a l u e =" A p p l e t 1 . c l a s s " > ’ , ’ </OBJECT> ’ ) ; } else { document . w r i t e ( ’ <p>Sorry , unsupported browser . < / p> ’ ) ; } </ s c r i p t > </ html > Possibilité d’utiliser le html converter de Sun Cours Java - F. Michel 69 / 70 Introduction Hello World Différences API Pratique Finalisation Déploiement Informations complémentaires et Références Pour aller plus loin Insérer des sons dans une applet Autres exemples d’utilisation des threads dans une applet Références Ce cours reprend largement le tutoriel proposé par Sun : Applets Cours Java - F. Michel 70 / 70