web-dev-qa-db-fra.com

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

J'ai un fichier dans mon 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. Je ne sais pas comment former le chemin d'accès à la ressource:

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

Comment pourrais-je construire mon chemin vers cette ressource à utiliser avec File (), exactement comme ci-dessus?

Merci

90
user291701

Il y a plusieurs façons de faire cela. Tant que le fichier WAR est développé (un ensemble de fichiers au lieu d'un 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)

Cela vous donnera le chemin d'accès complet du système à la ressource que vous recherchez. Toutefois, cela ne fonctionnera pas si le conteneur de servlet ne développe jamais le fichier WAR (comme Tomcat). Ce qui fonctionnera utilisera les méthodes getResource de ServletContext.

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

ou bien 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 quel que soit le conteneur de servlet que vous utilisez et l'emplacement d'installation de l'application. L'ancienne approche ne fonctionnera que si le fichier WAR est décompressé avant le déploiement.

EDIT: La méthode getContext () est évidemment quelque chose que vous devez implémenter. Les pages JSP le rendent disponible dans le champ context. Dans un servlet, vous l'obtenez de votre ServletConfig qui est passé dans la méthode init() du servlet. Si vous le stockez à ce moment-là, vous pouvez obtenir votre ServletContext à tout moment par la suite.

134
Berin Loritsch

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

3
Daniel De León

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

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