java - ¿Qué significa servletcontext.getRealPath("/") y cuándo debería usarlo?
servlets (3)
Introducción
El ServletContext#getRealPath()
tiene la intención de convertir una ruta de contenido web (la ruta en la estructura expandida de la carpeta WAR en el sistema de archivos del disco del servidor) a una ruta de sistema de archivos de disco absoluta.
El "/"
representa la raíz del contenido web. Es decir, representa la carpeta web
como en la estructura de proyecto siguiente:
YourWebProject
|-- src
| :
|
|-- web
| |-- META-INF
| | `-- MANIFEST.MF
| |-- WEB-INF
| | `-- web.xml
| |-- index.jsp
| `-- login.jsp
:
Por lo tanto, pasar el "/"
a getRealPath()
le devolverá la ruta absoluta del sistema de archivos del disco de la carpeta /web
del archivo WAR ampliado del proyecto. Algo así como /path/to/server/work/folder/some.war/
que debería poder seguir utilizando en File
o FileInputStream
.
Tenga en cuenta que la mayoría de los principiantes no parecen ver / darse cuenta de que en realidad puede pasar toda la ruta de contenido web y que a menudo utilizan
String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp";
en lugar de
String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp");
Nunca escribir archivos allí
También tenga en cuenta que, aunque puede escribir nuevos archivos en él utilizando FileOutputStream
, todos los cambios (por ejemplo, archivos nuevos o archivos editados) se perderán cada vez que se reubique la GUERRA; con la simple razón de que todos esos cambios no están contenidos en el archivo WAR original. Entonces, todos los principiantes que intentan guardar archivos cargados allí lo están haciendo mal.
Además, getRealPath()
siempre devolverá null
o una ruta de acceso completamente inesperada cuando el servidor no está configurado para expandir el archivo WAR en el sistema de archivos del disco, sino en la memoria, por ejemplo, como un sistema de archivos virtual.
getRealPath()
es portable; es mejor que nunca lo uses
Use getRealPath()
cuidado. En realidad, no existen casos prácticos sensatos de uso del mundo real. Si todo lo que realmente necesita es obtener un InputStream
del recurso web, mejor use ServletContext#getResourceAsStream()
lugar, esto funcionará independientemente de la forma en que se expande el WAR. Entonces, si, por ejemplo, quiere un InputStream
de index.jsp
, entonces no lo haga:
InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!
Pero en cambio, hazlo:
InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!
O si tiene la intención de obtener una lista de todas las rutas de recursos web disponibles, use ServletContext#getResourcePaths()
lugar.
Set<String> resourcePaths = servletContext.getResourcePaths("/");
Puede obtener un recurso individual como URL
través de ServletContext#getResource()
. Esto devolverá null
cuando el recurso no exista.
URL resource = servletContext.getResource(path);
O si tiene la intención de guardar un archivo cargado, o crear un archivo temporal, vea los enlaces "Ver también" a continuación.
Ver también:
En el siguiente fragmento:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
¿Qué representa /
en el método getRealPath()
? ¿Cuándo debería usarlo?
La ruta de contexto de una aplicación web es el directorio que contiene el directorio WEB-INF de la aplicación web. Se puede considerar como el "hogar" de la aplicación web. A menudo, al escribir aplicaciones web, puede ser importante obtener la ubicación real de este directorio en el sistema de archivos, ya que esto le permite hacer cosas como leer archivos o escribir en archivos.
Esta ubicación se puede obtener a través del método getRealPath () del objeto ServletContext. Este método se puede pasar a un parámetro String establecido en File.separator para obtener la ruta usando el separador de archivos del sistema operativo ("/" para UNIX, "/" para Windows).
También hay un cambio entre Java 7 y Java 8. Es cierto que se trata de una llamada obsoleta, pero tengo una. Tuvimos que agregar un "/" para que nuestro programa funcione. Aquí está el enlace discutiendo ¿Por qué servletContext.getRealPath devuelve null en tomcat 8?