¿Qué significa servletcontext.getRealPath (“/”) y cuándo debería usarlo?

En el siguiente fragmento:

ServletContext context = request.getServletContext(); String path = context.getRealPath("/"); 

¿Qué representa / en el método getRealPath() ? ¿Cuándo debería usarlo?

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 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:

  • getResourceAsStream () vs FileInputStream
  • Forma recomendada para guardar archivos cargados en una aplicación servlet
  • Maneras sencillas de mantener los datos sobre la redistribución de la aplicación web Java EE 7

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 progtwig funcione. Aquí está el enlace discutiendo ¿Por qué servletContext.getRealPath devuelve null en tomcat 8?