2015-02-26 4 views
0

Я пытаюсь вывести рендеринг страницы 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: Забыл сказать метод является статическим, но я также пытался сделать это не статично, не имеет никакого значения

+0

Я не понимаю, почему это вызовет проблему, которую вы видите, но при возврате нового PrintWriter каждый раз, когда метод вызывается, это плохая идея. Вы всегда должны возвращать тот же PrintWriter. –

+0

Спасибо @JBNizet это сделает, но все же мне нужно выяснить, что там происходит .... –

ответ

0

Код выше работает, я понял, где этот вопрос. На включенной странице JSP было открыто много соединений MySQL, но только один был закрыт. Следовательно, второй запрос ожидал освобождения ресурсов MYSQL перед выполнением задачи. Мне очень жаль, что я этого не замечал до сих пор, и я даже не упоминал о соединениях MySQL. Я предполагаю, что не получаю ответы здесь, заставляю меня найти решение в самом файле JSP.

Смежные вопросы