Page d'accueilFindIt !Contact Cahier Java

Cahier Java

 Forum Java

Ce forum est dédié à l'ouvrage Bien programmer en Java 7, ainsi qu'aux éditions précédentes des Cahiers du Programmeur Java.
Utilisez-le pour toute demande d'information supplémentaire ou pour toute suggestion au sujet de ces ouvrages.
Pour les informations relatives au Cahier du programmeur Swing, merci d'utiliser le forum qui lui est dédié.
Vous pouvez consulter ces forums librement. Pour y participer, inscrivez-vous tout d'abord.

Sujets Messages récents Identification Inscription
Messages du sujet Problème d'accès à une classe depuis un applet (jar)

yizashi

Ville : Neuchâtel
Membre depuis : 6 avr. 2006
Messages : 3
 8 avr. 2006 à 19:10
Bonjour!
J'ai un petit ennui avec un applet. Je souhaitais écrire un applet qui communiquait lors de son initialisation avec un servlet, en gros il devait lancer une requête comme c'est fait dans le livre avec les JSP et ouvrir un flux.

J'ignore si le flux fonctionne pour le moment mais ce que j'ai constaté c'est que mon applet, que j'ai placé dans un fichier JAR, n'arrivait pas à accèder aux classes permettant de parser la réponse du servlet. Cette réponse est faite au format XML et donc j'ai fait un import javax.xml.parsers.*; dans mon fichier qui extraits les données de la réponse.

L'initialisation ne fonctionne pas et voilà ce que m'écrit tomcat:

127.0.0.1 - - [08/Apr/2006:18:35:25 +0200] "GET /devel/inscription? HTTP/1.1" 200 186
127.0.0.1 - - [08/Apr/2006:18:35:25 +0200] "GET /favicon.ico? HTTP/1.1" 200 21630
127.0.0.1 - - [08/Apr/2006:18:35:25 +0200] "GET /devel/applet/Ainscription.jar? HTTP/1.1" 200 17508
127.0.0.1 - - [08/Apr/2006:18:35:25 +0200] "GET /devel/villes? HTTP/1.1" 200 22
127.0.0.1 - - [08/Apr/2006:18:35:27 +0200] "GET /devel/applet/META-INF/services/javax.xml.parsers.DocumentBuilderFactory? HTTP/1.1" 404 1174

La 1ère ligne concerne l'accès à une servlet qui renvoie une page HTML dans laquelle j'ai un applet.
La 2ème ligne il fait une requête pour obtenir une image, je suppose que c'est le logo JAVA car c'est pas moi qui ait programmé cette requête.
La 3ème ligne c'est la demande de mon applet nommé Ainscription.
La 4ème ligne c'est la requête vers mon servlet, c'est là que le flux xml est créée.
Jusque là tout ce passe comme prévu... par contre je ne comprends pas pourquoi il reçoit une nouvelle requête, surtout pas avec ce chemin: /devel/applet/META-INF/services/javax.xml.parsers.DocumentBuilderFactory

Mon fichier jar contient la classe DocumentBuilderFactory ainsi que toutes les classes de parsers... le chemin de cette classe au sein de mon fichier jar c'est javax\xml\parsers. Comment indiquer à mon applet que la classe DocumentBuilderFactory se trouve dans le fichier jar? Est-ce qu'il y a une raison d'aller chercher ce fichier dans META-INF/services? J'ai jamais créé de répertoire services moi...

Merci de votre aide !
---
Yizashi

yizashi

Ville : Neuchâtel
Membre depuis : 6 avr. 2006
Messages : 3
 9 avr. 2006 à 15:56
Bon je ne crois que c'était ça qui empêchait mon applet de s'initialiser mais ça reste quelque chose qui me dérange...
J'ai trouvé ceci sur le site de Sun:
---------------------
newInstance

public static DocumentBuilderFactory newInstance()
throws FactoryConfigurationError

Obtain a new instance of a DocumentBuilderFactory. This static method creates a new factory instance. This method uses the following ordered lookup procedure to determine the DocumentBuilderFactory implementation class to load:

* Use the javax.xml.parsers.DocumentBuilderFactory system property.
* Use the properties file "lib/jaxp.properties" in the JRE directory. This configuration file is in standard java.util.Properties format and contains the fully qualified name of the implementation class with the key being the system property defined above.
* Use the Services API (as detailed in the JAR specification), if available, to determine the classname. The Services API will look for a classname in the file META-INF/services/javax.xml.parsers.DocumentBuilderFactory in jars available to the runtime.
* Platform default DocumentBuilderFactory instance.

Once an application has obtained a reference to a DocumentBuilderFactory it can use the factory to configure and obtain parser instances.

Throws:
FactoryConfigurationError - if the implementation is not available or cannot be instantiated.
-----------------------

Comme on peut le voir, le newInstance cherche à charger l'implémentation de la classe DocumentBuilderFactory à divers endroits dont ce mystérieux META-INF/services.

Finalement il trouve cette classe, mais je ne sais pas encore où. J'ai par contre constaté que c'était un mauvais cast qui faisait bugger mon Applet. Maintenant ça fonctionne sauf si mon flux XML contient des accents.

Je vais fouiller pour trouver la raison...

Au fait il existe une méthode, applicable sur un "Element" qui se nomme getContentText(), c'est censé être mieux que le getFirstChild() puis getData d'après ce qu'ils expliquent au milieu de la page, ici : http://www-128.ibm.com/developerworks/xml/library/x-domjava/

Enfin je dis ça parce que moi je comprenais pas bien le principe du getFirstChild alors je cherchais un moyen qui me paraisse plus clair. Je ne pensais pas que du PCDATA c'était considéré comme un noeud enfant.

Bonne journée et merci pour votre livre qui est très bien, enfin moi il m'aide beaucoup!
---
Yizashi

yizashi

Ville : Neuchâtel
Membre depuis : 6 avr. 2006
Messages : 3
 9 avr. 2006 à 18:15
Bon je me réponds une nouvelle fois, après avoir perdu pas mal de temps j'ai trouvé la solution:
String texte = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><racine><ville>Paris</ville><ville>Neuchâtel</ville></racine>";
OutputStreamWriter sortieXML = new OutputStreamWriter(res.getOutputStream(), "UTF8");
sortieXML.write(texte);
sortieXML.close();

Voilà, c'était le second argument de OutputStreamWriter qui manquait (UTF8), en plus au début j'avais mis un simple OutputStream alors je pouvais pas mettre ce UTF8.
J'ai d'abord essayé de modifier mon flux d'entrée (InputStream) mais puisque c'est des bytes il n'y a pas d'encodage possible. D'ailleurs je sais pas comment ça se fait que lors du passage d'un OutputStreamWriter en UTF8 à un InputStream le paramètre UTF8 soit toujours actif.

Bonne soirée!
---
Yizashi

Manu

Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
 10 avr. 2006 à 22:06
> Voilà, c'était le second argument de OutputStreamWriter qui manquait (UTF8),
> en plus au début j'avais mis un simple OutputStream alors je pouvais pas mettre ce UTF8.

Ah, ces problèmes d'encodage !!! Ne vous inquiétez pas, je suis passé par les mêmes problèmes avant de comprendre. Vous avez fini par trouver la bonne solution : en effet, il faut utiliser un filtre OutputStreamWriter avec un encodage "UTF-8" en second paramètre, sinon vos caractères seront encodés avec l'encodage du système en cours qui n'est pas "UTF-8".
Vous auriez pu aussi utiliser un autre encodage mais dans ce cas il faut changer l'attribut encoding du prologue xml, par exemple en <?xml version="1.0" encoding="ISO-8859-1"?> pour un encodage "ISO-8859-1".


> J'ai d'abord essayé de modifier mon flux d'entrée (InputStream)
> mais puisque c'est des bytes il n'y a pas d'encodage possible.

Et si justement, l'encodage est dans le prologue xml et les parsers XML s'en servent pour décoder correctement les textes d'un flux XML ;-)


> Au fait il existe une méthode, applicable sur un "Element" qui se nomme getContentText()

Si cette méthode existe, elle n'est pas standard car je ne la voie nulle part dans l'interface org.w3c.dom.Element : http://java.sun.com/j2se/1.5.0/docs/api/org/w3c/dom/Element.html !?!
---
Manu (moderator/modérateur)


Page d'accueilFindIt !ContactDébut de la page

© Copyrights 1997-2014 eTeks - Tous droits réservés

Cahier Java