olá Pessoal,
No post de hoje, vou apresentar como gerar relatorios de uma base de dados sendo uma aplicação JEE. Em outro post, mostrei como gerar relatorios usando Java Basico com Hibernate, aqui vamos manter a mesma estrutura técnica a diferença apenas que será com foco para JEE. Espero que gostem.
Lets go…
Requisitos
Starting…
Para gerar relatorios em ambiente JEE, há algumas mudancas a nivel de codigo que sofrem alterações, porem tudo de ireport com BD é mantido.
passo 1
- criar o layout no ireport e fazer a conexao com o banco de dados e definir as colunas do relatorio, enfim definir a estrutura do relatorio
passo 2
- criar a classe de conexao com banco de dados – Hibernate
- Criar o bean
passo 3
- cria um package exclusivo para o relatorio e uma classe, por questao de organizacao importar o jrxml para o projeto e para o package do relatorio por medida de seguranca
passo 4
- para que o arquivo seja gerado na pagina WEB, eh preciso mudar algumas coisas no metodo responsavel por gerar o relatorio:
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
InputStream caminho = getClass().getResourceAsStream(“../relatorio/reportblog.jrxml”);
response.setContentType(“application/pdf”);
-
criar um context e objetos de resposta.
-
Fazemos um stream do caminho onde esta o jrxml. Quando temos dois pontos antes da barra significa que temosum caminho diferente da classe que gera o relatorio
- depois um response que informa o tipo do conteudo para o browser saber qual aplicativo chamar caso ele tenha suporte response.setContentType(“application/pdf”);
Na linha a seguir informamos como sera o nome do arquivo a ser gerado
response.setHeader(“Content-Disposition”,”attachment; filename=\”relatorio.pdf\””);
Abaixo temos o padrao para invocao
JasperReport pathReport = JasperCompileManager.compileReport(caminho);
//relatorio gerado
JasperPrint preencher = JasperFillManager.fillReport(pathReport, null,new JRBeanCollectionDataSource(listaUS));
JasperExportManager.exportReportToPdfStream(preencher,responseStream);
responseStream.flush();
responseStream.close();
context.renderResponse();
context.responseComplete();
O resultado
O resultado eh que ao inves de ter um arquivo que é direcionado para um local, ele aparece no browser (firefox, Chrome, IE) do usuario. E o browser decide como vai apresentar esse arquivo. Por exemplo, no FireFox, ele aprende o arquivo no proprio Browser, no Internet Explorer ele abre uma Janela onde o usuario decide se vai abrir ou fazer o download.
JasperViewer
O JasperViewer eh forma de exibir o relatorio em applet, ao inves de usar o browser, pode ser ate mais amigavel que usar o proprio browser, mas deve ser analizado o tempo de carregado disso em producao, basta adiciona a linha abaixo
JasperViewer.viewReport(preencher, false);
E desabilitar as linhas referente ao browser, para que nao seja executada em paralelo
response.setContentType(“application/pdf”);
response.setHeader(“Content-Disposition”,”attachment; filename=\”relatorio.pdf\””);
Vou ficando por aqui, espero que tenham gostado do post.
Abracos, see ya! Have a nice week, guys!
Opa camilo, beleza?
Tem como disponibilizar o projeto desse post?
Desde já agradeço
att
Jeferson Costa
Camilo tudo bem?
prezado tenho encontrado alguns problemas para “Ver” o relatorio no meu projeto ( JSF + Spring 3 para IOC, JPA + Primefaces ) passei ja por algumas etapas e acho que agora perto de funcionar deu um problema e pesquisando encontrei este seu blog
primeiro tive problemas em achar o arquivo jrxml
String jasper = context.getExternalContext().getRealPath(“WEB-INF/reports/rcpapel.jrxml”);
InputStream jasperStream = getClass().getClassLoader().getResourceAsStream( jasper );
if (jasperStream == null) {
throw new ReportException(“Erro abrindo arquivo ‘” + jasper + “‘ não foi encontrado”);
}
e com isto sai criando pasta com o relatorio em diversas partes do projeto, no raiz, no web-inf, no scr e não conseguia nada, eu chamo o relatorio de dentro de uma pagina JSF
mais consegui resolver apenas desta maneira
URL jasper = this.getClass().getResource(“/reports/rcpapel.jrxml”);
bem apos isto tudo indicaria que o relatorio iria rodar mais
vem o erro java.lang.IllegalStateException: getOutputStream() has already been called for this response
e pelo que li tem a ver com o ciclo de vida do faces ( bem não cheguei a tanto em meus estudos para saber como contornar isto )
mais pelo visto vc esta usando o JSF vc teria como disponibilizar o projeto ?
ou alguma dica do que posso fazer?
Olá Robson,
Vc não pode colocar o arquivo dentro de web-inf. pela regra basica de web-inf, de não ter outros arquivos alem do que vai ser deployed.
E sobre o segundo erro eu tive ele com JSF e a solução está neste post. É ali onde tá o response. Sobre o projeto manda um email atraves do botao de contato do blog que envio para vc.
flw.
Olá Camilo bom dia
Prezado utilizei as informações descritas por vc, pela similaridade de framework que vc utiliza, so que no meu projeto no log do Eclipse percebo o relatorio ser compilado, como tenho 4 registros na tabela também percebo que apos a compilação, no log aparece algo que identifico como o detalhe aparecendo 4 vezes ( ou seja o numero de registros que eu tenho ) mais, o relatorio não aparece, nem no IE, nem no Mozilla vc teria alguma dica do que pode estar ocorrendo?
Caro Camilo, observei novamente o seu post, linha a linha e no meu projeto não encontrei problema algum, de qualquer forma usando o Mozilla, ou o IE o relatorio não aparece contudo o log do Eclipse mostra que o relatorio foi compilado e não percebo erros então, resolvi comentar as linhas que mostrariam o relatorio no Navegador, isto porque vi o JasperViewer
então resolvi testar ( já que não encontro um porque do relatorio não aparecer ) e dai que
usando o JasperViewer o relatorio aparece.
Prezado olha faz tempo que tô tentando fazer isto, tempo mesmo mais, agora o que tem de errado no meu projeto com relação ao navegador? seria o windows 7? seria o navegador? os dois? o JSF?
Prezado boa tarde, consegui resolver o problema, até ja tinha desistido dos relatorios.
Como eu uso o primefaces e chamo o relatorio por um botão, foi apenas colocar a propriedade ajax = false
poderia mandar o projeto atualizado?
Consegui fazer abrir um PDf, mas está vindo em branco, sem o layout que criei. Será que pode me ajudar?