que - servlets pdf
Cómo encontrar la carpeta de trabajo de una aplicación basada en servlet para cargar recursos (3)
Preferiría usar la opción getResourceaAsStream para cargar el recurso basado en el directorio principal.
getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
Escribo un servlet de Java que quiero instalar en muchas instancias de Tomcat en diferentes servidores. El servlet usa algunos archivos estáticos que están empaquetados con el archivo war en WEB-INF. Esta es la estructura de directorios en una instalación típica:
- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3
¿Cómo puedo saber la ruta absoluta de MY_STATIC_FOLDER, para que pueda leer los archivos estáticos?
No puedo confiar en la "carpeta actual" (lo que obtengo en un nuevo archivo (".")) Porque depende de dónde se inició el servidor Tomcat, que es diferente en cada instalación.
Puede usar ServletContext#getRealPath()
para convertir una ruta de contenido web relativa en una ruta de sistema de archivos de disco absoluta.
String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...
Sin embargo, si su única intención es obtener un InputStream
, mejor use ServletContext#getResourceAsStream()
lugar como getRealPath()
puede devolver null
siempre que WAR no se expanda en el sistema de archivos del disco local (Tomcat lo hace de manera predeterminada, pero es configurable para no hacerlo!):
String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
Después de todo, esto es mucho más sólido que el enfoque java.io.File
.
Ver también:
Puedes intentar esto
String relativeWebPath = "WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);