Загрузка отчета без запроса пользователя на сохранение

#jsf #jsf-2 #jasper-reports

#jsf ( СПС ) #jsf-2 #jasper-отчеты #jsf

Вопрос:

Я пытаюсь сгенерировать простой отчет в формате PDF с помощью JasperReport одним нажатием кнопки. Вот соответствующий код:

report.xhtml:

<p:commandButton value="#{msg['report.generate']}" action="#{generateReportBean.generateReport}" />

GenerateReportBean.java:

 public void generateReport() throws JRException, IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletResponse response = (HttpServletResponse) externalContext
            .getResponse();

    InputStream reportStream = facesContext.getExternalContext().getResourceAsStream("/WEB-INF/reports/report.jrxml");
    JasperDesign jasperDesign = JRXmlLoader.load(reportStream);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    byte[] report = JasperRunManager.runReportToPdf(jasperReport, new HashMap(), new JREmptyDataSource());

    response.setContentType("application/pdf");
    response.setContentLength(report.length);
    response.setHeader("Content-disposition", "attachment; filename=report.pdf" );

    ServletOutputStream servletOutputStream = response.getOutputStream();
    servletOutputStream.write(report);
    servletOutputStream.flush();
    servletOutputStream.close();
    facesContext.responseComplete();

}
  

Проблема в том, что когда я использую FireBug, я вижу ответ (для меня это нормально):

 X-Powered-By    JSF/2.0
Content-Type    application/pdf
Content-Length  1310
Content-Disposition attachment; filename=report.pdf
Server  Jetty(7.4.0.v20110414)
  

Но я не получаю всплывающее окно, которое позволило бы мне сохранить PDF. Как вы можете видеть, я разрабатываю плагин Jetty 7.4 maven. Я делаю что-то не так здесь?

Ответ №1:

Добавьте ajax = «false» к вашей командной кнопке

 <p:commandButton ajax="false" value="#{msg['report.generate']}" action="#{generateReportBean.generateReport}" />