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

95

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 vers la ressource:

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

Comment puis-je construire mon chemin vers cette ressource à utiliser avec File (), comme il apparaît ci-dessus?

Merci

user291701
la source

Réponses:

138

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 complet du système vers la ressource que vous recherchez. Cependant, cela ne fonctionnera pas si le conteneur de servlet n'étend jamais le fichier WAR (comme Tomcat). Ce qui fonctionnera, c'est d'utiliser les getResourceméthodes 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 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 évidemment quelque chose que vous devriez implémenter. Les pages JSP le rendent disponible en tant que contextchamp. Dans un servlet, vous l'obtenez de votre ServletConfigqui est passé dans la init()méthode de la servlet . Si vous le stockez à ce moment-là, vous pouvez obtenir votre ServletContext à tout moment après cela.

Berin Loritsch
la source
3
Cela vaut la peine de souligner que j'avais besoin de mettre un / dans le chemin pour que cela fonctionne, comme ceci: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear le
1
Ne fonctionne pas aussi simplement sur appengine, car la question est balisée.
Renascienza
2
Elle a été marquée comme la bonne réponse il y a 6 ans. Soit Google a modifié l'API du moteur d'application, soit il y a un bogue dans votre déploiement. Si vous exécutez un servlet standard, vous devriez pouvoir utiliser la context.getResourceAsStream()variante.
Berin Loritsch
2
cela semble bon, mais j'utilise java 1.8 et getContext () n'existe pas par défaut, quel fichier jar est nécessaire pour l'utiliser?
f1wade le
3
ServletContext fait partie du javax.servletpackage de vos bibliothèques J2EE. Vous en obtenez une référence à partir de la classe de servlet (c'est-à-dire ce qui s'étend java.servlet.GenericServlet). BTW, GenericServlet a maintenant une méthode pour getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch
1

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");
sifflement
la source