пересылка ответа на другое действие в стойках и отправка файла в ответ - PullRequest
0 голосов
/ 03 декабря 2018

Я перенаправляю действие в метод doFilter условно в виде следующего кода в другой метод:

    public void dofilter(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
                              HttpServletResponse resp) {
    String reportType = request.getParameter("reportType");
    ActionForward actionForward = null;
    try {

       if (reportType.equals("completedChart")) {
                actionForward = cmsGetCompeltedTasks(mapping, actionForm,request, resp);

    } catch (Exception ex) {
        ex.printStackTrace();
    }

}

, и мой метод, который принимает действие, и ответ генерирует файл отчета о яшмеи отправляет его в ответ:

    public ActionForward cmsGetCompeltedTasks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                          HttpServletResponse response) throws Exception {
            JasperReport jasperReport =                     fileName = COMPLETED_TASK + format.format(new Date()).toString() + ".xlsx";
                String filePath = servlet.getServletContext().getRealPath("") + fileName;
                System.out.println(filePath);
                JRXlsxExporter exporter = new JRXlsxExporter();
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, filePath);
                exporter.exportReport();                
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
                file = new File(filePath);
                FileInputStream fileInputStream = new FileInputStream(filePath);
                OutputStream responseOutputStream = response.getOutputStream();
                int bytes;
                while ((bytes = fileInputStream.read()) != -1) {
                    responseOutputStream.write(bytes);
                }
                responseOutputStream.flush();
                fileInputStream.close();
                 responseOutputStream.close();

        return mapping.findForward("cmsGetCompeltedTasks");


    } catch (Exception e) {
        e.printStackTrace();
    }           finally {
            file.delete();
        }

    return null;

}

Но файл не загружается, и я получаю исключение:

java.lang.IllegalStateException: Cannot forward after response has been committed

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема заключалась в том, что я запускал Ajax-запрос и отправлял файл для загрузки в ответе сервлета, но файл для загрузки был обработан Ajax-запросом в JavaScript при успешном обратном вызове, а не в ответе сервлета. Я обработал проблему, чтобы отправитьпрямой URL-адрес файла, который я хочу загрузить в Ajax, перезвоните и сгенерируйте новый запрос к URL-адресу этого файла.

0 голосов
/ 03 декабря 2018

Вы пишете в ответ в сервлете, и вы должны переместить его в JSP

, только не пишите в ответ в сервлете.Это ответственность JSP.

Переместите строки с помощью response в JSP, который вы перенаправляете на

response.setContentType("application/vnd.openxmlformats- officedocument.spreadsheetml.sheet");
...
...