Criando as entidades da sua aplicação através de engenharia reversa no Eclipse

Se você já tem seu banco de dados pronto e deseja criar as entidades com o mínimo de esforço (estratégia bottom-up de desenvolvimento), a solução é fazer engenharia reversa. O Eclipse Ganymede 3.4 permite que isso seja realizado de forma muito simples e, embora não gere um código perfeito,  já poupa bastante tempo do desenvolvedor.

Nesse exemplo uso banco de dados Postgres. Vamos aos passos:

Leia mais

Como retornar e preencher apenas alguns atributos da entidade na consulta com Hibernate

Esses dias desenvolvi um sistema que teria que armazenar uma entidade em escopo de sessão, porém a classe representada pela entidade tinha vários atributos de instância. Isso despertou uma certa preocupação em relação ao consumo de memória, visto que haveriam muitos acessos simultâneos ao sistema e quase todos os usuários teriam esse objeto setado na sessão. O detalhe é que em termos de escopo de sessão eu precisava de apenas alguns atributos, enquanto vários outros eu precisava em apenas algumas telas – poderia ser escopo de requisição.

A solução foi puxar somente alguns dos atributos na consulta que retornava o objeto a ser colocado na sessão. Quando eu precisasse dos outros atributos da entidade, teria uma variável do mesmo tipo em um managed bean com escopo de request que seria utilizado nas telas.

Pensei então: para fazer isso com JDBC é muito fácil, mas minha aplicação usa Hibernate. É possível fazer isso com Hibernate? Como?

Após algumas horas de pesquisa descobri a classe AliasToBeanResultTransformer que simplifica bastante as coisas para a gente. Vamos aos códigos:

Leia mais

Como executar métodos antes de renderizar páginas em JSF – abordagem com RestFaces

No meu post anterior, mostrei como preparar uma aplicação JSF para receber requisições GET com o uso de RestFaces Actions. Nessa nova publicação, mostrarei como chamar um método de um Bean antes de renderizar uma página.

Uma das possibilidades de se conseguir isso é criando um PhaseListener. O problema é que muitas vezes isso acontece em apenas uma página do nosso sistema, então criar um PhaseListener que vai verificar se o usuário está em uma determinada página para executar uma simples ação é bastante desencorajador. Uma outra opção seria colocar lógica no método getter, mas essa prática é fortemente desaconselhada, pois, em geral, os getters não devem ter lógica de negócio.

Com o RestFaces (caso você queira saber como instalar o RestFaces, consulte meu post anterior nesse endereço)  é muito simples fazer essa operação, conforme demonstrarei abaixo:

Leia mais

Usando RestFaces na sua aplicação JSF – trabalhando com requisições GET no JSF

Hoje me deparei com um problema aqui no trabalho: uma aplicação nossa em PHP iria chamar uma aplicação JSF passando parâmetros GET que deveriam ser tratados e, dependendo dos dados recebidos, essa aplicação JSF redirecionaria o usuário para uma view ou para outra. Além disso, o sistema em JSF deveria armazenar algumas das informações vindas pela URL para posteriormente exibir na tela para o usuário.

Já sabia que para trabalhar com bookmarking no JSF era necessário utilizar algum componente externo e o mais famoso é o RestFaces. A primeira iniciativa foi então pesquisar como eu iria realizar os seguintes passos:

  1. Tratar esses parâmetros vindos do sistema PHP;
  2. Armazenar os dados recebidos em propriedades dos beans;
  3. Direcionar o usuário para uma das duas telas predefinidas.

O RestFaces tem várias funcionalidades bastante úteis e permite invocar métodos server-side através de uma simples requisição GET HTTP. Ele lhe ajuda bastante no gerenciamento de parâmetros das seguintes formas:

  • Permite passar parâmetros da URL para os métodos server-side;
  • Converte parâmetros;
  • Renderiza parâmetros;
  • Alinha propriedades dos Beans aos parâmetros da URL e vice-versa.

A solução que encontrei para meu problema (poderia ser feito de outras formas) foi apenas criar duas RestFaces Actions.

Vamos ao passo-a-passo:

Leia mais

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:

Leia mais

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:

Leia mais

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.

Leia mais

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.

Leia mais

Dicas de banco de dados

Logo Postgres

Logo Postgres

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:

Leia mais

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.