iReport com JSF

15 respostas
Dassayev

Boa tarde pessoal!

Tenho uma aplicação web usando JSF. Criei um relatório no iReport. Mas não estou sabendo como utilizar ele na web. Tenho uma página de consulta. Nessa página existem vários filtros e um botão. Eu queria que quando o botão fosse acionado a query fosse executada e a página com o relatório fosse aberta. Já está funcionado com a query sendo executada. Quando clico no botão a query é executada pelo Hibernate e é me retornada uma lista de Objetos. O problema é que não sei como atribuir esses objetos ao relatório do iReport e nem abrir esse relatório.

Alguém poderia me ajudar!!

15 Respostas

rdmardegam

Entao amigo, o seu relatório é simplesmente uma lista exibindo o resultado da consulta? Ou Um relatorio com subReport e td mais?

Enfim, você pode passar uma lista para o relatório renderizala ou parametros, ou os 2.

Enfim, supondo q vc fez sua lista e possui uma colecao do objeto Funcionario.

// Lista a ser exportada
Collection lista = new ArrayList().

// Adicionando na lista de Funcionarios
list.add(new Funcionario("NOME1", "25", "RH"));
list.add(new Funcionario("NOME2", "22", "TI"));
list.add(new Funcionario("NOME3", "26", "FN"));

// Parametros do relatorio, no caso sem nenhum parametro
Map parameters = new HashMap();

// Gera o JasperPrint do relatorio
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Relatorio.jasper", parameters, new JRBeanCollectionDataSource(lista));

// Criando arquivo PDF
byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
// Adicionando informações para o response p transferencia
response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();

Qualquer duvida se puder ajudar, so falar.

Abraço.

Dassayev

Como pego a response dentro da minha classe JAVA? Poque na minha classe FuncionarioBean, por exemplo, eu tenho a lista com os objetos mas não tenho a response.

rdmardegam

Mas a propia classe FuncionarioBean vai ser responsavel por efetuar a exportação?

Se sim, tente passar o response para ela como parametro ou instanciar.

Dassayev
O meu código ficou assim:
public void imprimirRelatorio() {
        try {
            SolicitacaoDAO sDao = (SolicitacaoDAO) this.getDao();
            List lista = sDao.geraRelatorio(this.getSolicitacao());

            FacesContext context = FacesContext.getCurrentInstance();
            ServletResponse response = (ServletResponse) context.getExternalContext().getResponse();

            // Parametros do relatorio, no caso sem nenhum parametro
            Map parameters = new HashMap();

            // Gera o JasperPrint do relatorio
            JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Relatorio.jasper", parameters, new JRBeanCollectionDataSource(lista));

            // Criando arquivo PDF
            byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
            // Adicionando informações para o response p transferencia
            response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));
            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            response.getOutputStream().write(bytes);
            response.getOutputStream().flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Mas ficou com erro na linha:
response.addHeader("Content-Disposition", "attachment;filename=\"".concat("nomeRelatorio.pdf"));

Esse método não existe. O que eu fiz de errado?

rdmardegam

Qual o erro gerado?

Veja se o objeto response não está nulo.

Pelo que percebi, vc esta recuperando o Response:
ServletResponse response = (ServletResponse) context.getExternalContext().getResponse();

Na veradade, acredito que vc tenha que recuperar o HttpServletResponse

Dassayev

Ok. Peguei o HttpServletResponse. O erro parou de acontecer mas o relatório não é exibido.

SolicitacaoDAO sDao = (SolicitacaoDAO) this.getDao();
List lista = sDao.geraRelatorio(this.getSolicitacao());

FacesContext context = FacesContext.getCurrentInstance();
            
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

// Parametros do relatorio, no caso sem nenhum parametro
Map parameters = new HashMap();

// Gera o JasperPrint do relatorio
JasperPrint jasperPrint = JasperFillManager.fillReport("D:\\solicitacao.jasper", parameters, new JRBeanCollectionDataSource(lista));

// Criando arquivo PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "D:\\solicitacao.pdf");
byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
// Adicionando informações para o response p transferencia
response.addHeader("Content-Disposition", "attachment;filename=\"".concat("solicitacao.pdf"));
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
rdmardegam

O relatorio pelo menos está aparecendo em d:\solicitacao.pdf ?

Dassayev

Não!

rdmardegam

Era pelo menos para estar gravando neste diretório! Veja se o código está passando corretamente por este ponto.

Dassayev

Está gerando o seguinte erro:

java.lang.NullPointerException at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:176) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1846) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:88) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:515) at br.com.jdsistemas.sri.bean.SolicitacaoBean.imprimirRelatorio(SolicitacaoBean.java:95) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.el.parser.AstValue.invoke(AstValue.java:172) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91) at javax.faces.component.UICommand.broadcast(UICommand.java:383) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321) at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:619)

Esse erro é gerado quando passa pela instrução:

JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(lista);//Aqui passa JasperPrint jasperPrint = JasperFillManager.fillReport("D:/solicitacao.jasper", parameters, beanCollectionDataSource);//Aqui da erro

Dassayev

Alguém teria alguma solução?

Desde já agradeço!!!

fbarreto

Bom naum sei se eh isso mas derrepente,
os campos no seu relatorio estao com os mesmos nomes do atribustos da lista que vc passa para o ireport??
por exemplo se sua lista for de um tipo Pessoa e contiver os atribustos nome e telefone la no seu relatorio vc tera que ter exatamente os values com este nomes.

Dassayev

Tentei fazer do geito que você falou fBarreto. Mas quando vou compilar o relatório, para gerar o arquivo JASPER, é informado que os campos não existem.
Já tentei de um tudo mas não consigo.

Dassayev

Alguém sabe como resolver isso pessoal?

L

cara se ta dizendo que os campos nao existem ,pode ser pq vc criou os values mas naum alterou os nomes nos TextField.
Verifique se os values e os seus campos texto estao com as referencias corretas:
tipo se vc tem um value com nome Telefone entaum seu campo texto no relatorio que representa este cara tem que ter a seguinte expressao:

$F{Telefone}, se naum me engano isso e sensitive.

Criado 27 de maio de 2010
Ultima resposta 9 de jun. de 2010
Respostas 15
Participantes 4