101 votes

Chemin du fichier de la ressource dans notre dossier war/WEB-INF ?

J'ai un fichier dans le dossier war/WEB-INF de mon projet de moteur d'application. J'ai lu dans la FAQ que vous pouvez lire un fichier à partir de là dans un contexte de servlet. Mais je ne sais pas comment former le chemin d'accès à la ressource :

/war/WEB-INF/test/foo.txt

Comment puis-je construire le chemin d'accès à cette ressource pour l'utiliser avec File(), tel qu'il apparaît ci-dessus ?

Merci

144voto

Berin Loritsch Points 3863

Il y a plusieurs façons de le faire. Tant que le fichier WAR est étendu (un ensemble de fichiers au lieu d'un seul fichier .war), vous pouvez utiliser cette API :

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String

Vous obtiendrez ainsi le chemin d'accès complet du système à la ressource que vous recherchez. Cependant, cela ne fonctionnera pas si le conteneur de servlets ne développe jamais le fichier WAR (comme Tomcat). Ce qui fonctionnera, c'est l'utilisation de la fonction getResource méthodes.

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

ou alternativement si vous voulez juste le flux d'entrée :

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String

Cette dernière approche fonctionnera quels que soient le conteneur de servlets utilisé et l'endroit où l'application est installée. La première approche ne fonctionnera que si le fichier WAR est décompressé avant le déploiement.

EDIT : La méthode getContext() est manifestement quelque chose que vous devez implémenter. Les pages JSP la mettent à disposition sous la forme de la méthode context champ. Dans une servlet, vous l'obtenez de votre ServletConfig qui est transmis à la fonction init() méthode. Si vous le stockez à ce moment-là, vous pourrez récupérer votre ServletContext à tout moment par la suite.

0 votes

Juste pour suivre, oui vous pouvez utiliser le chemin comme ça, ça marche.

3 votes

Il faut savoir que j'ai dû mettre un / initial dans le chemin pour que cela fonctionne, comme ceci : context.getResourceAsStream("/WEB-INF/test/foo.txt") ;

0 votes

Extrait de Java Docs : "Le chemin doit commencer par un / et est interprété comme relatif au contexte actuel Root" pour ServletContext.getResource et ServletContext.getResourceAsStream : ". Le chemin doit être spécifié selon les règles données dans getResource. "

5voto

Daniel De León Points 2842

Maintenant, avec Java EE 7, vous pouvez trouver la ressource plus facilement avec

InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");

https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--

3voto

eunelyky Points 49

Je sais que c'est tard, mais c'est comme ça que je fais normalement,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X