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
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");
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");
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.
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--
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");