You are on page 1of 2

Relatrio Ireport WEB

No ltimo post publiquei como fazer a execuo de relatrios do ireport com a juda do fileDownload do
primefaces.
Hoje mostrarei como fazer a execuo de relatrios com JSF 2, de uma forma muito boa, no explicarei como
desenhar o relatrio, 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 cdigo, 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 no temos muito segredo, simplesmente estamos passando o local do nosso arquivo *.jasper e mandando o
cdigo 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 = "Formulrio";
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 botes 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 dvida, s perguntar!!!



Relatrio Ireports com Primefaces

Ol amigos, descobri uma maneira muito boa de executar relatrios utilizando o JSF 2 e o primefaces, utilizando
o componente fileDownload.
De acordo com o showcase do primefaces sobre este componente, ele funciona atravs de um recebimento
de um determinado arquivo do tipo StreamedContent, ento resolvi juntar o til ao agradvel ( j tinha visto a
ideia em um post americano, mas melhorei o mtodo para melhor uso ).
Abaixo coloco meu mtodo para chamar o relatrio 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 cdigo, possvel ver que no h misterios, o segredo todo est no exporter onde os parametros
setados para ele, fazem todo o trabalho para transformar o relatrio no final em um arquivo aceitvel para
criao de um DefaultStreamedContent d famlia do StreamedContent xD;
Aqui no caso estou retornando apenas .pdf para exemplificar o post. Mas voc pode criar um mtodo para
controlar qual tipo de sada vai ser, blza? ^_^
No irei colocar a chamada deste mtodo no java, pois s ter um mtodo que faa essa execuo 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 boto um arquivo ser automagicamente baixado pelo seu browser.