Seria bom disponibilizar no curso um exemplo como esse, pois iria ajudar bastantes a galera.
public class UtilRelatoriosPdf implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings({ "rawtypes" })
public static void imprimeRelatorio(String relatorioNome, Map<String, Object> parametros, List lista) {
try {
// OBTEM O CONTEXTO ATUAL DO JSF
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
// LOCAL ONDE ESTAO OS RELATORIOS
String path = scontext.getRealPath("/WEB-INF/relatorios/");
// SEPARA OS RELATORIOS
parametros.put("SUBREPORT_DIR", path + File.separator);
// SETA PARA BRASIL
parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));
// O JASPER VAI NO CAMINHO + E PEGA O RELATORIO SEPARADO + O NOME DO MESMO +
// ESTENSAO NO CASO .JASPER
JasperPrint jasperPrint = JasperFillManager.fillReport(
scontext.getRealPath("/WEB-INF/relatorios/") + File.separator + relatorioNome + ".jasper",
// PASSANDO A CONEXAO DO DATASOURCE CUSTOMIZADO APENAS PARA RELATORIOS
parametros, getConnection());
// B = UM ARRAY DE ARQUIVOS E EXPORTA PARA PDF
byte[] b = JasperExportManager.exportReportToPdf(jasperPrint);
// RESETA O CONTEXTO
res.reset();
// SETA PARA O TIPO PDF NA TELA
res.setContentType("application/pdf");
// GERA O ARQUIVO NA TELA SEM FAZER O DOWLOAD
res.addHeader("Content-disposition", "inline);filename=relatorio" + relatorioNome + ".pdf");
// ESCREVE
res.getOutputStream().write(b);
// FECHA A RESPONSE
// facesContext.renderResponse();
// FECHA O CONTEXTO E BOLA PARA FRENTE
facesContext.responseComplete();
} catch (Exception e) {
UtilMensagens.mensagemErro("Erro ao imprimir: " + UtilErros.getMensagemErro(e));
e.printStackTrace();
}
}
// CAMINHO DO BANCO
private static final String JAVA_JBOOS_DATASOURCES_SGIDS = "java:jboss/datasources/SGIDS";
private static Connection getConnection() throws UtilException {
java.sql.Connection conexao = null;
try {
Context initContext = new InitialContext();
DataSource ds = (DataSource) initContext.lookup(JAVA_JBOOS_DATASOURCES_SGIDS);
conexao = (java.sql.Connection) ds.getConnection();
} catch (NamingException e) {
throw new UtilException("Não foi possivel encontrar uma conexão com o banco de dados", e);
} catch (SQLException e) {
throw new UtilException("Ocorreu um erro de SQL", e);
}
return conexao;
}
}
// depois criaria uma Classe conforme abaixo para chamar o relatório.
// metodo da classe
public void actionRelatorioPdfPorData() {
Map<String, Object> parametros = new HashMap<String,Object>();
parametros.put("codCliente", this.codCliente);
parametros.put("dataInicio", this.dataInicio);
parametros.put("dataFim", this.dataFim);
UtilRelatoriosPdf.imprimeRelatorio("RelatorioDeClientes", parametros, clienteDao.listaCliente(cliente));
init();
}