Fiz um programa em java aqui na empresa para cadastro e consulta no banco de dados. A parte de cadastro e consulta pelo formulario está funcionando de boa. Agora tenho que fazer imprimir dados do cliente em um relatorio jasper. Quando clico no botão consultar o programa está consultando de boa, agora fiz um botão imprimir e tenho que adicionar um método nesse botão que chama a classe de conexão do relatorio. Como faço esse método pra chamar o relatorio?
Se for pela web com servlet pode fazer conforme abaixo.
Ignorem a construção, pois isso tirei aqui de um projeto antigo que fizeram essa classe ridicularmente encapsulada.
Podes fazer um método disso passando oque precisa como parametro (parameters, connection, response)
publicclassGeraRelatorioextendsHttpServlet{privatestaticfinallongserialVersionUID=-433379001619945275L;@SuppressWarnings("unchecked")protectedvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{JasperReportjasperReport=null;byte[]pdfRelatorio=null;Connectionconnection=null;DBConnectdbConnect=null;//DBConnect implementa a conexao com o banco de dadostry{dbConnect=newDBConnect();// o construtor retorna uma conexao para o banco}catch(SQLExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(InstantiationExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(IllegalAccessExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(ClassNotFoundExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}connection=dbConnect.getConnection();StringpathJasper=getServletContext().getRealPath("/caminhoParaJasperDoRelatorio/")+"/";StringpathImages=getServletContext().getRealPath("/caminhoParaImagensDoRelatorio/")+"/";Mapparametros=newHashMap();parametros.put("IMAGES_URI",pathImages);parametros.put("SUBREPORT_DIR",pathJasper);try{jasperReport=(JasperReport)JRLoader.loadObject(pathJasper+"Relatorio.jasper");pdfRelatorio=JasperRunManager.runReportToPdf(jasperReport,parametros,connection);}catch(JRExceptione1){e1.printStackTrace();}//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.. ServletOutputStreamservletOutputStream=res.getOutputStream();servletOutputStream.write(pdfRelatorio);servletOutputStream.flush();servletOutputStream.close();}}
a classe acima eh um exemplo que apenas exibe o relatorio na tela. ele nao salva o pdf.
publicclassGeraRelatorio2extendsHttpServlet{privatestaticfinallongserialVersionUID=42203657584556370L;@SuppressWarnings("unchecked")protectedvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{Connectionconnection=null;DBConnectdbConnect=null;//DBConnect implementa a conexao com o banco de dadostry{dbConnect=newDBConnect();// o construtor retorna uma conexao para o banco}catch(SQLExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(InstantiationExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(IllegalAccessExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}catch(ClassNotFoundExceptione2){// TODO Auto-generated catch blocke2.printStackTrace();}connection=dbConnect.getConnection();StringpathJasper=getServletContext().getRealPath("/caminhoParaJasperDoRelatorio/")+"/";StringpathImages=getServletContext().getRealPath("/caminhoParaImagensDoRelatorio/")+"/";Stringpath=getServletContext().getRealPath("/");Mapparametros=newHashMap();parametros.put("SUBREPORT_DIR",pathJasper);parametros.put("IMAGES_URI",pathJasper);try{JasperPrintimpressao=JasperFillManager.fillReport(pathJasper+"/Relatorio.jasper",parametros,connection);JasperExportManager.exportReportToPdfFile(impressao,path+"/caminho/Relatorio.pdf");res.sendRedirect("Relatorio.pdf");}catch(Exceptione){res.getWriter().println("Erro ao gerar o relatorio: "+e);}}}
a classe acima salva o pdf no hd e redireciona para ele