Estou tentando fazer com que a aplicação consiga gerar mais de um arquivo na mesma requisição. Preciso que o usuário clique uma vez no botão "emitir relatório" e a aplicação consiga gerar vários relatórios diferentes de uma vez.
@Named
@RequestScoped
public class GeradorRelatorios implements Serializable {
private static final long serialVersionUID = 1L;
private HttpServletResponse response;
private FacesContext context;
private InputStream stream;
public GeradorRelatorios() {
this.context = FacesContext.getCurrentInstance();
this.response = (HttpServletResponse) context.getExternalContext().getResponse();
}
public void getRelatorio(List<?> lista, Map<String, Object> params, String path, String nomeRelatorio) {
stream = this.getClass().getResourceAsStream(path);
context.getExternalContext().getFlash().setKeepMessages(true);
try {
JasperPrint print = null;
JasperReport jasper = (JasperReport) JRLoader.loadObject(stream);
print = JasperFillManager.fillReport(jasper, params, new JRBeanCollectionDataSource(lista));
// attachment; inline;
response.addHeader("Content-disposition", "attachment; filename=" + nomeRelatorio);
ServletOutputStream servletOutputStream = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(print, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
System.out.println("======================================");
} catch (JRException e) {
context.addMessage(null, new FacesMessage(e.toString()));
e.printStackTrace();
} catch (IOException e) {
context.addMessage(null, new FacesMessage(e.toString()));
e.printStackTrace();
} catch (Exception ex) {
context.addMessage(null, new FacesMessage(ex.toString()));
ex.printStackTrace();
ex.getMessage();
} finally {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}