Relatório Ireport WEB

3
Relatório Ireport WEB No último post publiquei como fazer a execução de relatórios do ireport com a juda do fileDownload do primefaces. Hoje mostrarei como fazer a execução de relatórios com JSF 2, de uma forma muito boa, não explicarei como desenhar o relatório, existem muitos tutoriais que ensinam isso, explicarei aqui como executa-los de uma forma adequada. Dica: Sempre que desenvolver um projeto WEB, coloque seus recursos, inclusive seus arquivos *.jasper e *.jrxml dentro da pasta WebContent. Abaixo coloco o código, que por si só, já é auto-explicativo: public void gerarRelatorio(String localRelatorio, Map<String, Object> parametros , Collection<T> lista) throws MalformedURLException{ ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); ServletContext contextS = (ServletContext) externalContext.getContext(); ServletOutputStream servletOutputStream = null; FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); String arquivo = contextS.getRealPath("/relatorios/" + localRelatorio); try { servletOutputStream = response.getOutputStream(); JasperRunManager.runReportToPdfStream(new FileInputStream(new File(arquivo)), response.getOutputStream(), parametros, new JRBeanCollectionDataSource(lista)); response.setContentType("application/pdf"); servletOutputStream.flush(); servletOutputStream.close(); context.renderResponse(); context.responseComplete(); } catch (JRException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } Aqui não temos muito segredo, simplesmente estamos passando o local do nosso arquivo *.jasper e mandando o código compila-lo e fazemos o processo para que ele seja executado perfeitamente na web. Abaixo coloco a chamada feita no Bean: public void gerarRelatorio() throws MalformedURLException{ try{ Map<String, Object> parametros = new HashMap<String, Object>(); parametros.put("REPORT_LOCALE", new Locale("pt", "BR")); String nomeArquivoSaida = "Formulário"; Collection<SeuObjeto> lista= new ArrayList<SeuObjeto>(); lista = seuDAO.buscarTodos(); gerar(CAMINHO_SEU_JASPER, parametros, lista, nomeArquivoSaida); }catch(Exception e){ LOG.error(e.getMessage(), e); } return null;

Transcript of Relatório Ireport WEB

Page 1: Relatório Ireport WEB

Relatório Ireport WEB

No último post publiquei como fazer a execução de relatórios do ireport com a juda do fileDownload do primefaces.Hoje mostrarei como fazer a execução de relatórios com JSF 2, de uma forma muito boa, não explicarei como desenhar o relatório, existem muitos tutoriais que ensinam isso, explicarei aqui como executa-los de uma forma adequada.Dica: Sempre que desenvolver um projeto WEB, coloque seus recursos, inclusive seus arquivos *.jasper e *.jrxml dentro da pasta WebContent.Abaixo coloco o código, que por si só, já é auto-explicativo:

public void gerarRelatorio(String localRelatorio, Map<String, Object> parametros , Collection<T> lista) throws MalformedURLException{

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();ServletContext contextS = (ServletContext) externalContext.getContext();

ServletOutputStream servletOutputStream = null;FacesContext context = FacesContext.getCurrentInstance();HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();String arquivo = contextS.getRealPath("/relatorios/" + localRelatorio);

try {servletOutputStream = response.getOutputStream();JasperRunManager.runReportToPdfStream(new FileInputStream(new File(arquivo)), response.getOutputStream(), parametros, new JRBeanCollectionDataSource(lista));

response.setContentType("application/pdf");servletOutputStream.flush();servletOutputStream.close();context.renderResponse();context.responseComplete();

} catch (JRException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

Aqui não temos muito segredo, simplesmente estamos passando o local do nosso arquivo *.jasper e mandando o código compila-lo e fazemos o processo para que ele seja executado perfeitamente na web. Abaixo coloco a chamada feita no Bean:

public void gerarRelatorio() throws MalformedURLException{try{Map<String, Object> parametros = new HashMap<String, Object>();parametros.put("REPORT_LOCALE", new Locale("pt", "BR"));String nomeArquivoSaida = "Formulário";Collection<SeuObjeto> lista= new ArrayList<SeuObjeto>();lista = seuDAO.buscarTodos();gerar(CAMINHO_SEU_JASPER, parametros, lista, nomeArquivoSaida);}catch(Exception e){LOG.error(e.getMessage(), e);}return null;}

Só darei a dica que utilize chamadas seja em botões ou links, sem ser ajax e caso queira que ele execute em outra aba do navegador, só fazer com que seu onclick tenha um target = “_blank”.Espero que tenha ajudado. Qualquer dúvida, só perguntar!!!

Relatório Ireports com Primefaces

Page 2: Relatório Ireport WEB

Olá amigos, descobri uma maneira muito boa de executar relatórios utilizando o JSF 2 e o primefaces, utilizando o componente fileDownload.De acordo com o showcase do primefaces sobre este componente, ele funciona através de um recebimento de um determinado arquivo do tipo StreamedContent, então resolvi juntar o útil ao agradável ( já tinha visto a ideia em um post americano, mas melhorei o método para melhor uso ).Abaixo coloco meu método para chamar o relatório desenvolvido no ireport:

public StreamedContent gerarRelatorio(String localRelatorio, Map<String, Object> parametros , Collection<T> lista, String nomeArquivoSaida) throws MalformedURLException{

InputStream relatorio = null;ByteArrayOutputStream relat = new ByteArrayOutputStream();ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();ServletContext contextS = (ServletContext) externalContext.getContext();String arquivo = contextS.getRealPath("/relatorios/" + localRelatorio);

try {

JasperPrint print = JasperFillManager.fillReport(new FileInputStream(new File(arquivo)), parametros, new JRBeanCollectionDataSource(lista));JRExporter exporter = new JRPdfExporter();exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, relat);exporter.exportReport();relatorio = new ByteArrayInputStream(relat.toByteArray());

} catch (JRException e) {LOG.error(e.getMessage(), e);e.printStackTrace();} catch (IOException e) {LOG.error(e.getMessage(), e);e.printStackTrace();} catch (Exception e){LOG.error(e.getMessage(), e);}return new DefaultStreamedContent(relatorio, "application/pdf", nomeArquivoSaida + ".pdf");}

Analisando o código, é possível ver que não há misterios, o segredo todo está no “exporter” onde os parametros setados para ele, fazem todo o trabalho para transformar o relatório no final em um arquivo aceitável para criação de um DefaultStreamedContent dá família do StreamedContent xD;Aqui no caso estou retornando apenas .pdf para exemplificar o post. Mas você pode criar um método para controlar qual tipo de saída vai ser, blza? ^_^Não irei colocar a chamada deste método no java, pois é só ter um método que faça essa execução e retorne um StreamedContent para o click que será dado no componente “fileDownload” do primefaces. O qual mostro abaixo:

<p:commandButton value="Gerar relatorio" ajax="false" icon="ui-icon-arrowthichk-s"><p:fileDownload value="#{seuBean.gerarRelatorioTeste()}"></p:fileDownload></p:commandButton>

Ao clicar no botão um arquivo será automagicamente baixado pelo seu browser.