Jetty servlet覆盖扩展读取文件

时间:2014-10-06 17:30:48

标签: java servlets resources jetty getresource


我试图在Jetty上创建一个覆盖文件扩展名但仍需要读取正在访问的文件的servlet。
我一直在尝试资源,但我还没有做到。到目前为止,我已尝试使用此代码,正如您所见,资源存在,但我无法访问它们:

package valarionch.lab0.webapp.todo;

import java.io.FileInputStream;
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;

@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "*.ToDo" })
public class ToDoHandler extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    resp.setContentType("text/html");
    String s = req.getParameter("s");
    boolean small = (s != null && s.equals("1"));
    PrintWriter out = resp.getWriter();

    if (!small) {
        out.println("<html><head><title>ToDo list</title></head>"
                + "<body>");
    }

    for (String res : getServletContext().getResourcePaths("/")) {
        System.out.println("Resource: " + res);
        System.out.println("ResourceURL: " + getServletContext().getResource(res));
        System.out.println("ResourceStream: " + getServletContext().getResourceAsStream(res));
    }


    InputStream input = getServletContext().getResourceAsStream(req.getRequestURI());
    System.out.println(input);

    ToDoFormatter.parse(input, out, req.getParameter("q"));

    if (!small) {
        out.println("</body></html>");
    }
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    doGet(req, resp);
}
}

此代码打印出来:

Resource: /META-INF/
ResourceURL: null
ResourceStream: null
Resource: /WEB-INF/
ResourceURL: null
ResourceStream: null
Resource: /index.html
ResourceURL: null
ResourceStream: null
Resource: /ToDoList.ToDo
ResourceURL: null
ResourceStream: null
null

我也尝试了下一个代码,但也没有用过:

getClass().getClassLoader().getResource(".").toString()+"../.."+req.getRequestURI()

所以 getClass()。getClassLoader()。getResource(&#34;。&#34;)。toString()转到 WEB-INF / classess 并且 +&#34; ../.." + req.getRequestURI()选择实际文件。

我错过了有关资源如何运作的信息吗?还有另一种方法来读取文件吗?

1 个答案:

答案 0 :(得分:0)

您可以使用getServletContext().getRealPath()执行此类任务。我们假设您在myText.txt文件夹中有webapps文件:

   @SuppressWarnings("serial")
   @WebServlet(urlPatterns = { "*.ToDo" })
   public class UseGetRealPath extends HttpServlet {
    public void doGet( HttpServletRequest req, HttpServletResponse res )
      throws ServletException, IOException {
     String todoFile = getServletContext().getRealPath("/myText.txt");
     FileReader fr = new FileReader( todoFile );
     for( int c = fr.read(); c != -1; c = fr.read() ) {
      System.out.print( (char) c );
     }
     fr.close();
     res.getWriter().println( "check the console!" );
    }
   }

代码将打开文件并将其内容转储到控制台中。