¿Ruta del archivo al recurso en nuestra carpeta war / WEB-INF?

95

Tengo un archivo en mi carpeta war / WEB-INF de mi proyecto de motor de aplicaciones. Leí en las preguntas frecuentes que puede leer un archivo desde allí en un contexto de servlet. Sin embargo, no sé cómo formar la ruta al recurso:

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

¿Cómo construiría mi ruta a ese recurso para usar con File (), tal como se ve arriba?

Gracias

user291701
fuente

Respuestas:

138

Hay un par de formas de hacer esto. Siempre que el archivo WAR esté expandido (un conjunto de archivos en lugar de un archivo .war), puede usar esta 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)

Eso le dará la ruta completa del sistema al recurso que está buscando. Sin embargo, eso no funcionará si el Servlet Container nunca expande el archivo WAR (como Tomcat). Lo que funcionará es usar los getResourcemétodos de ServletContext .

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

o alternativamente si solo desea el flujo de entrada:

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)

El último enfoque funcionará independientemente del contenedor de servlet que utilice y dónde esté instalada la aplicación. El primer enfoque solo funcionará si el archivo WAR se descomprime antes de la implementación.

EDITAR: El método getContext () es obviamente algo que tendrías que implementar. Las páginas JSP lo hacen disponible como contextcampo. En un servlet lo obtienes de tu, ServletConfigque se pasa al init()método del servlet . Si lo almacena en ese momento, puede obtener su ServletContext en cualquier momento que desee después de eso.

Berin Loritsch
fuente
3
Vale la pena señalar que necesitaba poner una inicial / en la ruta para que esto funcione, así: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear
1
No funciona tan simple en appengine, como está etiquetada la pregunta.
Renascienza
2
Se marcó como la respuesta correcta hace 6 años. Google cambió la API del motor de la aplicación o hay un error en su implementación. Si está ejecutando un Servlet estándar, debería poder utilizar la context.getResourceAsStream()variación.
Berin Loritsch
2
esto parece bueno, pero estoy usando java 1.8 y getContext () no existe de forma predeterminada, ¿qué archivo jar se necesita para usarlo?
f1wade
3
ServletContext es parte del javax.servletpaquete de sus bibliotecas J2EE. Obtiene una referencia a él de la clase de servlet (es decir, lo que se extiende java.servlet.GenericServlet). Por cierto, GenericServlet ahora tiene un método para getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch
1

Sé que es tarde, pero así es como lo hago normalmente,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
zumbido
fuente