Путь к файлу в веб-приложении под GlassFish

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

./WebContent/WEB-INF/templates

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


person Slavko    schedule 01.06.2010    source источник
comment
Да, я использую связку Eclipse/GlassFish. Оказывается, ./ указывал на рабочую область\.metadata\.plugins\com.sun.enterprise.jst.server.sunappsrv92\domain1\config, которая находится за пределами каталога моего проекта. Прямо сейчас я использовал очень длинный путь оттуда к моему приложению, чтобы заставить его работать, но я знаю, что во время развертывания он снова укусит меня за задницу...   -  person Slavko    schedule 03.06.2010
comment
вы можете опубликовать свое решение в качестве ответа на этот вопрос, чтобы помочь следующему человеку, у которого есть аналогичная проблема. именно так stackoverflow становится лучше.   -  person vkraemer    schedule 04.06.2010
comment
Я обязательно сделаю это, как только убедюсь, что это действительно работает после развертывания.   -  person Slavko    schedule 06.06.2010


Ответы (4)


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

Из Как сервлет может получить абсолютный путь к файлу вне сервлета? который, в свою очередь, взят из 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/
person Thorbjørn Ravn Andersen    schedule 30.06.2010

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

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

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

Вам потребуется получить доступ к содержимому файла, используя 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";
    }

}
person vkraemer    schedule 03.06.2010
comment
Ну, это не совсем то, что мне нужно, мне не нужно использовать сам файл, мне просто нужно передать путь к FreeMarker, но все равно большое спасибо, я очень ценю ваше время и помощь. Кроме того, я нашел более короткий путь в той же структуре папок к тому, что похоже на локально развернутое приложение. Надеюсь, он продолжит работать после реального развертывания. - person Slavko; 04.06.2010

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

person Slavko    schedule 18.06.2010

Будет ли полезна функция JAR ресурсов сервлета 3.0: http://blogs.oracle.com/alexismp/entry/web_inf_lib_jar_meta ?

person Alexis MP    schedule 24.06.2010
comment
Нет, не будет. Это новый способ получения ресурса, и мне не нужен ресурс, мне просто нужен путь к файлу, который я могу передать FreeMarker. - person Slavko; 01.07.2010