2009-11-23 16 views
7

Desarrollar una aplicación Struts 2 Corro en un problema siguiente. Necesito leer un archivo de texto que se implementa en el servidor web con mi aplicación. ¿Cómo puedo acceder sabiendo su camino relativo? En otras palabras, ¿cómo puedo encontrar la ruta absoluta si conozco la ruta relativa dentro del directorio implementado? Cuando tuve un problema similar con los servlets solía utilizar this.getContextPath() (o algo similar) que devolvía una ruta de acceso absoluta a la carpeta en el servidor web.¿Cómo se puede leer un archivo de texto en una aplicación de Struts 2?

EDIT: Gracias a todos por la respuesta. Para mí trabajó esto:

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt") 

Podría explicar por qué funcionó porque estoy dando los primeros pasos en Java.

Respuesta

10

Si se coloca en la ruta de clase de la aplicación Web, a continuación, sólo tiene que utilizar:

InputStream input = servletContext.getResourceAsStream("file.txt"); 

Si se coloca en la ruta de clase mundial, a continuación, utilizar:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt"); 

Si se coloca en el webcontent , simplemente use:

InputStream input = new FileInputStream(servletContext.getRealPath("file.txt")); 

Los ejemplos asumen que se colocan en la raíz. Por supuesto, puede utilizar la ruta relativa en lugar de la raíz de la ruta de clase o la raíz de contenido web, p. path/to/file.txt. Puede obtener el ServletContext en Struts por ServletActionContext#getServletContext().

Editar: ha editado su pregunta con lo siguiente:

EDIT: Gracias chicos por respuesta. Trabajé para mí esto:

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt") 

podría explicar por qué

Esto no es en realidad la forma "correcta", pero esto también es factible. Solo necesita asegurarse de que separelativa ruta del archivo en comparación con la ruta real de la clase GetPointsOfInterestAction. Esta clase, por supuesto, se coloca en un paquete diferente, por lo que básicamente necesita retroceder un directorio (como lo hace en los sistemas de archivos de disco normales: cd ../ y así sucesivamente). Nuevamente, esta no es la manera más elegante. Debe utilizar una de las dos primeras formas antes mencionadas, con el nombre de recurso resources/visitor_attractions.txt.

3

Here

ServletActionContext.getServletContext()

usted parece saber qué hacer a partir de ahí.

+0

Yeap. El problema es que si trato de leerlo en una constante, devolverá nulo. Parece una decisión de diseño equivocada. –

3

Puede usar Resource Bundle. Los uso para buscar archivos de propiedades. Creo que el directorio solo necesita estar en el Classpath y el ResourceBundle lo encontrará.

2

Si el archivo está en el classpath (que no está claro, pero sería una buena idea), sugiero usar la clase de utilidad org.apache.struts2.util.ClassLoaderUtils.De su documentación java:

Esta clase es extremadamente útil para cargar recursos y clases de forma tolerante a errores que funciona en diferentes servidores de aplicaciones.

Preste especial atención al método estático ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass) que es un método conveniente para cargar un recurso como una secuencia. Como se ha documentado, el algoritmo usado para encontrar los recursos se da en getRessource():

Este método intentará cargar el recurso utilizando los métodos siguientes (en orden):

  • De Thread.currentThread().getContextClassLoader()
  • De ClassLoaderUtil.class.getClassLoader()
  • Desde el callingClass.getClassLoader()
Cuestiones relacionadas