Есть много проблем с кодом. Давайте возьмем их по одному за раз.
Загрузка драйвера JDBC
Сбой следующего кода:
Class.forName("org.postgresql.postgresql-42.2.2");
Это не класс, это ссылка на архив Java, который содержит класс драйвера. Документация PostgreSQL предлагает следующий пример использования драйвера JDBC:
String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("ssl","true");
Connection conn = DriverManager.getConnection(url, props);
-или-
String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
Connection conn = DriverManager.getConnection(url);
Вам нужно убедиться, что org.postgresql.postgresql-42.2.2.jar находится где-то в пути к классам, чтобы можно было найти класс драйвера.
Файл отчета не указан
Следующий код не может быть правильным:
String report = "";
Здесь необходимо указать путь для загрузки файла JRXML. Например:
String report = "reports/Template.jrxml";
AWT против JSF?
Следующая строка предполагает, что настольное приложение пишется из-за его ссылки на AWT ActionEvent:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Однако отчет экспортируется в поток вывода ответа, который предполагает запись в веб-браузер:
JasperExportManager.exportReportToPdfStream(jp, response.getOutputStream());
JasperReports плохо работает с выходными потоками JSF. Вместо этого вы захотите использовать сервлет с JasperReports и использовать простой h:commandLink
или h:commandButton
, чтобы начать генерацию отчета с веб-страницы.
Подробнее см. https://stackoverflow.com/a/35698286/59087.
Переменная ответа
Переменная ответа не объявлена в предоставленном фрагменте кода. При использовании сервлета переменная ответа предоставляется сигнатурой метода :
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
// ... your code here to handle generating report ...
}
Теперь переменная response
доступна для использования, но только из контекста сервлета.
Принцип СУХОГО
В качестве незначительного примечания следующие три строки нарушают принцип DRY :
JasperExportManager.exportReportToPdfStream(jp, response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
Вместо этого вы можете написать:
OutputStream out = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jp, out);
out.close();
Обычно нет необходимости вызывать out.flush()
, потому что out.close()
обеспечит сброс данных.
Рекомендация
Посмотрите в Интернете примеры, показывающие, как создать отчет с использованием сервлета.
https://github.com/deadlydirk/jasperreports-example/blob/master/src/main/java/be/example/jasper/servlet/ReportServlet.java
Кроме того, рассмотрите возможность работы с базовым приложением, которое вы можете запустить из командной строки, прежде чем пытаться сделать что-то настолько сложное, как техническая интеграция с сервлетом для веб-приложения.
http://www.ewebtutorials.com/generate-pdf-report-using-jasper-report-api-in-java.html