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 sur le site
javasoft ( http://java.sun.com/products/jdk/1.1 )
-> le guide de l'API :
docs/api/packages.html
-> le guide général
: docs/index.html
Qui répondrons a la majorité de vos questions.
HISTORIQUE DES DERNIERES VERSIONS
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.2 25/02/2000
Mise à jour.
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 suite a une proposition postée dans le groupe de
nouvelles fr.comp.lang.java
à l'initiative de Christophe Jolif
( Christophe.Jolif@wanadoo.fr
). Elle est maintenue par :
- Christophe Jolif ( Christophe.Jolif@wanadoo.fr )
à 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 théoriquement
disponible directement sur le site Web
http://perso.wanadoo.fr/transit/java.html
Les créateurs/mainteneurs
de cette FAQ, n'ont en fait pas grand mérite si ce
n'est celui de suivre
régulièrement le groupe et d'en faire une synthèse.
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.
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.2.2 ( Solaris
et Windows ), cependant,
les portages sur certaines autres machines ainsi
que pour certains navigateurs
Web en sont encore aux versions précédentes.
La version Java correspondant
aux JDK 1.2.x est officiellement nommée la
plate-forme Java 2 et
le JDK correspondant est nommé le SDK v1.2.x pour la
plate-forme Java 2.
A titre d'information,
la version 1.2 du JDK pour Linux est disponible en
pré-version. Les
versions 4.x de Internet Explorer ( Microsoft ), de
Communicator ( Netscape
) et la dernière version de HotJava ( Sun )
intègrent une version
1.1.x. Pour utiliser Java 2 avec un navigateur, il
faut faire appel à
un plugin ( par exemple Java Plug In ) qui permet de
lancer une autre machine
virtuelle ( par exemple celle de Sun ) dans le
navigateur [cf 7.7]
Toujours à titre
d'information le JDK1.3 ( ou SDK v1.3 pour Java 2 ) de Sun
est actuellement disponible
en pré-version [cf 12.1].
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.
Hot Spot 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. Ceci est surtout vrai
pour les serveur. En effet
le temps perdu par Hot Spot pour optimiser le
code lors de son premier
passage, va entraîner la nécessité de passer de
nombreuses fois sur ce
code pour que le temps perdu la première fois soit
compensé par les
optimisations et ceci est particulièrement vrai pour les
serveurs. Sun annonce
une version d'Hot Spot pour les clients qui sera livré
avec le JDK1.3.
2.1 Peut-on surcharger les opérateurs comme en C++ ?
Non et cela fait partie des choix/spécifications de Java.
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.
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)
...
}
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 consisterais a "encapsuler"
String dans une classe
de notre conception.
En JDK 1.1.x, 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écutable. Il faut donc lancer comme exécutable
l'interpréteur
de commande (cmd.com sous NT; command.com sous Windows ou le
shell sous Unix ) puis
comme argument la commande.
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.
Ceci n'est possible qu'a partir du JDK 1.1.x.
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
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.
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 un 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 ...).
2.12 Existe-t-il des templates en Java ?
Non par pour l'instant,
cependant Sun étudie dans le cadre d'un processus
commun ( 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/
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.
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).
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.
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 Les événements
de types MOUSE_ENTER ou _EXIT ne sont pas transmis a mes
éléments
de la classe Button, que faire (JDK 1.0.x) ?
La réponse est valable
pour d'autres Component ( ceux qui ne sont pas des
Containers ) et pour d'autre
événements ( ceux qui ne sont pas des ACTION ).
La classe Button, en effet
ne retransmet pas les événements MOUSE_ENTER et
_EXIT. On ne peut donc
pas déterminer facilement quand le pointeur passe sur
un tel composant.
La solution, consiste a
se créer soit même une classe Button (MyButton par
exemple) qui descend d'une
classe Container (Panel par exemple) ainsi, ces
événements
seront bien transmis à notre fonction handleEvent() de notre
classe MyButton.
Attention, ce problème
n'existe pas en 1.1.x où de toute façon la gestion
des événements
est totalement différente.
4.3 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.4 Comment changer la forme du curseur de la souris ?
Dans la classe java.awt.Frame
des variables de classe (variable statique)
definissent des curseurs,
en choisir un et faire :
setCursor(java.awt.Frame.celui_desire)
( par exemple : DEFAULT_CURSOR, WAIT_CURSOR ... )
En JDK 1.1.x cela change, 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.5 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 redifinie
processActionEvent
protected processActionEvent(ActionEvent
e)
...
// pour permettre
la transmission de l'evenement
super.processActionEvent(e);
}
}
4.6 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.7 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.8 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.9 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.10 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.getToolkit();
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.11 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.12 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.13 Comment récupérer la taille de l'écran ?
Tout simplement :
Toolkit.getDefaultTookit().getScreenSize()
4.14 Comment enregistrer une image ?
Java ne permet pas d'enregistrer
un image au format GIF 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
4.15 Qu'est ce que Java 2D ?
Java 2D est un 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.16 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.17 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 retransfromer 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 (JDK1.1.x) ?
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);
// premiere 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.1.1/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 faisiez appel à
ses méthodes uniquement
dans le thread de gestion de é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.6].
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'śil 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é
cliente 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
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
?
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.
10. LES AUTRES PACKAGES OU OUTILS
10.1 Apache supporte-t-il les servlets ?
Non, par contre il existe
un extension à Apache nommée JServ qui gère les
Servlets :
http://java.apache.org/jserv/index.html
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 :
http://www.preemptive.com/
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é.
En JDK 1.0.x le seul moyen 'un peu lourd' était
de faire un system("java
ma_classe"); qui devrait fonctionner.
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 !
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ère 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.
Pour l'instant Java ne
possède pas d'API permettant de lire/écrire du XML.
Cependant Sun et IBM propose
en pré-version de telles API. Voir les URLs
suivantes :
IBM propose également
un afficheur de SVG (SVG décrit du graphique en XML).
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 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 : http://www.blackdown.org/java-linux.html
w95/Solaris : http://java.sun.com
ou http://www.javasoft.com
w95/NT : http://cafe.symantec.com
( bientôt chez BEA )
w95/NT : http://www.microsoft.com/java
w95/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/macos/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://www.w3c.org/jigsaw
Mais aussi de chez
JavaSoft Java Web Server 1.1
http://www.javasoft.com
C'est deux serveur 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.
12.13 Existe-t-il des sites
JAVA en français ?
http://www.eerie.fr/~javateam
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 ?
java@u-strasbg.fr
12.18 Existe-t-il une mailing
list sur java et corba ?
JavaCORBA@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 ?
http://www.suntest.com/JavaCC
http://www.antlr.com/
12.21 Où trouver
Thinking In Java (le pdf) :
http://www.bruceeckel.com/
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
?
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
12.26 Où trouver
des informations sur JSP ?
http://www.caucho.com/misc/jsp-faq.html
12.27 Où trouver
des informations sur les servlets ?
Il existe un FAQ
en anglais :
http://www.purpletech.com/java/servlet-faq/
12.28 Je m'intéresse
à l'obfuscation, où trouver des informations ?
http://www.cs.arizona.edu/~collberg/Research/Obfuscation/index.html
From - Sat Mar 10 00:14:21
2001
Path: nnrp3.proxad.net!feeder2.proxad.net!proxad.net!fr.usenet-edu.net!usenet-edu.net!freenix!fr-chartes!maintfaq
From: christophe.jolif@wanadoo.fr
(Christophe Jolif)
Newsgroups: fr.comp.lang.java,fr.usenet.reponses
Subject: [FAQ] fr.comp.lang.java
Supersedes: <fr.comp.lang.faq-java-981002596.395898@ns2.freenix.org>
Followup-To: poster
Date: Fri, 16 Feb 2001
04:43:17 GMT
Approved: fr-reponses@frmug.org
Expires: Mon, 5 Mar 2001
04:43:17 GMT
Message-ID: <fr.comp.lang.faq-java-982298597.560398@ns2.freenix.org>
Mime-Version: 1.0
Content-Type: text/plain;
charset=iso-8859-15
Content-Transfer-Encoding:
8bit
X-No-Productlink: yes
Lines: 1506
Xref: feeder2.proxad.net
fr.comp.lang.java:36810 fr.usenet.reponses:9489
Archive-Name: fr/comp/lang/faq-java
FTP-Archive-Name: ftp://ftp.univ-lyon1.fr/pub/faq/by-name/fr/faq-java