Web applications GlassFish下webapp中文件的路径

Web applications GlassFish下webapp中文件的路径,web-applications,glassfish,application-server,glassfish-3,web-container,Web Applications,Glassfish,Application Server,Glassfish 3,Web Container,如何在web应用程序中指定文件的路径?我在WEB-INF下有一个名为“templates”的文件夹,有人告诉我,在GlassFish v3下,路径应该如下所示: ./WebContent/WEB-INF/templates 但通过这种方式,我得到了一个文件未找到异常。为了使其正常工作,我必须更改什么?在Eclipse中创建动态web应用程序项目时,将进入war文件根目录的内容将从WebContent文件夹打包 听起来您想在运行时访问WEB应用程序的WEB-INF/templates目录中的文件

如何在web应用程序中指定文件的路径?我在WEB-INF下有一个名为“templates”的文件夹,有人告诉我,在GlassFish v3下,路径应该如下所示:

./WebContent/WEB-INF/templates

但通过这种方式,我得到了一个文件未找到异常。为了使其正常工作,我必须更改什么?

在Eclipse中创建动态web应用程序项目时,将进入war文件根目录的内容将从WebContent文件夹打包

听起来您想在运行时访问WEB应用程序的WEB-INF/templates目录中的文件

我假设您正在使用绝对路径从那里访问文件。您已经发现,一旦部署应用程序,这可能对您的应用程序不起作用

您需要使用访问文件的内容

下面的代码段从servlet中找到一个名为WEB-INF/templatez/myfile.txt的文件,该servlet是包含myfile.txt文件的WEB应用程序的一部分。其他web应用程序和用户将无法通过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";
    }

}

在Eclipse中创建动态web应用程序项目时,将进入war文件根目录的内容将从WebContent文件夹打包

听起来您想在运行时访问WEB应用程序的WEB-INF/templates目录中的文件

我假设您正在使用绝对路径从那里访问文件。您已经发现,一旦部署应用程序,这可能对您的应用程序不起作用

您需要使用访问文件的内容

下面的代码段从servlet中找到一个名为WEB-INF/templatez/myfile.txt的文件,该servlet是包含myfile.txt文件的WEB应用程序的一部分。其他web应用程序和用户将无法通过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";
    }

}

好吧,我知道了。真不敢相信解决办法竟如此简单。我刚刚将templates文件夹移动到WebContent文件夹,JSP和HTML页面位于同一位置,并将DD中的路径更改为/templates。现在,我很确定它可以在任何服务器上的任何web容器下工作。

好的,我知道了。真不敢相信解决办法竟如此简单。我刚刚将templates文件夹移动到WebContent文件夹,JSP和HTML页面位于同一位置,并将DD中的路径更改为/templates。现在我很确定它可以在任何服务器上的任何web容器下工作。

servlet 3.0的资源JAR功能有用吗:?

servlet 3.0的资源JAR功能有用吗:?

如果我理解正确,您不能依靠当前的工作目录来定位已部署的资源。如果您的资源是相对于类路径资源(比如在jar中)物理放置的,那么您可以询问该资源在哪里,然后从那里导航

从中依次是:


如果我理解正确,您就不能依靠当前工作目录来定位已部署的资源。如果您的资源是相对于类路径资源(比如在jar中)物理放置的,那么您可以询问该资源在哪里,然后从那里导航

从中依次是:


是的,我正在使用Eclipse/GlassFish捆绑包。原来./was指向了workspace\.metadata\.plugins\com.sun.enterprise.jst.server.sunappsrv92\domain1\config,它在我的项目目录之外。现在,我使用了一条很长的路径从那里到我的应用程序,以使其工作,但我知道在部署过程中,它会再次咬我的屁股…你可能想发布你的解决方案作为这个问题的答案,以帮助下一个有类似问题的人。这就是stackoverflow变得更好的原因。一旦我确定它在部署后真的能工作,我肯定会这么做。是的,我正在使用Eclipse/GlassFish捆绑包。原来./was指向了workspace\.metadata\.plugins\com.sun.enterprise.jst.server.sunappsrv92\domain1\config,它在我的项目目录之外。现在,我使用了一条很长的路径从那里到我的应用程序,以使其工作,但我知道在部署过程中,它会再次咬我的屁股…你可能想发布你的解决方案作为这个问题的答案,以帮助下一个有类似问题的人。这就是stackoverflow变得更好的原因。一旦我确定它在部署后真的能工作,我一定会这样做。好吧,这不是我需要的,我不需要使用文件本身,我只需要传递到FreeMarker的路径,但非常感谢,我真的非常感谢你的时间和帮助。此外,我在同一个文件夹结构中找到了一个较短的路径,看起来像是本地部署的应用程序。希望它能在实际部署后继续工作。好吧,这并不是我所需要的,我不需要使用文件本身,我只需要传递到FreeMarker的路径,但是非常感谢,我真的非常感谢你的时间和帮助。此外,我在同一个文件夹结构中找到了一个较短的路径,看起来像是本地部署的应用程序。希望它能在真正部署后继续工作。不,不会。这是一种获取资源的新方法,我不需要资源,我只需要一个可以传递给FreeMarker的文件路径。不,它不会。这是一种获取资源的新方法,我不需要资源,我只需要一个可以传递给FreeMarker的文件路径。