Como chamar relatórios feitos em ireport em uma aplicação feita em JSF + RichFaces? (resolvido)

9 respostas
X

Boa noite pessoal!

Alguém sabe como posso chamar um relatório feito em Ireport em uma aplicação construida com JSF + RichFaces? Pois da maneira que estou fazendo só funciona se não estiver utilizando o RichFaces. Segue a maneira como fiz, se alguém souber como modificar para funcionar com o RichFaces…
Qualquer idéia é bem vinda! Obrigado!

public void imprimir(String relatorio, HashMap<String, Object> parametros, HttpServletResponse response, Connection conexao) {
        try {
            byte[] arquivo = new byte[0];

            String caminho = getDiretorioReal("Relatorios/"+ relatorio + ".jasper");
            JasperReport jasper = (JasperReport) JRLoader.loadObject(caminho);
            JasperPrint print = JasperFillManager.fillReport(jasper, parametros, conexao);
            arquivo = JasperExportManager.exportReportToPdf(print);

            response.setContentType("application/pdf");
            response.setContentLength(arquivo.length);

            OutputStream saida = response.getOutputStream();

            saida.write(arquivo, 0, arquivo.length);
            saida.flush();
            saida.close();

        } catch (Exception ex) {
            System.err.println("O arquivo não foi gerado corretamente!");
            ex.printStackTrace();
        }
    }

9 Respostas

R

Qual o erro que acontece? O botao que esta chamando esse metodo eh a4j?

X

Olá rollei! Obrigado por responder!

Não acontece erro algum! Isso que é mais estranho! Simplesmente não acontece nada.
Eu estou chamando o método atraves de um commandlink.

Tem alguma sugestão?

R

Olá,

Da maneira tradicional, você não pode exibir o relatório com algum componente AJAX, no caso os componentes do Richfaces/Ajax4jsf. Pois os componentes AJAX trabalham com a atualização parcial de páginas (XHTML), como o response completo da tua página será um arquivo binário (no caso o pdf) o Richfaces não sabe como se comportar, daí o problema. A requisição AJAX funciona normalmente, porém o erro ocorre durante a renderização.

A dica é você trabalhar com os componentes que efetuam submit’s normais, como h:commandLink ou h:commandButton, por exemplo.

Abraços e boa sorte.

X

Apenas para efeito de informação caso alguém precise.
Conegui resolver incluindo no final do meu código o seguinte trecho (sem aspas): “FacesContext.getCurrentInstance().responseComplete();”.
Agradecimento especial ao rponte pela ajuda!

Abraços…

P

Boa Noite
Galera.

Sou novo aq e estou tendo dificuldades para chamar um relatorio em uma aplicação swing. Eu criei o relatorio em jasper mais não sei como fazer para chamar este relatorio em minha aplicação. Alguem poderia me ajudar?


Na minha aplicação tem uma tela de Emprestimo de filme, com uma tabela quando faço um emprestimo ele é armazenado no banco MySql e na tabela. Com o jasperreport e ireport criei um relatorio com o nome de "Relatorios_Emprestimos" em um pacote Relatorios. Editei a tela de emprestimo e coloquei um Botao "Relatorio" e dentro desse botao inseri o seguinte codigo...
InputStream isJasper =  new FileInputStream (sisoficio/relatorios/RelOficiosExpedidos.jasper);

JasperReport relatoriosJasper = (JasperReport) JRLoader.loadObject( isJasper );

JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
JasperPrint rel = null;
try {

HashMap param = new HashMap();

// param.put(“logotipo”,path.getDirImages()+“brasao.gif”);

rel = JasperFillManager.fillReport(relatoriosJasper, param, jrRS);

} catch (JRException e) {

e.printStackTrace();

}
JasperViewer viewer = new JasperViewer(rel,true);   
      viewer.show();  
            InputStream isJasper =  new FileInputStream ("sisoficio/relatorios/RelOficiosExpedidos.jasper");  
            JasperReport relatoriosJasper = (JasperReport) JRLoader.loadObject( isJasper );	                
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
                           
            JasperPrint rel = null;
	try {
                HashMap param = new HashMap();
               // param.put("logotipo",path.getDirImages()+"brasao.gif");
                rel = JasperFillManager.fillReport(relatoriosJasper, param, jrRS);
	} catch (JRException e) {
                e.printStackTrace();
	}        
        
        JasperViewer viewer = new JasperViewer(rel,true);
        viewer.show();


     So que não sei como fazer para ele rodar.... 
     Estou utilizando o NetBeans 6.7

Alguem sabe.

J
public void imprimir(String relatorio, HashMap<String, Object> parametros, HttpServletResponse response, Connection conexao) {

try {

byte[] arquivo = new byte[0];
String caminho = getDiretorioReal("Relatorios/"+ relatorio + ".jasper");  
    JasperReport jasper = (JasperReport) JRLoader.loadObject(caminho);  
    JasperPrint print = JasperFillManager.fillReport(jasper, parametros, conexao);  
    arquivo = JasperExportManager.exportReportToPdf(print);  

    response.setContentType("application/pdf");  
    response.setContentLength(arquivo.length);  

    OutputStream saida = response.getOutputStream();  

    saida.write(arquivo, 0, arquivo.length);  
    saida.flush();  
    saida.close();  

} catch (Exception ex) {  
    System.err.println("O arquivo não foi gerado corretamente!");  
    ex.printStackTrace();  
    [b]FacesContext.getCurrentInstance().responseComplete();[/b]
}

}

J

Xande_cf , posta aqui o resto do coido formularios conecção etc…

K

Olá rponte, bom dia.

Cara, pelo que li, existe uma imcompatibilidade entre o richfaces e o jasperreports. Segundo o que vc disse, deve-se utilizar os componentes inerentes do jsf (http://java.sun.com/jsf/html), é isso??
Eu estou usando um h:commandButton dentro de um rich:dataTable ou dentro de um a4j:form: isso atrapalha a renderização durante a execução do método que gera o relatório??

O mais estranho é que, quando a aplicação é rodada pelo eclipse, mesmo com o tomcat6, ele apresenta tudo certinho, gerando todos os relatórios, porém, quando eu passo a mesma para rodar pelo servidor em arquivo .WAR, ela me funciona tudo, mas na hora de gerar os relatórios, ela dá aquele erro:

Servlet response already use stream, Writer not possible

Cara, se tu puder ajudar nisso, fico muito agradecido.

Valeu man.
Deus te abençoe.

rponte:
Olá,

Da maneira tradicional, você não pode exibir o relatório com algum componente AJAX, no caso os componentes do Richfaces/Ajax4jsf. Pois os componentes AJAX trabalham com a atualização parcial de páginas (XHTML), como o response completo da tua página será um arquivo binário (no caso o pdf) o Richfaces não sabe como se comportar, daí o problema. A requisição AJAX funciona normalmente, porém o erro ocorre durante a renderização.

A dica é você trabalhar com os componentes que efetuam submit’s normais, como h:commandLink ou h:commandButton, por exemplo.

Abraços e boa sorte.

M

Bom dia senhores.
Estou com o mesmo problema utilizando o richfaces.
Encontraram solução…funcionar apenas com JSF puro.
Segue codigo.

public static void executarRelatorio(String caminhoRelatorio, Map<String, Object> parametros, String nomeRel, JRBeanCollectionDataSource fonteDados, TipoFormatoRelatorio tipoFormatoRelatorio) throws ReportException
{
	FacesContext context = FacesContext.getCurrentInstance();
	HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
	// pega o caminho do arquivo .jasper da aplicação
	parametros.put("SUBREPORT_DIR", context.getExternalContext().getRealPath("/relatorios") + "/");
	InputStream reportStream = context.getExternalContext().getResourceAsStream(caminhoRelatorio);
	response.setHeader("Cache-control", "must-revalidate");
	response.setDateHeader("Expires", 0);
	// response.setHeader("Content-Disposition", "attachment; filename=" +
	// nomeRel + ".pdf");
	response.setHeader("Content-Disposition", "inline; filename=" + nomeRel + ".pdf");
	//response.setHeader("Pragma", "no-cache");
	// envia a resposta com o MIME Type
	if(tipoFormatoRelatorio.equals(TipoFormatoRelatorio.ACROBAT_PDF))
	{
		response.setContentType("application/pdf");
	}
	else
		if(tipoFormatoRelatorio.equals(TipoFormatoRelatorio.PAGINA_HTML))
		{
			response.setHeader("Content-Disposition", "attachment; filename=" + nomeRel + ".pdf");
			response.setContentType("application/html");
		}
		else
			if(tipoFormatoRelatorio.equals(TipoFormatoRelatorio.DOWNLOAD))
			{
				response.setContentType("application/download");
			}
	try
	{
		ServletOutputStream servletOutputStream = response.getOutputStream();
		// envia parametros para o relatório
		if(parametros == null)
		{
			parametros = new HashMap<String, Object>();
		}
		// envia para o navegador o PDF gerado
		JasperPrint jsPrint = JasperFillManager.fillReport(reportStream, parametros, fonteDados);
		byte[] arquivo = new byte[0];
		arquivo = JasperExportManager.exportReportToPdf(jsPrint);
		response.setContentLength(arquivo.length);
		servletOutputStream.write(arquivo, 0, arquivo.length);
		servletOutputStream.flush();
		servletOutputStream.close();
	}
	catch (JRException e)
	{
		e.printStackTrace();
		throw new ReportException(ERRO_MENSAGEM_REPORT);
	}
	catch (IOException e)
	{
		e.printStackTrace();
		throw new ReportException(ERRO_MENSAGEM_REPORT);
	}
	finally
	{
		context.responseComplete();
	}
}

Agradeço a todos desde já.

Criado 8 de junho de 2009
Ultima resposta 21 de abr. de 2012
Respostas 9
Participantes 7