[FAQ] fr.comp.lang.java
jmoliere@nerim.net (Jerome Moliere)
Archive-Name: fr/comp/lang/faq-java
[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
( Christophe.Jolif@wanadoo.fr ). Elle est dorenavant maintenue par:
- Jerome Moliere ( jmoliere@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:
http://xml.apache.org/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 :
http://www.preemptive.com/
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:
http://java.sun.com/xml/
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 ?
jjava@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 ?
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/
Traduit en HTML par faq2html.pl le Wed Nov 3 05:42:13 2010 pour le site Web Usenet-FR.