Я пытаюсь вывести рендеринг страницы JSP с помощью RequestDispatcher.include() следующим способом:RequestDispatcher.include работает только один раз
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. Это работает отлично в первый раз, но зависает при включении вызова второго запуска (т. Е. Если я нажму обновление в браузере).
Я уже подтвердил, что диспетчер не имеет значения.
Это то, что я могу видеть из 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.
Может кто-нибудь объяснить, что я делаю неправильно или, по крайней мере, как отладить это? Благодаря!
EDIT 1: Забыл сказать метод является статическим, но я также пытался сделать это не статично, не имеет никакого значения
Я не понимаю, почему это вызовет проблему, которую вы видите, но при возврате нового PrintWriter каждый раз, когда метод вызывается, это плохая идея. Вы всегда должны возвращать тот же PrintWriter. –
Спасибо @JBNizet это сделает, но все же мне нужно выяснить, что там происходит .... –