[FAQ] fr.comp.lang.java
A toujours consulter avant de poser une question dans ce groupe !
Consultez aussi la documentation de Sun dans votre rᅵpertoire d'installation
du jdk ou en ligne ( http://java.sun.com/j2se/1.4/docs/index.html )
-> le guide de l'API : docs/api/packages.html
-> le guide gᅵnᅵral : docs/index.html
Qui rᅵpondrons ᅵ la majoritᅵ de vos questions.
HISTORIQUE DES VERSIONS MAJEURS
Version Date Description
1.0 15/09/1996 Version de base
2.0 08/06/1997 Prise en compte JDK 1.1.x
3.0 22/03/1999 Prise en compte la plate-forme Java 2
3.5 27/03/2001 JDK1.3
4.0 25/02/2002 JDK1.4
4.1 22/11/2002 JDK1.4.1
4.2 03/10/2003 Mises ᅵ jour diverses (prise en compte de certaines
suggestions
de Jean Baptiste Bugeaud, qu'il se soit remerciᅵ pour son effort)
A PROPOS DE CETTE FAQ
FAQ = Frequently Ask Questions
= Questions Frᅵquemment posᅵes
= Foire Aux Questions
Cette FAQ reprend donc les questions les plus souvent posᅵes dans le
newsgroup fr.comp.lang.java et tente d'y rᅵpondre ! Donc, toute personne
participant ᅵ la discussion est grandement remerciᅵe pour sa contribution ᅵ
la rᅵalisation de cette FAQ.
Cette FAQ a ᅵtᅵ crᅵe et maintenue jusqu'a sa version 4.1 par Christophe
Jolif
( Christop...@wanadoo.fr ). Elle est dorenavant maintenue par:
- Jerome Moliere ( jmol...@nerim.net )
ᅵ qui vous pouvez adresser vos remarques.
Cette FAQ peut ᅵtre reproduite par quelques moyens que ce soit mais ne doit
en aucun cas ᅵtre modifiᅵe par ajout ou suppression. Pour obtenir une
correction ou proposer un ajout, demander aux mainteneurs. Cela permet
d'ᅵviter une multiplication des versions.
Elle est postᅵe deux fois par mois dans les groupes fr.comp.lang.java et
fr.usenet.reponses.
Elle est aussi disponible directement sur le site Web suivant:
http://www.usenet-fr.net/fur/comp/lang/faq-java.html
SOMMAIRE
I- Gᅵnᅵralitᅵs
1. Questions Gᅵnᅵrales
2. Le langage
3. Les outils Java
4. AWT et Java2D
5. Les classes de bases
6. JDBC
7. Les Applets
8. Les Java Foundation Classes
9. La programmation rᅵseau
10. Les autres packages ou outils
11. Java et ....
12. Questions sur les Ressources
II- Les plate-formes Java
1.Introduction
2.J2SE
3.J2EE
4.J2ME
I- Gᅵnᅵralitᅵs
1. QUESTIONS GENERALES
1.1 Qu'est ce que JAVA ?
La premiᅵre et la plus difficile des questions : pour ᅵtre concis, il s'agit
d'un langage orientᅵ objet dᅵveloppᅵ par la sociᅵtᅵ Sun. Son mᅵme code ( ou
plus exactement byte-code ) peut ᅵtre exᅵcutᅵ sur diffᅵrentes machines. Le
byte-code de JAVA est interprᅵtᅵ par une machine virtuelle qui existe pour
diffᅵrents environnement :
Windows95/NT
MacOS
Solaris
Linux
AIX
OS/2
IRIX
UnixWare
HP/UX
Digital Unix
AmigaOS
BeOS
OpenVMS
FreeBSD
SunOS
Windows 3.1
Windows CE
RiscOS
(liste non exhaustive)
Sans cette machine vous ne pourrez rien faire.
Pour ᅵtre prᅵcis et on peut l'espᅵrer un peu plus clair, il faut bien
prᅵciser
que Java est ᅵ la fois le nom donnᅵ au langage et ᅵ la plate-forme
d'exᅵcution/dᅵveloppement.
1.2 Qu'est ce que le JDK / Java 2 SDK ?
C'est l'environnement de dᅵveloppement minimum pour faire du java. Il
comprend notamment :
javac -> le compilateur
java -> la machine virtuelle
javah -> pour l'interfacage avec le langage C
javap -> permet le desassemblage
javadoc -> crᅵateur de documentations
jdb -> debugueur
A partir du JDK 1.1.x, on peut aussi citer :
jar -> compacte diffᅵrents fichiers .class
native2ascii -> transforme un fichier au format unicode
rmic -> gᅵnᅵre des objets distants a partir d'une
classe java utilisant la rmi
rmiregistry -> crᅵe et lance un tel objet sur le port
specifiᅵ de la machine courante
javakey -> outil sur la sᅵcuritᅵ
serialver -> rᅵcupᅵre l'UID d'une classe 'serialisable'
A partir du JDK 1.2.x, viennent entre autres :
tnameserv -> fournit un accᅵs au service de nommage
idltojava -> utile avec les nouvelles extensions CORBA de Java 2.
La derniᅵre version officielle du JDK de Sun est la version 1.4.1 ( Linux,
Solaris et Windows ), cependant, les portages sur certaines autres machines
ainsi que pour certains navigateurs Web en sont encore aux versions
prᅵcᅵdentes. Les versions Java correspondant aux JDK 1.2.x et supᅵrieurs
font partie de ce qui officiellement nommᅵe la plate-forme Java 2.
La version 1.4.0 apporte de nombreuses nouvelles API comme le
package nio autorisant les IO non bloquantes ou encore le package de
manipulation des preferences utilisateurs. Les retours sur ces nouvelles
APIs sont encore peu nombreux (en tout cas sur le groupe fr.comp.lang.java)
et il est donc encore difficile de connaitre leur maturite.
1.3 Diffᅵrences Application/Applet/Servlet ?
Une application Java est un programme utilisant le langage de programmation
Java et qui tourne gᅵnᅵralement sur la machine ou se trouve au dᅵpart le
code. Il a le mᅵme but qu'un programme C ou d'un autre langage. L'applet est
elle rᅵcupᅵrᅵe ᅵ distance ᅵ travers un navigateur Web et s'exᅵcute sur
celui-ci.
En raison de ce tᅵlᅵchargement ᅵ distance, les rᅵgles de sᅵcuritᅵ concernant
les applets sont trᅵs strictes ( pour ᅵviter notamment les virus ). Par
exemple, une applet ( contrairement ᅵ une application ), ne permet pas
forcᅵment l'ᅵcriture sur le disque local ou l'impression.
Une servlet est elle destinᅵe ᅵ ajouter des fonctionnalitᅵs ᅵ un serveur web
acceptant ce type d'extension en Java.
1.4 Qu'est ce que HotSpot ?
HotSpot est une machine virtuelle [cf 1.1] optimisᅵe de Sun. Elle permet
d'exᅵcuter le byte-code Java de maniᅵre plus rapide.
Il existe une version serveur et une version pour les clients qui est livrᅵ
avec le JDK1.3.
Pour obtenir la version serveur trᅵs utile dans le contexte des servlets
il faut aller sur le site de Sun :
http://java.sun.com/products/hotspot/
2. QUESTIONS SUR LE LANGAGE
2.1 Peut-on surcharger les opᅵrateurs comme en C++ ?
Non et cela fait partie des choix/spᅵcifications de Java.
Ce choix est dᅵ aux multiples problᅵmes inhᅵrents ᅵ cette fonctionnalitᅵ
dans de
nombreux projets C++. Comme bien d'autres ce choix s'avᅵre ᅵtre une
restriction
visant ᅵ faciliter le dᅵveloppement. En effet, le code s'avᅵre beaucoup plus
simple ᅵ lire et donc maintenir. Mais certains peuvent regretter cette
fonctionnalitᅵ...
2.2 Mon compilateur n'accepte pas la dᅵclaration : int tab[5] ?
En Java tous les objets sont dynamiques, or les tableaux sont des objets,
ils ne peuvent donc pas ᅵtre allouᅵs statiquement. Il faut donc faire :
int tab[];
tab = new int[5];
ou directement
int tab[] = new int[5];
comme on ferait MaClasse objet = new MaClasse(param1, param2);
2.3 Ma classe refuse d'hᅵriter de plusieurs autres ?
Contrairement au C++, Java ne permet pas d'hᅵritage ( extends ) multiple
ceci pour ᅵviter les problᅵmes liᅵs ( notamment l'hᅵritage de deux classes
hᅵritant elles mᅵme toutes deux d'une mᅵme classe ). Par contre une classe
java peut implᅵmenter plusieurs interfaces et cela permet parfois de passer
outre cette limitation. Ce choix est arbitraire mais permet de passer au
travers
des problᅵmes dᅵs ᅵ l'utilisation (diabolique) de l'hᅵritage en diamant.
A
|
|
---------
| |
B C
| |
----------
|
D
2.4 Quand je compile ma classe, j'obtiens une erreur du type :
"Exception ... must be caught ...."
En Java, les erreurs sont gᅵrᅵes ᅵ travers des exceptions qui sont levᅵes
par exemple quand une mᅵthode ne peut pas aboutir. Le compilateur, ne
laisse pas le dᅵveloppeur ignorer ces exceptions, pour pouvoir les traiter
il faut :
utiliser une succession try/catch (essaye/attrape):
try {
... mes instructions
} catch (mon_type_d_Exception e)
... mon traitement si l'erreur intervient
} catch (un_autre_Exception e)
...
}
Ceci est lᅵ encore une diffᅵrence par rapport au langage C++.
A noter que l'on peut aussi trouver en plus des clauses catch, la clause
finally qui permet de libᅵrer des ressources, de fermer des flux et ce
quelque
soit le rᅵsultat des opᅵrations prᅵcᅵdentes (succᅵs ou erreur
induisant entrᅵe
dans une clause catch).
2.5 Que veut dire le mot clef final ?
Devant une mᅵthode : on ne pourra plus redᅵfinir cette mᅵthode. Ce qui
entraᅵne une certaine optimisation dans les appels a cette mᅵthode.
Devant une variable membre : la variable doit ᅵtre initialisᅵe ᅵ la
dᅵclaration et ne pourra plus ᅵtre modifiᅵe ( constante ).
Devant une classe : on ne peut pas crᅵer de classe dᅵrivᅵe de celle-ci.
Par exemple il est impossible de dᅵriver une classe ᅵ partir de la classe
String de la bibliothᅵque de base. La solution consisterait a "encapsuler"
String dans une classe de notre conception.
Final est aussi obligatoire devant toute variable locale ou paramᅵtre de
fonction qui sera utilisᅵ plus tard dans une 'inner class' (classe
intᅵrieure).
2.6 Comment lancer une commande ou un exᅵcutable non Java ᅵ partir du code
Java ?
Pour un exᅵcutable, une portion de code telle que celle-ci peut faire
l'affaire, on peut ensuite contrᅵler le processus ('proc') avec les
methodes waitFor(), getInputStream() et getOutputStream().
Runtime rt = Runtime.getRuntime();
try {
Process proc = rt.exec("Executable");
}
catch (java.io.IOException e) {..}
Attention, si votre appel comprend des arguments il faut ᅵtre un peu plus
prᅵcis et passer ᅵ exec un tableau comprenant l'exᅵcutable et ses arguments
sous forme de String.
Concernant une commande ( par exemple la commande changement de rᅵpertoire
"cd" ), ce ne sont pas des exᅵcutables. Il faut donc lancer comme exᅵcutable
l'interprᅵteur de commande (cmd.exe sous NT; command.com sous Windows ou le
shell sous Unix ) puis comme argument la commande.
A noter qu'ᅵvidemment cette faᅵon de procᅵder est tout sauf portable et
qu'il
convient de rᅵflᅵchir ᅵ sa conception avant de l'utiliser. On peut par
exemple
noter la possibilitᅵ de wrapper (encapsuler) l'appel dans un composant
CORBA.
2.7 Qu'est ce qu'une inner class ?
Une inner class ou classe intᅵrieure est une classe dᅵclarᅵe ᅵ l'intᅵrieur
mᅵme d'une top-level classe.
2.8 Quel est l'ᅵquivalent Java des pointeurs sur fonctions C/C++ ?
En Java il n'existe pas de pointeurs sur mᅵthodes, il faut utiliser un objet
la ou en C/C++ vous utilisiez une fonction.
Par exemple au lieu de faire en C/C++ :
typedef void (*ptrFcnt)(int);
et d'utiliser un objet de type ptrFcnt pour passer cette fonction ᅵ une
autre.
void fonction(ptrFcnt uneFonction) {
uneFonction(unint);
}
On utilisera un objet implᅵmentant une interface commune :
interface IFonction {
public void execute(int);
}
class Fonction implements IFonction {
public void execute(int arg) {
// faire ce que l'on aurait fait dans la fonction
// uneFonction en C/C++
}
}
dans une autre classe :
public void fonction(IFonction uneFonction) {
uneFonction.execute(unint);
}
Un bel exemple de tel mᅵthodologie est le systᅵme de callback de AWT, au
lieu de passer des fonctions comme en C/C++, on passe des instances de
classes appelᅵes Listener. A noter que cette faᅵon de procᅵder est
directement
liᅵe au Design Pattern Command (cf livre de Gamma et associᅵs du mᅵme nom).
2.9 Comment faire en sorte que le paramᅵtre int de ma mᅵthode soit modifiᅵ
en retour ?
En Java les types de base sont passes aux mᅵthodes par valeur, ils ne
peuvent pas ᅵtre modifiᅵs. Il va falloir utiliser une instance de classe
"encapsulant" un entier pour effectuer la modification. Attention la classe
fournie Integer ne permet pas la modification et est donc inutile dans ce
cas.
Exemple :
class MonEntier {
private int value;
public void setValue(int newValue) {
value = newValue;
}
public int getValue() {
return value;
}
}
Dans la mᅵthode maMethode faire :
public void maMethode (MonEntier i) {
i.setValue(maNouvelleValeur);
}
2.10 Qu'est ce qu'une classe anonyme ?
C'est une classe que l'on instancie sans lui donner un nom explicite. Ceci
est souvent utilisᅵ dans les Listener.
addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {}
}) ;
On a ici crᅵe une classe anonyme hᅵritant de la classe ActionListener.
2.11 Comment remplacer les enum C/C++ en Java ?
Il y a principalement deux types de solutions. Voici la plus simple :
Il faut dᅵclarer une classe :
public class MonEnum{
public final static int Val1=0;
public final static int Val2=1;
public final static int Val3=2;
file://?
}
On peut ensuite utiliser MonEnum.Val1, MonEnum.Val2 etc, ou mieux on peut
faire une interface plutᅵt qu'une class afin que les classes l'implᅵmentant
puissent directement appeler Val1, Val2...
Le problᅵme reste le typage des ᅵlᅵments, rien n'empᅵche de passer un objet
d'une ᅵnumᅵration ᅵ la place d'une autre. D'oᅵ une deuxiᅵme catᅵgorie de
solutions plus complexes mais permettant d'ᅵviter ce problᅵme. On peut par
exemple penser ᅵ utiliser des instances de classes :
public final class MonEnum1 {
private MonEnum1() {}
public final static MonEnum1 Val1 = new MonEnum1();
public final static MonEnum1 Val2 = new MonEnum1();
public final static MonEnum1 Val3 = new MonEnum1();
}
Ainsi un ᅵventuel objet de type MonEnum2 ne pourra jamais ᅵtre utilisᅵ ᅵ la
place d'un objet de type Enum1 (Enum1.Val1 Enum1.Val2 ...).
On peut aussi noter qu'une nouvelle faᅵon de procᅵder est disponible par le
biais du package Commons (sous projet Apache). Pour plus d'informations n'
hᅵsitez pas ᅵ vous rendre ᅵ l'adresse suivante:
http://jakarta.apache.org/commons/lang.html
2.12 Existe-t-il des templates en Java ?
Non par pour l'instant, cependant Sun ᅵtudie dans le cadre d'un processus
communautaire ( community process ) l'intᅵgration d'un mᅵcanisme de
gᅵnᅵricitᅵ ᅵ Java. Un des candidats serait une implᅵmentation Java des
templates qui est disponible ᅵ l'adresse suivante :
http://www.cs.bell-labs.com/~wadler/pizza/gj/
La gᅵnᅵricitᅵ est une des nouveautᅵs de la future version de la
plate-forme Java
dans sa version 1.5. Pour tester le compilateur javac (prᅵ-version):
http://developer.java.sun.com/developer/earlyAccess/adding_generics/index.html
3. QUESTIONS SUR LES OUTILS JAVA
3.1 Java ne trouve pas mes classes ?
il faut faire pointer la variable d'environnement CLASSPATH vers les
rᅵpertoires de base ou le fichier jar oᅵ sont stockᅵes vos classes ( pour
les JDK prᅵcᅵdent le 1.2 il faut aussi pointer sur le fichier classes.zip
des classes Java). Attention pour les utilisateur de Windows les
majuscules/minuscules sont importantes.
Chaque systᅵme d'exploitation possᅵde sa propre maniᅵre de dᅵfinir et d'
initialiser des variables d'environnement.
Sous certains systemes Windows (98, ...) on peut par exemple modifier le
fichier autoexec.bat en ajoutant une ligne du type
SET CLASSPATH=c:\java\lib\oro.jar pour initialiser le classpath avec la
librairie ORO du projet Jakarta (manipulation d'expressions regulieres).
Sur certains autres systemes Windows (comme Windows NT, 2000 ou XP) il
suffit plus simplement de proceder via le "Control Panel" dans la partie
systeme, en ajoutant ou modifiant la variable CLASSPATH directement dans
la boite de dialogue.
Les Unixiens (utilisant un shell BASH) peuvent taper dans leur console:
export CLASSPATH=$CLASSPATH:/home/jerome.java/libs/oro.jar
pour rajouter la librairie ORO au classpath actuel.
Pour l'initialiser a chaque dᅵmarrage on peut editer cette variable dans un
script du type .bashrc ou .profile (placᅵs dans votre home directory).
3.2 Comment compiler et exᅵcuter ?
Supposons le fichier source foo.java
-> compilation : javac Foo.java
-> execution : java Foo
Attention, il faut que le fichier porte exactement (majuscules / minuscules
comprises) le nom de la classe publique du fichier ( la classe Foo doit ᅵtre
dans Foo.java et la classe bar dans bar.java par exemple).
Il faut ici prᅵciser que depuis quelques mois maintenant, le projet ANT
s'est
imposᅵ comme standard de facto pour toutes les tᅵches relevant de la
compilation
(prᅵ-compilation), du packaging et du dᅵploiement.
http://ant.apache.org
3.3 Jdb refuse de se lancer en levant des exceptions "rᅵseaux" ?
En fait, la version actuelle de jdb nᅵcessite de travailler en reseau. La
solution est de crᅵer une interface loopback (sur nous mᅵme 127.0.0.1) qui
suffit a jdb pour fonctionner.
3.4 appletviewer ne fonctionne pas sur appletviewer maclass.class ?
L'appletviewer, comme son nom l'indique est chargᅵ de lancer l'applet d'une
page HTML, il faut donc lui donner en paramᅵtre cette page et non pas une
classe :
appletviewer mapage.html
3.5 Quand j'exᅵcute mon application Java sur un Terminal X, j'ai des
problᅵmes de segmentation fault.
En fait, il faut que le fichier lib/font.properties dans le rᅵpertoire
d'installation du JDK contienne seulement des fontes connues du TX. Un moyen
consiste a renommer ce fichier pour qu'il ne soit plus pris en compte.
3.6 Comment ne pas lancer le jit en lanᅵant Java 2 car -nojit ne fonctionne
plus ?
Il faut prᅵciser NONE comme compilateur : java -Djava.compiler=NONE
application.
3.7 Quelle est la diffᅵrence entre java.exe et javaw.exe sous Windows ?
javaw.exe n'affichera pas la fenᅵtre DOS que java.exe affiche
habituellement. L'inconvᅵnient est bien sᅵr que les traces des ᅵventuelles
exceptions ne seront plus visibles.
3.8 En Java 2, je ne trouve pas le fichier classes.zip !
En JDK1.2 il ne faut plus faire pointer votre CLASSPATH vers un tel fichier.
Il n'existe d'ailleurs plus et est remplacᅵ par des jars et principalement
rt.jar dans le rᅵpertoire jre/lib.
3.9 Est-il possible de compiler du code Java vers un exᅵcutable machine ?
Oui certains outils/compilateurs permettent d'obtenir un exᅵcutable ou plus
gᅵnᅵralement du code C compilable vers un exᅵcutable. Entre autres :
Toba: http://www.cs.arizona.edu/sumatra/toba
Harissa: http://www.irisa.fr/compose/harissa
EGCS: http://sourceware.cygnus.com/java
TowerJ: http://www.towerj.com
et Visual Cafe ᅵgalement.
A noter qu'il convien tde rᅵflᅵchir avant d'utiliser de tels outils car
ceci
brise l'un des atouts majeurs de Java : la portabilitᅵ.
4. AWT ET JAVA2D (JAVA.AWT.*, JAVA.AWT.EVENT.*,
JAVA.AWT.DATATRANSFER.*, JAVA.AWT.GEOM.*)
4.1 Qu'est ce que AWT ?
AWT est un "Abstract Window Toolkit" qui met ᅵ la disposition d'un
dᅵveloppeur une API indᅵpendante du systᅵme de fenᅵtrage utilisᅵ : que ce
soit celui du Macintosh, Windows95 ou X-Window. Par contre les objets
affichᅵs sont bien des objets du systᅵme correspondant. Les objets Swing
sont quant ᅵ eux des objets purement Java.
4.2 Comment mettre une image dans un bouton ?
La aussi ce n'est pas possible en AWT, il faut crᅵer sa propre classe
MyButton permettant de le faire en dᅵrivant par exemple Component pour faire
un lightweigth component.
Si vous utilisez Swing, vous pouvez bien entendu vous servir de la classe
JButton qui accepte les images.
4.3 Comment changer la forme du curseur de la souris ?
On utilise:
java.awt.Component.setCursor(java.awt.Cursor)
sachant que dans la classe Cursor un certain nombre de curseurs par dᅵfaut
sont dᅵfinit ( DEFAULT_CURSOR, WAIT_CURSOR... ) on peut ainsi changer le
curseur dans un Dialog ce qui n'ᅵtait pas possible prᅵcᅵdemment. En Java 2
on n'est plus limitᅵ aux curseurs par dᅵfaut et l'on peut en dᅵfinir un ᅵ
partir d'une Image.
4.4 Comment rᅵcupᅵrer les ᅵvᅵnements sur un Component a partir du JDK 1.1.x
?
En fait on peut distinguer plusieurs mᅵthodes :
-> Premiᅵre mᅵthode, on ajoute explicitement un Listener a notre objet
Par exemple,
class MyListener implements ActionListener
{
MyListener()
{..}
actionPerformed(ActionEvent e)
{... faire quelque chose ... }
}
class MyApplication
Button oneButton;
MyApplication()
{
oneButton = new Button();
oneButton.addActionListener(new MyListener());
}
}
Il existe d'autres types de Listener comme MouseListener, TextListener...
-> Deuxiᅵme mᅵthode, notre objet dᅵrive d'un objet existant, alors on
redᅵfinit des mᅵthodes protᅵgᅵes existantes (dans l'objet de base). Sans
oublier de prᅵciser que l'on veut recevoir de tels ᅵvᅵnements en utilisant
la mᅵthode enableEvents().
Par exemple,
class MyButton extends Button
{
MyButton()
{...
enableEvents(AWTEvent.ACTION_EVENT_MASK);
// permet l'arrivee des evenements
...}
// on redᅵfinie processActionEvent
protected processActionEvent(ActionEvent e)
{
...
// pour permettre la transmission de l'evenement
super.processActionEvent(e);
}
}
4.5 Comment imprimer l'ensemble d'un Container (JDK 1.1.x) ?
Voilᅵ un dᅵbut de code permettant d'imprimer un Container 'cont' :
// rᅵcupᅵre le travail et affiche la boite de dialogue d'impression
PrintJob job = getToolkit().getPrintJob(frame_parent_pour_le_dialogue,
"essai", null);
if (job != null)
{
// recupere le Graphics dans lequel on va ecrire
Graphics g = job.getGraphics();
if (g != null) {
// sur le Container imprime l'ensemble de ses Components
cont.printAll(g);
g.dispose();
}
// finit le travail
job.end();
}
4.6 Comment traiter les "double click" dans un mouseListener ?
Sur un ᅵvᅵnement de type MouseEvent, la mᅵthode getClickCount() permet de
connaᅵtre le nombre de clicks et donc de gᅵrer les doubles.
4.7 Comment connaᅵtre le bouton de souris concernᅵ par un ᅵvᅵnement ?
Sur un ᅵvᅵnement de type InputMouseEvent, les modifiers (getModifiers())
contiendront InputEvent.BUTTONx_MASK ou x correspond au bouton utilisᅵ.
Par exemple pour tester si on appui sur le 3eme bouton (e = event) :
if ((e.getModifiers()&InputEvent.BUTTON3_MASK)!=0) {...}
Si l'on veut tester le fait que l'on soit sur le bouton devant dᅵclencher un
menu contextuel (ce bouton peut diffᅵrer selon la plate-forme) il faudra
tester :
if ((e.isPopupTriggered()) {...}
4.8 Je n'arrive pas a faire du cut/paste inter applications en JDK1.1.x ?
Dans cette version, ceci n'est possible qu'avec le stringFlavor et
plainTextFlavor pas encore avec les DataFlavor dᅵfinis par l'utilisateur qui
ne fonctionneront qu'en intra application.
4.9 Comment lire une image dans une application puisque je ne dispose pas
de Applet.getImage(URL) ?
Il faut dans un premier temps rᅵcupᅵrer le toolkit :
Toolkit tk = Toolkit.getDefaultToolkit();
Puis sur ce dernier lire le fichier :
Image im = tk.getImage("image.gif");
ou pour un chemin absolu par une URL :
Image im = tk.getImage(new URL("file:chemin/image.gif"));
4.10 Si cette image est dans un .jar lu par un application la solution si
dessus ne fonctionne pas.
Une maniᅵre gᅵnᅵrale de rᅵcupᅵrer une ressource qui devrait fonctionner sur
une applet ou application dans un jar ou non est :
tk.getImage(getClass().getResource("chemin/nom.gif"));
Ainsi on laisse au ClassLoader la tache de chercher le fichier.
4.11 Comment faire en sorte que lors d'un double click de la souris l'action
sur le simple click ne soit pas exᅵcutᅵe ?
Tout d'abord gᅵnᅵralement les actions simple et double click sont
complᅵmentaires ( par exemple sᅵlection d'une icᅵne sur le simple click et
lancement de l'application correspondante sur le second click), il devrait
donc ᅵtre rare d'avoir ᅵ rendre les 2 actions exclusives.
Si cela est vraiment nᅵcessaire dans votre cas, il faudra sur la rᅵception
de l'ᅵvᅵnement souris du premier click lancer un timer (objet Timer de Swing
ou votre propre objet [cf 8.3]) qui exᅵcutera l'action associᅵe seulement au
bout d'un temps supᅵrieur a la durᅵe d'un double click puis s'arrᅵtera de
lui-mᅵme. Si un second click de souris survient avant vous devez
naturellement stopper ce timer et effectuer l'action associᅵe au second
click. La premiᅵre action sera donc bien exᅵcutᅵe uniquement si le second
click n'arrive pas.
4.12 Comment rᅵcupᅵrer la taille de l?ᅵcran ?
Tout simplement :
Dimension d = Toolkit.getDefaultTookit().getScreenSize();
4.13 Comment enregistrer une image ?
Java ne permet pas d'enregistrer un image au format GIF, PNG ou JPEG. Il
va falloir faire appel ᅵ des classes extᅵrieures permettant le codage de
l'image.
En Java 2 qui ne fait pas partie des spᅵcification de la plate-forme est
fournie pour enregistrer du JPEG :
http://java.sun.com/products/jdk/1.2/docs/guide/2d/api-jpeg/overview-
summary.html
Pour le GIF vous pouvez faire appel ᅵ :
http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html
Pour le PNG, un encoder est disponible dans le code source de Batik:
4.14 Qu'est ce que Java 2D ?
Java 2D est une extension de AWT apparu avec Java 2 est qui consiste
principalement en une classe dᅵrivant de Graphics et permettant comprenant
des primitives de dessin plus evoluᅵes que dans la classe de base (gradient
de couleurs, transparence, splines...).
4.15 Comment dessiner une Spline en Java ?
A moins de redᅵfinir soit mᅵme le dessin de la spline ᅵ l'aide de multiples
segments de droite, il faut attendre Java 2 et les Shape Java 2D pour
dessiner une spline. Les Shapes courbes sont : java.awt.geom.QuadCurve2D et
java.awt.geom.CubicCurve2D.
4.16 Aprᅵs avoir appuyᅵ sur un bouton ou choisi un menu pour exᅵcuter une
action, mon interface est comme bloquᅵe et ne se dessine plus ?
Suite au choix dans le menu ou ᅵ l'appui sur le bouton, Java est dans le
thread EDT ( Event Dispatcher Thread ), c'est le thread chargᅵ de diffuser
les ᅵvᅵnements d'interface (souris, clavier, fenᅵtre, paint,...). Si ce
thread est monopolisᅵ par une action, l'interface ne fonctionne plus et ne
se repeint plus. Ceci peut arriver si l'action est trᅵs longue ᅵ exᅵcuter
( accᅵs ᅵ une base de donnᅵes par exemple ) ou si un sleep() est effectuᅵ
dans cette action.
La solution est alors de lancer l'action dans un autre thread. Lors du clic
sur le bouton ou sur le menu, il faut lancer un thread qui fera l'action, et
l'EDT sera alors relᅵchᅵ, l'affichage se fera !
5. CLASSES DE BASE (JAVA.UTIL.* JAVA.LANG.* JAVA.TEXT.*)
5.1 Quelle fonction permet de rᅵcupᅵrer la valeur d'une variable
d'environnement ?
Il faut utiliser la mᅵthode getProperty() de la classe System ainsi pour
rᅵcupᅵrer la valeur de HOME par exemple :
System.getProperty("HOME") renvoie une String contenant la valeur dᅵsirᅵe ᅵ
condition de lancer le programme ainsi : java -DHOME="xxx" nom_programme.
Pour correctement passer la variable d'environnement.
Par contre, les "propriᅵtᅵs systᅵmes" dᅵfinies comme telles par java comme
par exemple "java.home" ou "os.name" ou encore "user.dir" sont accessibles
de cette maniᅵre sans passer par la dᅵfinition avec le -D lors de l'appel.
La mᅵthode renvoie directement la bonne valeur en faisant
System.getProperty("user.dir").
5.2 Comment transformer une String en entier ?
Deux principaux moyens existent :
int i = Integer.parseInt(maString);
ou
int i = Integer.valueOf(maString).intValue();
(on cree un objet Integer pour le retransformer en int)
On peut bien entendu appliquer ceci a d'autres types par exemple :
long l = Long.parseLong(maString);
5.3 Qu'est ce que l'API de reflexion (Java Core Reflection API) ?
(Comment crᅵer une instance d'une classe dont on connaᅵt le nom)
C'est un package qui permet de travailler sur les attributs, mᅵthodes et
constructeurs de classes "chargᅵes". Elle permet par exemple de construire
"dynamiquement" un nouvel objet (ou mᅵme tableau) ou encore d'accᅵder a ses
attributs et mᅵthodes.
Par exemple pour crᅵer un objet ᅵ partir du nom d'une classe et transmettre
des arguments a son constructeur (exceptions a traiter) :
java.lang.Class cs = java.lang.Class.forName("nom_de_ma_classe");
java.lang.reflect.Constructor cr = cs.getConstructor();
java.lang.Object ot = cr.newInstance();
5.4 Comment calculer le cosinus ou sinus d'un nombre ?
java.lang.Math.cos(double) retourne le cosinus
et java.lang.Math.sin(double) le sinus
D'autres fonctions trigonomᅵtriques et mathᅵmatiques sont disponibles dans
cette class Math sous forme de mᅵthodes statiques.
5.5 Comment rediriger ce qui est envoyᅵ sur la sortie standard (System.out)
?
Utiliser tout simplement : System.setOut(PrintStream), le PrintStream ᅵtant
par exemple connectᅵ ᅵ un fichier. Ceci est bien entendu aussi possible avec
System.err et System.in.
5.6 Comment connaᅵtre l'heure courante?
Tout d'abord, il faut rᅵcupᅵrer une instance de la classe Calendar :
Calendar cal = Calendar.getInstance();
ou si l'on veut preciser une zone horaire (ici Europe Central Time)
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("ECT"));
Ensuite sur cet objet on peut rᅵcupᅵrer l'heure, les minutes ...
cal.get(Calendar.HOUR);
cal.get(Calendar.MINUTES);
cal.get(Calendar.DAY_OF_YEAR); //... voir java.util.Calendar
Ou afficher un rᅵsultat formatᅵ :
System.out.println(DateFormat.getDateInstance(DateFormat.LONG).
format(cal.getTime());
On peut ici aussi explicitement dire au format sous quelle TimeZone afficher
les rᅵsultats en faisant un setTimeZone() dessus. A la construction on peut
ᅵgalement lui prᅵciser la langue ᅵ utiliser en prᅵcisant une Locale.
5.7 Comment formatter un nombre pour avoir par exemple 2 chiffres aprᅵs la
virgule ?
DecimalFormat df = new DecimalFormat("########.00");
System.out.println(df.format(mon_nombre));
5.8 Comment dᅵcouper une chaᅵne (String) en morceaux ?
Il faut utiliser un objet java.util.StringTokenizer qui permet aisᅵment de
dᅵcouper une chaᅵne en sous-chaines sᅵparᅵes par des dᅵlimiteurs que l'on
peut prᅵciser.
5.9 Comment transformer une chaᅵne en float et inversement ?
La mᅵthode est diffᅵrente de celle des entiers. Pour crᅵer une chaᅵne il
faut par exemple faire :
String machaine = Float.toString(monfloat);
Et dans l'autre sens :
float monfloat = Float.valueOf(machaine).floatValue();
La mᅵme chose est valable pour les double/Double.
6. JDBC (JAVA.SQL.*)
6.1 Comment effectuer une requete sur une base de donnees ?
Supposons que le driver JDBC de votre gestionnaire implᅵmente
java.sql.Driver ᅵ travers une classe boite.sql.myDriver. Alors pour
effectuer par exemple un SELECT, on peut procᅵder ainsi :
try {
// charge la classe driver
Class.forName(boite.sql.myDriver);
} catch (java.lang.ClassNotFoundException e) {}
// mon_protocole peut-etre msql, odbc (attention syntaxe
// speciale dans odbc pour la suite du protocole))
String url = "jdbc:mon_protocole://ma_machine:mon_port/ma_base";
try {
Connection con =
DriverManager.getConnection(url,"mon_log", "mon_pass");
// un statement ne peut servir pour une seule requete a la fois
Statement smt = con.createStatement();
// exemple : peut etre remplace par toute autre requete
ResultSet result = executeQuery(SELECT * FROM TEST);
// result est un "tableau" contenant le resultat de la requete
// voir la doc pour les mᅵthodes permettant de l'analyser
// par exemple si la base est forme d'un INT et d'un REAL
// tant qu'il reste des lignes a lire on fait :
while (result.next()) {
int a = result.getInt(1); // premier element
float x = result.getFloat(2); file://deuxieme element
// on peut aussi mettre une String :
// getFloat("nom_de_la_colonne");
// traitements ...
}
smt.close();
con.close();
} catch (java.sql.SQLException e) {}
6.2 Comment rᅵcupᅵrer le nom d'une colonne par exemple ?
En gardant la connexion mise en place prᅵcᅵdemment, pour accᅵder aux types
et propriᅵtᅵs des colonnes on utilise un objet de type ResultSetMetaData
obtenu ainsi :
ResultSetMetaData rsm = result.getMetaData();
Puis par exemple pour connaᅵtre le nom de la colonne 1 :
String str = rsm.getColumnName(1);
On peut aussi en connaᅵtre le type :
String str = rsm.getColumnTypeName(1);
et autres mᅵthodes bien pratiques...
6.3 Mon driver JDBC ne fonctionne pas au sein d'une Applet ?
Au sein d'une Applet, seul les drivers de type III et IV fonctionnent
correctement.
Pour plus de prᅵcisions sur les types de drivers vous trouverez sur le site
de Sun :
http://java.sun.com/products/jdbc/jdbc.drivers.html
7. LES APPLETS (JAVA.APPLET.* ET JAVA.NET.*)
7.1 Certaines mᅵthodes du JDK me demandent une Frame, mais Applet ne
dᅵrivant
pas de Frame que passer en argument ?
Une solution semble exister au moins avec Netscape Navigator et
Appletviewer, en effet ils placent les applets dans une Frame. Il suffit
donc d'utiliser getParent() sur l'Applet pour rᅵcupᅵrer cette Frame et s'en
servir ( ᅵventuellement de maniᅵre rᅵcursive jusqu'ᅵ rᅵcupᅵrer la Frame ).
7.2 Comment dans une applet afficher une nouvelle page HTML dont on connaᅵt
l'adresse ?
Il faut dans l'applet, rᅵcupᅵrer la page puis l'afficher, ceci peut ᅵtre
effectuᅵ suite a l'appui sur un bouton ou autre.
URL recup;
try {
// rᅵcupᅵre l'URL a partir du document courant et "page.html"
recup = new URL(getDocumentBase(), "page.html");
// Affiche le document apres avoir recupere le contexte courant
getAppletContext().showDocument(recup, option_frame);
repaint();
} catch (MalformedURLException e) {
// un traitement quelconque si la page n'est pas correcte
}
option_frame peut-ᅵtre :
"_self" -> la frame courant
"_parent" -> la frame parente
"_top" -> la frame de base
"_blank" -> nouvelle fenetre
"un_nom" -> nouvelle fenetre nommee.
7.3 Comment rᅵcupᅵrer des arguments d'une page HTML dans une applet ?
ᅵ l'intᅵrieur de la page HTML l'appel se fait ainsi :
<applet code=mon_code>
<param name=param1 value="xxx">
<param name=param2 value="yyy">
</applet>
dans l'applet on rᅵcupᅵre les rᅵsultats ainsi :
String param1 = getParameter("param1");
String param2 = getParameter("param2");
7.4 Comment afficher quelque chose dans la barre de status d'un navigateur ?
Il faut utiliser la mᅵthode showStatus(String) sur un objet de type
java.applet.AppletContext.
7.5 Comment rᅵcupᅵrer le source html de la page web sur laquelle on se
trouve ?
-> premiᅵre mᅵthode sur l'applet :
String ligne;
try {
InputStream is = getDocumentBase().openStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
while (ligne = bf.getLine())
{
// on lit ligne par ligne...
}
}
catch (IOException e) {...}
-> seconde mᅵthode plus complexe mais sᅵrement plus puissante :
Il s'agit ici de crᅵer une "content handler factory" qui crᅵera des objets
Java en fonction du type mime du document. Ainsi la mᅵthode
java.net.URL.getContent() retournera automatique l'objet correspondant au
type de document pointᅵ par l'URL.
7.6 Comment faire communiquer deux Applets ?
Deux cas se prᅵsentent :
-> Les Applets se trouvent dans la mᅵme frame HTML.
Alors il suffit de rᅵcupᅵrer une Applet a partir d'une autre de cette
maniᅵre :
CType autre_applet = (CType)(getAppletContext().getApplet("tagname");
il faut que l'autre applet ait ᅵtᅵ dᅵclarᅵe dans le code HTML de la sorte :
<applet code=.... name="tagname"></applet>
-> Si les Applets sont dᅵclarᅵes dans des frames HTML diffᅵrentes.
Comme le navigateur utilise gᅵnᅵralement une seule JVM, l'espace mᅵmoire est
partagᅵ. Une astuce est donc alors de crᅵer une classe ne contenant que des
membres statiques et permettant l'enregistrement et la rᅵcupᅵration
d'Applet. Ces membres statiques seront uniques en mᅵmoire et donc partagᅵs
entre les applets.
Un dᅵbut de structure serait :
class AppletDataBase
{
// une structure de donnᅵe permettant d'enregistrer les donnees
static Hashtable data;
// un methode permettant de recuperer une Applet grace a son tag
public static Applet getApplet(String tag);
// un methode chargee d'enregistrer une Applet marquee par un tag
public static void addApplet(Applet applet, String tag);
}
dans les Applets on peut ainsi faire l'ᅵquivalent de ce qui est fait avec
l'AppletContext :
Applet autre_applet = AppletDataBase.getApplet("tagname");
7.7 Mon applet ne marche pas avec un plugin java que faire ?
En fait pour faire marcher votre applet avec un plugin, il va falloir
modifier le contenu de votre page html. Ceci dᅵpendant de votre naviguateur.
Vous trouverez plus d'informations ᅵ l'adresse suivante :
http://www.javasoft.com/products/plugin/1.3/docs/tags.html
8. LES JAVA FOUNDATION CLASSES (JFC : JAVAX.SWING.* ET
JAVA.AWT.DND.* )
8.1 Qu'est que les JFC et Swing ?
Le JFC sont un certain nombre de packages principalement graphiques ᅵtendant
les packages de base standard prᅵsents dans le JDK1.1. Les JFC sont
intᅵgrᅵes au JDK 1.2 et supᅵrieurs (Java 2).
Vous pouvez tᅵlᅵcharger Swing pour le JDK1.1.x sur le site Sun [Cf 12.2]
Elles sont formᅵes de classes pure java dᅵnommᅵes Swing mais aussi de
nouvelles extensions comme le drag'n'drop par exemple qui sont dᅵpendantes
de la plate-forme.
8.2 Des problᅵmes graphiques apparaissent lorsque j'utilise Swing ?
Ce problᅵme peut avoir principalement deux origines :
Les composants swing sont lightweight et vont donc dans certains cas
s'afficher derriᅵre les composants du systᅵme qui sont heavyweight et ont
prioritᅵ ( il s'agit des composants AWT en l'occurrence ).
Pour plus de dᅵtails sur les diffᅵrents problᅵmes observᅵs et pour vous
aider a les rᅵsoudre il est intᅵressant de consulter :
http://java.sun.com/products/jfc/tsc/archive/tech_topics_arch/mixing/mixing.
html
Une deuxiᅵme source d'erreur est le fait d'utiliser Swing dans un
environnement multithread. En effet Swing dᅵs lors que vous avez appelᅵ
setVisible(true) sur la fenᅵtre principale requiers que vous fassiez appel ᅵ
ses mᅵthodes uniquement dans le thread de gestion d'ᅵvᅵnements. C'est-ᅵ-
dire dans un listener.
Pour plus de dᅵtail ᅵ ce sujet, il est intᅵressant de lire :
http://java.sun.com/products/jfc/tsc/archive/tech_topics_arch/threads/thread
s.html
8.3 Existe il un objet gᅵrant les timers en java ?
Dans l'API de base il n'existe pas de tel objet, par contre Swing possᅵde un
objet Timer qui permet d'exᅵcuter des mᅵthodes a intervalle rᅵgulier.
En dehors de Swing vous pouvez vous crᅵer relativement simplement un tel
objet avec les Thread et la mᅵthode Thread.sleep(). L'objet Timer de Swing
est lui un peu plus complexe et est gᅵrᅵ avec un systᅵme de notification
(notify/wait).
Voici un exemple trᅵs simple si vous n'avez pas Swing :
class Timer extends Thread
{
private int _delay;
private TimerListener _listener;
public Timer(int delay, TimerListener listener) {
_delay = delay;
_listener = listener;
}
public void run() {
try {
sleep(_delay); }
catch (Exception ex) { ex.printStackTrace());}
_listener.executedMethod();
}
}
interface TimerListener {
public abstract void executedMethod();
}
// crᅵation du timer :
Timer timer = new Timer(500, new TimerListener() {
public void executedMethod() {
System.out.println("coucou");
}
});
// lancement
timer.start();
8.4 Comment afficher une info bulle ( Tooltip ) ?
En Swing, il suffit d'utiliser un JToolTip, en spᅵcifiant le texte dᅵsirᅵ
sur votre JComponent avec la mᅵthode JComponent.setToolTipText().
En dehors de Swing la seule alternative est de gᅵrer vous mᅵme l'affichage
d'une Window ᅵ travers un listener ᅵcoutant l'entrᅵe et la sortie du
pointeur souris des composants.
8.5 Comment afficher du HTML dans un composant Swing ?
En utilisant un JEditorPane :
JEditorPane html = new JEditorPane();
html.setEditable(false);
html.setPage(un_objet_URL);
8.6 Comment traduire le JFileChooser ou le JColorChooser en franᅵais ?
Ces boᅵtes de dialogue ne suivent pas la locale de votre systᅵme. En fait
chaque texte affichᅵ dans ces boᅵtes de dialogue correspond ᅵ une ressource
du UIManager. Il va donc falloir changer ces ressources.
Par exemple pour le JFileChooser vous pouvez dans votre code faire :
UIManager.put("FileChooser.saveButtonText","Enregistrer");
UIManager.put("FileChooser.openButtonText","Ouvrir");
UIManager.put("FileChooser.cancelButtonText","Annuler");
UIManager.put("FileChooser.updateButtonText","Actualiser");
UIManager.put("FileChooser.helpButtonText","Aide");
UIManager.put("FileChooser.saveButtonToolTipText","Enregistre le fichier");
Ce genre de propriᅵtᅵs ne sont souvent pas documentᅵs et vous devrez les
trouver vous mᅵme [cf 8.7].
8.7 Oᅵ trouver les propriᅵtᅵs ᅵ passer au UIManager (UIManager.put()) ou aux
objets (JComponent.putClientProperty()) ?
Il n'y a pas de documentation exhaustive de ces ressources. Cependant vous
pouvez vous dᅵbrouiller ainsi :
Concernant les ressources du UIManager vous pouvez jeter un coup d'oeil au
cite suivant qui en comparant les diffᅵrents Look & Feel dᅵcrit les valeurs
des ressources
http://www.gargoylesoftware.com/papers/plafdiff.html
Concernant les propriᅵtᅵs clientes des JComponent vous trouverez de
informations notamment :
http://java.sun.com/products/jfc/tsc/special_report/performance/performance.
html
Cette page dᅵcrit une ou deux propriᅵtᅵs clientes concernant la performance
des objets en Swing-1.1.1.
On peut trouver certaines informations dans la documentation des UIComponent
correspondant aux JComponent (javax.swing.plaf.*) par exemple pour le JTree
en look Metal :
http://java.sun.com/products/jdk/1.2/docs/api/javax/swing/plaf/metal/MetalTr
eeUI.html
Le livre : Java Look and Feel Design Guidelines contient des informations
pour le look Metal. Une version en ligne est maintenant disponible :
http://java.sun.com/products/jlf/dg/index.htm
Concernant aussi bien les ressource UIManager que les propriᅵtᅵs clientes,
la liste exhaustive vient en examinant le code source de Swing...
8.8 Peut-on rendre les JTooltip multi-lignes ?
Par dᅵfaut les JTooltip ne savent afficher qu'une seule ligne, il faut
ᅵtendre la classe pour afficher plusieurs lignes. Voir un exemple sur :
http://www.codeguru.com/java/articles/122.shtml
Cependant ᅵ partir du JDK1.3 cela devient possible en utilisant du code
HTML pour le texte de son tooltip !
8.9 Comment mᅵlanger un JTree Swing et une JTable ?
Il faut s'inspirer de l'exemple suivant qui permet de visualiser le contenu
d'un rᅵpertoire :
http://java.sun.com/products/jfc/tsc/articles/treetable2/index.html
8.10 Que faut-il faire pour avoir un JTextField n'acceptant que des chiffres
?
En JDK1.4 et suivant vous pouvez directement utiliser la sous-classe de
JTextField prevue a cet effet: JFormattedTextField (package javax.swing).
Sinon, il faut redᅵfinir un Document qui n'accepte que des chiffres. Un
autre avantage est que ce document pourra resservir dans d'autres objets
( JTextField, JTextArea... ). Si dessous un exemple :
// example de redefinition d'un document
private static class NumberDocument
extends PlainDocument
{
// est-ce qu'on peut rentrer un flotant => '.' sera accepte
private boolean isFloat;
// est-ce qu'on peut rentrer un negatif => '-' sera accepte
private boolean acceptNeg;
public NumberDocument(boolean isFloat, boolean acceptNeg)
{
this.isFloat = isFloat;
this.acceptNeg = acceptNeg;
}
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{
if (str == null)
return;
char[] first = str.toCharArray();
StringBuffer buff = new StringBuffer();
int i = 0;
if (offs == 0 && acceptNeg && first[0] == '-')
buff.append(first[i++]);
for (; i < first.length; i++)
if(Character.isDigit(first[i])||(isFloat && first[i]=='.'))
buff.append(first[i]);
super.insertString(offs, buff.toString(), a);
}
}
// exemple d'utilisation
JTextField field = new JTextField(new NumberDocument(false, false),"23", 2);
9. JAVA ET LE RESEAU (JAVA.NET.* JAVA.RMI.* ORG.OMG.CORBA.*)
9.1 Comment savoir si une connexion Socket est toujours ᅵtablie ?
Lorsque la connexion est coupᅵe, une IOException est levᅵe lors de tout
appel ᅵ n'importe quelle mᅵthode de la classe Socket ( cotᅵ client ) ou
ServerSocket ( cotᅵ serveur ). Il faut donc bien attraper cette exception.
9.2 Qu'est ce que RMI ?
Java-RMI est une forme particuliᅵre d'invocation d'objets distribuᅵs et
ce par
le biais d'un protocole (RMI-IIOP) particulier. Il faut prᅵciser que ceci se
fait au sein d'un environnement Java-Java (contrairement ᅵ l'utilisation
d'un
middleware CORBA).
9.3 Qu'est ce que CORBA ?
C'est le nom d'une norme permettant l'invocation de services (mᅵthodes)
sur un
rᅵseau (Internet ou Intranet), implᅵmentᅵs dans n'importe quel langage
dotᅵ d'
outils de projection pour CORBA (C/C++/COBOL Object etc...), sur n'importe
quelle plate-forme. CORBA est normalisᅵ par l'OMG (Object Management Group)
http://www.omg.org
9.4 Quels sont les packages dᅵdiᅵs ᅵ CORBA dans mon environnement
Ces packages sont normalisᅵs et sont prᅵfixᅵs par org.omg.*
10. LES AUTRES PACKAGES OU OUTILS
10.1 Apache supporte-t-il les servlets ?
Non, par contre il existe une extension ᅵ Apache nommᅵe Tomcat qui gᅵre les
Servlets :
http://jakarta.apache.org/tomcat/
10.2 Comment accᅵder au registre de Windows avec Java ?
Par exemple en utilisant une API native comme :
http://www.ice.com/java/jnireg/index.shtml
10.3 Comment supprimer d'une archive jar les fichiers inutiles ᅵ l'exᅵcution
d'une application ou applet ?
Le plus simple est d'utiliser un outil qui cherchera pour vous les
classes/mᅵthodes non utilisᅵes et les supprimera en rᅵduisant ainsi la
taille de l'archive jar.
On peut par exemple citᅵ Dash-O de Preemptive Software :
On peut aussi rappeler que la construction/modification d'archives JAR
est une
tᅵche de choix pour commencer ᅵ utiliser ANT.
10.4 Choix d'un envrionnement de developpement : IDE ou Editeur
1) La question:
Cette question s'avᅵre etre l'une des questions recurrentes sur ce forum,
donc je vais tenter d'y repondre de maniᅵre relativement exhaustive et la
moins partiale possible.
Il est normal qu'un nouveau venu dans le monde Java cherche a demander
l'avis de personnes plus aguerries sur leur choix d'outil, donc examinons
les diffᅵrentes possibilites.
2) IDE ( Integrated Development Environment ou Environnement de
Developpement Integres ):
Ces outils permettent d'integrer en un seul et meme outil de nombreuses
fonctionnalites telles que:
* editeur de textes
* compilateur
* debugueur
* gestionnaire de code source (partie cliente d'un serveur de type
CVS ou Visual Source Safe)
* gestion de documentation
* packaging, deploiement d'applications
* eventuellement des modules de modᅵlisation graphique (support U.M.L)
Les avantages de ce genre d'outils:
- uniformite des postes de developpement pour une equipe
- editeur de textes adaptes au langage (Java) permettant l'auto
complᅵtion des mots clᅵs du langage, des attributs et methodes.
- aide du JDK integre au produit (contextuellement ou dans une
fenetre dediee).
Les inconvenients:
- souvent lourds (reclament de grosses machines)
- trop souvent fermes (difficultes pour changer de version de JDK ou
adapter les parametres de travail )
- peuvent etre percus comme des entraves a la progression d'un
debutant puisqu'ils ne lui permettent pas d'etre confronte a des
problemes classiques via leur nombreux assitants pre-machant le
travail.
- le debugueur est un outil assez pratique mais reste souvent
inutilisable sur de reels projets du fait de l'instabilite des
machines et des ressources memoire demandees.
Quelques produits (liste non exhaustive):
- JBuilder de Borland
- Visual Age for Java (IBM) qui va etre remplace par le projet
Eclipse (eclipse.org).
- AnyJ
- Code Warriors de Metrowerks inc
- Forte de Sun issu du projet Netbeans (netbeans.org).
- Eclipse (http://www.eclipse.org)
3) La solution plus minimaliste
De nombreux developpeurs preferent une solution plus portable, plus legere
mais aussi plus difficile de prime abord : integrer un JDK dans un editeur
de textes a l'aide de modules de personnalisation ou de scripts shell ou
batch sous DOS.
Cette solution presente de nombreux avantages:
- ouverture (vous pouvez changer de JDK, integrer de nouveaux outils
a peu pres librement comme un debugueur , un profileur etc..)
- legerete.
- portabilite : si votre code Java est portable mais que vous etes
ataches a une palte-forme a cause des outils.... Emacs est dispo
sur quasiment toutes les plates-formes, comme VI...
- cout.
- progression : un debutant va etre amene a resoudre des problemes
par lui meme, ce qui va l'amener a progresser...
Inconvenients:
- moins d'assitance, plus de travail fait a la main
- environnement graphique moins plaisant esthetiquement
Quelques outils:
- solution Emacs/Xemacs + JDE : pour un mini IDE sous Emacs, avec
des templates de code, auto-completion partielle, lancement et
debuguage des programmes Java dans la fenetre Emacs...
(http://www.fsf.org ou http://www.xemacs.org)
- Ultra Edit sous Windows ou TextPad sont de tres bons petits
editeurs
- Kawa est une solution tres repandue
4) Comment choisir ?
Personne ne peut vous donner de conseil parfait, votre productivite ne peut
etre evaluee que par vous, il faut donc esayer differentes formules et
choisir...
11. JAVA ET ...
11.1 Java et C/C++
En C/C++ vous ne pouvez pas directement appeler du code java puisque celui-
ci est un code a interprᅵtᅵ.
Solution 1: JNI
Cependant en JDK 1.1.x, la JNI ( Java Native Interface ) permet ᅵ travers
l'API d'invocation (Invocation API) de faire appel a la VM ᅵ partir d'un
code C/C++ et donc d'invoquer du code Java.
Rᅵciproquement, en Java vous pouvez utiliser les mᅵthodes "natives" qui vous
permettent de faire appel a du code C/C++ sous forme de librairie. La
dᅵmarche ᅵ suivre est la suivante :
-> Crᅵation du source java avec pour les mᅵthodes qui viendront de
C/C++ juste leur dᅵclaration sous cette forme :
public native type_retour ma_fonction(argument) ;
-> Ajouter un constructeur de classe qui chargera la librairie C :
static {
System.loadLibrary("nom_librarie");
}
-> Compilation du source java
-> Traitement avec javah : javah ma_classe qui renvoie un header
(fichier .h) contenant la dᅵclaration de nos fonctions C et un
fichier .c qui "gᅵre" le dialogue avec Java.
-> Crᅵer le fichier source C correspondant a l'implᅵmentation des
fonctions du header (voir la doc du JDK).
-> Compiler le fichier C et le mettre sous forme de librairie
cette ᅵtape est diffᅵrente selon les systᅵmes ( a vous de
voir ).
-> Essayer !
Solution 2: Communication via CORBA
Cette solution est peut-ᅵtre moins intuitive mais s'avᅵre plus sᅵre, moins
contraignante et beaucoup plus propre... De plus, on peut noter que cette
solution reste aussi valable pour le sens inverse de communication (Jaav
vers
C++)
La mᅵthodologie est la suivante :
- Crᅵation d'une interface IDL dᅵfinissant vos services
- Compilation de l'IDL
- Implᅵmentation en Java de votre service (respectivement C++ pour un
dialogue
Java vers C++)
- Mise ᅵ disposition de votre composant sur le bus CORBA
- Invocation du service (comme si c'ᅵtait un objet local)
11.2 Java et JAVASCRIPT
Java est un langage oriente objet, il peut ᅵtre utilisᅵ aussi bien ᅵ travers
le Web que comme langage applicatif. JavaScript est un langage non objet qui
peut ᅵtre intᅵgrᅵ aux scripts HTML pour ᅵtendre leurs possibilitᅵs.
Attention JavaScript ne fait en aucun cas partie de la norme HTML. De plus,
il permet ᅵvidemment de faire beaucoup moins de choses que Java. Il n'est
pas rᅵaliste de rᅵaliser des applications entiᅵres avec par exemple.
11.3 Applet Java et CGI/BIN
La principale diffᅵrence est que l'Applet s'exᅵcute sur le client alors que
le script CGI/BIN est exᅵcutᅵ lui sur le serveur.
L'applet est ᅵcrite en JAVA. Elle travaille directement dans la fenᅵtre du
navigateur ou dans ses propres fenᅵtres.
Le script CGI/BIN peut lui ᅵtre ᅵcrit ᅵ priori dans n'importe quel langage.
Il prend les donnᅵes de la page HTML en entrᅵe standard et renvoie du code
HTML sur sa sortie standard.
11.4 Java et l'Euro !
Le caractᅵre UNICODE correspondant ᅵ l'Euro est : 0x20AC.
C'est ᅵ dire que vous devez ᅵcrire :
System.err.print("Maintenant les prix sont en u\20AC");
11.5 Java et XML.
Le JDK 1.4 possᅵde une API permettant de lire/ᅵcrire du XML. Pour en
profiter avec des version prᅵcᅵdente du JDK, rᅵcupᅵrer JAXP ᅵ l'adresse
suivante:
Autres outils et/ou API Java/XML:
http://castor.exolab.org
http://www.jdom.org
http://xml.apache.org/xerces
12. QUESTIONS SUR LES RESSOURCES
12.1 Oᅵ trouver les Java Foundation Classes 1.1.1 (Swing) ?
http://www.javasoft.com/products/jfc/index.html
12.2 Oᅵ se procurer des prᅵ-versions des nouvelles API de Sun ?
http://developer.javasoft.com
ᅵ noter qu'une inscription libre et gratuite est nᅵcessaire pour accᅵder ᅵ
ce site.
12.3 Sites spᅵcialisᅵs dans le portage de la machine ou d'un IDE sur un OS ?
Linux/w98/NT/Solaris : http://java.sun.com ou http://www.javasoft.com
w98/NT/Linux/Solaris : http://www.borland.fr/produits/jbuilder/
OS/2 AIX : http://www.ibm.com/Java
IRIX : http://www.sgi.com/developers/devtools/languages/java.html
HP/UX : http://www.hp.com/esy/go/java.html
MacOS : http://www.apple.com/java/
MacOS : http://www.metrowerks.com/
pour plusieurs type de plate-forme :
http://www.kaffe.org
et encore plus de choix ᅵ :
http://java.sun.com/cgi-bin/java-ports.cgi
12.4 Oᅵ trouver la liste des diffᅵrents caractᅵres UNICODE ?
ftp://ftp.unicode.org/Public/
12.5 Oᅵ trouver un driver JDBC pour Msql ?
http://www.imaginary.com/
12.6 Oᅵ trouver un driver JDBC pour Oracle ?
http://www.oracle.com/products/free_software/index.html
12.7 Oᅵ trouver un driver JDBC pour Interbase ?
http://www.interbase.com
12.8 Oᅵ trouver la liste des drivers JDBC connus ?
http://java.sun.com/products/jdbc/jdbc.drivers.html
12.9 Classes permettant de traiter des collections d'objets ?
http://gee.cs.oswego.edu/dl/classes/collections/index.html
ces packages sont inclus dans le JDK1.2
12.10 Existe-t-il un serveur HTTP ecrit en Java ?
http://jakarta.apache.org/tomcat
http://www.w3c.org/jigsaw
Ces deux serveurs supportent les Servlets.
12.11 Oᅵ trouver d'autre Layout Managers que ceux de AWT ?
http://www.softbear.com/people/larry/javalm.htm
12.12 Existe-t-il des alternatives ᅵ AWT ?
Concernant les gadgets, Swing est bien entendu un remplaᅵant de choix.
Ou egalement la librarie SWT d'Eclipse proposant des composants natifs:
http://www.eclipse.org
12.13 Existe-t-il des sites JAVA en franᅵais ?
http://cuiwww.unige.ch/java
12.14 Existe-t-il des dᅵcompilateurs de byte code ?
par exemple Mocha et son "antidote" Crema.
voir aussi http://www.meurrens.org/ip-Links/java/codeEngineering
12.15 Oᅵ peut-on trouver un client RPC en Java ?
http://www.distinct.com
12.16 Oᅵ trouver des codes lisp pour un mode Java sous Emacs ?
http://eclia5.ec-lille.fr/~bouts/java-emacs.eng.html
autrement un environnement trᅵs complet est le jde :
http://sunsite.auc.dk/jde/
12.17 Existe-t-il une mailing list sur java en francais ?
jj...@u-strasbg.fr
12.18 Existe-t-il une mailing list sur java et corba ?
Java...@luke.org
12.19 Oᅵ trouver des informations concernant les applets signᅵes ?
http://java.sun.com/docs/books/tutorial/security1.1
http://www.suitable.com/Doc_CodeSigning.shtml
12.20 Existe-t-il un equivalent a Lex et Yacc en Java ?
https://javacc.dev.java.net/
http://www.antlr.com/
12.21 Oᅵ trouver Thinking In Java (le pdf) :
http://www.bruceeckel.com/
Une initiative est menᅵe pour une traduction franᅵaise :
http://penserenjava.free.fr
12.22 Existe-t-il des classes permettant de gᅵrer le port sᅵrie et parallᅵle
?
http://java.sun.com/products/javacomm
12.23 Existe-t-il un package permettant de gᅵrer les expressions rᅵguliᅵres
?
Depuis la sortie du JDK 1.4 un package est inclus dans le JDK:
java.util.regex
Ou voir:
http://www.meurrens.org/ip-Links/java/regex
12.24 Existe-t-il d'autre debugger que jdb ?
Oui, par exemple :
http://www.jwatch.com
12.25 Existe-t-il un package pour gᅵrer l'envoi de mail ?
http://java.sun.com/products/javamail/index.html
http://jakarta.apache.org/james
12.26 Oᅵ trouver des informations sur JSP ?
http://www.caucho.com/misc/jsp-faq.html
http://www.j2eeolympus.com/freebooks/freej2eebooks.jsp (liste de livres/
extraits librement tᅵlᅵchargeables)
12.27 Oᅵ trouver des informations sur les servlets ?
Il existe un FAQ en anglais :
http://www.jguru.com
site de Jason Hunter:
http://www.servlets.com
site de marty hall:
http://www.corejsp.com/
12.28 Je m'intᅵresse ᅵ l'obfuscation, oᅵ trouver des informations ?
http://www.cs.arizona.edu/~collberg/Research/Obfuscation/index.html
http://www-106.ibm.com/developerworks/java/library/j-obfus/?loc=tstheme
http://www.meurrens.org/ excellent site du dr meurrens en belgique
II- Les plate-formes Java
1.Introduction
Java s'est au fil des ans imposᅵ par le cᅵtᅵ client (applets), puis a
gagnᅵ les
serveurs (servlets/JSP/EJB) pour envahir les cartes ᅵ puce et autres
environnements extrᅵmes (tᅵlᅵphones portables ou PDA). Pour cela, Sun a
dᅵcidᅵ
de dᅵcliner la plate-forme Java sous divers packaging cohᅵrents et ce de
maniᅵre
ᅵ mieux cibler divers environnements aussi hᅵtᅵrogᅵnes que possible car quel
rapport il ya t'il entre votre joli tᅵlᅵphone portable et le
quadri-processeur
dᅵdiᅵ ᅵ l'hᅵbergement du site Web de votre entreprise ? Java...
2. J2SE
C'est l'ᅵdition standard de la plate-forme Java telle que vous la possᅵdez
probablement sur votre PC (ou mac). La derniᅵre versio ndisponible est
la 1.4.2
et la version 1.5 est dᅵsormais trᅵs proche...
http://java.sun.com/j2se/
3. J2EE
Java 2 Entreprise Edition est un ensemble de spᅵicfications, d'API et
aussi une
plate-forme visant ᅵ fournir des solutions standards ᅵ des problᅵmes
rᅵcurrents
propres ᅵ l'informatique d'entreprise (persistance, envoi de mails,
gestion de
transactions).
La derniᅵre version stable de cette plate-forme est la 1.3.1 et la
future 1.4
est au stade de draft.
http://java.sun.com/j2ee/
4. J2ME
C'est une ᅵdition dᅵdiᅵe aux environnements rᅵduits (carte ᅵ puce, assitants
personnels, tᅵlᅵphones portables ...). Dᅵclinᅵe en plusieurs versions...
Plus d'informations sur le site:
http://java.sun.com/j2me/
--
Document publiᅵ par MaintDoc depuis le 2008-04-07.
Reponsables : Jerome Moliere.
Auteur original: Laurent Pellisier <Laurent.P...@ensm-ales.fr>
========================================================
= Conseils d'utilisation du groupe fr.comp.lang.java =
========================================================
--------------------------------------------------------
Nom : fr.comp.lang.java
Statut : non modᅵrᅵ
Description : Langage de developpement Java
Date de crᅵation : 18/06/96
--------------------------------------------------------
Charte du groupe :
--------------------
fr.comp.lang.java est destinᅵ aux discussions en franᅵais sur
le langage de dᅵveloppement Java.
Java est un langage qui permet de crᅵer des "applets" et des
applications indᅵpendantes du WEB. Selon la terminologie officielle
de Sun, une applet est un programme destinᅵ ᅵ ᅵtre transportᅵ par le
protocole HTTP jusqu'ᅵ un client WWW qui l'exᅵcutera en local. Pour
cela il suffit de mettre une rᅵfᅵrence dans un document HTML
(<APPLET>) vers le fichier contenant le code compilᅵ du programme.
Au contraire d'une applet, une application est un programme compilᅵ
autonome capable de s'exᅵcuter dans n'importe quelle Java Virtual
Machine (interprᅵteur Java). Une JVM peut ᅵtre intᅵgrᅵe ᅵ un
client WWW ou ᅵtre dans l'application Java. Dans ce cas elle est
autonome et peut s'exᅵcuter mᅵme dans un environnement hors rᅵseau.
Ne pas confondre Java avec Javascript qui est une version trᅵs
simplifiᅵe de Java, qui n'est pas compilᅵ mais directement inclus
dans un source HTML. Pour discuter de Javascript, il vaut mieux
utiliser le groupe fr.comp.lang.javascript.
Le langage Java est fortement inspirᅵ du C++ auquel il reprend
beaucoup de ses qualitᅵs mais en ᅵvitant certains points qui
posent le plus de problᅵmes aux programmeurs (pointeurs, ...).
Java est un langage crᅵᅵ par Sun Microsystem.
Ce groupe est ouvert ᅵ toute discussion qui traite de Java. Ceci
inclut :
- discussion sur les problᅵmes de dᅵveloppement rencontrᅵs et les
solutions proposᅵes.
- discussion sur les outils connexes ᅵ Java (compilateur et
environnement de dᅵveloppement, JDK, serveur HTTP et client
HTTP/HTML supportant Java, processeurs Java, compilateur Just In
Time,...), .
- discussion sur les problᅵmes de sᅵcuritᅵs liᅵs ᅵ Java et aux
diffᅵrentes versions des JVM.
- annonce de produits (compilateur, dᅵbuggeur, environnement de
dᅵveloppement, bibliothᅵque de classes, ordinateur Java, ...) en
respectant si possible le caractᅵre non commercial des messages
postᅵs ailleurs que dans fr.biz.*.
--
Document publiᅵ par MaintDoc depuis le 2008-04-07.
Reponsables : Joseph Boudou.