Почему getRealPath() возвращает null при развертывании с файлом.war?

getRealPath() возвращает фактический путь в локальной системе, но возвращает ноль при развертывании с .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>

Кто-нибудь может предоставить мне альтернативу для этого? Было бы очень полезно, если бы вы также показали пример кода.

10 ответов

Для начала, ServletRequest.getRealPath (String path) не рекомендуется. Соответствующая замена:

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

Однако документы API для состояния ServletContext.getRealPath(String path):

"Этот метод возвращает null если контейнер сервлета не может перевести виртуальный путь в реальный путь по какой-либо причине (например, когда контент становится доступным из архива.war)."

Таким образом, API выполняет свой контракт! Однако не все потеряно, так как вы можете загрузить ресурс из WAR, используя следующий метод, как определено в ServletContext:

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 -> Домен -> Веб-приложения - установите флажок "Включен реальный путь в архиве".

Смотрите: http://ananthkannan.blogspot.com/2009/12/servletcontextgetrealpath-returns-null.html

Принять к сведению context.getRealPath() может вернуть ноль, если есть проблема с правами пользователя, проверьте, какой веб-сервер работает под каким пользователем.

Это решает проблему также:

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() возвращает ноль при развертывании на автономном сервере. После поиска вокруг я нашел решение для этого, это не в коде. Это в конфиге вашего веб-сервера.

Для меня это Weblogic 10.3, вы идете в раздел Домашняя страница - - Конфигурация - Веб-приложение, установите для параметра Активированный архивный реальный путь значение true. Перезагрузите сервер и все работает нормально.

Надеюсь, что это поможет, С уважением.

Если вы хотите написать в

использование

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

чтобы получить путь

Я не верю, что можно делать то, что ты пытаешься сделать.

Вы должны использовать getResource для чтения XML-файла из вашего военного файла (это также работает без войны)

servletContext.getResourceAsStream("/generate.xml")

Начальная косая черта зависит от того, где хранится файл generate.xml.

Следующее исправление работает нормально для меня.

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

После развертывания файла war я могу получить файл из контекстного пути.

Следующее исправит мою проблему.

  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);
Другие вопросы по тегам