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
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.
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:
[code] /**
* 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();
*/
public String geraReport(){
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.
String caminho_arquivo = new File("").getAbsolutePath() + "/workspace/project/WebContent/reports/";
String nome_arquivo = "report.jasper";
String caminho_completo = caminho_arquivo + nome_arquivo;
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(caminho_arquivo + nome_arquivo);
Map parameters = new HashMap();
parameters.put("Caminho", caminho_arquivo);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, this.getRelatorio()); //this.getRelatorio = Datasource do Relatório
//*/
//GERA PDF
// @ outputStream
ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, pdfStream);
//*/
//HTML RESPONSE
HttpServletResponse response
= (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 response
ServletOutputStream flusher;
flusher = response.getOutputStream();
pdfStream.writeTo(flusher);
flusher.flush();
flusher.close();
FacesContext.getCurrentInstance().responseComplete();
pdfStream.close();
pdfStream = null;
//*/
}catch(Exception e){
e.printStackTrace();
log.error("Erro ao executar método para mandar o pdf para download.");
return "";
}
return "";
}[/code]