FeaturesPluginsDocs & SupportCommunityPartners

>> Mais documentação do Visual Web Pack

Gerando relatórios e PDFs de um aplicativo da Web

Janeiro de 2007 [Número da revisão: V1-1]    

Quando você precisa gerar um relatório, um gráfico ou um arquivo PDF de um aplicativo da Web, há diversos produtos de terceiros que podem ajudar a realizar a tarefa, inclusive a estrutura de código aberto JasperReports. JasperReports é uma ferramenta de relatório que produz relatórios nos formatos HTML, PDF, XLS, CSV e XML. Este tutorial mostra como integrar a estrutura JasperReports a um aplicativo da Web que você constrói usando o NetBeans Visual Web Pack.

Neste tutorial, você cria um aplicativo da Web que exibe e imprime informações de um banco de dados de viagem. O aplicativo da Web permite que você visualize um relatório de viagem no formato HTML ou PDF.

Conteúdo

Criando uma biblioteca de JasperReports
Configurando o ambiente de edição JRXML
Criando o projeto
Configurando os recursos de relatório
Mapeando o ImageServlet do JasperReports
Adicionando a lógica de geração de relatório
Criando a consulta do banco de dados
Criando a página do relatório de viagem
  O conteúdo desta página se aplica ao Netbeans Visual Web Pack 5.5

Componentes JavaServer Faces/
Plataforma Java EE
funciona com 1.2 com Java EE 5*
funciona com 1.1 com J2EE 1.4
Banco de dados Viagem necessárioNecessário
Biblioteca de componentes BluePrints Ajax não é necessárioNão é necessário

* Na data da publicação deste tutorial, somente o servidor de aplicativos Sun Java System oferecia suporte ao Java EE 5.

install_pt_BR.html">Notas de versão.

Criando uma biblioteca de JasperReports

Antes de começar a construir o projeto, use o Gerenciador de biblioteca do IDE para tornar a biblioteca de relatórios Java do JasperReports facilmente disponível para qualquer projeto.
  1. Faça o download de jasperreports-1.3.0-project.zip de http://www.jasperforge.org e extraia os arquivos. É necessário registrar-se com JasperForge antes de poder fazer o download do arquivo zip.

    Observação: Os exemplos neste tutorial usam o JasperReports 1.3.0 e os arquivos JAR associados que são fornecidos com esta versão. Se usar uma versão diferente, os nomes da biblioteca JAR e os números de versão irão variar. Além disso, a lista de bibliotecas JAR a serem adicionadas pode diferir.
  2. No IDE, escolha Ferramentas > Gerenciador de bibliotecas no menu principal.
  3. Clique em Nova biblioteca, digite JasperReports130 na caixa de texto Nome da biblioteca e clique em OK.
  4. Clique em Adicionar JAR/Pasta e navegue até o diretório no qual você extraiu os arquivos de jasperreports-1.3.0-project.zip.
  5. Navegue até o diretório dist, selecione jasperreports-1.3.0.jar e pressione Enter.
  6. Clique novamente em Adicionar JAR/Pasta e navegue até o diretório ../lib (vá um diretório acima e abaixo no diretório lib).
  7. Use Ctrl-Clique para selecionar os arquivos JAR abaixo e pressione Enter. Se estiver usando uma versão diferente da 1.3.0, consulte o site de JasperForge para identificar os arquivos JAR a serem selecionados.

    • commons-beanutils-1.7.jar
    • commons-collections-2.1.jar
    • commons-digester-1.7.jar
    • commons-logging-1.0.2.jar
    • itext-1.3.1.jar
    Estas são as bibliotecas mínimas necessárias para um aplicativo da Web que usa a estrutura JasperReports. Talvez seja necessário adicionar bibliotecas adicionais para usar recursos mais avançados. Por exemplo, se você estiver usando o recurso de sub-relatórios, será necessário adicionar commons-javaflow-20060411.jar.
  8. Verifique se você adicionou as seis bibliotecas, como mostrado na figura abaixo.

    Figura 1: Janela Gerenciador de bibliotecas mostrando a biblioteca do JasperReports130
    Figura 1: Janela Gerenciador de bibliotecas mostrando a biblioteca do JasperReports130Figura 1:
  9. Para tornar o Javadoc do JavaReports disponível para o editor de Java, clique na guia Javadoc, clique em Adicionar ZIP/Pasta, navegue até o diretório no qual você extraiu os arquivos de jasperreports-1.3.0-project.zip, selecione o subdiretório dist/javadoc e pressione Enter.
  10. (Opcional) Se desejar entrar nas classes do JasperReport durante a sessão de depuração, clique na guia Fontes, clique em Adicionar JAR/Pasta, navegue até o diretório no qual você extraiu os arquivos de jasperreports-1.3.0-project.zip, selecione o subdiretório src e pressione Enter.
  11. Clique em OK para fechar o Gerenciador de bibliotecas.

Configurando o ambiente de edição JRXML

Você escreve os modelos do JavaReport no formato XML. Para que o editor do IDE possa reconhecer um arquivo XML do JavaReport (JRXML) como um arquivo XML, use a caixa de diálogo Opções para adicionar jrxml à propriedade Extensões e tipos MIME para o objeto XML, como mostrado na figura abaixo.

Figura 2: Associando um arquivo JRXML a objetos XML
Figura 2: Associando um arquivo JRXML a objetos XML
  1. Escolha Ferramentas > Opções para abrir a caixa de diálogo Opções.
  2. Clique em Opções avançadas.
  3. Expanda Configuração do IDE, expanda Sistema, expanda Tipos de objetos e selecione Objetos XML (não Esquemas XML).
  4. Clique no botão de reticências (...) para a propriedade Extensões e tipos MIME abrir o editor de personalização.
  5. Digite jrxml na caixa de texto Item e clique em Adicionar.
  6. Clique em OK e feche a caixa de diálogo Opções.

Criando o projeto

Complete as etapas abaixo para criar e configurar o projeto.
  1. Na janela Tempo de execução, expanda o nó Bancos de dados.
  2. Clique com o botão direito do mouse no nó jdbc para o banco de dados Viagem e escolha Conectar no menu pop-up.

    Se o banco de dados Viagem não estiver disponível, consulte a seção Informações de configuração nas Instruções de instalação do NetBeans Visual Web Pack para obter informações.
  3. Se a caixa de diálogo Conectar for exibida, digite viagem como Senha e selecione Lembrar senha durante esta sessão.
  4. No menu principal do IDE, escolha Arquivo > Novo projeto.
  5. No assistente para Novo projeto, selecione Web na lista Categorias e selecione Visual Web Application na lista Projetos.
  6. Clique em Próximo.
  7. Nomeie o projeto TravelReport.
  8. Selecione o servidor desejado e a versão Java EE, e clique em Concluir.

    O projeto aparece com a página inicial (Page1) aberta no Visual Designer.

    Observe que, se você usar um servidor que não seja o servidor de aplicativos Sun Java System, será necessário tornar o driver do banco de dados disponível para o servidor. Consulte a seção Configuração de projeto do Visual Web no Guia de instalação para obter mais informações.

  9. Na janela Projetos, clique com o botão direito do mouse em TravelReport > Bibliotecas e escolha Adicionar biblioteca.
  10. Na janela Adicionar biblioteca, selecione JasperReports130, como mostrado na figura abaixo, e clique em Adicionar biblioteca.

    Figura 3: Adicionando a biblioteca JasperReports126
    Figura 3: Adicionando a biblioteca JasperReports126

Configurando os recursos de relatório

Nesta seção, você adiciona um diretório de imagens e colocar o logotipo da empresa neste diretório. Em seguida, adiciona um modelo JRXML para o relatório de viagem e modifica o arquivo de construção do projeto para compilar o modelo JRXML em um modelo de relatório binário Jasper.

O modelo JRXML gera um relatório semelhante ao mostrado na figura abaixo.

Figura 4: Relatório de viagem
Figura 4: Relatório de viagem
  1. Na janela Projetos, expanda Páginas da Web.
  2. Clique com o botão direito do mouse no nó de recursos e escolha Novo > Pasta.
  3. Digite Nome e pressione Enter.
  4. Clique com o botão direito do mouse na imagem a seguir e use o comando do navegador para salvar a imagem no disco rígido. Salve a imagem na pasta caminho-para-o-projeto-da-Web/TravelReport/web/resosurces/images.

    Figura 1: Janela Gerenciador de bibliotecas mostrando a biblioteca Hibernate
    Figura 5: Logotipo da companhia
  5. Clique no cabeçalho Arquivos, que aparece ao lado do cabeçalho Projetos, para visualizar a janela Arquivos.
  6. Na janela Arquivos, expanda TravelReport.
  7. Clique com o botão direito do mouse no nó src e escolha Novo > Pasta.
  8. Digite relatórios na caixa de texto Nome da pasta.
  9. Assegure-se de que Pasta pai esteja definida como src e pressione Enter.
  10. Na janela Arquivos, clique com o botão direito do mouse em TravelReport e selecione Propriedades.
  11. No painel Categorias, selecione Fontes.
  12. Clique no botão Adicionar pasta que aparece à direita da lista Pastas de pacote de fontes.
  13. Navegue até a pasta src, selecione relatórios e clique em Abrir.
  14. Na caixa de texto Rótulo para a linha src/relatórios, altere o valor para Definições de JasperReports e pressione Enter.

    Se não pressionar Enter, o IDE não salvará as alterações.
  15. Clique em OK.
  16. Clique no cabeçalho Projetos e observe o novo nó Definição de JasperReports, que tem um subnó <pacote padrão>.

    Na etapa seguinte, você coloca uma definição de relatório neste pacote padrão. Posteriormente, você irá modificar o script de construção para compilar as definições de relatório nesta pasta na pasta build/web/WEB-INF/reports, que é onde o código de tempo de execução em ApplicationBean1 espera encontrá-las.
  17. Clique com o botão direito do mouse no nó Definição de JasperReports e escolha Novo > Arquivo/Pasta.
  18. Expanda o nó Outro no painel Categorias, selecione Arquivo de propriedades no painel Tipos de arquivos e clique em Próximo.
  19. Digite TripReportByPerson.jrxml na caixa de texto Nome do arquivo e pressione Enter. O novo arquivo abre-se no editor de XML.
  20. Copie as marcas XML abaixo e cole-as no arquivo XML vazio.

    Amostra de código 1: Modelo JasperReport TripReportByPerson.jrxml
    <?xml version="1.0"?>
    <!DOCTYPE jasperReport
      PUBLIC "-//JasperReports//DTD Report Design//EN"
      "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
    <jasperReport name="TripReportByPerson">
    
    <style name="Arial_Normal" isDefault="true" fontName="Arial" fontSize="12"
      isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"
      pdfFontName="Helvetica" pdfEncoding="Cp1252" isPdfEmbedded="false"/>
    <style name="Arial_Bold" fontName="Arial" isDefault="false"  isBold="true"
      pdfFontName="Helvetica-Bold"/>
    <style name="Arial_Header1"  fontName="Arial" isDefault="false" fontSize="22"
      isBold="true" pdfFontName="Helvetica-Bold"/>
    
    <style name="Arial_Bold_White" fontName="Arial" forecolor="white"
      isDefault="false" fontSize="12" isBold="true" pdfFontName="Helvetica-Bold"/>
    
    <parameter name="LogoURL" class="java.net.URL"/>
    
    <field name="NAME" class="java.lang.String"/>
    <field name="TRIPID" class="java.lang.Integer"/>
    <field name="DEPDATE" class="java.util.Date"/>
    <field name="DEPCITY" class="java.lang.String"/>
    <field name="DESTCITY" class="java.lang.String"/>
    <field name="DESCRIPTION" class="java.lang.String"/>
    
    <group name="PersonGroup" minHeightToStartNewPage="84">
      <groupExpression>
      <![CDATA[$F{NAME}]]>
      </groupExpression>
      <groupHeader>
        <band height="64">
          <textField>
            <reportElement style="Arial_Bold" mode="Opaque" x="0" y="24"
              width="550" height="15" backcolor="#e0e0e0" />
            <textFieldExpression class="java.lang.String">
              <![CDATA["Scheduled Trips for " + $F{NAME}]]>
            </textFieldExpression>
          </textField>
        <line>
          <reportElement x="0" y="39" width="550" height="1" />
          <graphicElement />
        </line>
        <frame>
          <reportElement x="0" y="40" width="550" height="20"
            mode="Opaque" backcolor="lightGray"/>
          <staticText>
            <reportElement style="Arial_Bold_White" x="20" y="2" width="130" height="15"  />
            <text><![CDATA[Departure Date]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White" x="150" y="2" width="130" height="15"  />
            <text><![CDATA[Departure City]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White"  x="280" y="2" width="130" height="15" />
            <text><![CDATA[Destination City]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White" x="410" y="2" width="130" height="15" />
            <textElement textAlignment="Left" />
            <text><![CDATA[Purpose]]></text>
          </staticText>
          </frame>
        </band>
      </groupHeader>
    </group>
    
    <pageHeader>
      <band height="94">
        <image>
          <reportElement x="0" y="0" width="441" height="60"/>
          <graphicElement />
          <imageExpression class="java.net.URL">
            <![CDATA[$P{LogoURL}]]>
          </imageExpression>
        </image>
        <line>
          <reportElement x="0" y="60" width="550" height="1"/>
          <graphicElement />
        </line>
        <staticText>
          <reportElement style="Arial_Header1" x="0" y="60" width="445" height="30" />
          <text><![CDATA[Trip Report by Employee]]></text>
        </staticText>
      </band>
    </pageHeader>
    
    <detail>
      <band height="20">
        <textField pattern="dd/MM/yyyy">
          <reportElement x="20" y="0" width="100" height="20"/>
          <textFieldExpression class="java.util.Date">
            <![CDATA[$F{DEPDATE}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="150" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DEPCITY}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="280" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DESTCITY}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="410" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DESCRIPTION}]]>
          </textFieldExpression>
        </textField>
      </band>
    </detail>
    </jasperReport>
  21. Feche e salve o arquivo.
  22. Na janela Arquivos, expanda TravelReport e clique duas vezes em build.xml para abri-lo na área de edição.
  23. Adicione o script abaixo antes da marca </project>.

    O script substitui o destino de -pós-compilação, que o IDE chama após compilar as fontes de Java. O script de destino compila qualquer arquivo JRXML encontrado na pasta src/relatórios e coloca o arquivo compilado na pasta build/WEB-INF/reports.

    Amostra de código 2: build.xml Script de compilação de relatório
        <!-- Personalize a seguinte propriedade para apontar para a pasta
             em que você desempacotou a versão do JasperReports -->
        <property name="jrc.home"
                  value="JasperReports-Install-Dir/jasperreports-1.3.0"/>
        <!-- Defina a classpath usada para a compilação do relatório -->
        <path id="jrc.classpath">
            <fileset dir="${jrc.home}/dist"
                         includes="*.jar"/>
            <fileset dir="${jrc.home}/lib"
                         includes="*.jar"/>
        </path>
        <!-- Defina a tarefa Ant personalizada que compila definições de relatório -->
        <taskdef name="jrc"
                 classname="net.sf.jasperreports.ant.JRAntCompileTask">
            <classpath refid="jrc.classpath"/>
        </taskdef>
        <!-- Defina o destino que irá compilar relatórios, depois que a compilação
             estiver concluída -->
        <target name="-post-compile"
                        description="Compile todas as definições de JasperReports">
            <!-- Crie primeiro o diretório de saída -->
            <mkdir dir="${build.web.dir}/WEB-INF/reports"/>
            <!-- Compile a definição de relatório -->
            <jrc srcdir="src/reports"
                      destdir="${build.web.dir}/WEB-INF/reports">
                <classpath
                    refid="jrc.classpath"/>
                <include
                    name="*.jrxml"/>
            </jrc>
            <!-- Omita as fontes da definição de relatório de webapp -->
            <delete>
                <fileset dir="${build.web.dir}/WEB-INF/classes"
                         includes="*.jrxml"/>
            </delete>
        </target>
    
  24. Modifique o valor da propriedade jrc.home para apontar para a pasta na qual você desempacotou o arquivo zip do JasperReports.
  25. Feche e salve o arquivo.
  26. Escolha Construir > Construir projeto principal para invocar o script build.xml.
  27. Na janela Arquivos, expanda Construir > Web > WEB-INF > relatórios e verifique se o IDE gerou o binário TripReportByPerson.jasper.

    Se vir erros de construção na janela Saída, ou se o binário não foi criado, verifique se você definiu corretamente a propriedade jrc.home no arquivo build.xml.

Mapeando o ImageServlet do JasperReports

A estrutura JasperReports inclui um servlet denominado ImageServlet para exibir imagens em relatórios HTML gerados. Mesmo que você inclua imagens no relatório, é necessário adicionar um mapeamento para este servlet, porque JasparReports usa imagens em branco para espaçamento.

Complete as etapas seguintes para mapear o URI de imagem para ImageServlet. Você usará o URI de imagem mais tarde, quando adicionar código para exportar o relatório para HTML.
  1. Na janela Arquivos, expanda Web > WEB-INF e clique duas vezes no nó web.xml para abri-lo no editor de XML.

    Certifique-se de editar o arquivo web.xml em Web > WEB-INF, e não o arquivo em Construir > Web > WEB-INF. Se editar o web.xml em Construir > Web > WEB-INF, você perderá as alterações na próxima vez que construir o projeto.
  2. Na barra de ferramentas de edição, clique em Servlets para abrir o editor de Servlet.
  3. No editor de Servlet, clique em Adicionar elemento de servlet.

    A caixa de diálogo Adicionar servlet é exibida, como mostrado na figura abaixo.

    Figura 5: Caixa de diálogo Adicionar servlet Figura 6: Caixa de diálogo Adicionar sevlet
  4. Na caixa de diálogo Adicionar servlet, digite os valores abaixo e clique em OK.

    Caixa de texto Valor
    Nome do servlet ImageServlet
    Classe do servlet net.sf.jasperreports.j2ee.servlets.ImageServlet
    Padrões de URL /image
  5. Feche web.xml e salve as alterações.

    Agora o aplicativo sabe que, ao receber uma solicitação endereçada a image, deve enviar a solicitação para a instância ImageServlet.

Adicionando a lógica de geração de relatório

Use estas etapas para adicionar lógica ao Bean do aplicativo para gerar o relatório.
  1. Na janela Projetos, clique duas vezes no nó Bean do aplicativo para abrir ApplicationBean1.java na área de edição.
  2. Adicione o código abaixo ao final do arquivo, antes da última chave final.

    Amostra de código 3: Código de geração de relatório
    /**
     * <p>Prefixo do nome do recurso para relatórios compilados.</p>
     */
    private static final String PREFIX = "/WEB-INF/reports/";
    
    
    /**
     * <p>Sufixo do nome do recurso para relatórios compilados.</p>
     */
    private static final String SUFFIX = ".jasper";
    
    
    /**
     * <p>Tipos de conteúdo válidos para relatórios que podemos produzir.</p>
     */
    private static final String[] VALID_TYPES =
    { "text/html",            // Standard HTML representation
      "application/pdf",      // Adobe Portable Document Format
    };
    
    
    /**
     * <p>Gerar o relatório especificado, no formato de saída
     * especificado, baseado nos dados especificados.</p>
     *
     * nome do @param do nome do relatório a ser renderizado
     * tipo de @param do tipo de conteúdo do relatório solicitado ("application/pdf"
     *  or "text/html")
     * dados do @param <code>ResultSet</code> contendo
     *  os dados do relatório
     *
     * @exception IllegalArgumentException se o tipo de conteúdo
     *  especificado não for reconhecido
     * @exception IllegalArgumentException se nenhuma definição do relatório compilado
     * para o nome especificado puder ser encontrada
     */
    public void jasperReport(String name, String type,
                             ResultSet data) {
        jasperReport(name, type, data, new HashMap());
    }
    
    /**
     * <p>Gerar o relatório especificado, no formato de saída
     * especificado, baseado nos dados especificados.</p>
     *
     * nome @param do nome do relatório a ser renderizado
     * tipo de @param do tipo de conteúdo do relatório solicitado ("application/pdf"
     *  or "text/html")
     * dados de @param <code>ResultSet</code> contendo os dados para relatar
     * params @param de <code>Map</code> de parâmetros
     *   de relatório adicionais
     *
     * @exception IllegalArgumentException se o tipo de conteúdo
     *  especificado não for reconhecido
     * @exception IllegalArgumentException se nenhuma definição do relatório compilado
     * para o nome especificado puder ser encontrada
     */
    public void jasperReport(String name, String type,
            ResultSet data, Map params) {
    
        // Validar que reconhecemos o tipo de relatório
        // antes de perder tempo potencialmente preenchendo
        // o relatório com dados
        boolean found = false;
        for (int i = 0; i < VALID_TYPES.length; i++) {
            if (VALID_TYPES[i].equals(type)) {
                found = true;
                break;
            }
        }
        if (!found) {
            throw new IllegalArgumentException("Invalid report type '"
                    + type
                    + "' requested");
        }
    
        // Procurar recurso de design de relatório compilado
        ExternalContext econtext = getExternalContext();
        InputStream stream = econtext.getResourceAsStream(PREFIX + name
                    + SUFFIX);
        if (stream == null) {
            throw new IllegalArgumentException("Unknown report name '"
                    + name
                    + "' requested");
        }
    
        try {
            data.beforeFirst();
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Preencha o relatório solicitado com os dados especificados
        JRResultSetDataSource ds = new JRResultSetDataSource(data);
        JasperPrint jasperPrint = null;
        try {
            jasperPrint = JasperFillManager.fillReport(
                stream, params, ds);
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new FacesException(e);
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                ;
            }
        }
    
        // Configurar o exportador a ser usado, junto com os parâmetros
        // personalizados específicos do tipo de exportador
        JRExporter exporter = null;
        HttpServletResponse response = (HttpServletResponse)
        econtext.getResponse();
        FacesContext fcontext = FacesContext.getCurrentInstance();
        try {
            response.setContentType(type);
            if ("application/pdf".equals(type)) {
              exporter = new JRPdfExporter();
              exporter.setParameter(JRExporterParameter.JASPER_PRINT,
                jasperPrint);
              exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                response.getOutputStream());
            } else if ("text/html".equals(type)) {
              exporter = new JRHtmlExporter();
              exporter.setParameter(JRExporterParameter.JASPER_PRINT,
                jasperPrint);
              exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,
                response.getWriter());
              // Tornar imagens disponíveis para a saída HTML
              HttpServletRequest request =
                (HttpServletRequest)
                fcontext.getExternalContext().getRequest();
              request.getSession().setAttribute(
                ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
                jasperPrint);
              exporter.setParameter(
                JRHtmlExporterParameter.IMAGES_MAP, new HashMap());
              // A seguinte instrução requer mapeamento / imagem
              // para o imageServlet no web.xml.
              //
              // Este servlet serve imagens, incluindo imagens px
              // para espaçamento.
              //
              // Sirva as imagens diretamente para não
              // incorrermos em tempo extra associado a
              // a uma solicitação JSF para uma entidade não-JSF.
              exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
                request.getContextPath() + "/image?image=");
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Basta de preliminares ...
        // exportar o relatório
        try {
            exporter.exportReport();
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Dizer a JavaServer Faces que nenhuma saída é necessária
        fcontext.responseComplete();
    
    }
  3. Clique com o botão direito do mouse no código-fonte e escolha Fixar importações no menu pop-up. Na caixa de diálogo Corrigir importações, verifique se java.io.InputStream aparece no campo Nome totalmente qualificado para a classe InputStream e se java.sql.ResultSet aparece no campo Nome totalmente qualificado para a classe ResultSet.
  4. Clique em OK.
  5. Feche e salve o arquivo.

Criando a consulta do banco de dados

Neste aplicativo, você usa o mesmo conjunto de resultados de consulta do banco de dados para as informações de viagem serem exibidas na página da Web e no relatório gerado. Você o Editor de consultas para desenhar a consulta do banco de dados, como mostrado na figura abaixo.

Figura 6: Configurações do Editor de consultas para o Conjunto de resultados de viagem
Figura 7: Configurações do Editor de consultas para o Conjunto de resultados de viagem
  1. Na área de edição, clique na guia Page1 para exibir a página no Visual Designer.
  2. Na janela Tempo de execução, expanda Banco de dados, expanda o nó jdbc do banco de dados Viagem e expanda o nó Tabelas.
  3. Arraste o nó TRIP e solte-o em um local em branco na página.
  4. Na janela Esboço, expanda SessionBean1 e clique duas vezes em tripRowSet para abrir o Editor de consultas.
  5. Na tabela TRIP no painel superior, desmarque as caixas de seleção para PERSONID, TRIPTYPEID e LASTUPDATED.
  6. Arraste o nó PESSOA da janela Servidores e solte-o ao lado da tabela TRIP no painel superior.
  7. Na tabela PESSOA, desmarque as caixas de seleção para PERSONID, JOBTITLE, FREQUENTFLYER e LASTUPDATED.
  8. Arraste o nó TRIPTYPE da janela Servidores e solte-o ao lado da tabela PESSOA no painel superior.
  9. Na tabela TRIPTYPE, desmarque as caixas de seleção para TRIPTYPE, NAME e LASTUPDATED.
  10. Na linha NAME da tabela TRAVEL.PERSON no painel de grade, escolha Crescente na lista suspensa na coluna Tipo de classificação.

    O IDE define a Ordem de classificação como 1.
  11. Na linha DEPDATE da tabela TRAVEL.TRIP no painel de grade, escolha Crescente na lista suspensa na coluna Tipo de classificação.

    O IDE define a Ordem de classificação como 2.
  12. Feche o Editor de consultas para tripRowSet.

Criando a página do relatório de viagem

Nesta seção você adiciona uma tabela à Page1 para exibir os dados de viagem e adiciona botões para gerar o relatório nos formatos HTML e PDF, como mostrado na figura abaixo.

Figura 8: Page1
Figura 8: Page1
  1. Exiba Page1 no Visual Designer.
  2. Arraste um componente Tabela da Paleta e solte-o na página.
  3. Clique com o botão direito do mouse no componente Tabela e escolha Layout da tabela no menu pop-up.
  4. Na caixa de diálogo Layout da tabela, escolha tripDataProvider na lista suspensa Obter dados de.
  5. Selecione PERSON.NAME na lista Selecionado e clique no botão para cima repetidamente até PERSON.NAME mover-se para o alto da lista.
  6. Clique na guia Opções.
  7. Digite Trips na caixa de texto Título.
  8. Selecione Ativar paginação.
  9. Clique em OK para fechar a caixa de diálogo.
  10. Coloque um componente Botão acima do componente Tabela, digite View Report e pressione Enter.
  11. Na janela Propriedades, defina a propriedade id como viewReportBtn.
  12. Clique no botão de reticências (...) para a propriedade action, selecione viewReportBtn_action na lista suspensa e clique em OK.
  13. Coloque um componente Botão ao lado botão Exibir relatório, digite Create PDF e pressione Enter.
  14. Na janela Propriedades, defina a propriedade id como createPdfBtn.
  15. Clique no botão de reticências (...) para a propriedade action, selecione createPdfBtn_action na lista suspensa e clique em OK.
  16. Clique duas vezes no botão Exibir relatório para exibir a fonte de Java para o método viewReportBtn_action.
  17. Adicione o código abaixo mostrado em negrito ao corpo do método viewReportBtn_action.

    Amostra de código 4: Método viewReportBtn_action
        public String viewReportBtn_action() {
            // Liberar os recursos de rowset
            tripDataProvider.close();
            Map fillParams = new HashMap();
            // A instrução acima gerar avisos com Java SE 1.5
            // Para eliminar os avisos, substitua-a pela
            // seguinte instrução:
            // Map<String, URL> fillParams =
            //   new HashMap<String, URL.>>();
            try {
                fillParams.put
                  ("LogoURL",
                   getExternalContext().getResource("/resources/images/logo.gif"));
                getApplicationBean1().jasperReport
                  ("TripReportByPerson", "text/html",
                   getSessionBean1().getTripRowSet(), fillParams);
            } catch (Exception e) {
                log("Exception generating report", e);
                error("Exception generating report: " + e);
            }
            return null;
        }
    
  18. Efetue rolagem até o método createPdfBtn_action e adicione o código que aparece abaixo em negrito.

    Amostra de código 5: Método createPdfBtn_action
        public String createPdfButton_action() {
            // Liberar os recursos de rowset
            tripDataProvider.close();
            Map fillParams = new HashMap();
            try {
                fillParams.put
                  ("LogoURL",
                   getExternalContext().getResource("/resources/images/logo.gif"));
                getApplicationBean1().jasperReport
                  ("TripReportByPerson", "application/pdf",
                   getSessionBean1().getTripRowSet(), fillParams);
            } catch (Exception e) {
                log("Exception generating report", e);
                error("Exception generating report: " + e);
            }
            return null;
        }
    
  19. Clique com o botão direito do mouse no código-fonte e escolha Fixar importações no menu pop-up.
  20. Na barra de ferramentas principal, clique em Executar projeto principal para construir, implantar e executar o aplicativo da Web.
  21. No aplicativo da Web, clique em Exibir relatório para visualizar o relatório no formato HTML.

    Se vir imagens quebradas, abra Web > WEB-INF > web.xml e certifique-se de que a entrada para ImageServlet existe. Às vezes, o IDE não salva entradas recém-adicionadas.
  22. Clique no botão Voltar e clique em Criar PDF para visualizar o relatório no formato PDF.

Resumo

As etapas principais para usar a estrutura JasperReports do projeto NetBeans Visual Web Pack são as seguintes:
  1. Fazer o download e descompactar a estrutura JasperReports a partir de http://www.jasperforge.org.
  2. Usar o Gerenciador de bibliotecas para criar uma biblioteca JasperReports. Isso facilita adicionar os arquivos JAR necessários de JasperReports a um aplicativo da Web.
  3. Para adicionar a biblioteca JasperReports a um aplicativo da Web, clique com o botão direito do mouse no nó Biblioteca e escolha Adicionar biblioteca.
  4. Usar as propriedade Extensões e tipos MIME para Objetos XML na caixa de diálogo Opções e adicionar jrxml à lista de objetos XML. Ao fazê-lo, o IDE abrirá arquivos jrxml no editor de XML.
  5. Adicionar um mapeamento a net.sf.jasperreports.j2ee.servlets.ImageServlet no arquivo web.xml.
  6. Adicionar lógica ao Bean do aplicativo para gerar os relatórios.
  7. Após criar o relatório, chamar facesContext.responseComplete( ) para encerrar o atual ciclo de solicitações.
  8. Se você estiver gerando um relatório HTML, use o parâmetro IMAGES_URI para passar o URI para a classe ImageServlet. Por exemplo, se você definir o URI como /image, defina o parâmetro IMAGES_URI como request.getContextPath() + "/image?image=".
  9. Você pode usar um conjunto de linhas em cache, como o conjunto de linhas em cache que o IDE cria quando você adiciona um provedor de dados a uma página, como uma fonte de dados para preencher o relatório. Certifique-se de chamar o método close do provedor de dados antes de preencher o relatório.

Consulte também:


Esta página foi modificada pela última vez em 26 de fevereiro de 2007


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by