Java Jetty servlet重写扩展读取文件

Java Jetty servlet重写扩展读取文件,java,servlets,resources,jetty,getresource,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

我试图在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);
}
}
我也尝试了下一个代码,但也没有成功:

getClass().getClassLoader().getResource(".").toString()+"../.."+req.getRequestURI()
因此getClass.getClassLoader.getResource..toString转到WEB-INF/classess,+../..+req.getRequestURI选择实际文件

我是否遗漏了一些关于资源如何工作的信息?还有其他读取文件的方法吗?

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


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

这也不起作用,因此它让我认为问题出在其他地方,所以我再次检查,这就是我意识到的。。。服务器是从非ascii路径执行的,所以我移动了项目,现在它就像一个符咒一样工作。无论如何,不要使用../。。web项目中的点段。如果需要访问/WEB-INF/类之外的代码,请使用相对于项目根的路径。
getClass().getClassLoader().getResource(".").toString()+"../.."+req.getRequestURI()
   @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!" );
    }
   }