java - 如何替换 HttpServletResponse 输出流?

标签 java jsp tomcat servlets

我需要使用 JSP 生成 HTML 报告。我做了一个例子,但是目前它在 Tomcat6 中不起作用。

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

当我尝试运行这个示例时,结果是一个空字符串。我犯了什么错误?

最佳答案

问题是您为方法 getWriter 的每次调用都创建了新的 PrintWriter。相反,您应该拥有一个并重复使用它。

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

关于java - 如何替换 HttpServletResponse 输出流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198656/

相关文章:

java - 使用并解析 request.getParameter 中的 Double ("price");

jsp - 响应 .sendRedirect 不工作

java - 将 java 变量传递给 sql (netbeans)

java - tomcat docker-compose 无法访问共享卷

mysql - gwt tomcat,我的文件保存在哪里?

java - 使用 Java 创建作业队列或任务 Controller 并动态向其中添加任务

java - 停止循环时遇到问题

java - 使用 JPA 和 Eclipselink 在 JSP 文件中显示现有数据库表中的数据

javascript - 是否可以显示隐藏的输入值?

spring - JTATransaction 的替代方案