Já li em todos os tópicos que tem aqui e em todos os sites do google e não consigo fazer isso funcionar, cada um fala uma coisa, não sei mais o que fazer. Se alguém puder me ajudar agradeço. Segue meu código:
ReportUtils
package com.relatorios;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.servlet.Servlet;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
public class ReportUtils {
/**
* Gera o relatório em PDF.
*
* @param inputStream InputStream que contém o relatório.
* @param parametros Parâmetros utilizados pelo relatório.
* @param conexao Conexão utilizada para a execução da query.
* @param response HttpServletResponse que será usado como base para
* gerar o relatório.
* @return O OutputStream do HttpServletResponse passado.
* @throws JRException Caso ocorra algum problema na geração do relatório.
* @throws IOException Caso ocorra algum problema na obtenção do
* OutputStream.
*/
public static void createPDFReport(InputStream inputStream, Map<String, Object> parametros, Connection conexao) throws JRException, IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.responseComplete();
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, parametros, conexao);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Exporta em PDF, escrevendo os dados no output stream do response.
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
// gera o relatório
exporter.exportReport();
byte[] bytes = baos.toByteArray();
if (bytes != null && bytes.length > 0) {
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "filename=\"relatorio.pdf\"");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();
FacesContext.getCurrentInstance().renderResponse();
FacesContext.getCurrentInstance().responseComplete();
}
// retorna o OutputStream
}
}
RelatorioMB
package com.modelo.managedBean;
import com.relatorios.ConnectionFactory;
import com.relatorios.ReportUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
@ManagedBean
public class RelatorioMB {
private HttpServletResponse response;
public void gerarRelatorio() throws IOException {
ServletOutputStream out = null;
InputStream is = getClass().getResourceAsStream("RelatorioCategoriasPorNome.jasper");
Map<String, Object> parametro = new HashMap<String, Object>();
parametro.put("primeiroNome", "b");
try {
ReportUtils.createPDFReport(is, parametro, ConnectionFactory.getTurismoGuiadoConnection());
} catch (SQLException exc) {
exc.printStackTrace();
} catch (JRException exc) {
exc.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
Eu não consigo criar o Relatório e exibir na tela para o usuário fazer o download. Tentei debugar isso mas não consigo entender "/