2014-10-06 3 views
0


Я пытаюсь сделать сервлет на Jetty, который переопределяет расширение файла, но ему все еще нужно прочитать доступ к файлу.
Я пытался с ресурсами, но я ничего не мог достичь. Я судимый этот код до сих пор и, как вы увидите, что ресурсы есть, но я как-то не могу их открыть:Файл чтения расширений сервлетов Jetty

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 

I судимого со следующим кодом тоже, но не работал:...

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

так GetClass() getClassLoader() getResource ("") ToString() идет к WEB-INF/classess и + "../ .." + req.getRequestURI() выбирает фактический файл.

Я пропустил что-то о том, как работают ресурсы? Есть ли другой способ прочитать файл?

ответ

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!"); 
    } 
    } 

Код будет открыть файл и сбросить его содержимое в консоли.

+0

Это тоже не сработало, поэтому мне показалось, что проблема должна быть где-то в другом месте, поэтому я снова проверил, и вот где я понял ... сервер выполнялся с пути, отличного от ascii, поэтому я переместил проект, и теперь он работает как шарм. – valarion

+0

В любом случае, не используйте '../ ..' (dot-сегменты) в своих веб-проектах. Если вам нужно получить доступ к коду вне путей использования '/ WEB-INF/class' относительно корня вашего проекта. –

Смежные вопросы