Jasper Report com Vraptor 4

Você já deve ter visto por aí query dentro de arquivos jrmxl. Se eu já tenho uma query na minha aplicação que traz os dados do relatório, não tem sentido reescrever a mesma query dentro do arquivo jrxml e pior, ir no banco de dados mais uma vez pegar as mesmas informações que já tenho na aplicação. Como eu já tenho a lista de objetos que o hibernate recuperou do banco, é muito melhor passar a lista direto para o jasper. 

Vou tomar como base o projeto criado nesse post aqui. Adicione as dependencias no pom.xml

  
      <dependency>   
             <groupId>br.com.prixma</groupId> 
              <artifactId>vraptor-jasperreport</artifactId> 
                <version>4.1.0</version>     
          <scope>compile</scope>  
     </dependency> 
      <dependency>   
                <groupId>net.sf.jasperreports</groupId> 
           <artifactId>jasperreports</artifactId>   
          <version>6.2.2</version> 
      </dependency>

Antes de fazer o relatório, vamos criar uma interface e uma classe chamada Entidade para deixar a arquitetura do nosso projeto mais organizada.

Interface Entidade.java dentro do pacote models:

  
   package br.com.davifelipe.models;
 
   import java.io.Serializable;
  
   public interface Entidade<T extends Serializable> extends Serializable {
  
       T getId();
       void setId(T id);
   }

As duas classes: Product e Category implementam a interface:

  
   @Entity
   public class Product implements Entidade<Integer>{
  
   @Entity
   public class Category implements Entidade<Integer>{
  
   

Agora vamos criar uma classe chamada EntidadeReport dentro do pacote controller:

   package br.com.davifelipe.controllers;
  
   
  
   import java.util.Collection;
   import java.util.HashMap;
   import java.util.List;
   import java.util.Map;
   import javax.servlet.ServletContext;
   import br.com.caelum.vraptor.jasperreports.Report;
   import br.com.davifelipe.models.Entidade;
  
  
   @SuppressWarnings("rawtypes")
   public class EntidadeReport<T extends Entidade> implements Report{
  
       private final List<T> data;
       private Map<String, Object> parameters;
       private String template;
   
       public EntidadeReport(List<T> data, String template, ServletContext context) {
  
           this.data = data;
           this.template = template;
           this.parameters = new HashMap<String, Object>();
           addParameter("diretorio_base", context.getRealPath("/") );
  
       }
  
       @Override
       public String getTemplate() {
           return template;
       }
  
   
       @Override
       public Map<String, Object> getParameters() {
           return parameters;
       }
  
       @Override
       public Collection<T> getData() {
           return data;
       }
   
       @Override
       public String getFileName() {
           return "report" + System.currentTimeMillis();
       }
  
       @Override
       public Report addParameter(String parameter, Object value) {
           parameters.put(parameter, value);
           return this;
       }
  
       @Override
       public boolean isCacheable() {
           return false;
       }
  
   }
  
   

Vamos adicionar um arquivo de imagem referente a logo que vai aparecer no relatório.

Crie um arquivo na pasta: /src/main/webapp/WEB-INF/reports/img/twitter_logo.png

No meu caso usei uma log do twitter. Pode pegar qualquer imagem na internet.

Exporte as classes do pacote models para um arquivo jar:

Imagem

Imagem

Imagem

Estou usando JaspoerSoft Studio. Mas Ireport também deve funcionar. Agora vamos criar o relatório e importar o arquivo jar para que possamos enchergar os atributos das classes models dentro do jasper Soft Studio.

Abra o JasperSoft Studido e crie um novo relatório chamado produtos.jrxml

Imagem

Imagem

 

Imagem

Ele cria automaticamente esse relatório na pasta C:/Users/davi/JaspersoftWorkspace/MyReports

Vamos fazer logo o seguinte:

Copie o arquivo produtos.jrxml da pasta MyReports para dentro do projeto em src/main/webapp/WEB-INF/reports/produtos.jrxml

Depois Vá em project explorer no Jasper Reports e exclua o arquivo produtos.jrxml

Esse arquivo que você está excluíndo é na pasta MyReports. Agora vá em File> Open File e abra o arquivo produtos.jrxml que está dentro do projeto. 

Dessa forma já trabalhamos direto no arquivo que está dentro do projeto. A primeira coisa que vamos fazer é criar um parametro chamado diretorio_base que serve para o jasper achar o arquivo de imagem que está dentro do projeto. Esse diretorio_base que é o caminho base do projeto vai ser passado no controller:

Imagem

Imagem

Agora vamos adicionar o componente de imagem que vai aparecer no relatório mostrando a logo na parte de cima:

Imagem

Imagem

Clique em image e depois nesse icone ao lado de expression

 Imagem

Imagem

Imagem

Adicionamos o caminho do diretório base contatenado com o arquivo de imagem.

Vamos importar para dentro do Jasper Soft o arquivo jar com o pacote model que exportamos no inicio. Essa importação serve apenas para que possamos adicionar com mais facilidade os campos das entidades do projeto. O relatório não vai depender desse arquivo .jar para rodar.

 Imagem

Imagem

 

Imagem

 

Imagem

 

Imagem

Imagem

Imagem

Imagem

Imagem

Agora que os campos já aparecem na parte Fields, basta ir arrastando os campos para a banda detail1 e os labels para column header. 

A logo e o título pode manter em page header e se quiser pode colocar alguma coisa em footer. Como não seu muito jeitoso o meu ficou assim:

Imagem

Depois que ajustar as posicções e adicionar os campos no relatório, basta clicar em Build All para gerar o arquivo compilado .jasper

Se você estiver editando o arquivo jrxml que está dentro da pasta do projeto, o arquivo .jasper deve ser gerado lá também, na mesma pasta do jrxml. 

Imagem

O relatório já está pronto. Agora falta criar uma action no controller e mandar a lista de produtos para serem exibidas no relatório.

Antes de começar a codificar, vamos conferir se os arquivos jrxml e jasper estão na pasta correta:

Imagem

É bom também conferir se a data/hora de alteração do arquivo confere com a hora da sua máquina. Só para ter certeza que o arquivo correto está no projeto.

Feito isso, crie esse método em ProductController.java

  
  @Get
  @Path("/imprimirProdutos")
  @SuppressWarnings({ "unchecked", "rawtypes" })
  public Download imprimirProdutos() {
  
          List<Product> lista = productDao.all(); 
          Report report = new EntidadeReport(lista, "produtos.jasper", context);
          ReportDownload download = new ReportDownload(report, ExportFormats.pdf(), false);
          return download;
  
  }

Agora crie essa variável global injetada na classe ProductController

  
  @Inject
  private ServletContext context;

Limpe o projeto e inicie o tomcat. Se tudo estiver ok, deve disparar esse erro:

Imagem

Isso significa que esses dois métodos estão em conflito. Para resolver, basta ir na anotação @Get("/{product.id}") e alterar para @Get("/edit/{product.id}"). O método deve ficar assim:

  
   @Get("/edit/{product.id}")
   public void formUpdate(Product product)
   {
        result.include("product", productDao.findById(product.getId()));
        loadFormDependencies();
   }

Feito isso, reinicie o servidor novamente e o relatório deve ser exibido:

 Imagem

Para baixar o projeto completo clique aqui

Comentários

 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente