2009-02-11 5 views
27

getRealPath() restituisce il percorso effettivo nel sistema locale, ma restituisce null se distribuito con un file .war.Perché getRealPath() restituisce null quando distribuito con un file .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> 

Qualcuno può fornirmi un'alternativa per questo? Sarebbe molto utile se mostrassi anche qualche esempio di codice.

+0

Qualche possibilità è possibile ripulire il codice un po 'di più per favore? –

+0

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

risposta

36

Per iniziare, ServletRequest.getRealPath(String path) è deprecato. La sostituzione adatto è

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

Tuttavia, la documentazione API per ServletContext.getRealPath(String path) stato:

"Questo metodo restituisce null se il contenitore servlet non può tradurre il percorso virtuale in un percorso reale per qualsiasi ragione (ad esempio come quando il contenuto è reso disponibile da un archivio .war). "

Quindi l'API sta rispettando il suo contratto! Tuttavia, non tutto è perduto, come si può caricare una risorsa dalla guerra utilizzando il seguente metodo, come definito in ServletContext:

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

Cosa succede se effettivamente ho bisogno del percorso? per esempio in questa domanda: http://stackoverflow.com/questions/6889728/referencing-a-file-within-servlet la funzione setOutputProperty ha bisogno di ottenere una stringa di un percorso, cosa dovrei fare allora? – Nayish

+2

Cosa fai se vuoi * scrivere * sul file? getResourceAsStream restituisce un InputStream, giusto? –

+0

'http://www.coderanch.com/t/372437/java/java/javax-net-ssl-keyStore-system' Sfortunatamente la proprietà javax.net.ssl.trustStore non può leggere i dati da classpath ma si aspetta che sia essere un percorso di file. – ggb667

2

non credo sia possibile fare ciò che si sta cercando di fare.

Si dovrebbe usare getResource di leggere il file XML da dentro il file di guerra (questo funziona anche senza la guerra)

servletContext.getResourceAsStream("/generate.xml") 

lo slash iniziale dipende da dove è memorizzato il generate.xml.

+0

classloader e servletcontext possono avere idee diverse su cosa è /generate.xml - uno sta guardando tramite classpath, un altro è attraverso il contesto dell'applicazione (che non viene contato da WEB-INF/classi ma dalla radice di WAR). Quindi il modo giusto è usare ServletContext.getResourceAsStream. –

+0

Abbastanza corretto, ho modificato. – krosenvold

+0

rispondere alla domanda è l'obiettivo principale. questa risposta non fornisce alcuna soluzione che funzioni! – Stephan

1

Prendere nota context.getRealPath() può restituire null quando c'è un problema di autorizzazione utente, controllare il server Web in esecuzione con quale utente.

2

Ho avuto gli stessi problemi anche io. Chiamando getRealPath() restituisce null quando distribuito su un server standalone. Dopo aver cercato per un po ', ho trovato la soluzione per questo, non è nel codice. È nella configurazione del tuo server web.

Per me è Weblogic 10.3, vai a Home - - Configurazione - Applicazione Web, imposta Percorso reale archiviato abilitato su true. Riavvia il server e tutto funziona correttamente.

Spero che questo aiuto, Saluti.

0

la seguente correzione lavorando bene per me.

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

Dopo il file di guerra distribuito, sono in grado di ottenere il file dal percorso di contesto.

2

se si vuole scrivere in

uso

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

per ottenere il percorso

+0

Grazie. Ho passato troppo tempo a cercarlo, haha. – adpro

14

po 'tardi, ma mi sono imbattuto in questa domanda quando ho avuto questo problema in WebLogic. La mia soluzione era quella di aggiungere questo al mio 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> 

ho trovato questa soluzione migliore per quando non si vuole (o non può) modificare la configurazione del server WebLogic.

3

Questo risolve il problema anche:

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 seguente correzione il mio 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); 

Quando si tenta di ottenere getRealPath da this.getClass() getResource ("/") getPath() quando sistema operativo è Windows, allora si può ottenere una stringa come segue:

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

Perciò, è necessario fare alcuni lavori in più sul ritorno string.Furthermore, se si vuole ottenere getRealPath su richiesta. È possibile sostituire il codice come segue:

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

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