次のメソッドで 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 で実行しているサーブレットの一部です。これは最初は完全に機能しますが、2 回目の実行でインクルード呼び出しでハングします (つまり、ブラウザーで更新をクリックした場合)。
ディスパッチャーが 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
2 回目の実行 (応答が返されない、つまり、ブラウザーは常にページを読み込んでいます):
26-Feb-2015 17:41:26.327 INFO [http-nio-8081-exec-8] ism.Reports.readTemplate Reading template /templates/INCIDENT_REPORT.jsp ...
これは、Tomcat を再起動するまで変わりません。
誰かが私が間違っていること、または少なくともこれをデバッグする方法を説明できますか? ありがとう!
編集1:メソッドが静的であると言うのを忘れましたが、静的ではないものにしてみましたが、違いはありませんでした