Por que eu devo ler este artigo:O artigo mostra a integração dos frameworks JSF 2, Spring e Hibernate na arquitetura de projetos web e a utilização da ferramenta Maven como agente facilitador desta integração. Também são discutidas as vantagens e características de cada componente utilizado.

O conjunto de ferramentas e frameworks apresentados mostra uma dentre as tantas possíveis combinações de tecnologias do mundo Java. A solução apresentada pode servir como arquitetura de um projeto de sistema web ou servir como um comparativo com outras tecnologias disponíveis.

Apresentaremos neste artigo a construção de uma aplicação web que faz uso de poderosos frameworks e ferramentas Java: Maven, JSF 2, Spring e Hibernate. Serão abordados os fundamentos por trás de cada uma destas tecnologias e será apresentado o motivo de suas escolhas. Serão discutidos também os passos para integração das mesmas e a demonstração de suas capacidades de forma bastante prática. O exemplo construído, apesar de simples, aborda tópicos avançados no desenvolvimento de sistemas Java, como injeção de dependência, controle transacional, Ajax e mapeamento objeto relacional. Além disso, embora o exemplo use especificamente as tecnologias citadas, o artigo emprega boas práticas de arquitetura de software para fornecer baixo acoplamento entre os seus componentes, possibilitando uma fácil expansão ou mudança das tecnologias.

Neste artigo construiremos um exemplo que mostrará de forma objetiva a arquitetura de uma aplicação Web que envolve a integração das seguintes tecnologias do mundo Java: Maven, JSF 2, Spring e Hibernate.

Maven é uma ferramenta pertencente ao grupo Apache que tem como finalidade o gerenciamento e a automação de projetos Java. De acordo com o próprio site do Maven, a ferramenta tem os seguintes objetivos: prover um padrão para desenvolvimento de aplicações; criar mecanismos para uma clara definição do conteúdo do projeto; facilitar a publicação de informações do projeto; e possibilitar o compartilhamento de bibliotecas entre vários projetos. Um dos principais serviços providos pelo Maven é o gerenciamento de dependências. Esta facilidade será apresentada e discutida mais à frente no artigo e é a razão principal da escolha desta ferramenta no desenvolvimento da aplicação exemplo que iremos construir.

JSF é o framework Java padrão para a construção de aplicações web a partir da versão Java EE 5. É uma especificação para o desenvolvimento de interfaces web utilizando uma arquitetura voltada a componentes. Assim, na definição de uma página web utilizamos componentes JSF dentro desta página sem a necessidade de escrevermos código HTML. O desenvolvimento de páginas pode ser simplesmente baseado na ação de pegar e arrastar componentes na tela. Este framework faz uso do bom e velho padrão Modelo–Visão–Controlador (MVC) na sua arquitetura, o que ajuda na manutenção do código. E pelo fato do JSF ser apenas uma especificação, você pode escolher a implementação que mais lhe agradar. Neste artigo utilizaremos a implementação de referência do JSF 2, o Mojarra. O JSF 2 é a mais nova especificação do framework e traz enormes melhorias em comparação com as versões anteriores. Algumas destas melhorias serão abordadas ao longo do artigo.

Spring é um framework de desenvolvimento Java que emergiu em 2003 como uma alternativa ao então conturbado EJB (Enterprise JavaBeans). Este framework tem como paradigma o desenvolvimento ágil e leve, baseado em POJO (Plain Old Java Objects). Ele provê um ecossistema completo de desenvolvimento, possibilitando o seu uso em diversos tipos de aplicativos. O Spring possibilita uma simples integração com outros frameworks Java, como por exemplo, Struts, JSF e Hibernate. Também permite o uso de serviços do padrão Java EE, como por exemplo, JPA, JMS, JTA, entre outros. Além disso, implementa e possibilita o uso de boas práticas de programação, como inversão de controle e programação orientada a aspectos. A essência do Spring está no seu container de IoC (Inversion of Control), que é um ambiente responsável por criar, gerenciar e injetar os objetos de uma aplicação. Em suma, o Spring é um framework completo que agiliza bastante o desenvolvimento de uma aplicação. A escolha do mesmo em nossa arquitetura se justifica pelo uso do seu poderoso IoC container, da sua integração com JPA (Hibernate) e do fácil e transparente controle transacional provido pelo framework.

O JPA (Java Persistence API) é a especificação padrão do Java para persistência. Ela define como deve ser feito o mapeamento de um modelo orientado a objetos para um banco de dados relacional. Como JPA é apenas uma especificação, assim como JSF, existem vários frameworks que o implementam, dentre eles, destacamos Hibernate, TopLink e JDO. Frameworks deste tipo são chamados de ORM (Object-Relational Mapping). Para a construção do nosso exemplo, usaremos a implementação JPA do Hibernate. O serviço prestado pelo JPA é uma camada de abstração para o acesso e manipulação dos dados relacionais do banco de dados de uma maneira orientada a objetos. Esta camada de abstração provê um caminho bidirecional no qual os dados relacionais (colunas das tabelas) são transformados em objetos do nosso modelo e vice-versa. Um objeto JPA mapeado para uma tabela do banco de dados é chamado de entidade. O JPA também oferece o Entity Manager ou gerenciador de entidades, que é responsável por abstrair as operações relacionais do banco de dados de inserção, leitura, alteração e exclusão, comumente chamadas de operações CRUD (Create, Read, Update e Delete). A escolha do Hibernate na persistência dos dados do nosso projeto se deve ao fato de ele ser o framework ORM Java mais consolidado do mercado e implementar a especificação padrão Java EE para persistência, o JPA.

Até o momento realizamos apenas breves introduções do potencial das tecnologias que serão utilizadas neste artigo. Quando integradas, Maven, JSF, Spring e Hibernate tornam-se um poderoso conjunto na arquitetura de aplicações Web, possibilitando um desenvolvimento rápido e robusto de aplicações. Agora estamos prontos para iniciarmos a construção da aplicação exemplo!

Especificação do exemplo e Ambiente de Desenvolvimento

Utilizaremos como exemplo de integração das ferramentas e frameworks citados a criação de uma aplicação Web bastante simples. Esta aplicação mantém o cadastro de clubes e atletas de futebol, e daremos a ela o nome de Onze Vencedor – uma alusão ao clássico jogo de futebol Winning Eleven.

Teremos apenas duas telas na nossa aplicação: uma para a manutenção de clubes e outra para a manutenção de atletas. Estas telas oferecem as operações CRUD para inserção, leitura, alteração e exclusão de registros. Além disso, as telas possuem dois modos distintos: um de edição, usado na inclusão e alteração; e outro para pesquisa de registros.

O diagrama de classes da nossa aplicação pode ser visto na Figura 1. Note que existe uma agregação entre as classes Clube e Atleta, onde definimos que um clube tem vários atletas e um atleta pertence a apenas um clube. A classe Atleta também tem uma associação com um tipo enumerado chamado Posicao, que mantém as possíveis posições que um atleta de futebol pode ter.

Por fim, a nossa aplicação terá um banco de dados relacional para o armazenamento dos dados, e para tal, utilizaremos o banco de dados MySQL.

O nosso ambiente de desenvolvimento contará com a IDE Eclipse Indigo 3.7 e com o servidor Web Apache Tomcat 7. As instalações do MySQL, Eclipse e Tomcat 7 estão fora do escopo deste artigo, por isso, para detalhes sobre a instalação destes programas, consulte a seção Links.

Utilizaremos o Maven na fase de desenvolvimento para o gerenciamento de dependências e para a distribuição do projeto em um arquivo WAR. Para uma melhor produtividade recomenda-se a integração do mesmo à IDE utilizada. No entanto, o Eclipse não oferece suporte nativo ao desenvolvimento com Maven, portanto, adicionaremos à IDE um plugin chamado M2Eclipse. Este plugin acrescenta ao Eclipse a capacidade de criar, importar e gerenciar projetos Maven. Os detalhes de como instalar o plugin M2Eclipse podem ser encontrados na Edição 93 da Java Magazine, no artigo Além da IDE – Parte 2, e também no site do plugin (veja a seção Links).

Diagrama de classes da aplicação de exemplo
Figura 1. Diagrama de classes da aplicação de exemplo.

Arquitetura do projeto

Embora a especificação da aplicação de exemplo do nosso artigo seja simples por conter apenas operações CRUD, faremos uso de uma boa arquitetura de sistemas utilizando padrões que possibilitem uma fácil expansão do código futuramente.

O código terá uma divisão lógica utilizando o padrão arquitetural MVC (Modelo-Visão-Controle). Na camada de visão da aplicação teremos as páginas JSF que irão conter os componentes visuais da aplicação, como é o caso de formulários, botões, texto, entre outros.

JSF faz uso de beans Java para possibilitar a separação do código de apresentação do código de negócio. Por sua vez, uma página JSF referencia um ou mais beans, que são classes Java que armazenam o código de negócio que deve ser invocado pelas páginas da aplicação. Estes beans têm seu ciclo de vida gerenciado pelo JSF, sendo assim chamados de Managed Beans.

Os managed beans do JSF fazem o papel de controladores da nossa aplicação. Eles recebem um estímulo da camada de visão para a execução de alguma operação e em seguida delegam esta execução à classe de negócio responsável. Após a execução da regra de negócio o controlador repassa o resultado da operação à camada de visão.

Já a camada de modelo do nosso exemplo é representada pelas classes de entidades JPA que são mostradas na Figura 1.

Além destas, teremos uma camada de serviço (Facade) que implementa as regras de negócio da aplicação. A camada de serviço visa encapsular, isolar o código de negócio da aplicação, sendo considerada uma boa prática por facilitar o reuso o código.

Por último temos a camada de persistência DAO (Data Access Object). Os objetos DAO são responsáveis pelas operações realizadas no banco de dados. A utilização do mesmo é um bom padrão de desenvolvimento, pois separa as regras de negócio da aplicação das operações de manipulação do banco de dados.

Os nossos objetos DAO fazem uso de um objeto do tipo EntityManager, que é criado pelo Hibernate e injetado pelo Spring no DAO. Falaremos sobre o EntityManager mais adiante no artigo.

O fluxo da aplicação inicia-se na camada de visão por algum evento disparado pelo usuário na página JSF. O managed bean que atua como controlador, recebe tal evento, validando a entrada de dados e chamando a camada de serviço para efetuar a operação desejada. A camada de serviço, assim, pode vir a chamar a camada DAO se a operação envolver acesso a banco de dados. Por fim, o modelo é atualizado na camada de serviços que devolve o modelo atualizado para a camada de visão após o final da operação.

...
Quer ler esse conteúdo completo? Tenha acesso completo