Chamada e execução do relatório numa aplicação JavaEE7

Uma vez compilado, o relatório pode ser chamado via Java, para que a aplicação o mostre como desejado.

A seguir serão vistos os procedimentos para configurar o JasperReports no IDE Netbeans e a sua importação para o projeto.

Download do JasperReports Library Como exposto no início desta seção, a biblioteca JasperReports é o mais popular mecanismo open source para a geração de relatórios com os sistemas desenvolvidos em Java.

Para utiliza-la, a primeira coisa a fazer é baixar os ficheiros necessários do site http://community.jaspersoft.com. Requere-se um registo simples e gratuito e depois fazer o login.

Ao clicar no botao Download Now, situado no canto superior direito do site, serão apresentadas várias edições de produtos comunity disponiveis da Jaspersoft. Na lista, deve-se fazer clique no botao Download, correspondente ao JasperReports Library.

A versão mais recente é a v6.3.0. Até chegar à versao v6.3.0, a versao 6 conheceu muitas alterações e a ultima deixa a sensação de ser uma versão não consolidada. Já na sua evolução forma registados upgrades e downgrades, remoção de dependências, etc. Para o exemplo do ebook vai ser utilizada a versão 6.1.0.

Por isso, depois de se ter feito clique no botaão Download, na janela que se segue fazer clique em JasperReports Library (v All Releases) para aceder às outras versos da biblioteca.

… e será mostrada a lista das demais versões do JasperReports.

Fazendo clique no pacote com a versão desejada, no caso do ebook, a versão 6.1.0, será mostrada uma lista com ficheiros jar e algumas pastas comprimidas. Na imagem abaixo é indicados com uma seta vermelha o item a baixar.

Concluído o download é necessário descomprimir a pasta e de preferência copiar os ficheiros a seguir indicados para um mesmo local.

Os ficheiros fundamentais para a execução de um relatório com o JasperReports encontram-se nas sub pastas dist e lib da pasta descomprimida.

Da pasta dist:

jasperreports-6.1.0.jar | jasperreports-fonts-6.1.0.jar | jasperreports-javaflow-6.1.0.jar

Da pasta lib:

commons-beanutils-1.9.0.jar| commons-collections-3.2.1.jar | commons-digester-2.1.jar | commons-javaflow-20060411.jar | commons-logging-1.1.1.jar | groovy-all-2.0.1.jar | iText-2.1.7.jar | jcommon-1.0.15.jar | jfreechart-1.0.19.jar | poi-3.10.1.jar

As imagens a seguir ajudam a ilustrar

Conteúdo a selecionar da pasta dist

Conteúdo a seleccionar da pasta lib

Configuração da biblioteca JasperReports no NetBeans 8.1

Os ficheiros selecionados poderiam ser adicionados diretamente à pasta do projeto. Especificamente na pasta bibliotecas.

Mas como é um recurso que pode ser necessário para outros projetos, então o ideal é criar no NetBeans uma biblioteca com estes ficheiros. E será esta biblioteca a ser adicionada ao projeto . Para configurar a biblioteca do JasperReports no NetBeans 8.1 o procedimento a seguir é o seguinte: 1 – Aceder ao Menu Tools(Ferramentas) e escolher Libraries(bibliotecas).

2- Na caixa de diálogo que aparece, fazer clique em New Library e na outra caixa escreve o nome da biblioteca, como pode ser visto na figura e fazer clique em OK.

3 – A seguir fazer é necessário adicionar os JAR a esta biblioteca. Então, na janela Library Manager fazer clique em Add Jar/Folder… e selecionar os ficheiros, previamente organizados, necessários para a execução dos relatórios.

4 – Para adicionar a biblioteca criada a um projeto é suficiente fazer clique com o botão direito do mouse sobre o projeto e fazer clique em Properties (Propriedades), e na caixa de diálogo que aparece escolher Libraries e depois fazer clique no botão Add Library…, a seguir fazer clique no botão Import… Na caixa de listagem que aparece, escolher a biblioteca desejada e fazer clique no botão Import Library e sucessivamente confirmar fazendo clique nos botões OK.

Com isto termina o processo de instalação e configuração da biblioteca JasperReports utilizada para a geração de relatórios em aplicações Java tanto para aplicações Stant alone como para as aplicações Web. O passo seguinte e ultimo será a criação do servlet com as instruções para recuperação do ficheiro jasper e para mostrar o relatório no browser. No presente ebook os relatórios serão executados apenas no formato PDF.

Serão implementadas instruções para dois relatórios de exemplo, num único servlet. Um sem parâmetros que apresenta a lista dos projetos e outro com parâmetro que mostra a ficha de um determinado projeto.

Classe RelatorioProjetoServlet.Java



….
@WebServlet(name = "RelatorioProjetoServlet", urlPatterns = {"/relatorioProjetoServlet"})
public class RelatorioProjetoServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        Connection conn;

        ServletOutputStream servletOutputStream = response.getOutputStream();

        File caminhoRelatorioSemParametros = new File(getServletConfig().getServletContext().getRealPath("/WEB-INF/relatorios/projetos_lista.jasper"));
        File caminhoRelatorioComParametros = new File(getServletConfig().getServletContext().getRealPath("/WEB-INF/relatorios/projeto_ficha.jasper"));
        byte[] bytes;

        String comando = request.getParameter("comando");

        **if (comando.equalsIgnoreCase("imprimir_lista_projetos"))** {

            try {
                conn = Conexao.getConnection();
                bytes = JasperRunManager.runReportToPdf(caminhoRelatorioSemParametros.getPath(), new HashMap(), conn);
                conn.close();
                response.setContentType("application/pdf");
                response.setContentLength(bytes.length);
                servletOutputStream.write(bytes, 0, bytes.length);
                servletOutputStream.flush();
                servletOutputStream.close();

            } catch (IOException | JRException | SQLException ex) {
                StringWriter stringWriter = new StringWriter();
                PrintWriter printWriter = new PrintWriter(stringWriter);
                ex.printStackTrace(printWriter);
                response.setContentType("text/plain");
                response.getOutputStream().print(stringWriter.toString());

            }

        } **else if (comando.equalsIgnoreCase("imprimir_ficha_projeto")**) {

            String codigoProjeto = request.getParameter("codigoProjeto");
            HashMap hashMap = new HashMap();
            hashMap.put("codigoProjeto", codigoProjeto);

            try {
                conn = Conexao.getConnection();
                bytes = JasperRunManager.runReportToPdf(caminhoRelatorioComParametros.getPath(), hashMap, conn);
                conn.close();
                response.setContentType("application/pdf");
                response.setContentLength(bytes.length);
                servletOutputStream.write(bytes, 0, bytes.length);
                servletOutputStream.flush();
                servletOutputStream.close();

            } catch (IOException | JRException | SQLException ex) {
                StringWriter stringWriter = new StringWriter();
                PrintWriter printWriter = new PrintWriter(stringWriter);
                ex.printStackTrace(printWriter);
                response.setContentType("text/plain");
                response.getOutputStream().print(stringWriter.toString());

            }

        }

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

Para executar o relatório sem parámetros é suficiente chama-lo num objeto do html. Por exemplo:

<a href="../relatorioProjetoServlet?comando=imprimir_lista_projetos">Imprimir Lista de Projetos</a>

Para o relatório com parametros vários opções podem ser desenhadas. Por exemplo o valor poderia ser recebido de uma caixa de texto, de uma caixa de combinação ou de listagem, etc. Para o exemplo do ebook foi adicionado um link entre as acções da tabela de listagem.

  <td><a href="../projectoServlet?comando=prepara_editar&id_projeto=<%=projeto.getIdProjecto()%>"><img src="../imagens/edit.png" /></a></td>

<td><a href="../projectoServlet?comando=eliminar&id_projeto=<%=projeto.getIdProjecto()%>"><img src="../imagens/delete.png" /></a></td>

<td><a  href="../relatorioProjetoServlet?comando=imprimir_ficha_projeto&codigoProjeto= <%=projeto.getCodigoProjecto()%>"> <img src="../imagens/print.png" /></a></td>

A figura seguinte ilustra com uma visão gráfica a explicação anterior.

Prática

Aqui termina a secção que mostra como criar e executar relatórios numa aplicação construida na plataforma JavaEE 7 com JavaServer Pages, Servlets e persistência de dados.

Como dizia Cícero, " a prática aplicada a uma única coisa muitas vezes supera a inteligência e a arte ", aqui fica a recomendação de construir outros relatórios para as entidades cuja informação pareça pertinente.

results matching ""

    No results matching ""