2009-02-11 19 views
27

getRealPath() está devolviendo la ruta real en el sistema local, pero devuelve nulo cuando se implementa con un archivo .war.¿Por qué getRealPath() devuelve nulo cuando se implementa con un archivo .war?

<%@ page import="java.io.*" %> 
<%@ page contentType="text/html;charset=ISO-8859-1" %> 
<% 
int iLf = 10; 
char cLf = (char)iLf; 
String a= application.getResource("/"); 
//String myfile = application.getRealPath("/")+ "generate.xml"; 
//String myfile = request.getContextPath()+"generate.xml"; 
//String myfile = request.getRealPath("/")+"generate.xml"; 

out.println(myfile);  
File outputFile = new File(myfile); 
outputFile.createNewFile(); 
FileWriter outfile = new FileWriter(outputFile); 
outfile.write(" <?xml version='1.0' encoding='UTF-8'?> "+cLf); 
outfile.write(" <playlist version='1' xmlns = 'http://xspf.org/ns/0/' > " +cLf); 
outfile.write(" <title>My Band Rocks Your Socks</title> "+cLf); 
outfile.write("<trackList>"+cLf); 
%> 
<%! String[] sports; %> 
<% 
    sports = request.getParameterValues("sports"); 

    out.println("<html><body><h1>hello</h1></body></html>"); 

    if (sports != null) 
    { 
     for (int i = 0; i < sports.length; i++) 
     { 
       // outfile.writeln (sports[i]); 
       String total=sports[i]; 
       String[] sa=total.split("[,]"); 
       // String[] sub=new String(); 
       outfile.write("<track>"+cLf); 
       for (int j=0;j<sa.length;j++) 
       { 
       // outfile.writeln(sa[j]); 
       // outfile.writeln("sa["+j+"]="+sa[j]); 
       if(j == 0) 
       { 
        outfile.write("<location>" + sa[0] +"</location>"+cLf); 
       } 
       else if (j == 1) 
        { 
         outfile.write("<image>" + sa[1] +"</image>"+cLf); 
        } 
        else if(j==2) 
          { 
          outfile.write("<title>" + sa[2] +"</title>"+cLf); 
          } 

       }// end of inner for loop()  
       outfile.write("</track>"+cLf); 
     //outfile.writeln(); 
     }// end of outer for() 
    } 
    //else outfile.writeln ("<b>none<b>"); 

    outfile.write(" </trackList> "+cLf); 
    outfile.write(" </playlist> "+cLf); 
    outfile.close(); 

    %> 
<object type="application/x-shockwave-flash" width="400" height="170" 
      data="xspf_player.swf?playlist_url=generate.xml"> 
      <param name="movie" value="xspf_player.swf?playlist_url=generate.xml" /> 

</object> 

¿Alguien me puede dar una alternativa para esto? Sería muy útil si también mostrara algún código de muestra.

+0

¿Alguna posibilidad de que pueda limpiar el código un poco más, por favor? –

+0

Explicación: http://stackoverflow.com/questions/12160639/what-does-servletcontext-getrealpath-mean-and-when-should-i-use-it Answer: http://stackoverflow.com/questions/2161054/ where-to-place-and-how-to-read-configuration-resource-files-in-servlet-based-app – BalusC

Respuesta

36

Para empezar, ServletRequest.getRealPath(String path) está en desuso. La sustitución adecuada es:

ServletContext context = session.getServletContext(); 
String realContextPath = context.getRealPath(request.getContextPath()); 

Sin embargo, los documentos de la API para ServletContext.getRealPath(String path) Estado:

"Este método devuelve null si el contenedor de servlets no puede traducir la ruta de acceso virtual a un camino real por cualquier motivo (por ejemplo, como cuando el contenido está disponible desde un archivo .war) ".

¡Así que la API está cumpliendo con su contrato! Sin embargo, no todo está perdido, como se puede cargar un recurso de la guerra mediante el siguiente método, como se define en ServletContext:

ServletContext context = session.getServletContext(); 
InputStream is = context.getResourceAsStream("generate.xml"); 
+3

¿Qué ocurre si realmente necesito la ruta? por ejemplo en esta pregunta: http://stackoverflow.com/questions/6889728/referencing-a-file-within-servlet la función setOutputProperty necesita obtener un String de una ruta, ¿qué haría entonces? – Nayish

+2

¿Qué haces si quieres * escribir * en el archivo? getResourceAsStream devuelve un InputStream, ¿verdad? –

+0

'http://www.coderanch.com/t/372437/java/java/javax-net-ssl-keyStore-system' Lamentablemente, la propiedad javax.net.ssl.trustStore no puede leer los datos de classpath, pero espera que ser una ruta de archivo – ggb667

2

que no creen que es posible hacer lo que estamos tratando de hacer.

Debe utilizar getResource para leer el archivo XML desde el interior de su archivo de la guerra (esto también funciona sin guerra)

servletContext.getResourceAsStream("/generate.xml") 

La barra inicial depende del lugar donde se almacena el generate.xml.

+0

classloader y servletcontext pueden tener diferentes ideas de lo que es /generate.xml: una busca a través de classpath, otra es a través del contexto de la aplicación (que no se cuenta desde WEB-INF/classes sino desde la raíz de WAR). Así que la forma correcta es usar ServletContext.getResourceAsStream. –

+0

Bastante bien, edité. – krosenvold

+0

responder a la pregunta es el objetivo principal. ¡esta respuesta no proporciona ninguna solución que funcione! – Stephan

1

Tome nota context.getRealPath() puede devolver nulo cuando hay un problema de permiso de usuario, compruebe el servidor Web que se ejecuta bajo qué usuario.

2

Tuve los mismos problemas también. Llamar a getRealPath() devuelve nulo cuando se implementa en un servidor independiente. Después de buscar por un tiempo, encontré la solución para esto, no está en el código. Está en la configuración de tu servidor web.

Para mí es Weblogic 10.3, vaya a Inicio - - Configuración - Aplicación web, establezca Archived Real Path Enabled como true. Reinicie el servidor y todo funciona bien.

Espero que esta ayuda, Atentamente.

0

La revisión siguiente trabaja bien para mí.

// I am using Struts2 
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT); 
fileInputStream = sc.getResourceAsStream("test.xls"); 

Después de desplegar el archivo war, puedo obtener el archivo de la ruta del contexto.

2

si desea escribir en

uso

this.getClass().getResource("/").getPath(); 

para obtener la ruta

+0

Gracias. Pasé mucho tiempo buscando esto, jaja. – adpro

14

poco tarde, pero me encontré con esta pregunta cuando estaba teniendo este problema en WebLogic. Mi solución fue la de añadir esto a mi weblogic.xml:

<?xml version='1.0' encoding='UTF-8'?> 
<weblogic-web-app> 
    <container-descriptor> 
     <show-archived-real-path-enabled>true</show-archived-real-path-enabled> 
    </container-descriptor> 
</weblogic-web-app> 

He encontrado esta solución mejor para cuando usted no quiere (o no puede) editar la configuración en el servidor WebLogic.

3

Esto resuelve el problema también:

weblogic.xml

<?xml version = '1.0' encoding = 'windows-1252'?> 
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd" xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app"> 

<container-descriptor> 
    <index-directory-enabled>true</index-directory-enabled> 
    <show-archived-real-path-enabled>true</show-archived-real-path-enabled> 
</container-descriptor> 

<virtual-directory-mapping> 
    <local-path>bla.war</local-path> 
    <url-pattern>*</url-pattern> 
</virtual-directory-mapping> 

<context-root>bla</context-root> 

-1

La revisión siguiente mi problema. ..

public EHWInit() 
    { 
    String resetRootPath = ""; 

    try{ 
    resetRootPath = this.getClass().getResource("/").getPath(); 
     boolean isWinOS = System.getProperty("os.name").startsWith("Windows"); 
    if(isWinOS) 
     {resetRootPath = resetRootPath.substring(1, resetRootPath.lastIndexOf("chucec"));} 
    else 
     {resetRootPath = resetRootPath.substring(0, resetRootPath.lastIndexOf("chucec"));} 

    resetRootPath = resetRootPath.replace("%20", " "); 
    System.out.println("EHWInit#75:resetRootPath=" + resetRootPath); 

Cuando se intenta obtener getRealPath por this.getClass() getResource ("/") getPath() al sistema operativo es Windows, entonces usted puede obtener una cadena como siguiente:

 
EHWInit#73:getPath=/C:/Program%20Files%20(x86)/Apache%20Software%20Foundation/Tomcat%208.5/webapps/chucec/WEB-INF/classes/ 

para ello, es necesario hacer algunos trabajos adicionales en la string.Furthermore regresar, si desea obtener getRealPath por la petición. Puede reemplazar el código de la siguiente manera:

public void resetSystemPath(HttpServletRequest paramHttpServletRequest) 
    { 
    //String str = paramHttpServletRequest.getRealPath("/"); 

    HttpSession session = paramHttpServletRequest.getSession(true); 
    String str = session.getServletContext().getRealPath("/"); 
    System.out.println("getRealPath:"+str); 
Cuestiones relacionadas