| > Développement - Java | SOURCE : http://www.asi.fr/ungi/coupal/ |
[ RETOUR ]
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.
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" > </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" > <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.
--> liste des AWT :
| 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" > <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 :
[ RETOUR ]