RequestDispatcher.include只工作一次

时间:2015-02-26 17:00:48

标签: java jsp servlets requestdispatcher

我正在尝试使用RequestDispatcher.include()在以下方法中输出JSP页面的呈现:

public static String readTemplate(HttpServletRequest request, HttpServletResponse response, String template) {
    HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(response) {
        private final StringWriter sw = new StringWriter();

        @Override
        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(sw);
        }

        @Override
        public String toString() {
            return sw.toString();
        }
    };

    String templateFile = "/templates/" + template + ".jsp";
    logger.log(Level.INFO, "Reading template {0} ...", templateFile);

    try {
        request.getRequestDispatcher(templateFile).include(request, responseWrapper);

    } catch (ServletException | IOException | IllegalStateException e) {
        logger.log(Level.SEVERE, e.getMessage());
    }

    logger.log(Level.INFO, "Completed reading template {0}", templateFile);

    // retrieve HTML from response
    return responseWrapper.toString();
}

该方法是我与Tomcat8一起运行的servlet的一部分。这在第一次完美运行,但在第二次运行的包含调用时挂起(即如果我点击浏览器上的刷新)。

我已经确认调度程序不为空。

这是我从catalina.log中看到的(清理后供审阅)

首先运行:

26-Feb-2015 17:41:17.921 INFO [http-nio-8081-exec-2] ism.Reports.readTemplate Reading template /templates/INCIDENT_REPORT.jsp ...
26-Feb-2015 17:41:18.046 INFO [http-nio-8081-exec-2] ism.Reports.readTemplate Completed reading template /templates/INCIDENT_REPORT.jsp

第二次运行(响应永不返回,即浏览器始终加载页面):

26-Feb-2015 17:41:26.327 INFO [http-nio-8081-exec-8] ism.Reports.readTemplate Reading template /templates/INCIDENT_REPORT.jsp ...

在我重启Tomcat之前,这不会改变。

有人可以解释我做错了什么或者至少如何调试这个?谢谢!

编辑1:忘了说方法是静态的,但我也试过让它不是静态的没有任何区别

1 个答案:

答案 0 :(得分:0)

上面的代码正在运行,我意识到问题出在哪里。包含的JSP页面打开了许多MySQL连接,但只有一个被关闭。因此,第二个请求在执行任务之前等待释放MYSQL资源。我很抱歉直到现在我都没有注意到这一点,我甚至没有提到MySQL连接。我想这里没有收到回复让我找到JSP文件本身的解决方案。