2010-12-02 42 views
81

J'ai un fichier dans mon dossier war/WEB-INF de mon projet de moteur d'application. J'ai lu dans les FAQ que vous pouvez lire un fichier à partir de là dans un contexte de servlet. Je ne sais pas comment former le chemin de la ressource que:Chemin du fichier vers la ressource dans notre dossier war/WEB-INF?

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

Comment puis-je construire mon chemin à cette ressource à utiliser avec fichier(), comme il semble au-dessus?

Merci

Répondre

125

Il existe plusieurs façons de procéder. Tant que le fichier WAR est étendu (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)

que vous obtiendrez le chemin complet du système à la ressource Tu recherches. Cependant, cela ne fonctionnera pas si le conteneur de servlet n'expanse 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 ne fonctionnera peu importe ce que vous utilisez Servlet Container 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 auriez à implémenter. Les pages JSP le rendent disponible sous le champ context. Dans une servlet, vous l'obtenez à partir de votre ServletConfig qui est transmis à la méthode init() du servlet. Si vous le stockez à ce moment-là, vous pouvez obtenir votre ServletContext à tout moment après cela.

+3

Il est intéressant de souligner que je devais mettre un premier/dans le chemin pour que cela fonctionne, comme ceci: context.getResourceAsStream ("/ WEB-INF/test/foo.txt"); –

+0

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

+0

Depuis Java Docs: "Le chemin doit commencer par un/et est interprété comme relatif à la racine de contexte actuelle" pour ServletContext.getResource et ServletContext.getResourceAsStream: "Le chemin doit être spécifié selon les règles données dans getResource." –