RequestDispatcher.include 只工作一次
RequestDispatcher.include is working only once
我正在尝试在以下方法中使用 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
第二个 运行(从不响应 returns,即浏览器始终加载页面):
26-Feb-2015 17:41:26.327 INFO [http-nio-8081-exec-8] ism.Reports.readTemplate Reading template /templates/INCIDENT_REPORT.jsp ...
这不会改变,直到我重新启动 Tomcat。
有人可以解释我做错了什么或者至少如何调试吗?谢谢!
编辑 1: 忘了说这个方法是静态的,但我也试过让它不是静态的,但没有任何区别
上面的代码是有效的,我意识到问题出在哪里了。包含的 JSP 页面打开了许多 MySQL 个连接,但只有一个被关闭。因此,第二个请求在执行任务之前等待 MYSQL 资源被释放。非常抱歉我直到现在才注意到这一点,而且我一开始甚至没有提到 MySQL 连接。我想在这里没有收到回复会让我在 JSP 文件本身上找到解决方案。
我正在尝试在以下方法中使用 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
第二个 运行(从不响应 returns,即浏览器始终加载页面):
26-Feb-2015 17:41:26.327 INFO [http-nio-8081-exec-8] ism.Reports.readTemplate Reading template /templates/INCIDENT_REPORT.jsp ...
这不会改变,直到我重新启动 Tomcat。
有人可以解释我做错了什么或者至少如何调试吗?谢谢!
编辑 1: 忘了说这个方法是静态的,但我也试过让它不是静态的,但没有任何区别
上面的代码是有效的,我意识到问题出在哪里了。包含的 JSP 页面打开了许多 MySQL 个连接,但只有一个被关闭。因此,第二个请求在执行任务之前等待 MYSQL 资源被释放。非常抱歉我直到现在才注意到这一点,而且我一开始甚至没有提到 MySQL 连接。我想在这里没有收到回复会让我在 JSP 文件本身上找到解决方案。