【问题标题】:RequestDispatcher.include is working only onceRequestDispatcher.include 只工作一次
【发布时间】:2015-02-26 17:00:47
【问题描述】:

我正在尝试通过以下方法使用 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 的一部分。这第一次完美运行,但在第二次运行时挂起包含调用(即,如果我单击浏览器上的刷新)。

我已经验证了dispatcher不为null。

这是我从 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:忘了说该方法是静态的,但我也尝试将其设为非静态并没有任何区别

【问题讨论】:

  • 我不明白为什么会导致您看到的问题,但是每次调用该方法时都返回一个新的 PrintWriter 是个坏主意。您应该始终返回相同的 PrintWriter。
  • 感谢@JBNizet 会这样做,但我仍然需要弄清楚那里发生了什么......

标签: java jsp servlets requestdispatcher


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 2013-12-31
    • 1970-01-01
    • 2013-09-28
    • 2013-03-30
    • 2015-06-04
    • 2019-05-18
    相关资源
    最近更新 更多