Dernière mise à jour | 31 mars 1996 | Auteur | Gilles Maire |
Serveur | http://www.imaginet.fr/ime/java.htm | Adresse | Gilles.Maire@UNGI.com |
L'envoi de page HTML par un serveur http est assez statique, même si comme nous l'avons vu, quelques astuces permettent l'affichage d'images animées.
Avec Java, le serveur http peut envoyer un programme au client qui est chargé de l'exécuter. Cette exécution peut paraître triviale, mais elle doit prendre en compte les notions fondamentales que l'on retrouve dans tous les développements sur les réseaux hétérogènes. Ainsi par exemple, le code exécutable sur un PC n'est pas du tout le même que celui exécutable sur un Macintosh. On peut bien sûr imaginer un mécanisme qui dialogue pour envoyer le code correspondant à l'ordinateur client, mais ceci serait lourd et peu évolutif.
Le langage Java est un langage client-serveur, c'est-à-dire indépendant des plates-formes matérielles. De plus, il est orienté objet comme tous les langages modernes.
Si Java est un langage compilé, JavaScript est un langage interprété. Il sera étudié dans un chapitre indépendant du guide.
Vous avez peut-être également entendu citer HotJava qui est un logiciel de lecture de Web comme Netscape mais proposé par la société SUN, il fut développé en Java, ce qui prouve que Java est bien un langage à part entière.
Netscape, quant à lui, comprend les langages Java et JavaScript à partir de sa version 2, aussi bien sur les versions PC et Macintosh.
Il est possible de ne pas aller plus loin dans ce chapitre, si vous ne désirez pas développer vos propres codes JAVA. Il est possible d'utiliser des codes JAVA déjà développés et présents dans des librairies publiques.
Ainsi de façon triviale, vous pourrez orner votre page HTML de graphiques animés ou de sons et impressionner vos amis.
Vous trouverez plusieurs bibliothèques particulièrement intéressantes aux adresses :
Pause Java est un serveur situé à Strasbourg et dédié au langage Java. Il est une source importante d'informations sur le langage JAVA en français et offre une liste de distribution permettant de participer à la communauté Java en France. Miroir ftp.javasoft.com est un autre site majeur en France qui est mis à jour plusieurs fois par semaine et permet, entre autre, de récupérer le JDK de Sun de façon plus efficace.
Ungi vous proposera bientôt sa propre bibliothèque d'Applet Java.
Côté page HTML, une nouvelle balise appelée APPLET est utilisée.
La syntaxe de cette balise est
<APPLET code="x" width=20 height=20> </APPLET>
La largeur et la longueur données par width et height permettent de définir la taille de la zone de la page qui sera réservée à l'objet.
L'objet peut être une image animée, un extrait de texte HTML ou tout programme.
Lorsque cette balise est rencontrée par le navigateur, le programme JAVA présent sur le serveur est chargé dans le répertoire cache de votre ordinateur.
Le programme Java n'est pas chargé sous la forme d'un fichier Java, mais comme un fichier class correspondant au code généré par le compilateur Java.
Ce code peut être présent localement sur votre disque dans le répertoire de votre page HTML pour test ou sur votre serveur.
Le logiciel Netscape garde l'Applet présent dans le cache même si vous changez la classe Java qu'il doit lire. Ceci veut dire que lorsque vous développerez vos propres Applets, il faudra configurer Netscape dans les préférences pour mettre les valeurs du cache à 0.
L'exemple suivant donne un exemple de source JAVA :
import java.applet.Applet ; public class x extends Applet { }
Ce programme a besoin d'être compilé par un compilateur JAVA pour créer un programme x.class puisque le nom donné à la classe était bien x.
Si le programme est contenu dans le fichier x.java, la classe x est explicitement rendue publique.
Le canevas précédent est important car il est le programme minimal que nous devons écrire pour faire fonctionner les APPLETS.
La première chose que fera une procédure JAVA est de s'initialiser, ce que nous pouvons faire par la procédure suivante :
import java.applet.Applet; public class nouveau extends Applet { public void init() { resize(250, 300); } }
La fonction resize est une classe prédéfinie qui redéfinit la taille de la zone réservée à l'APPLET par sa largeur et sa hauteur.
Nous sommes presque en mesure de faire le programme d'affichage de la chaîne de caractères Hello World
import java.applet.Applet; import java.awt.Graphics ; public class Hello extends Applet { public void init() { resize(250, 300); } public void paint(Graphics g) { g.drawString("Hello World", 10, 50); } }
Ce programme affiche Hello World aux coordonnées 10, 50.
Remarquons l'importation de la classe Graphics qui se trouve dans java\awt\Graphics et l'utilisation de la fonction drawString qui prend en paramètres le mot à afficher et les coordonnées de ce mot.
La balise HTML qui servira à appeler l'applet Hello sera :
<APPLET CODE="Hello.class" WIDTH=150 HEIGHT=25> </APPLET>
Bien sûr nous verrons que le code appelé peut comprendre des paramètres que nous appellerons comme le montre l'exemple suivant :
<APPLET CODE="Hello.class" WIDTH=150 HEIGHT=25> <param name=param1 value="val1" > <param name=param2 value="val2" > </APPLET>
Il existe un environnement de compilation des programmes Java, contenant compilateurs, debuggers et librairies en 3Mo de fichiers compressés sur le site de Javasoft [www.javasoft.com]
Cet environnement de développement s'appelle JDK (Java Development Kit), c'est à cette adresse que vous trouverez le fichier correspondant à votre environnement.
De façon commune aux environnements SUN et Windows 32 bits, le compilateur JAVA se nomme javac et son appel se fait par la syntaxe suivante (sous l'interpréteur de commandes) :
javac fichier.java
Il est important que l'extension du fichier soit java en quatre lettres. Le résultat de la compilation sera un fichier fichier.class.
Vous pouvez appeler la classe fichier.class par le paramètre CODE de la balise APPLET que la classe soit locale dans le répertoire courant de votre disque ou sur le serveur htttp dans le répertoire de lecture de la page correspondante.
Pour les utilisateurs de Windows 95, le programme e! de Patrick Philippot permet de lancer le compilateur javac et de récupérer les erreurs en positionnant le curseur dans le fichier source à l'endroit de l'erreur. Vous le trouverez dans le chapitre Les logiciels chargeables sur Ungi dans la section concernant PC 16 bits, par contre les fichiers d'extension java à quatre lettres ne sont pas supportés, ce qui vous obligera à appeler un programme bat qui convertira le fichier $$.jav en $$.java avant que ce même programme bat n'appelle le compilateur.
Vous pouvez toujours écrire à Patrick Philippot pour l'encourager à supporter l'option windows 95 dans son superbe éditeur. Vous trouverez son adresse dans l'aide de l'éditeur. En outre Patrick accorde une réduction du prix de son shareware à tous les lecteurs d'UNGI.
En attendant il existe un éditeur (jedit) pour Windows 95 spécialement dédié à Java, il permet de compiler, de lancer Netscape et de lancer l'applet viewer.
Vous le trouverez à la page Spider [www.ugrad.cs.ubc.ca/spider/w3i1/home.html]
Il se couple avec l'aide en ligne de Bill Bercik en format Help que l'on trouve à Dippybird [www.dippybird.com/java.html]
Vous voici donc avec un environnement de programmation gratuit sous Windows 95.
Cette section définit succinctement le langage Java. Pour plus d'informations, les documentations et aides en langue anglaise sont disponibles sur le serveur de JavaSoft Javsoft [www.javasoft.com]
Les tableaux sont définis par la syntaxe suivante (pour un tableau appelé chaîne de 24 caractères):
char chaîne[] = new char[24];
On remarquera que le mot chaîne est valide en JAVA. Le mot new permet d'allouer la mémoire pour le tableau. Il est évident que la mémoire peut être allouée après la déclaration.
Les tableaux de tableaux se déclarent de la façon suivante :
char chaîne[][] = new char[24][3];
La longueur d'un tableau peut être déterminée par .length :
char chaîne[][] = new char[24][3]; println (chaîne.length) ; // imprime 24 println (chaîne[0].length) ; // imprime 3
Comme tous les langages orientés objet, le langage Java offre les notions de classe, d'objet et de dérivation.
Une classe est toujours construite à partir d'autre classe dont elle est dérivée. Une classe dérivée est une sous-classe d'une sur-classe.
La déclaration d'une classe se fait de la façon suivante :
[commentaire document ] [Modifieurs] class Nom_de_la-classe-défini extends Sur-classe implements Interface{, Interface}] { Corps_de_la_classe }
Ainsi les exemples suivants mettent en évidence cette structure :
/** Client */ public class Client { }
/** Client satisfait */ class ClientSatisfait extends Client implements Printable { ... public void print() { ... } }
On voit dans cet exemple que l'objet ClientSatisfait est une sous-classe de Client.
Toute classe est une sous-classe d'une classe, la sur-classe de plus haut niveau est la classe Objet. Lorsque le paramètre extends est omis, la classe déclarée est une sous classe de l'objet Objet. On appelle une instantiation d'une classe un élément déclaré comme élément de cette classe. Une instanciation d'une classe A peut être changé d'instanciation par une opération appelée cast qui change le type de l'instanciation (mais pas son contenu).
Par exemple (nom_de_classe1) A changera l'objet A en instanciation de la classe 1.
Les méthodes sont les opérations ou les fonctions que l'on peut effectuer sur une classe.
Une déclaration de méthode est de la forme suivante :
[commentaire document ] [Modifieurs] type_retourné Nom_de_la_méthode ( paramètres ...) { Corps_de_la_méthode }
Un constructeur est une méthode appelée lors de l'initialisation de la classe, ainsi une instantiation de la méthode sera systématiquement initialisée par le constructeur. Le constructeur est identifié par son nom qui est celui de la classe et par le fait qu'il est sans type retourné.
Une deuxième déclaration d'une méthode remplace la première.
Une méthode est dite surchargée si elle permet plusieurs passages de paramètres différents.
Une méthode ou une variable peut être déclarée (par le champ modifieur) :
Toutes les variables peuvent être déclarées dans une classe, elles sont dites variables instanciées. Une variable déclarée static dans une classe n'est plus une variable instanciée, mais commune à plusieurs classes.
Un objet est donc une instanciation d'une classe. Pour allouer la mémoire nécessaire à cet objet, l'opérateur new est appelé, cet opérateur lance l'exécution du constructeur.
La syntaxe de l'opérateur new est
a=new Classe () ;
Les noms des procédures donnés sans les corps sont appelés Interfaces et visent à spécifier les méthodes et variables sans en donner le contenu. C'est ainsi que les spécifications des programmes sont communiquées.
Les threads (en français processus indépendants) sont des mécanismes importants du langage Java. Ils permettent d'exécuter plusieurs programmes indépendants les uns des autres. Ceci permet une exécution parallèle de différentes tâches de façon autonome.
Un thread réagit aux différentes méthodes suivantes :
La méthode sleep() est souvent employée dans les animations, elle permet de mettre des temporisations d'attente entre deux séquences d'image par exemple.
Les opérateurs par ordre de préséance décroissante sont les suivants :
. [] () ++ -- ! ~ instanceof * / % + - << >> >>> < > <= >= == != & ^ | && || ?: = op= ,
Ces opérateurs ont la même signification que leur homonyme en C.
Les chaînes de caractères comprennent l'opérateur + qui permet de concaténer deux chaînes et par voie de conséquence l'opérateur += est valide pour les chaînes.
L'opérateur instanceof permet de tester si un objet est une instance de la classe passée en paramètre (ou de l'une de ses sous-classes).
Exemple :
if ( 2CV instanceof voitures ) ....
Les instructions de contrôle sont presque les mêmes que celles utilisées en C ou en C++ à savoir :
switch(e1) { case cond1: instruction1 case cond2: instruction2 default: instruction3 }
Quand une erreur apparaît dans un programme, une exception peut être appelée. Certaines exceptions sont prédéfinies par le système mais peuvent être redéfinies à volonté.
L'exception est définie par le mot clé throw.
Exemple :
class MonException extends Exception { } class MaClass { void Erreur() { if (/* pas d'erreur */) { ... } else { /* erreur*/ throw new MonException(); } } }
Pour utiliser une exception l'instruction try est utilisée, suivie par autant d'instruction catch que de classes d'exception.
Exemple :
try { p.a = 10; } catch (NullPointerException e) { println("p est null"); } catch (Exception e) { println("autre erreur"); } catch (Object obj) { println("Who threw that object?"); }
Pour se familiariser avec le JDK, il existe deux documentations fondamentales en langue anglaise, qui explicitent l'utilisation et le contenu des paquetages.
Ces deux documentations concernent :
Vous trouverez ces documentations sur le serveur ftp de javasoft[ftp://ftp.javasoft.com]
Si le tutorial nécessite de connaître l'anglais, la descritpion des API donne surtout les interfaces nécessaires à l'utilisation des différentes méthodes et des différentes classes.
Regardons comment se servir de la documentation sur les API.
Le fichier html api/packages.html présente les différentes informations relatives aux API :
Pour utiliser un paquetage dans un programme JAVA, on utilise la commande : import nom du paquetage ;
Ainsi pour utiliser le paquetage audioclip, on fera la déclaration suivante :
import java.applet.AudioClip ;
ou la simplification suivante :
import java.applet.* ;
Les AWT sont des classes que l'on peut utiliser pour la gestion de l'interface homme-machine. Le tableau suivant montre les définitions et l'action de quelques-unes des méthodes associées.
Nom | Code | Exemple |
---|---|---|
Button |
import java.applet.*; import java.awt.*; public class nom extends Applet { public void init() { add(new Button ("Bouton")); } }
|
|
TextField |
import java.applet.*; import java.awt.*; public class champtex extends Applet { public void init() { add(new TextField("Entrez du texte",20)); } }
|
|
Choice |
import java.applet.*; import java.awt.*; public class choix extends Applet { public void init() { Choice choice ; add(choice = new Choice ()); choice.addItem("Petit"); choice.addItem("Moyen"); choice.addItem("Grand"); } }
|
|
getImage & drawImage |
import java.applet.*; import java.awt.*; public class image extends Applet { Image n; public void init() { n = getImage(getCodeBase(), "gif/atwork.gif"); } public void paint(Graphics g) { g.drawImage(n, 10, 15, this); } }
|
L'écriture d'Applets se fait par l'écriture d'un code JAVA prévoyant le passage de paramètres afin de donner à l'auteur des pages HTML la possibilité de définir certains attributs de l'Applet. Imaginons une applet qui joue une séquence sonore, il faudra que l'auteur de la page puisse définir le fichier sonore et ceci se fera par exemple de la façon suivante :
<APPLET CODE="UNGIson.class" WIDTH=0 HEIGHT=0> <param name=param1 value="FichierSon" > </APPLET>
Nous allons voir ici comment votre programme JAVA va s'interfacer avec l'Applet.
La méthode getParameterInfo permet de définir les paramètres qui seront passés à l'Applet. Elle retourne un tableau de chaînes de caractères. Le tableau renvoyé est un tableau de 3 chaînes comprenant :
Cette méthode s'utilise par exemple de la façon suivante :
public String[][] getParameterInfo() { String tableau[][] = { {"largeur", "int", "largeur de l'applet"}, {"hauteur", "int", "longueur de l'applet"}, {"URL", "url", "adresse du fichier GIF indiquant la présence de l'Applet"} }; return tableau ; }
Pour initialiser les différentes valeurs déclarées dans le tableau tableau on utilise la méthode getParameter avec en argument le nom de l'argument :
variable = getParameter ("largeur" ) ;
Si le paramètre n'est pas trouvé la fonction getParameter retrourne la valeur null.
Les exemples qui sont donnés ici sont un bon moyen de commencer à pratiquer JAVA.
Cet exemple consiste à afficher une image, il ne constitue pas plus qu'un intérêt didactique, puisque l'insertion d'image en HTML ne nécessite pas l'usage du langage JAVA.
import java.applet.*; import java.awt.*; public class exemple1 extends Applet { Image image; public void init() { image=getImage(getDocumentBase(),"javagif/Ex1.gif"); } public void paint(Graphics g) { g.drawImage(image,0,0,this); } }
Remarques :
Exécution :
Ce deuxième exemple affiche la même icone, mais à chaque clic de souris change l'image.
import java.applet.*; import java.awt.*; public class exemple2 extends Applet // exemple2.class sera le code appelé par le navigateur { Image buf[]; // buf est un tableau qui va être rempli avec les noms des différentes images. int i=0; int a=0, b=0; int j = 1; public void init() { buf = new Image[7]; for (i = 0; i<7; i++) { buf[i] = getImage(getCodeBase(), "javagif/Ex"+j+".gif"); j++; } i=0; } public void paint(Graphics g) { g.drawImage(buf[i], 0, 0, this); } public boolean mouseUp(Event e, int x, int y) { repaint(); i++; if (i == 7) i = 0; return true; } }
Remarques :
Exécution : (cliquez sur l'icone pour suivre l'exécution) :
Ce troisième exemple est le code qui vous a envoyé le message sonore de bienvenue.
import java.applet.* ; import java.awt.*; import java.net.URL; import java.net.MalformedURLException; public class laius extends Applet { AudioClip son ; URL sonURL ; public void init () { try { sonURL = new URL( getCodeBase(), "./bonjour.au" ); showStatus ("bonjour.au ok" ) ; } catch (MalformedURLException sonURL) { showStatus ("erreur d'initialisation"); } son = getAudioClip(sonURL); son.play () ; } }
Remarques :