Percorso del file alla risorsa nella nostra cartella war / WEB-INF?


95

Ho un file nella mia cartella war / WEB-INF del progetto del mio motore di app. Ho letto nelle FAQ che puoi leggere un file da lì in un contesto servlet. Non so come formare il percorso per la risorsa però:

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

Come dovrei costruire il mio percorso a quella risorsa da utilizzare con File (), proprio come appare sopra?

Grazie

Risposte:


138

Ci sono un paio di modi per farlo. Finché il file WAR è espanso (un insieme di file invece di un file .war), puoi utilizzare questa 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)

Questo ti fornirà il percorso completo del sistema per la risorsa che stai cercando. Tuttavia, ciò non funzionerà se il Servlet Container non espande mai il file WAR (come Tomcat). Ciò che funzionerà è utilizzare i getResourcemetodi di ServletContext .

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

o in alternativa se vuoi solo il flusso di input:

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)

Quest'ultimo approccio funzionerà indipendentemente dal contenitore servlet utilizzato e da dove è installata l'applicazione. Il primo approccio funzionerà solo se il file WAR viene decompresso prima della distribuzione.

EDIT: Il metodo getContext () è ovviamente qualcosa che dovresti implementare. Le pagine JSP lo rendono disponibile come contextcampo. In un servlet lo ottieni dal tuo ServletConfigche viene passato nel init()metodo del servlet . Se lo memorizzi in quel momento, puoi ottenere il tuo ServletContext ogni volta che vuoi dopo.


3
Vale la pena sottolineare che avevo bisogno di mettere un iniziale / nel percorso per farlo funzionare, come questo: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear

1
Non funziona così semplice su appengine, poiché la domanda è contrassegnata.
Renascienza

2
È stata contrassegnata come risposta corretta 6 anni fa. O Google ha cambiato l'API del motore dell'app o c'è un bug nella tua distribuzione. Se stai utilizzando un servlet standard, dovresti essere in grado di utilizzare la context.getResourceAsStream()variazione.
Berin Loritsch

2
questo sembra buono, ma sto usando java 1.8 e getContext () non esiste di default, quale file jar è necessario per usarlo?
f1wade

3
ServletContext fa parte del javax.servletpacchetto delle tue librerie J2EE. Si ottiene un riferimento ad esso dalla classe servlet (cioè cosa si estende java.servlet.GenericServlet). A proposito, GenericServlet ora ha un metodo per getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch


1

So che è tardi, ma è così che normalmente lo faccio,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.