Come trovare la cartella di lavoro di un’applicazione basata su servlet per caricare le risorse

Scrivo un servlet Java che voglio installare su molte istanze di Tomcat su server diversi. Il servlet usa alcuni file statici che sono imballati con il file war sotto WEB-INF. Questa è la struttura di directory in un’installazione tipica:

- tomcat -- webapps --- myapp ---- index.html ---- WEB-INF ----- web.xml ----- classs ------ src ------- ..... ----- MY_STATIC_FOLDER ------ file1 ------ file2 ------ file3 

Come posso conoscere il percorso assoluto di MY_STATIC_FOLDER, in modo da poter leggere i file statici?

Non posso fare affidamento sulla “cartella corrente” (ciò che ottengo in un nuovo file (“.”)) Perché dipende da dove è stato avviato il server Tomcat, che è diverso in ogni installazione!

È ansible utilizzare ServletContext#getRealPath() per convertire un percorso relativo del contenuto Web in un percorso assoluto del file system del disco.

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

Tuttavia, se il tuo unico scopo è quello di ottenere un InputStream da esso, meglio usare ServletContext#getResourceAsStream() invece come getRealPath() può restituire null ogni volta che WAR non è espanso sul file system del disco locale (Tomcat lo fa di default, ma è configurabile non farlo!):

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

Dopo tutto è molto più robusto rispetto all’approccio java.io.File .

Guarda anche:

  • getResourceAsStream () vs FileInputStream
  • Cosa significa servletcontext.getRealPath (“/”) e quando dovrei usarlo
  • Dove posizionare e come leggere i file di risorse di configurazione nell’applicazione basata su servlet?
  • Modo consigliato per salvare i file caricati in un’applicazione servlet

Preferirei utilizzare l’opzione getResourceaAsStream per caricare la risorsa in base alla directory padre.

 getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1"); 

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