web-dev-qa-db-fra.com

Comment trouver le dossier de travail d'une application basée sur servlet afin de charger des ressources

J'écris un Java servlet que je veux installer sur de nombreuses instances de Tomcat sur différents serveurs. Le servlet utilise des fichiers statiques qui sont emballés avec le fichier war sous WEB-INF. Il s'agit du répertoire structure dans une installation typique:

- Tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3

Comment puis-je connaître le chemin absolu de MY_STATIC_FOLDER, afin de pouvoir lire les fichiers statiques?

Je ne peux pas compter sur le "dossier actuel" (ce que j'obtiens dans un nouveau fichier (".")) Car cela dépend de l'endroit où le serveur Tomcat a été démarré, ce qui est différent dans chaque installation!

28
Erel Segal-Halevi

Vous pouvez utiliser ServletContext#getRealPath() pour convertir un chemin de contenu Web relatif en chemin de système de fichiers disque absolu.

String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...

Cependant, si votre seule intention est d'en retirer un InputStream, mieux vaut utiliser ServletContext#getResourceAsStream() à la place car getRealPath() peut retourner null chaque fois que WAR n'est pas développé sur le système de fichiers de disque local (Tomcat le fait par défaut, mais est configurable pour ne pas le faire!):

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...

C'est après tout beaucoup plus robuste que l'approche Java.io.File.

Voir également:

40
BalusC