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

Вопрос:

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

Как можно сделать отображение отчета в браузере пользователя?
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917156
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Типа такого
Код: 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
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917162
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
Насколько я понял, в моем случае вместо pdf нужно использовать html.
Вот только не пойму, в каком месте это использовать, в сервисе или в контроллере?
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917164
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Если много БЛ то в сервис. Если мало, то и сам сервис не нужен. Можно и контроллере хибером рулить.
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917217
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вот так.
Это в контроллере:
Код: 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
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917226
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Убери jasper
На клиенте F12 - отладка. Скрины сюда.
В контроллере отправь слово Привет чтобы показалось в браузере.
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917236
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
офтопик, если файлы потом юзером не используются, то есть не остается ссылок пользователю на них, чтобы он скачал старый отчет, то лучше не хранить вообще отчеты, а отдавать клиенту и всё. А то будет свалка на сервере через полгода.
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917244
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

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

Спасибо за помощь и за пинок в нужном направлении.
...
Рейтинг: 0 / 0
Показать в браузере пользователю отчет, сформированный на сервере JasperReports
    #39917254
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Код: 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
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Показать в браузере пользователю отчет, сформированный на сервере JasperReports
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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