[Resolvido] Servlets, SetvletResponse e JSF - como fazer?
3 respostas
G
gui.orioli
Pessoal,
Eu trabalho com JSF e estou atualmente tentando implementar um download de arquivo gerado dinamicamente.
Eu já sei como gerar o arquivo e como configurar os cabeçalhos HTTP do Response.
O meu problema é que eu estou usando este código no meu Managed Bean. Quando o método dele é chamado, eu seto o response do FacesContext, e isso não está funcionando direito, porque o response do FacesContext tem como resposta a próxima pagina HTML a ser exibida.
O que eu quero fazer é o seguinte: Chamar um Servlet como resposta a requisição do botão, e nesse servlet então eu gero o relatório e sou set na resposta para ser o arquivo/pdf.
O problema é que eu não tenho muito uma idéia de como fazer isso…
Alguem pode dar uma ajuda? Qualquer explicação a mais que precise tbm, pode pedir… tentei resumir o problema aqui…
Eu tambem estou com um problema parecido. Eu tb estou querendo chamar um Servlet como resposta, e tb queria saber como pego os dados setados na tags jsf, para serem mandados para o servlet
H
henrique.ajs
Ola,
Como vai galera… aqui estou eu em mais um post que provavelmente não terá resposta… mas vamos lá… eu estou com a mesma duvida…
Andei lendo o livro “JAvaServerFAces - Fundamentos - David Geary e Cay Horstmann”, achei um livro legal… porem pouco util para que ja tem uma ideia em JSF.
Neste livro eles simplesmente não comentam em momento algum sobre ServletResponse e JSF… e eu assim como o DCesar e o gui.orioli, preciso de alguma informação sobre esse assunto, caso alguem saiba e tenha preguiça de falar a resposta, poderia ao menos informar uma fonte de conhecimento sobre o assunto? Obrigado a todos.
Henrique Souza.
G
gui.orioli
Pessoal,
Resolvi meu problema, porém não precisei usar um servlet. Estou colocando aqui o método que está localizado no meu bean, e como eu chamei ele da minha JSP. Ambos estão colocados apenas no faces-config, como em todo projeto JSF.
Método @ ManagedBean:
/** * Método que instancia o JasperReport, e passa a ele o caminho e o nome do arquivo .jasper; * Recebe a response do FacesContext e seta para ser o envio do pdf em forma de octet-stream; * Anula outras responses. * @return Void. Método cancela a resposta do faces no final com a linha FacesContext.getCurrentInstance().responseComplete(); */publicStringgeraReport(){try{// Referencia: http://www.guj.com.br/posts/list/81020.java#432311// Referencia: http://www.onjava.com/pub/a/onjava/2003/06/18/dynamic_files.html?page=1//Bloco do Jasper -> Funcionando.Stringcaminho_arquivo=newFile("").getAbsolutePath()+"/workspace/project/WebContent/reports/";Stringnome_arquivo="report.jasper";Stringcaminho_completo=caminho_arquivo+nome_arquivo;JasperReportjasperReport=(JasperReport)JRLoader.loadObject(caminho_arquivo+nome_arquivo);Mapparameters=newHashMap();parameters.put("Caminho",caminho_arquivo);JasperPrintjasperPrint=JasperFillManager.fillReport(jasperReport,parameters,this.getRelatorio());//this.getRelatorio = Datasource do Relatório//*///GERA PDF// @ outputStreamByteArrayOutputStreampdfStream=newByteArrayOutputStream();JasperExportManager.exportReportToPdfStream(jasperPrint,pdfStream);//*///HTML RESPONSEHttpServletResponseresponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition","attachment; filename=relatorio.pdf");response.setContentLength(pdfStream.size());//para o pdfStream//*/// Flush pdfStream pra responseServletOutputStreamflusher;flusher=response.getOutputStream();pdfStream.writeTo(flusher);flusher.flush();flusher.close();FacesContext.getCurrentInstance().responseComplete();pdfStream.close();pdfStream=null;//*/}catch(Exceptione){e.printStackTrace();log.error("Erro ao executar método para mandar o pdf para download.");return"";}return"";}