Почему getRealPath() возвращает null при развертывании с .war файлом?
getRealPath()
возвращает фактический путь в локальной системе, но возвращает null при развертывании с файлом .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>
Может ли кто-нибудь предоставить мне альтернативу для этого?
Было бы очень полезно, если бы вы также показали примерный код.
Ответы
Ответ 1
Для начала ServletRequest.getRealPath(String path) устарел. Соответствующая замена:
ServletContext context = session.getServletContext();
String realContextPath = context.getRealPath(request.getContextPath());
Однако API docs для ServletContext.getRealPath(String path):
"Этот метод возвращает null
, если контейнер сервлета не может перевести виртуальный путь на реальный путь по какой-либо причине (например, когда контент становится доступным из .war-архива).
Итак, API выполняет свой контракт! Однако все не потеряно, так как вы можете загрузить ресурс из WAR, используя следующий метод, как определено в ServletContext:
ServletContext context = session.getServletContext();
InputStream is = context.getResourceAsStream("generate.xml");
Ответ 2
Бит поздно, но я столкнулся с этим вопросом, когда у меня возникла эта проблема в 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.
Ответ 3
Вы используете Weblogic?
Если да - тогда это проблема Weblogic, которую вы можете исправить в консоли администратора Weblogic → Domain- > Web Applications - установите флажок "Архивированный реальный путь включен".
Смотрите: http://ananthkannan.blogspot.com/2009/12/servletcontextgetrealpath-returns-null.html
Ответ 4
Это также решает проблему:
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>
Ответ 5
Я не верю, что можно делать то, что вы пытаетесь сделать.
Вы должны использовать getResource для чтения XML файла из вашего военного файла (это также работает без войны)
servletContext.getResourceAsStream("/generate.xml")
Ведущая косая черта зависит от того, где хранится файл generate.xml.
Ответ 6
У меня были те же проблемы. Вызов getRealPath() возвращает null при развертывании на автономный сервер. После поиска некоторое время я нашел решение для этого, это не в коде. Это в конфигурации вашего веб-сервера.
Для меня это Weblogic 10.3, вы переходите в Home - - Configuration - Web Application, установите для Archived Real Path Enabled значение true. Перезагрузите сервер, и все работает нормально.
Надеюсь, что эта помощь,
С наилучшими пожеланиями.
Ответ 7
если вы хотите записать в
использование
this.getClass().getResource("/").getPath();
чтобы получить путь
Ответ 8
Обратите внимание, что context.getRealPath()
может возвращать null при возникновении проблемы с правами пользователя, проверять веб-сервер, под которым работает пользователь.
Ответ 9
Следующее исправление работает для меня.
// I am using Struts2
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT);
fileInputStream = sc.getResourceAsStream("test.xls");
После развернутого военного файла я могу получить файл из контекстного пути.
Ответ 10
Следующее исправление проблемы.
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);
Когда вы пытаетесь получить getRealPath с помощью this.getClass(). getResource ( "/" ). getPath(), когда ОС - это Windows, тогда вы можете получить строка, как показано ниже:
EHWInit#73:getPath=/C:/Program%20Files%20(x86)/Apache%20Software%20Foundation/Tomcat%208.5/webapps/chucec/WEB-INF/classes/
Для этого вам нужно сделать некоторые дополнительные работы с возвращаемой строкой. Кроме того, если вы хотите получить getRealPath по запросу. Вы можете заменить код следующим образом:
public void resetSystemPath(HttpServletRequest paramHttpServletRequest)
{
//String str = paramHttpServletRequest.getRealPath("/");
HttpSession session = paramHttpServletRequest.getSession(true);
String str = session.getServletContext().getRealPath("/");
System.out.println("getRealPath:"+str);