Servlet retornando valor [RESOLVIDO]

4 respostas
R

Tenho uma servlet que gera o relatório do jasper e o navegador renderiza esses bytes.Porém agora além de renderizar esses bytes no navegador, posso pegar esses bytes para serem usados como anexo de um email.

Atualmente no servlet: conecto no banco de dados, gero o relatório em formato de bytes e renderizo no navegador

@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response)  
    throws IOException, ServletException  {  
		//no flex aonde chamar o relatório preciso passar o nome do relatório
    	String fileName = request.getParameter("nome_relatorio");
    	String title = request.getParameter("titulo_relatorio");
    	
    	Logger logger = Logger.getLogger(JasperReportPDF.class);
    	
        // obtém a conexão com o banco de dados  
        Connection conn = null;  
        try {  
            Class.forName("com.mysql.jdbc.Driver");  
            conn = DriverManager.getConnection(  
                    "jdbc:mysql://****************", // coloque o IP se não for usado localhost  
                    "*****",        // mude para o nome do usuário do seu bd  
                    "*****");   // mude para a senha deste usuário  

        } catch (Exception e) {  
            System.out.println("Erro ao obter conexao via DriverManager: "                      
                    + e.getMessage());  
        }  
          
        // gera o relatório  
        ServletContext context = getServletContext();  
        byte[] bytes = null;  
        try {  
        	
            // carrega os arquivos jasper  
            JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(
                    context.getRealPath("/WEB-INF/relatorios/" + fileName));  
              
            // parâmetros, se houverem  
            HashMap parametros = new HashMap(); 
            	parametros.put("SUBREPORT_DIR",  context.getRealPath("/WEB-INF/relatorios/"));
            	
            	//parametros possíveis
            	if(request.getParameter("PED_CODIGO")!= null)
            		parametros.put("PED_CODIGO",  new Integer(request.getParameter("PED_CODIGO")));
            
            	// direciona a saída do relatório para um stream  
            bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);  
            
            logger.info("Relatório Gerado");
            
        } catch (JRException e) {  
            e.printStackTrace();  
            
            logger.error("Erro ao gerar relatório");
        }  
        
        if (bytes != null && bytes.length > 0) {  
            // envia o relatório em formato PDF para o browser  
            response.setContentType("application/pdf");  
              
            response.setContentLength(bytes.length); 
            response.setHeader("Content-disposition", "inline; filename=" + title + ".pdf"); //nome do arquivo pdf
            ServletOutputStream ouputStream = response.getOutputStream();
            ouputStream.write(bytes, 0, bytes.length);  
            ouputStream.flush();  
            ouputStream.close();  
        }  
          
    }

Desculpem pela minha inexperiência, em servlets, mas como eu posso reaproveitar esses bytes do servlet em uma outra classe java responsável por mandar o email?Ou eu precisaria criar outra classe?

Editado:

Resolvido, criei classes especificas

4 Respostas

rodrigo.bossini

Você poderia setar o bytes como um atributo de contexto (this.getServletContext().setAttribute()). Assim quaisquer outros componentes da sua web app (servlets, jsp’s, etc) terão acesso a ele.

R

Obrigado pela dica.

Mais uma pergunta, esse atributo só estaria “visivel” em um contexto web (servlet, jsp, …) ou eu consigo acessar de uma classe java?

Vou dar uma procurada em materias na web, acho que é por ai o caminho :wink:

rodrigo.bossini

o ServletContext é um objeto criado pelo container…então creio que ele esteja disponível apenas para servlets e jsp’s que fazem parte da web app.

valtoni

Cara, a melhor saída seria você criar classes específicas que sejam especialistas no que fazem. Quer fazer um Jasper? Especialize essa atitude em uma classe. Quer mandar um email com o PDF renderizado pelo Jasper? Especialize isto em outra classe e receba os “bytes” como parâmetro. Assim você aumenta a granularidade e torna o seu código mais testável e reutilizável, ficando assim mais robusto e confiável.

Falow?

Criado 30 de junho de 2009
Ultima resposta 1 de jul. de 2009
Respostas 4
Participantes 3