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)
|