Смотрите здесь:
PrintWriter out = response.getWriter();
// *snip*
servletOutputStream = response.getOutputStream();
Вы получаете оба Writer
и OutputStream
из ответа. Это не разрешено Прочитайте их Javadocs:
ServletOutputStream getOutputStream() throws java.io.IOException
Возвращает ServletOutputStream
, подходящий для записи двоичных данных в ответе. Контейнер сервлета не кодирует двоичные данные.
Вызов flush()
на ServletOutputStream
фиксирует ответ. Либо этот метод, либо getWriter()
может быть вызван для написания тела, но не обоих.
и
java.io.PrintWriter getWriter() throws java.io.IOException
Возвращает объект PrintWriter
, который может отправлять текстовый символ клиенту. PrintWriter
использует кодировку символов, возвращаемую getCharacterEncoding()
. Если кодировка символа ответа не была указана, как описано в getCharacterEncoding
(т.е. метод просто возвращает значение по умолчанию ISO-8859-1), getWriter
обновляет его до ISO-8859-1.
Вызов flush()
на PrintWriter
фиксирует ответ.
Либо этот метод, либо getOutputStream()
может быть вызван для записи тела, но не обоих.
(акцент мой)
Проблема в вашем конкретном случае гораздо больше. Вы пытаетесь встроить PDF-результат отчета Jasper между этими HTML-тегами в HTML-ответе. Я не уверен, что вы думали или курили, когда писали код, но это определенно не сработает. Вам нужно переписать сервлет таким образом, чтобы он only возвращал PDF, а не эту кучу HTML-шума. Вы должны переместить весь этот HTML из сервлета в какой-нибудь файл JSP. Затем вы можете вызвать этот сервлет по простой ссылке для скачивания в JSP
<a href="yourServletUrl">Download PDF</a>
или внутри <iframe>
(да, в JSP)
<iframe src="yourServletUrl" style="width: 500px; height: 300px;"></iframe>
или <object>
(также здесь, только в JSP)
<object data="yourServletUrl" type="application/pdf" width="500" height="300" />
Просто поместите этот HTML-код на страницу JSP, откройте JSP в браузере, и веб-браузер позаботится о том, чтобы сервлет вызывался и чтобы PDF-файл отображался так, как вы хотели.
Ваша другая проблема в том, что обработка исключений не очень хороша. Таким образом, вы ничего не увидите, поскольку буфер ответов не был сброшен. Вместо этого вы должны делать
} catch (Exception e) {
throw new ServletException("descriptive message here", e);
}
, поскольку контейнер прекрасно знает, как обрабатывать исключения.
То, что и ваши doGet()
и doPost()
делают точно так же, это, кстати, и запах дизайна. Драйвер JDBC, который вы там использовали, полностью устарел и устарел. То, как вы зарегистрировали драйвер, неуклюже. То, что соединение с БД не закрыто в finally
, подвержено утечке ресурсов. Хорошо, я остановлюсь ...