tutorial for español development curso application java web-applications

for - Java-Ruta relativa de un archivo en una aplicación web java



jsp (6)

Quiero leer un archivo de una aplicación web java. No quiero dar la ruta absoluta del archivo. Solo quiero poner el archivo en algún directorio de mi aplicación web.

O

Se puede colocar junto con el archivo .war (aplicación web empaquetada).

Qué ruta relativa dar para el archivo. Intenté ./filename.csv pero no funcionó.

========

Actualizado

========

Entregaré un archivo WAR (aplicación web empaquetada) a mi cliente. Esta aplicación web leerá un archivo (digamos SuppliedFile.csv ) que el cliente copiará al servidor. Por lo tanto, necesito un mecanismo (que funcione independientemente de si el servidor de aplicaciones descompactará el WAR o no) para que la aplicación web pueda leer ese archivo.

Nota: No estoy utilizando el SuppliedFile.csv en un servlet ... Lo estoy usando en una clase Java simple ...


La alternativa sería usar ServletContext.getResource () que devuelve un URI. Este URI puede ser una URL ''file:'', pero no hay garantía para eso.

No es necesario que sea un archivo: ... URL. Solo necesita que sea una URL que su JVM pueda leer, y así será.


¿Realmente necesitas cargarlo desde un archivo? Si lo coloca a lo largo de sus clases (en WEB-INF / clases) puede obtener un InputStream utilizando el cargador de clases:

InputStream csv = SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");


Es posible que simplemente pueda acceder a una ruta de archivo preestablecida en el sistema. Esto es preferible ya que los archivos agregados al directorio de la webapp pueden perderse o la webapp puede no ser desempaquetada dependiendo de la configuración del sistema.

En nuestro servidor, definimos una propiedad del sistema establecida en la JVM del servidor de aplicaciones que apunta al "directorio de inicio" para los datos externos de nuestra aplicación. Por supuesto, esto requiere la modificación de la configuración del Servidor de Aplicaciones (-DAPP_HOME = ... agregado a JVM_OPTS al inicio), lo hacemos principalmente para facilitar la prueba del código ejecutado fuera del contexto de un Servidor de Aplicaciones.

También podría recuperar fácilmente una ruta desde la configuración de servlet:

<web-app> <context-param> <param-name>MyAppHome</param-name> <param-value>/usr/share/myapp</param-value> </context-param> ... </web-app>

A continuación, recupere esta ruta y úsela como la ruta base para leer el archivo proporcionado por el cliente.

public class MyAppConfig implements ServletContextListener { // NOTE: static references are not a great idea, shown here for simplicity static File appHome; static File customerDataFile; public void contextInitialized(ServletContextEvent e) { appHome = new File(e.getServletContext().getInitParameter("MyAppHome")); File customerDataFile = new File(appHome, "SuppliedFile.csv"); } } class DataProcessor { public void processData() { File dataFile = MyAppConfig.customerDataFile; // ... } }

Como mencioné, el problema más probable que encontrará son las restricciones de seguridad. Nada garantiza que webapps pueda preparar cualquier archivo sobre su raíz de webapp. Pero generalmente hay métodos simples para otorgar excepciones para rutas específicas a aplicaciones web específicas.

Independientemente del código en el que necesite acceder a este archivo, dado que se está ejecutando dentro de una aplicación web, se garantiza que se inicializa primero, y puede esconder su valor en algún lugar conveniente para que el resto del código se refiera, como en mi ejemplo o mejor aún, simplemente pase la ruta como un parámetro al código que lo necesita.


Muchas aplicaciones populares de Java, como Jenkins y Nexus , usan este mecanismo:

  1. Opcionalmente, verifique un servlet context-param / init-param . Esto permite configurar múltiples instancias de aplicación web por contenedor de servlet, usando context.xml que se puede hacer modificando el WAR o cambiando la configuración del servidor (en el caso de Tomcat).

  2. Verifique una variable de entorno (usando System.getenv ), si está configurada, luego use esa carpeta como la carpeta de datos de la aplicación. por ejemplo, Jenkins usa JENKINS_HOME y Nexus usa PLEXUS_NEXUS_WORK . Esto permite una configuración flexible sin ningún cambio en WAR.

  3. De lo contrario, use una subcarpeta dentro de la carpeta de inicio del usuario , por ejemplo $HOME/.yourapp . En código Java esto será:

    final File appFolder = new File(System.getProperty("user.home"), ".yourapp");


Si tiene una ruta para ese archivo en el servidor web, puede obtener la ruta real en el sistema de archivos del servidor utilizando ServletContext.getRealPath() . Tenga en cuenta que no se garantiza que funcione en todos los contenedores (ya que no se requiere que un contenedor descomprima el archivo WAR y almacene el contenido en el sistema de archivos, aunque la mayoría lo hace). Y supongo que no funcionará con los archivos en / WEB-INF, ya que no tienen una ruta virtual.

La alternativa sería usar ServletContext.getResource() que devuelve un URI. Este URI puede ser una URL ''file:'', pero no hay garantía para eso.


hay otra manera, si está usando un contenedor como Tomcat:

String textPath = "http://localhost:8080/NameOfWebapp/resources/images/file.txt";