0

Как указать путь к файлу в веб-приложении? У меня есть папка с именем «Шаблоны» под WEB-INF, я сказал, что под GlassFish v3 путь должен выглядеть следующим образом:Путь к файлу в webapp под GlassFish

./WebContent/WEB-INF/templates 

, но этот путь я получаю файл не найден исключение. Что мне нужно изменить, чтобы заставить его работать?

+0

Вы используете Eclipse? – vkraemer

+0

Да, я использую комплект Eclipse/GlassFish. Оказывается ./ указывал на рабочую область \ .metadata \ .plugins \ com.sun.enterprise.jst.server.sunappsrv92 \ domain1 \ config, которая находится вне моего каталога проекта. Прямо сейчас я использовал очень длинный путь оттуда к моему приложению, чтобы заставить его работать, но я знаю, что во время развертывания он снова укусит меня за задницу ... – Slavko

+0

вы можете отправить свое решение в качестве ответа на этот вопрос, чтобы помочь следующего человека, у которого есть аналогичная проблема. вот как stackoverflow становится лучше. – vkraemer

ответ

0

Хорошо, я понял это. Не могу поверить, что решение было таким простым. Я только что переместил папку шаблонов в папку WebContent, то же самое место JSP и HTML-страницы находятся и меняют путь в DD в/templates. Теперь я уверен, что он будет работать в любом веб-контейнере на любом сервере.

1

Когда вы создаете проект динамического веб-приложения в Eclipse, содержимое, которое войдет в корень военного файла, будет упаковано из папки WebContent.

Похоже, вы хотите получить доступ к файлу из каталога WEB-INF/шаблонов во время выполнения для вашего веб-приложения.

Я предполагаю, что вы используете абсолютный путь для доступа к нему оттуда. Вы уже поняли, что это, вероятно, не будет работать для вашего приложения после его развертывания.

Вам необходимо получить доступ к содержимому файла, используя ServletContext.getResourceAsStream(String).

Следующий фрагмент находит файл с именем WEB-INF/templatez/myfile.txt из сервлета, который является частью веб-приложения, содержащего файл myfile.txt. Другие веб-приложения и пользователи не смогут получить доступ к файлу через HTTP-запросы GET.

package a; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(name="FileFinder", urlPatterns={"/FileFinder"}) 
public class FileFinder extends HttpServlet { 

    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      //* TODO output your page here 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet FileFinder</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>Servlet FileFinder at " + request.getContextPath() + "</h1>"); 
      InputStream is = null; 
      try { 
       is = request.getServletContext().getResourceAsStream("/WEB-INF/templatez/myfile.txt"); 
       out.println((null == is ? "did not " : "did ") + "find the file myfile.txt"); 
      } finally { 
       if (null != is) is.close(); 
      } 

      out.println("</body>"); 
      out.println("</html>"); 
      //*/ 
     } finally { 
      out.close(); 
     } 
    } 

    /** 
    * Handles the HTTP <code>GET</code> method. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Returns a short description of the servlet. 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    } 

} 
+0

Ну, это не совсем то, что мне нужно, мне не нужно использовать сам файл, мне просто нужно пройти путь к FreeMarker, но, во всяком случае, спасибо большое, я очень ценю ваше время и помощь. Кроме того, я нашел более короткий путь в той же структуре папок, что и локально развернутое приложение. Надеюсь, он продолжит работать после реального развертывания. – Slavko

0

Может быть полезен ресурс JAR сервлета 3.0: http://blogs.oracle.com/alexismp/entry/web_inf_lib_jar_meta?

+0

Нет, это не так. Это новый способ получить ресурс, и мне не нужен ресурс, мне просто нужен путь к файлу, который я могу передать FreeMarker. – Slavko

2

Если вы правильно поняли, вы не можете полагаться на текущий рабочий каталог, чтобы найти ресурс, который вы развернули. Если ваш ресурс физически размещен относительно ресурса пути к классам (например, внутри банки), вы можете узнать о том, где , что находится ресурс, а затем перейти оттуда.

How a servlet can get the absolute path to a file outside of the servlet? С, который, в свою очередь от http://www.exampledepot.com/egs/java.lang/ClassOrigin.html:

Class cls = this.getClass(); 
ProtectionDomain pDomain = cls.getProtectionDomain(); 
CodeSource cSource = pDomain.getCodeSource(); 
URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/