Les applets Java

publicité
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
Téléchargement