Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Показать в браузере пользователю отчет, сформированный на сервере JasperReports / 10 сообщений из 10, страница 1 из 1
22.01.2020, 10:15
    #39917152
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Создал эту ветку по совету в https://www.sql.ru/forum/1321444/mozhno-li-sozdat-modelandview-znaya-tolko-imya-html-fayla

Вопрос:

Есть web приложение. Пользователь в окне браузера заполняет параметры отчета и нажимает кнопку "Получить отчет"
Контроллер получает запрос пользователя, обращается к методу сервиса. Сервис, используя JasperReports формирует отчет. Нужно, чтобы пользователь в браузере этот отчет увидел.
Сейчас отчет экспортируется в HTML файл, сохраняется на диск на сервере, а в контроллер возвращается url файла.
Редирект в контроллере проходит, возвращает статус Completed 302 FOUND, но отчет в браузере не открывается.

Как можно сделать отображение отчета в браузере пользователя?
...
Рейтинг: 0 / 0
22.01.2020, 10:25
    #39917156
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Павел Гужанов,
Типа такого
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
response.addHeader("Content-Disposition", "attachment; filename=Universal.pdf");
            response.setContentType("application/pdf");
            ServletOutputStream ouputStream = response.getOutputStream();

            JRPdfExporter pdfExporter = new JRPdfExporter();
            pdfExporter.setParameter(JRExporterParameter.
                    JASPER_PRINT, jasperPrint);
                    pdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                    ouputStream);
            pdfExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,"win1251");                         
            
            pdfExporter.exportReport();     

            ouputStream.flush();
            ouputStream.close();
...
Рейтинг: 0 / 0
22.01.2020, 10:46
    #39917162
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
PetroNotC Sharp,
Насколько я понял, в моем случае вместо pdf нужно использовать html.
Вот только не пойму, в каком месте это использовать, в сервисе или в контроллере?
...
Рейтинг: 0 / 0
22.01.2020, 10:55
    #39917164
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Павел Гужанов,
Если много БЛ то в сервис. Если мало, то и сам сервис не нужен. Можно и контроллере хибером рулить.
...
Рейтинг: 0 / 0
22.01.2020, 11:52
    #39917217
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Сделал вот так.
Это в контроллере:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@PostMapping(value = "getReport")
public void getReport(@RequestBody MainRequest<WebReportRequestDTO> request, HttpServletResponse res) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
        WebReportRequestDTO req = request.getRequest();
        File file = webReportService.createReportView(req.getReportParams());
        String content = new String(Files.readAllBytes(file.toPath()));
        res.setContentType("text/html");
        res.setCharacterEncoding("UTF-8");
        OutputStream out = res.getOutputStream();
        out.write(content.getBytes("UTF-8"));
        out.flush();
        out.close();
}



Это в сервисе:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public File createReportView(WebReportParamsDTO params, String templateName) throws JRException, ParseException, IOException {
        // Здесь идет параметров и данных для отчета
        ...
        JasperPrint print = JasperFillManager.fillReport(jasperReport, reportParams, beanColDataSource);

        String fileName = templateName + String.valueOf(new Date().getTime());

        JasperExportManager.exportReportToHtmlFile(print, "c:/" + fileName + ".html");
        File file = new File("c:/" + fileName + ".html");
        return file;
    }


На диске файл создается.
В контроллере String content - содержимое html файла.
Получаю в ответ статус 200, но в браузере не показывается ничего
...
Рейтинг: 0 / 0
22.01.2020, 12:02
    #39917226
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Павел Гужанов,
Убери jasper
На клиенте F12 - отладка. Скрины сюда.
В контроллере отправь слово Привет чтобы показалось в браузере.
...
Рейтинг: 0 / 0
22.01.2020, 12:14
    #39917236
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
офтопик, если файлы потом юзером не используются, то есть не остается ссылок пользователю на них, чтобы он скачал старый отчет, то лучше не хранить вообще отчеты, а отдавать клиенту и всё. А то будет свалка на сервере через полгода.
...
Рейтинг: 0 / 0
22.01.2020, 12:20
    #39917244
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Nixic,

Тоже хотел вставить.
Да Петро уже показал пример без файлов. Прямо в первом ответе. Писать надо сразу из джаспера в OutputStream.
Ну пусть ТС с файлом отладится, заменить потом файл на стрим дело 5 копеек
...
Рейтинг: 0 / 0
22.01.2020, 12:34
    #39917252
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
PetroNotC Sharp,
Извиняюсь, это я лопухнулся.
Запрос на сервер отправляется через javaScript. И ответ тоже приходит туда. А я ждал его сразу в браузере.
Добавил в javaScript вывод на страницу ответа - все заработало.

Спасибо за помощь и за пинок в нужном направлении.
...
Рейтинг: 0 / 0
22.01.2020, 12:40
    #39917254
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Павел Гужанов
Код: java
1.
        File file = new File("c:/" + fileName + ".html");

На диске файл создается.
В контроллере String content - содержимое html файла.
Получаю в ответ статус 200, но в браузере не показывается ничего
1. У веб-сервера есть ограничения на доступ к локальной файловой системе. Без такого ограничения злоумышленник имеет возможность читать любые файлы, к которым есть доступ у серверного процесса.
Поэтому есть некоторая область (каталог на диске), которая отображается в некоторый контекст веб-сервера. Например:
Код: plaintext
c:/static/jasper -> /reports
Это отображение должно быть настроена в вашем веб-сервере.
Далее.
Клиент обратился к одному ресурсу и на сервере начался процесс формирования отчёта.
По завершению сервер должен сообщить клиенту где можно забрать отчёт. Для этого используется код перенаправления.
Т.е. ваш сервис выставляет статус и (относительный) URL. Пример:
Отчёт сформирован в c:/static/jasper/xxl.html, клиенту отправляется статус 301 и URL /reports/xxl.html.
Дальше работает браузер клиента.

P.S.
Гораздо проще делать так, как предложил PetroNotC Sharp.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Показать в браузере пользователю отчет, сформированный на сервере JasperReports / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]