[Java J2EE Servlet] récupérer des fichiers inclus dans un war

récupérer des fichiers inclus dans un war [Java J2EE Servlet] - Java - Programmation

Marsh Posté le 10-02-2006 à 10:01:03    

bonjour,
Voici mon probleme
 
j'ai crée une archive war pour des tests (Cactus)  
le problème est que dans mes classes java je fais appel à des fichiers de tests(xml) qui sont contenus dans un répertoire qui s'appelle testfiles.
 
par exemple dans mon  code Java
j'ai ceci
 

Code :
  1. package tests.catcus;
  2. //import  
  3. public class MyCactusTest extends ServletTestCase{
  4. public static final String DIRECTORY_TEST="./testfiles/";
  5. public void testToto() throws IOException{
  6. String ficheTest=getFileToTest("monfichierTest.xml" );
  7. //envoie la requet HTTP avec le contenu du fichier que je vient de lire
  8. }
  9. private String getFileTotest(String file) throws
  10.          IOException {
  11.          InputStream stream = new FileInputStream(DIRECTORY + File.separator +
  12.                                                   file);
  13.          if (logger.isDebugEnabled()) {
  14.            logger.debug("getting Input Stream for file : " + file);
  15.            logger.debug("InputStream is null ? : " + (stream == null));
  16.          }
  17. return getContenuFichier(stream);
  18.    //getContenuFichier(String) permet de récupérer le contenu d'un fichier XML
  19.        }
  20. }


Mon probleme est que mes tests foirent à cause d'une erreur claire et précise du type
(file machin.xml not found), mais que je n'arrive aps à resoudre
En voici une trace
 

Code :
  1. ./testfiles/monFichierTest.xml (No such file or directory)
  2. java.io.FileNotFoundException: ./testfiles/monFichierTest.xml  (No such file or directory)
  3. at java.io.FileInputStream.open(Native Method)
  4. at java.io.FileInputStream.<init>(FileInputStream.java:106)
  5. at java.io.FileInputStream.<init>(FileInputStream.java:66)
  6. at tests.cactus.GetProfileTestCase.getInputStream(Unknown Source)
  7. at tests.cactus.GetProfileTestCase.beginGetProfile01(Unknown Source)
  8. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  9. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  10. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  11. at org.apache.cactus.internal.client.ClientTestCaseCaller.callGenericBeginMethod(ClientTestCaseCaller.java:358)
  12. at org.apache.cactus.internal.client.ClientTestCaseCaller.callBeginMethod_aroundBody0(ClientTestCaseCaller.java:192)
  13. at org.apache.cactus.internal.client.ClientTestCaseCaller.callBeginMethod_aroundBody1$advice(ClientTestCaseCaller.java:124)
  14. at org.apache.cactus.internal.client.ClientTestCaseCaller.callBeginMethod(ClientTestCaseCaller.java)
  15. at org.apache.cactus.internal.client.ClientTestCaseCaller.runTest(ClientTestCaseCaller.java:141)
  16. at org.apache.cactus.internal.AbstractCactusTestCase.runBareClient(AbstractCactusTestCase.java:215)
  17. at org.apache.cactus.internal.AbstractCactusTestCase.runBare(AbstractCactusTestCase.java:133)
  18. at org.apache.cactus.server.runner.ServletTestRunner.run(ServletTestRunner.java:315)
  19. at org.apache.cactus.server.runner.ServletTestRunner.doGet_aroundBody0(ServletTestRunner.java:193)
  20. at org.apache.cactus.server.runner.ServletTestRunner.doGet_aroundBody1$advice(ServletTestRunner.java:124)
  21. at org.apache.cactus.server.runner.ServletTestRunner.doGet(ServletTestRunner.java)
  22. at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
  23. at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
  24. at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:996)
  25. at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
  26. at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
  27. at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6452)
  28. at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  29. at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
  30. at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3661)
  31. at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2630)
  32. at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
  33. at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)


Ma question est de savoir à quel endroit dois-je placer les fichiers de tests au niveau du war afin de pouvoir y acceder en relatif comme c'est indiqué dans le code java.
est -ce dans le WEB-INF??? ou il faut que je foute mes fichiers de tests dans le meme repertoire que mes fichiers.class.
 
 
Sinon je seche depuis hier soir la dessus, si quelqu'un a une idée merci d'avance.


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 10-02-2006 à 10:01:03   

Reply

Marsh Posté le 10-02-2006 à 10:26:19    

le plus simple est de les mettre dans ton classpath et d'y acceder via un getResource(String)

Reply

Marsh Posté le 10-02-2006 à 11:17:40    

souk a écrit :

le plus simple est de les mettre dans ton classpath et d'y acceder via un getResource(String)


 
Merci pour ta réponse souk
 
Mais quand tu exécutes une Servlet via le browser tu ne spécifies pas de classpath. Je me trompe peut-etre.
 
Ou tu parlait du classpath du fichier META-INF contenu dans le war.
 
Ou bien il suffit juste que je copie mes fichiers de tests dans le meme repertoire que que celui du war.
j'avoue que je ne comprends pas tres bien.
 
Peux-tu etre plus explicite s'il te plait...
 
Merci d'avance


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 10-02-2006 à 11:37:11    

visiblement tu ne vois pas clairement ce qu'est le classpath, je te conseille de lire le topic de Benou (il y a un lien disponible dans le topic debutant java). Une fois que tu verras bien ce qu'est le classpath, tu pourras comprendre ma reponse. Pour acceder à une resource qui se trouve dans le classpath, tu peux aller lire ca
 
[:romf]

Reply

Marsh Posté le 10-02-2006 à 14:52:50    

souk a écrit :

visiblement tu ne vois pas clairement ce qu'est le classpath, je te conseille de lire le topic de Benou (il y a un lien disponible dans le topic debutant java). Une fois que tu verras bien ce qu'est le classpath, tu pourras comprendre ma reponse. Pour acceder à une resource qui se trouve dans le classpath, tu peux aller lire ca
 
[:romf]


 
 
Merci Souk,
mais ce n'est pas tant ma méconnaissance du CLASSPATH qui pose problème mais ma méconnaissance du fonctionnement des resources inlcuses dans un war qui me posent problème.
J'ai déjà manipulé des resources incluses dans des jars et effectivement j'avais utilisé le ClassLoader pour acceder à mes images en relatif sans avoir eu recours de façon explicite au CLASSPATH.
 
Merci des que ça marche je posterai la piste à suivre pour à qui ça interesse
 
A+


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 10-02-2006 à 15:25:23    

ya right :\


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-02-2006 à 01:55:52    

le war c'est la version packagé d'une application web.
Ce n'est pas à toi d'y accéder directement ... Toi, si tu codes une servlet qui fait parti de ce war, tu dois utiliser les ressources qui te sont mises à disposition par le moteur de servlet => soit des données récupérées dans le JNDI, soit des données contenues dans l'application web et accessible en lecture seule via les méthodes getRessource et getRessourceAsStream de l'objet ServletContext.
 
Après tu peux toujours accéder au système de fichier correspondant au répertoire de l'application en utilisant la méthode getRealPath(), mais ce n'est pas la méthode préconisée, sauf cas spécial.

Message cité 1 fois
Message édité par benou le 12-02-2006 à 01:58:25
Reply

Marsh Posté le 08-03-2006 à 15:01:01    

benou a écrit :

le war c'est la version packagé d'une application web.
Ce n'est pas à toi d'y accéder directement ... Toi, si tu codes une servlet qui fait parti de ce war, tu dois utiliser les ressources qui te sont mises à disposition par le moteur de servlet => soit des données récupérées dans le JNDI, soit des données contenues dans l'application web et accessible en lecture seule via les méthodes getRessource et getRessourceAsStream de l'objet ServletContext.
 
Après tu peux toujours accéder au système de fichier correspondant au répertoire de l'application en utilisant la méthode getRealPath(), mais ce n'est pas la méthode préconisée, sauf cas spécial.


 
 
Merci benou pour cette piste.
Maintenant que je l'ai empruntée je suis confronté à un nouveau problème: comment initialiser les objets
config,session car elle sont à  null.  
Et je n'arrive donc pas à invoquer la méthode getServletContext sur ces objets la.
 
Voici la structure de mon war
 
/testfiles/updateprofille
/testfiles/pushcontent
/testfiles/....  
/WEB-INF/classes
WEB-INF/lib
 
le répertoire testfiles contient des fichier de tests
 
Voici le code que j'essaie d'exécuter ça sera plus clair:
 

Code :
  1. public InputStream getInpuStream(String fileName) throws Exception{
  2. if(session==null) throw new Exception("The httpsession is null" );
  3. ServletContext context=session.getServletContext();
  4. if(context==null)  throw new Exception("The servlet context is null" );
  5. InputStream stream=context.getResourceAsStream(PATH+"/"+fileName);
  6. //PATH=testfiles/updateprofile
  7. //le fichier que je veux lire est situé dans le war comme suit: /testfiles/updateprofile/myTestFile.xml
  8. if(stream==null) throw new ResourceAccessException("The specified resource is not available" );
  9. return stream.
  10. }
  11. Voici l'exception que j'obtiens
  12. ...
  13. java.io.FileNotFoundException: The httpsession is null
  14. ...


 
Merci d'avance


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 08-03-2006 à 17:05:41    

axk47 a écrit :

Merci benou pour cette piste.
Maintenant que je l'ai empruntée je suis confronté à un nouveau problème: comment initialiser les objets
config,session car elle sont à  null.  
Et je n'arrive donc pas à invoquer la méthode getServletContext sur ces objets la.
 
Voici la structure de mon war
 
/testfiles/updateprofille
/testfiles/pushcontent
/testfiles/....  
/WEB-INF/classes
WEB-INF/lib
 
le répertoire testfiles contient des fichier de tests
 
Voici le code que j'essaie d'exécuter ça sera plus clair:
 

Code :
  1. public InputStream getInpuStream(String fileName) throws Exception{
  2. if(session==null) throw new Exception("The httpsession is null" );
  3. ServletContext context=session.getServletContext();
  4. if(context==null)  throw new Exception("The servlet context is null" );
  5. InputStream stream=context.getResourceAsStream(PATH+"/"+fileName);
  6. //PATH=testfiles/updateprofile
  7. //le fichier que je veux lire est situé dans le war comme suit: /testfiles/updateprofile/myTestFile.xml
  8. if(stream==null) throw new ResourceAccessException("The specified resource is not available" );
  9. return stream.
  10. }
  11. Voici l'exception que j'obtiens
  12. ...
  13. java.io.FileNotFoundException: The httpsession is null
  14. ...


 
Merci d'avance


 
 
 
Personne n'a une idée????
 
Merci d'avance


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed