GlassFish下webapp中文件的路径

时间:2010-06-01 23:47:13

标签: web-applications glassfish application-server glassfish-3 web-container

如何在Web应用程序中指定文件的路径?我在WEB-INF下有一个名为'templates'的文件夹,我被告知在GlassFish v3下,路径应如下所示:

./WebContent/WEB-INF/templates

但这样我得到的文件未找到异常。为了使其有效,我需要改变什么?

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您不能依赖当前工作目录来查找已部署的资源。如果您的资源是相对于类路径资源(例如jar内部)的物理放置,您可以询问资源的位置,然后从那里导航。

来自How a servlet can get the absolute path to a file outside of the servlet?http://www.exampledepot.com/egs/java.lang/ClassOrigin.html来自{{3}}:

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

答案 1 :(得分:1)

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

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

我假设您正在使用绝对路径从那里访问文件。您已经发现,部署后,这可能不适用于您的应用。

您需要使用ServletContext.getResourceAsStream(String)访问该文件的内容。

以下代码段从servlet中找到名为WEB-INF / templatez / myfile.txt的文件,该文件是包含myfile.txt文件的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";
    }

}

答案 2 :(得分:0)

好的,我想出来了。无法相信解决方案就这么简单。我刚将templates文件夹移动到WebContent文件夹,JSP和HTML页面所在的位置相同,并将DD中的路径更改为/ templates。现在我很确定它可以在任何服务器上的任何Web容器下工作。

答案 3 :(得分:0)

servlet 3.0的资源JAR功能是否有用:http://blogs.oracle.com/alexismp/entry/web_inf_lib_jar_meta