2015-08-25 4 views
0

Мне нужно использовать JSP для создания HTML-отчета. Я привел пример, но до сих пор он не работает в Tomcat6.Как заменить выходной поток HttpServletResponse?

public class SubstitutionServlet extends HttpServlet { 
    @Override 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/report.jsp"); 
     final ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
     ServletResponseWrapper wrapper = new HttpServletResponseWrapper(response){ 
      @Override 
      public PrintWriter getWriter() throws IOException { 
       return new PrintWriter(buf); 
      } 
     }; 
     dispatcher.forward(request, wrapper); 
     String html = buf.toString("UTF-8"); // "" is returned 
     System.out.println(html); 
     response.getOutputStream().print("Completed"); 
    } 
} 

Когда я пытаюсь запустить этот пример, в результате получается пустая строка. Какую ошибку я сделал?

+0

Ваш поток не был покраснел, что может быть проблемой, и вы должны закрыть поток, когда закончите писать. Это может решить вашу проблему. – Jan

+0

Вы не сделали ничего полезного с 'buf'. Вы напечатали его на 'System.out', то есть на файл журнала, но вы не записали его в выходной поток ответа. И вы не можете, потому что вы перешли к чему-то еще. Что именно вы пытаетесь сделать здесь? Это не имеет смысла. – EJP

ответ

2

Проблема заключалась в том, что вы создавали новый PrintWriter для каждого вызова метода getWriter. Вместо этого вы должны иметь один и повторно использовать его.

public class SubstitutionServlet extends HttpServlet { 

private static final long serialVersionUID = 1L; 

@Override 
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/report.jsp"); 
    final ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
    final PrintWriter out = new PrintWriter(buf); //CREATE ONLY ONE WRITER 
    ServletResponseWrapper wrapper = new HttpServletResponseWrapper(response) { 
     @Override 
     public PrintWriter getWriter() throws IOException { 
      return out; // REUSE WRITER 
     } 
    }; 
    dispatcher.forward(request, wrapper); 
    String html = buf.toString("UTF-8"); // "" is returned 
    System.out.println(html); 
    response.getOutputStream().print("Completed"); 
    } 
} 
+0

Мне пришлось вызвать out.flush() перед buf.toString ("UTF-8"), чтобы это работало. – jrahhali

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