Le code des applets est chargé depuis une machine (le serveur) et exécutées sur une autre machine (le client). Une applet est appelée à partir d’une page HTML. L’exécution du « code-byte » de l’applet est réalisée par la machine virtuelle du navigateur qui a chargé la page HTML. Les navigateurs récents possèdent en fait un compilateur qui génère à partir du « code-byte » un exécutable en code natif de la machine hôte. Dans ces conditions la vitesse d’exécution est celle d’un programme compilé.
Afin d’assurer la sécurité de l’utilisateur les possibilités des applets sont limitées :
une applet ne peut pas écrire de fichiers sur la machine du client.
une applet ne peut communiquer qu’avec la machine serveur.
une applet ne peut pas lancer de programmes sur le client.
une applet ne peut pas charger de programmes écrits en langage natif sur le client.
Compte tenu de ces restrictions, JAVA est langage sûr : en principe il ne permet pas l’introduction de virus ni d'investigations indiscrètes sur le contenu de la machine client.
Une applet est une classe de JAVA déclarée public qui étend la classe java.applet.Applet.
public nom_applet extends java.applet.Applet
Comme en général on utilise des méthodes de la classe java.applet, il est plus simple d'importer le package correspondant. L'en-tête prend alors la forme simplifiée suivante :
import java.applet.*;
public
nom_applet extends Applet
Pour faire quelque chose de visible par l'utilisateur, une applet doit comporter au minimum la méthode paint( ). Dans cet exemple, nous allons uniquement afficher un texte.
import java.applet.*;
import
java.awt.*;
public message0 extends Applet{
public void paint(Graphics
g){
g.drawString("Premier exemple",20,30);}}
Après compilation de ce fichier source (de nom message0.java), on obtient un fichier exécutable ayant comme nom message0.class. Il faut incorporer ce fichier à une page HTML avec la balise <APPLET>. Celle-ci doit au minimum contenir le nom de la classe et les dimensions de la fenêtre dans laquelle l'applet va s'exécuter.
<html>
<head><title>message0</title></head>
<body>
<applet code=message0.class width=200 height=50
></applet>
</body>
</html>
L'applet message0.
Les navigateurs définissent une couleur de fond, une couleur d'écriture et
une fonte par défaut. Ainsi dans IE la couleur du fond est un gris pâle
alors que dans Netscape 4.x c'est le blanc.
Pour obtenir des résultats reproductibles, il faut toujours
commencer par définir ces trois paramètres. On va déclarer une variable de type
"Font",
une variable taille et entrer le message à afficher dans une chaîne. Lors du
chargement d'une applet la méthode init ( ) est toujours appelée. Nous
allons la surcharger en initialisant ces variables. mafonte étant un
objet Font doit être initialisée par une instruction new; TimesRoman est
le nom d'une fonte standard de JAVA, font.BOLD est une constante de JAVA (en fait déclarée
: public final static int BOLD) ; taille définit la taille (en points)
de la fonte utilisée.
import java.applet.*;
import
java.awt.*;
public message1 extends Applet
{ Font
mafonte;
String s = "Second exemple";
int
taille;
public void init()
{ setBackground (Color.lightGray);
taille
= 16;
mafonte = new Font("TimesRoman",font.BOLD,taille);}
public void paint(Graphics g)
{ g.setFont(mafonte);
g.setColor(Color.red);
g.drawString(s,20,30);}}
L'applet message1.
Si l'on désire modifier le message à afficher dans la page HTML, il faut modifier le fichier source puis le recompiler et placer le nouveau fichier message1.class sur le serveur. Il est plus simple de modifier le code de notre programme pour qu'il puisse recevoir des informations depuis la page HTML de chargement. Les données sont transmises au moyen des balises <param >. Dans ces balises, on trouve le nom du paramètre et sa valeur sous la forme d'une chaîne de caractères.
<html>
<head><title>message0</title></head>
<body>
<applet code
= message0.class width = 200 height
= 50
>
<param name = "Mes"
value="Message">
<param name = "Tail" value="14">
</applet>
</body>
</html>
Dans le programme JAVA, avec la méthode getParameter(nom_du_parametre)
on récupère la chaîne de caractères contenue dans "value".
Mes étant
une chaîne, il n'y a pas de conversion de type à réaliser pour la valeur qui
est récupérée. Par contre pour la
taille de la fonte, il faut convertir une chaîne de caractères en entier. Cette
opération est réalisée par la méthode parseInt de la classe Integer (Classe
de java.lang). Les conversions de type seront examinées au chapitre 6.
import java.applet.*;
import
java.awt.*;
public message2 extends Applet
{ Font
mafonte;
String s ;
int
taille;
public void init()
{ setBackground (Color.lightGray);
s
= getParameter("mes"); //noms
insensibles à la casse
taille
= Integer.parseInt(getParameter("Tail");
mafonte = new Font("TimesRoman",font.BOLD,taille);}
public void paint(Graphics g)
{ g.setFont(mafonte);
g.setColor(Color.red);
g.drawString(s,20,30);}}
L'applet message2 avec "Mes" = "Nouveau message" et "Tail" = "16"
L'applet message2 avec "Mes" = "Message nouveau" et "Tail" = "20"
L'applet se comporte, pour son positionnement par rapport au texte qui
l'entoure, comme une image :
Le paramètre align
permet de préciser la position de la fenêtre de l'applet dans
la page.
De même les paramètres hspace et vspace définissent un cadre vide autour de l'applet.
La balise <applet> des deux exemples ci-dessus est la suivante :
<applet
code="message2.class" width="200" height="50"
hspace="20" align="middle"></applet>
Toute applet hérite de l'objet Applet un certain nombre de méthodes qui sont appelées par le navigateur de manière bien précise lors de son exécution .
init ( ) : cette méthode est exécutée juste après le chargement du code ou un rechargement par le navigateur.
start ( ) cette méthode est invoquée immédiatement après la fin de l'exécution de la méthode init. Cette méthode est aussi invoquée quand la page HTML contenant l'applet redevient visible pour l'utilisateur.
stop ( ) cette méthode est invoquée quand la page HTML disparaît.
destroy ( ) cette méthode est invoquée juste avant la disparition de l'applet afin de pouvoir éventuellement libérer des ressources.
L'applet hérite également de la classe java.awt.Component
et de la méthode paint (Graphics g) qui permet de dessiner dans
le composant graphique g attribué à l'applet. Cette méthode est exécutée à la
fin de l'exécution de la méthode start.
Si
l'applet était masquée (totalement ou partiellement) par une autre fenêtre,
elle se redessine lorsqu'elle redevient totalement visible. Ceci est effectué
par la méthode repaint ( ). C'est une méthode qui commence par invoquer
la méthode update (Graphics g ) puis la méthode paint
(Graphics g ). update est une méthode qui peint le composant
graphique avec la couleur du fond afin de réaliser son effacement.
La méthode
repaint ( ) peut également être invoquée par d'autres méthodes qui vont
répondre aux actions de l'utilisateur (souris, clavier ...).
Cette classe possède un certain nombre de méthodes,
appelées par le navigateur, qui ne font rien et qui doivent être surchargées
avant de pouvoir être utilisées : ce sont les méthodes init ( ) start
( ), stop ( ) et destroy ( ).
Cette classe possède
aussi un certain nombres de méthodes qui utilisent des URL (Uniform
Resource Locator) permettant de localiser le
serveur de l'applet, des fichiers
images et des fichiers sons.
getParameter( ) : Cette méthode
a déjà été étudiée plus avant (§ 5.2.1).
getAppletInfo(
) : Cette méthode retourne une chaîne de caractères. Elle doit être surchargée
comme dans l'exemple sinon elle retourne "null".
getParameterInfo(
) : Cette méthode retourne un tableau de chaînes de caractères. Elle doit
être surchargée comme dans l'exemple sinon elle retourne "null".
Pour
chaque paramètre, on peut construire trois chaînes avec par exemple le nom,
le type et un commentaire.
getCodeBase( ) : Cette méthode retourne
un URL qui pointe sur le répertoire du serveur qui contient l'applet. Si on
désire examiner sa valeur, il faut convertir l'URL en chaîne de caractères avec
la méthode getCodeBase( ).toString( ).
getDocumentBase( ) : Cette
méthode retourne un URL qui pointe sur le répertoire du serveur qui contient
la page HTML de chargement de l'applet. Si on désire examiner sa valeur, il
faut convertir l'URL en chaîne de caractères avec getDocumentBase(
).toString( ).
getAudioClip( ) : Cette méthode retourne un objet AudioClip
qui est en fait un fichier son au format "AU". Comme arguments, il
faut indiquer le chemin absolu de fichier (URL) et son nom. Quand le fichier
est chargé, il est possible de l'exécuter avec la méthode play( ).
getImage(
) : Cette méthode retourne un objet Image qui est en fait un fichier
au format "GIF" ou "JPG". Comme arguments, il faut indiquer
le chemin absolu du fichier (URL) et son nom. Quand le fichier correspondant
est chargé, il
est possible de visualiser l'image avec la méthode drawImage( ).
showStatus(
) : Cette méthode affiche sa chaîne argument dans la barre d'état du navigateur.
L'applet ci-dessous utilise un certain nombre de ces méthodes. En voici le code :
import java.applet.*;
import java.awt.*;
public
class applet1 extends Applet
{ Font mafonte; //choix
de la fonte
Image
monimage; //objet
image
String
sima="sign141.gif"; //le nom d'un fichier
image
AudioClip bip; //objet
sonore
String
base;
String
[][] paramInfo={{"par1","1-10","valeur 1"},
{"par2","1-5","valeur
2"}};//declaration et
assignation
String
st[][];
public String getAppletInfo()
{ return
"Auteur: J.J. Rousseau 2001";}
public
String[][] getParameterInfo()
{ return paramInfo;}
public
void init()
{ setBackground (Color.lightGray);
//couleur du fond
mafonte
= new Font("Helvetica",0,12);
st
= new String[3][2];
monimage
= getImage(getDocumentBase(),sima);
base=getCodeBase().toString(); //conversion
de l'URL en chaîne
bip=getAudioClip(getCodeBase(),"ding.au");} //nom
du fichier son
public
void paint(Graphics g)
{ g.setFont(mafonte);
g.drawString(getAppletInfo(),10,15);
st=getParameterInfo();
g.drawString(base,10,30);
//adresse
du fichier sur le serveur
g.drawImage(image,20,50,this);/*affichage
de l'image "sign141.gif"
origine
en x=20, y=50*/
g.drawString(st[0][0],150,60);//affiche
"par1"
g.drawString(st[0][1],150,80);//affiche
"1-10"
g.drawString(st[0][2],150,100);//affiche
"valeur 1"
bip.play();
/*execute
le fichier "ding.au".
il faut disposer d'une carte son
pour l'entendre.*/
showStatus("Dans
la barre d'état");}
//examiner la barre d'état
du navigateur.
}
Applet correspondant au code ci-dessus.
Placez le pointeur de la
souris dans le cadre de l'applet ,cliquez et regardez la barre d'état.