Como passar a consulta dinamicamente para o JasperReports / iReport
Essa semana me deparei com um problema no trabalho que levei alguns minutos estudando a melhor solução. Eu tinha um relatório que deveria ser gerado com o JarperReports cuja consulta a ser realizada no banco poderia mudar constantemente, de acordo com o filtro que o usuário selecionasse na tela. Uma solução me veio à cabeça imediatamente: mandar um ArrayList para o JasperReports com o resultado da minha consulta para que ele preencha os dados. Essa solução é prática e fácil de implementar, mas esse ArrayList poderia ficar muito grande, visto que meu banco possuía muitas informações.
A melhor solução que encontrei foi passar a consulta inteira como parâmetro para o JasperReports fazer a consulta no banco. Para ilustrar como fazer isso, vamos aos passos abaixo:
Client-side X Server-side em JSF. Onde salvar o estado?
Um das decisões mais debatidas em JSF ou Seam e que os desenvolvedores dão pouca importância é onde salvar a árvore de componentes da view. Há duas opções disponíveis: do lado do cliente (client-side) e do lado do servidor (server-side), cada uma com suas vantagens e desvantagens.
Para entender melhor, vamos ver o ciclo de vida do JSF, entender em que contexto se encontra a criação da árvore de componentes, e porque ela existe:
Implementando converter e validator de CNPJ
Dando continuidade ao assunto anterior, vou agora mostrar como criar converter e validator de CNPJ. Lembrando que a lógica de validação/conversão vai estar completamente inserida dentro das classes que implementam javax.faces.convert.Converter e javax.faces.validator.Validator. Aqui no meu trabalho colocamos essa lógica em classes Java separadas. Geramos um jar com essas classes e então colocamos esse jar no classpath da aplicação, evitando replicação de código.
Outro detalhe é que a classe de validação lança uma exception chamada FormatoCNPJException que é uma classe que extende Exception quando o CNPJ é inválido apenas para o código ficar mais claro. Não vou colocar o código dessa classe aqui no post para o artigo não ficar muito grande, portanto será necessário implementar essa classe caso você queira testar meu exemplo de validação.
Se você deseja entender melhor o que é um converter ou um validator, ou como eles funcionam, consulte meu post anterior aqui.
Implementando converter e validator de CPF
Recentemente me deparei no trabalho com alguns sistemas que exigiam a validação/formatação de CPF e de CNPJ. Achei que poderia solucionar o problema com javascript, mas considerei melhor criar validator e converter para cada um dos casos.
Nessa primeira etapa, vou mostrar a conversão e validação de CPF. Ressalto que a lógica de validação/conversão vai estar completamente inserida dentro das classes que implementam javax.faces.convert.Converter e javax.faces.validator.Validator. Aqui no meu trabalho colocamos essa lógica em classes Java separadas. Geramos um jar com essas classes e então colocamos esse jar no classpath da aplicação, evitando replicação de código.
Outro detalhe é que a classe de validação lança uma exception chamada FormatoCPFException que é uma classe que extende Exception quando o CPF é inválido apenas para o código ficar mais claro. Não vou colocar o código dessa classe aqui no post para o artigo não ficar muito grande, portanto será necessário implementar essa classe caso você queira testar meu exemplo de validação.
Dicas de banco de dados
Estou fazendo um curso de PostgreSQL e meu instrutor tem dado algumas dicas que venho utilizando em situações práticas nas aplicações que desenvolvo para melhorar a performance do banco e diminuir o tempo de retorno das requisições realizadas.
Através de estudos realizados ficou constatado que os problemas mais comuns encontrados em bancos de dados são:
- 60% relacionados ao mau uso da linguagem SQL;
- 20% relacionados a má modelagem do banco de dados;
- 10% relacionados à má configuração do SGDB;
- 10% relacionados a má configuração do SO.
Seguem algumas dicas que venho utilizando e configurações que podem ser feitas no Postgres para melhorar a interação entre o sistema e o SGBD:
Como forçar download de arquivo em JSF / Struts
Estou implementando uma aplicação em JSF que gera um arquivo texto em uma pasta da aplicação. Esse arquivo deve ser baixado para a máquina do usuário para que ele faça sua importação no servidor.
Para forçar o usuário a baixar o arquivo – e não deixar que o conteúdo dele aparecesse na tela do browser – desenvolvi uma solução muito simples que gira em torno de uma única JSP. O legal da solução é que ela serve para JSF, Struts e Servlets (acredito que com o Seam também funcione), a extensão do arquivo pode ser qualquer uma e o arquivo pode inclusive estar em qualquer pasta do servidor (dentro ou não do contexto web).
Clique aqui para baixar o PDF.
Tutorial: Técnicas de Geração de Relatórios com JasperReports / iReport
Uma abordagem utilizando a ferramenta de design iReport
Por diversas vezes tenho me deparado com pessoas no CEJUG e em diversos fóruns Java com dificuldades na geração de relatórios com o JasperReports ou na utilização do iReport como ferramenta visual de diagramação dos documentos.
Foi então que tive a idéia de disponibilizar esse tutorial no meu blog que mostra como criar relatórios no iReport através de três técnicas: passando uma conexão com o banco de dados, passando um ResultSet (encapsulado na classe JRResultSetDataSource) e passando uma lista de objetos (encapsulada na classe JRBeanCollectionDataSource).
Além da demostração de como gerar os relatórios, mostro também o código Java correspondente de cada método, dou algumas dicas para modificar os textFields dos relatórios e outras de utilização do próprio iReport.
Resolvi também disponibilizar a aplicação que criei em JSF no formato zip e war. Bom proveito a todos.
Clique aqui para baixar o PDF do tutorial.
Clique aqui para baixar o projeto do Eclipse compactado (zip).
Clique aqui para baixar o projeto no formato war.
