getRealPath()
renvoie le chemin d'accès réel sur le système local, mais renvoie null lorsqu'il est déployé avec un fichier .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>
Quelqu'un peut-il me proposer une alternative à cela? Il serait très utile que vous montriez aussi un exemple de code.
Pour commencer, ServletRequest.getRealPath (chemin de la chaîne) est obsolète. Le remplacement approprié est:
ServletContext context = session.getServletContext();
String realContextPath = context.getRealPath(request.getContextPath());
Cependant, la documentation de l'API pour ServletContext.getRealPath (chemin de la chaîne) state:
"Cette méthode retourne
null
si le conteneur de servlets ne peut pas traduire le chemin virtuel en un chemin réel pour une raison quelconque (par exemple, lorsque le contenu est rendu disponible à partir d'une archive .war)."
Donc, l'API remplit son contrat! Toutefois, tout n'est pas perdu, car vous pouvez charger une ressource du fichier WAR à l'aide de la méthode suivante, telle que définie dans ServletContext :
ServletContext context = session.getServletContext();
InputStream is = context.getResourceAsStream("generate.xml");
Un peu tard, mais je suis tombé sur cette question lorsque je rencontrais ce problème dans WebLogic. Ma solution a été d'ajouter ceci à mon 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>
J'ai trouvé cette solution préférable lorsque vous ne voulez pas (ou ne pouvez pas) modifier la configuration sur le serveur WebLogic.
utilisez-vous Weblogic?
Si c'est le cas, il s'agit d'un problème Weblogic que vous pouvez résoudre dans la console d'administration Weblogic -> Domaine-> Applications Web - cochez la case "Chemin réel archivé activé".
Voir: http://ananthkannan.blogspot.com/2009/12/servletcontextgetrealpath-returns-null.html
Cela résout le problème aussi:
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>
J'ai eu les mêmes problèmes aussi. L'appel de getRealPath () renvoie la valeur null lorsqu'il est déployé sur un serveur autonome. Après avoir cherché pendant un moment, j'ai trouvé la solution, ce n'est pas dans le code. C'est dans la configuration de votre serveur web.
Pour moi, il s’agit de Weblogic 10.3, vous allez dans Accueil - - Configuration - Application Web, définissez Archived Real Path Enabled sur true. Redémarrez le serveur et tout fonctionne correctement .
Espérons que cette aide, Cordialement.
si vous voulez écrire dans
utilisation
this.getClass().getResource("/").getPath();
pour obtenir le chemin
Je ne crois pas qu'il soit possible de faire ce que vous essayez de faire.
Vous devriez utiliser getResource pour lire le fichier XML à partir de votre fichier war (cela fonctionne aussi sans war)
servletContext.getResourceAsStream("/generate.xml")
La barre oblique dépend de l'emplacement de stockage du fichier generate.xml.
Prenez note que context.getRealPath()
peut renvoyer null en cas de problème d’autorisation d’utilisateur, vérifiez le serveur Web en cours d’exécution sous quel utilisateur.
La solution suivante fonctionne bien pour moi.
// I am using Struts2
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT);
fileInputStream = sc.getResourceAsStream("test.xls");
Après avoir déployé le fichier war, je peux extraire le fichier du chemin de contexte.