Boa a noite amigos! Estou com um problema e muitas dúvidas. Primeiro gostaria que me ajudassem a entender por que o Código abaixo não estão gerando o relatório:
FacesContext facesContext = FacesContext.getCurrentInstance(); //Get the context ONCE
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
InputStream reportStream = facesContext.getExternalContext().getResourceAsStream("/relatorios/folhaPonto.jasper");
try {
System.out.println("reportStream :"+reportStream);
ServletOutputStream servletOutputStream = response.getOutputStream();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=folhaPonto.pdf");
facesContext.responseComplete();
try { // Replace this with your desired JR utility method
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, params, jrds);
} catch (JRException ex) {
//
}
servletOutputStream.flush();
servletOutputStream.close();
} catch (IOException ex) {
}
O código não da erro, mas também não gera o relatório.
Outra dúvida é a seguinte: por que ao usar
JasperViewer.viewReport
O relatório é gerado somente no servidor e não na maquina cliente? Existe algo que isso possa modificar isso?
Onde você faz a chamada para escrever o relatório no response?
JasperViewer.viewReport é um recurso para JSE (java desktop) e não para JEE (java web).
M
marcelo1987
drsmachado:
Onde você faz a chamada para escrever o relatório no response?
JasperViewer.viewReport é um recurso para JSE (java desktop) e não para JEE (java web).
Agora as coisas estão ficando mais claras amigo! Vou desconsiderar o JasperViewer.viewReport.
Então, o método onde o código acima está contido é chamado por um p:commandButton utilizando um actionListener, mas acho que não foi isso que você me perguntou. Se não for pedir demais, poderia dar uma rápida explicação de como utilizar o response, por favor? Pois já vi tanta coisa na internet e já não sei mais qual o caminho seguir.
D
drsmachado
Você tem isso
System.out.println("reportStream :"+reportStream);
ServletOutputStream servletOutputStream = response.getOutputStream();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=folhaPonto.pdf");
facesContext.responseComplete();
try { // Replace this with your desired JR utility method
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, params, jrds);
} catch (JRException ex) {
//
}
servletOutputStream.flush();
servletOutputStream.close();
Onde está o servletOutputStream.write???
M
marcelo1987
drsmachado:
Você tem isso
System.out.println("reportStream :"+reportStream);
ServletOutputStream servletOutputStream = response.getOutputStream();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=folhaPonto.pdf");
facesContext.responseComplete();
try { // Replace this with your desired JR utility method
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, params, jrds);
} catch (JRException ex) {
//
}
servletOutputStream.flush();
servletOutputStream.close();
Onde está o servletOutputStream.write???
Então, inclui o servletOutputStream.write, segue abaixo como ficou:
FacesContextfacesContext=FacesContext.getCurrentInstance();//Get the context ONCE ServletContextservletContext=(ServletContext)facesContext.getExternalContext().getContext();HttpServletResponseresponse=(HttpServletResponse)facesContext.getExternalContext().getResponse();StringreportStream=servletContext.getRealPath("/relatorios/folhaPonto.jasper");try{System.out.println("reportStream :"+reportStream);ServletOutputStreamservletOutputStream=response.getOutputStream();response.setContentType("application/pdf");response.addHeader("Content-Disposition","attachment; filename=folhaPonto.pdf");facesContext.responseComplete();try{// Replace this with your desired JR utility method byte[]bytes=JasperRunManager.runReportToPdf(reportStream,params,jrds);servletOutputStream.write(bytes,0,bytes.length);}catch(JRExceptionex){// }servletOutputStream.flush();servletOutputStream.close();}catch(IOExceptionex){}
Acredito que seja algum detalhe que está passando. Ele não da nenhum erro, mas também não exibe o relatório.
M
marcelo1987
Continuando, fiz mais algumas alterações e acredito que seria dessa forma que deveria funcionar, que é como está a maior parte dos exemplos que tenho encontrado:
FacesContextfacesContext=FacesContext.getCurrentInstance();//Get the context ONCE ServletContextservletContext=(ServletContext)facesContext.getExternalContext().getContext();HttpServletResponseresponse=(HttpServletResponse)facesContext.getExternalContext().getResponse();StringreportStream=servletContext.getRealPath("/relatorios/folhaPonto.jasper");try{System.out.println("reportStream :"+reportStream);ServletOutputStreamservletOutputStream=response.getOutputStream();response.setContentType("application/pdf");response.addHeader("Content-Disposition","attachment; filename=folhaPonto.pdf");byte[]bytes=JasperRunManager.runReportToPdf(reportStream,params,jrds);System.out.println("bytes :"+bytes);System.out.println("bytes.length :"+bytes.length);servletOutputStream.write(bytes,0,bytes.length);servletOutputStream.flush();servletOutputStream.close();facesContext.renderResponse();facesContext.responseComplete();// }catch(JRExceptionex){}
O código acima é bem parecido com o que eu havia postado anteriormente, porém tive que fazer uma correção na chamada desse método. Precisei incluir o parametro ajax=“false” no meu commandButton que executa o relatório. Parece bobeira, mas era o que faltava.