Ola, pessoal.
Eu jah cheguei a fazer duas implementações para gerar o relatorio, uma que salva um pdf no disco e redireciona a pagina para o pdf e outra que gera um stream e manda exibir o stream no navegador
colocarei o codigo dos mesmos:
public class RelatorioAtendimentoHora extends HttpServlet {
private static final long serialVersionUID = -3362859697343829111L;
private Logger logger = Logger.getLogger(RelatorioAtendimentoHora.class);
private byte[] pdfRelatorioAtendimentoHoraSAPE;
@SuppressWarnings("unchecked")
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String sep = File.separator;
logger.info("Criando uma conexão ...");
DBConnectMySQL dao = null;
try {
dao = new DBConnectMySQL();
} catch (Exception ex) {
logger.error(ex);
logger.error("Pilha do erro: ");
for (int i = 0; i < ex.getStackTrace().length; i++) {
logger.error(ex.getStackTrace()[i]);
}
}
logger.info("Conexão: " + dao.getConnection());
String path = getServletContext().getRealPath("/");
String pathJasper =
new StringBuilder()
.append(path)
.append("content")
.append(sep)
.append("reports")
.append(sep)
.toString();
String pathImages =
new StringBuilder()
.append(path)
.append("content")
.append(sep)
.append("images")
.append(sep)
.toString();
logger.info("Inserindo parametros no Map ...");
Map parametros = new HashMap();
parametros.put("SUBREPORT_DIR", pathJasper);
parametros.put("IMAGES_URI", pathImages);
parametros.put("DATAINICIAL", req.getParameter("dataInicial"));
parametros.put("DATAFINAL", req.getParameter("dataFinal"));
// PRIMEIRA IMPLEMENTACAO - ESTA GRAVANDO NO DISCO
try {
logger.info("Caminho : " + path);
logger.info("CaminhoJasper: " + pathJasper);
logger.info("CaminhoImages: " + pathImages);
logger.info("Parametros : " + parametros);
logger.info(pathJasper + "RelatorioAtendimentoHoraSAPE.pdf");
logger.info("Criando impressão ...");
JasperPrint impressao = JasperFillManager.fillReport(
new StringBuilder()
.append(pathJasper)
.append("RelatorioAtendimentoHoraSAPE.jasper")
.toString(),
parametros,
dao.getConnection()
);
logger.info("Exportando o pdf ...");
JasperExportManager.exportReportToPdfFile(
impressao,
new StringBuilder()
.append(path)
.append("Relatorio")
.append(sep)
.append("RelatorioAtendimentoHoraSAPE.pdf")
.toString()
);
logger.info("Redirecionando para o pdf ...");
res.sendRedirect("RelatorioAtendimentoHoraSAPE.pdf");
} catch (Exception ex) {
logger.error(ex);
logger.error("Pilha do erro: ");
for (int i = 0; i < ex.getStackTrace().length; i++) {
logger.error(ex.getStackTrace()[i]);
}
} finally {
if (dao != null && dao.getConnection() != null) {
try {
dao.connectionClose();
} catch (SQLException ex) {
logger.error(ex);
logger.error("Pilha do erro: ");
for (int i = 0; i < ex.getStackTrace().length; i++) {
logger.error(ex.getStackTrace()[i]);
}
}
}
}
// PRIMEIRA IMPLEMENTACAO TERMINA AQUI
//SEGUNDA IMPLEMENTACAO - GERANDO UM STREAM E EXIBINDO NO NAVEGADOR
try {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(pathJasper + "RelatorioAtendimentoHoraSAPE.jasper");
pdfRelatorioAtendimentoHoraSAPE = JasperRunManager.runReportToPdf(jasperReport, parametros, dao.getConnection());
} catch (JRException ex) {
logger.error(ex);
logger.error("Pilha do erro: ");
for (int i = 0; i < ex.getStackTrace().length; i++) {
logger.error(ex.getStackTrace()[i]);
}
}
logger.info("Caminho : " + path);
logger.info("CaminhoJasper: " + pathJasper);
logger.info("CaminhoImages: " + pathImages);
logger.info("Parametros : " + parametros);
logger.info("Pdf : " + pdfRelatorioAtendimentoHoraSAPE);
logger.info(pathJasper + "RelatorioAtendimentoHoraSAPE.pdf");
//Parametros para nao fazer cache e o que será exibido..
res.setContentType("application/pdf");
res.setHeader("Cache-Control", "no-store");
res.setHeader("Pragma", "no-cache");
res.setDateHeader("Expires", 0);
//Envia para o navegador o pdf..
ServletOutputStream servletOutputStream = res.getOutputStream();
servletOutputStream.write(pdfRelatorioAtendimentoHoraSAPE);
servletOutputStream.flush();
servletOutputStream.close();
}
}
a implementacao ideal, para mim, seria a segunda, porque nao iria ser necessario guardar nada no hd … quando eu gero os arquivos no hd eu preciso gerar arquivos com nomes diferentes, para o caso de varias pessoas requerirem o mesmo relatorio
pois bem … o problema dessa segunda implementacao eh que ela nao esta funcionando em todos os browsers … testei aqui com o internet explorer 6.0 e ele nao exibe o relatorios soh uma pagina em branco - nenhum erro
queria saber o que preciso mudar no meu codigo para a segunda implementacao funcionar em qualquer browser
ajuda
[]'s
EDIT
as duas implementacoes estao no mesmo codigo, mas elas nao funcionam juntas, soh para deixar claro - ou usa uma ou outra, coloquei as duas nessa mesma classe soh para poupar espaco