[Resolvido] Servlets, SetvletResponse e JSF - como fazer?

3 respostas
G

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…

[]'s

3 Respostas

Dcesar

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

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

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();   
	 */
	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 "";
	}
chamada do método @ JSP
<h:commandButton value="Exportar Relatório" action="#{geraRelatorios.geraReport}" />

Bom, é isso...
Tá bem simples aí encima, qualquer coisa, estamos aí.
[]'s

Criado 18 de abril de 2008
Ultima resposta 18 de abr. de 2008
Respostas 3
Participantes 3