Relatório Ireport WEB
-
Upload
nando-matheus -
Category
Documents
-
view
31 -
download
0
Transcript of 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
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.