getRealPath()
はローカルシステムの実際のパスを返しますが、.war
ファイルを使用してデプロイするとnullを返します。
<%@ 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>
誰かがこれの代替手段を私に提供できますか?あなたもいくつかのサンプルコードを見せてくれるととても助かります。
まず、 ServletRequest.getRealPath(String path) は非推奨です。適切な置換は次のとおりです。
ServletContext context = session.getServletContext();
String realContextPath = context.getRealPath(request.getContextPath());
ただし、 ServletContext.getRealPath(String path) 状態のAPIドキュメント:
「このメソッドは、サーブレットコンテナが何らかの理由(コンテンツが.warアーカイブから利用できるようにする場合など)で仮想パスを実際のパスに変換できない場合、
null
を返します。 "
APIは契約を満たしています!ただし、 ServletContext で定義されている次のメソッドを使用してWARからリソースをロードできるため、すべてが失われるわけではありません。
ServletContext context = session.getServletContext();
InputStream is = context.getResourceAsStream("generate.xml");
少し遅れましたが、WebLogicでこの問題が発生しているときにこの質問に遭遇しました。私の解決策はこれを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>
この解決策は、WebLogicサーバーの構成を編集したくない(または編集できない)場合に適しています。
weblogicを使用していますか?
はいの場合-これはWeblogicの問題であり、Weblogic管理コンソール->ドメイン-> Webアプリケーションで修正できます-チェックボックス[アーカイブされた実パスを有効にする]をクリックします。
参照: http://ananthkannan.blogspot.com/2009/12/servletcontextgetrealpath-returns-null.html
これも問題を解決します:
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>
私も同じ問題を抱えていました。スタンドアロンサーバーにデプロイすると、getRealPath()を呼び出すとnullが返されます。しばらく探してみたところ、解決策が見つかりました。コードにはありません。それはあなたのウェブサーバーの設定にあります。
私にとっては、Weblogic 10.3です。[ホーム]--[構成]-[Webアプリケーション]に移動し、[アーカイブされた実パスの有効化]をtrueに設定します。サーバーを再起動すると、すべてが正常に動作します。
よろしくお願いします。
に書き込みたい場合
使用する
this.getClass().getResource("/").getPath();
パスを取得する
私はあなたがやろうとしていることをすることが可能だとは思いません。
GetResourceを使用して、warファイル内からxmlファイルを読み取る必要があります(これはwarなしでも機能します)
servletContext.getResourceAsStream("/generate.xml")
先頭のスラッシュは、generate.xmlが格納されている場所によって異なります。
ユーザー権限の問題がある場合、context.getRealPath()
はnullを返す可能性があることに注意してください。どのユーザーで実行されているWebサーバーを確認してください。
次の修正は私にとってはうまくいきます。
// I am using Struts2
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT);
fileInputStream = sc.getResourceAsStream("test.xls");
Warファイルをデプロイした後、コンテキストパスからファイルを取得できます。