JasperReports num servlet

3 respostas
dukejeffrie

O Baioni perguntou como se faz para gerar um report do Jasper e enviar pelo servlet.

Aqui tá o código que eu fiz já faz um tempo pra fazer isso, sem os métodos auxiliares.

public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException
    {
        try {
            String rootDir = getServletContext().getRealPath("/reports");
            Map parameters = loadParameters(request);
            // needed for subreports:
            parameters.put("rootDir", rootDir);

            String reportFilename = rootDir + File.separator + request.getParameter("report_file");

            File reportFile = new File(reportFilename);
            log("Using file "" + reportFilename + ""...");
            if (!reportFile.exists()) {
                showFileNotFound(parameters, response);
                return;
            }
            Connection conn = (Connection) request.getSession().getAttribute("conn");
            if (conn == null) {
                showNotConnected(parameters, response);
                return;
            }
            log("Connected to the database");

            byte[] buffer = JasperRunManager.runReportToPdf(
                reportFilename,
                parameters,
                conn
            );
            log("report generated, sending to user");

            response.setContentType("application/pdf");
            response.setContentLength(buffer.length);
            ServletOutputStream ouputStream = response.getOutputStream();
            ouputStream.write(buffer, 0, buffer.length);
            ouputStream.flush();
            ouputStream.close();
        }
        catch (Exception e) {
            log("Caught exception", e);
            String webmaster = getServletContext().getInitParameter("webmaster");
            if (webmaster != null) {
                Mailer.errorMail(e, webmaster);
            }
            throw new ServletException(e);
        }

As partes importantes são a que gera o report e a que envia o conteúdo pela web:

byte[] buffer = JasperRunManager.runReportToPdf(
                reportFilename,
                parameters,
                conn
            );

Aqui os parâmetros são o nome do report, que eu construí a partir de algumas coisas pré-definidas da aplicação, um Map com os parâmetros do report (aqueles definidos no XML. Vc precisa respeitar nome da chave e classe do valor) e, nesse caso, uma conexão com o BD. Existem outros métodos com o mesmo nome e outros parâmetros nessa classe, vc pode verificar.

response.setContentType("application/pdf");
            response.setContentLength(buffer.length);
            ServletOutputStream ouputStream = response.getOutputStream();
            ouputStream.write(buffer, 0, buffer.length);
            ouputStream.flush();

O content-type é bastante importante pro usuário, pq senão ele pode ver só umas sujeiras na tela. Escreva o buffer e envie… : )

[]s

3 Respostas

R

valeu pela ajuda, cara…

mas vc tah mostrando o relatorio como um .pdf??
tem um metodo p/ gerar como HTML, certo??

valew

dukejeffrie

Cara, se vc tá gerando HTML com o Jasper, pare antes que seja tarde.

Vc tá usando um documento MUITO complexo (XML) pra descrever um HTML, que já é texto.

Troca tudo pra Velocity!! : )

[]s

R

entao…

eh q no exemplo q vem no jasper, ele gera relatorio e mostra numa pagina HTML…parece tudo normal…

mas tb adorei a ideia do Velocity…mas ainda nao tenho mta intimidade com ele…
vc teria algum exemplo do uso de Jasper com velocity?? :?: :?: :?: :?:

valew mesmo cara…

Criado 21 de fevereiro de 2003
Ultima resposta 21 de fev. de 2003
Respostas 3
Participantes 2