Integrando os Frameworks Spring, Hibernate e JavaServer Faces

 

Introdução

Visando um dos principais objetivos da Engenharia de Software que é o reuso, onde através da reutilização de software obtém-se o aumento da qualidade e redução do esforço de desenvolvimento (Gimenes & Huzita, 2005), veremos a integração de três dos mais conhecidos e utilizados frameworks para a tecnologia JAVA: Spring, Hibernate e JavaServer Faces.

 

A orientação a objetos fornece facilidades para que possamos reutilizar muito do que está pronto ao invés de reescrevermos.

 

Componentes de software definem unidades reutilizáveis que oferecem serviços através de interfaces bem definidas (Gimenes & Huzita, 2005). Padrões de Projeto, Design Patterns, é outra abordagem mais abstrata que objetiva a reutilização de projetos de soluções para problemas recorrentes.

 

Os frameworks, também chamados de frameworks de aplicação, geram famílias de aplicações orientadas a objetos. Seus pontos de extensão são definidos como classes abstratas ou interfaces, que são estendidas ou implementadas por cada instância da família de aplicações.

 

Frameworks encapsulam detalhes de implementação voláteis através de seus pontos de extensão, interfaces estáveis e bem definidas, aumentando a modularidade da aplicação. Os locais de mudanças de projeto e implementação da aplicação construída usando o framework são localizados, diminuindo o esforço para entender e manter a aplicação.

 

O Framework Hibernate

Hibernate é um framework adotado na arquitetura do sistema para persistir os objetos de negócio. Hibernate fornece mapeamento completo e, ao contrário do EJB, trata de todas as questões relativas ao mapeamento de objetos em tabelas. Através da API do Hibernate são realizadas operações de inserção, atualização, remoção e consulta de objetos, e através da linguagem de consulta do Hibernate “Hibernate Query Language – HQL”, consultas mais complexas são realizadas. Os metadados de mapeamento de objetos são definidos em arquivos XML.

 

Hibernate (HIBERNATE, 2006) é um framework de Object-Relational Mapping para ambientes de Java. O termo Object-Relational Mapping (ORM) se refere à técnica de mapear uma respresentação de dados para um modelo modelo relacional dos dados baseado em Structured Query Language(SQL).

 

O Framework Spring

Spring é um framework de infra-estrutura adotado na arquitetura do sistema para complementar o Hibernate. Este Spring oferece os serviços de controle de transações, segurança e exposição de serviços remotos. O Spring também simplifica o desenvolvimento com o Hibernate através do uso de métodos template e contribui para um baixo acoplamento entre as classes da aplicação.

 

O Spring pode ser classificado como um framework de infra-estrutura, pois provê serviços como gerencia de transações e de segurança além de se integrar com frameworks ORM, que fornecem serviços de persistência. Spring também é usualmente chamado de container leve ou “lightweight container” (Walls & Breidenbach, 2005). O termo container é usado, pois Spring gerencia o ciclo de vida dos objetos configurados nele, assim como o container EJB. Porém é considerado um container leve, pois ao contrário do container EJB, ele não é intrusivo e as classes da aplicação tipicamente não possuem dependências com o Spring.

 

Spring é um framework dividido em vários módulos usados de acordo com as necessidades da aplicação. Através do seu módulo de Dependency Injection, consegue-se um baixo grau de acoplamento entre as classes da aplicação.

 

A subseção a seguir descreve Dependency Injection, o principal conceito por trás do Spring.

 

O Framework JavaServer Faces

JavaServer Faces (JSF, 2006) é diferente dos web frameworks apresentados até então, pois além de ser um framework de infra-estrutura, também pode ser classificado como um framework de componentes, pois define um modelo de componentes para serem usados na camada de apresentação. Há três tipos principais de componentes no JSF: componentes de interface, usado para compor interfaces com o usuário, componentes de conversão de dados, usados para converter os dados inseridos pelo usuário em tipos da aplicação e componentes de validação de dados, usados para validar a entrada do usuário. JSF vem com um conjunto padrão de componentes, que podem ser estendidos.

 

Os comandos no JSF recebem o nome de backing beans ou managed beans. Estes não precisam implementar interfaces específicas ou estender classes, bastando que o método do comando seja público, não receba parâmetros e tenha o tipo de retorno String. Componentes de interface vinculam hyperlinks ou botões a ações de comando. Os backing beans contém os dados dos formulários relacionados de forma que não é necessário criar classes extras, como beans de formulário ou Action Forms para isto.

 

O mapeamento entre requisições e controladores é feito através de campos escondidos em formulários, inseridos automaticamente pelos componentes de comando. Assim como no Spring MVC e no Struts, as URLs de requisição são divididas em uma parte fixa e uma parte variável. A parte fixa serve para associar a URL de requisição ao Servlet controlador do JSF e a parte variável da URL serve para identificar qual página JSP que contém componentes JSF será executada.

 

A Integração

Ao integrar o hibernate ao spring, a configuração do Hibernate que antes era feita separadamente passa a ser feita através do próprio Spring. Desta forma, a manutenção do arquivo de configuração da aplicação é feita em um só arquivo com uma sintaxe única, conforme segue:

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName">

<value>org.postgresql.Driver</value>

</property>

<property name="url">

                  <value>jdbc:postgresql://SERVER:5432/DATABASE</value>

</property>

<property name="username">

                  <value>USUARIO</value></property>

<property name="password">

                  <value>SENHA</value>

</property>

      </bean>

 

      <!-- Hibernate SessionFactory -->

      <bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

            <property name="dataSource">

                  <ref local="dataSource" />

            </property>

 

<!-- Must references all OR mapping files. -->

            <property name="mappingResources">

                  <list>

                        <value>br/com/projeto/hbm/QualquerCoisa.hbm.xml</value>

<value>br/com/projeto/hbm/OutraCoisa.hbm.xml</value>

                  </list>

            </property>

 

            <!-- Set the type of database -->

            <property name="hibernateProperties">

                  <props>

                        <prop key="hibernate.dialect">

                             org.hibernate.dialect.PostgreSQLDialect

                        </prop>

                        <prop key="hibernate.show_sql">

true

</prop>

                  </props>

            </property>

      </bean>

      <bean id="qualquerCoisaBO" class="br.com.projeto.bo. QualquerCoisaBO">

            <property name="dao">

                  <ref local="qualquerCoisaDAO" />

            </property>

      </bean>

      <bean id="qualquerCoisaDAO"

class="br.com.projeto.dao.QualquerCoisaDAO">

            <property name="sessionFactory">

                        <ref local="sessionFactory"/>

</property>

      </bean>

<beans>

 

O hibernate preocupa-se em manter o mapeamento Objeto-Relacional entre o sistema e a base de dados, tornando transparente o acesso e população dos objetos para a persistência, porém necessita de uma abertura e um fechamento de sua sessão a cada requisição de dados.

 

O framework JSF possui ótimos mecanismos de controle, validação, conversão e apresentação de dados, e faz tudo isso com um mínimo de esforço do desenvolvedor, possibilitando ainda um maior controle e desmembramento entre a interface de usuário “HTML e estilos” e o código desenvolvido, facilitando à cada área de desenvolvimento a manutenção específica, porém não possui nenhum mecanismo de acesso a bases de dados.

 

O framework Spring é um framework que implementa a “Invertion of Control – IoC” (SPRING, 2006), ou seja, Inversão de Controle, que facilita a tarefa de se acessar bases de dados através de padrões como “Data Access Object – DAO”, amplamente conhecido, o que permite que o framework JSF tenha acesso a dados para controlar na camada de apresentação através da injection de objetos. Possui ainda um ótimo controle de sessão, possibilitando que o framework Hibernate apenas se preocupe com o mapeamento e criação de queries.

 

Alguns exemplos comentados:

 

<managed-bean>

      <description>ManagedBean de QualquerCoisa</description>

      <managed-bean-name>qualquerCoisaMB</managed-bean-name>

      <managed-bean-class>

            br.com.projeto.managed.QualquerCoisaMB

      </managed-bean-class>

      <managed-bean-scope>session</managed-bean-scope>

      <managed-property>

            <property-name>bo</property-name>

            <value>#{qualquerCoisaBO}</value>

      </managed-property>

</managed-bean>

 

Este trecho, retirado do arquivo de configuração faces-config.xml, demonstra uma classe de controle qualquerCoisaMB utilizada para o controle de interface pelo JSF que utiliza uma classe de negócio qualquerCoisaBO para concretizar regras de negócio no sistema.

 

<bean id="qualquerCoisaBO" class="br.com.projeto.bo.QualquerCoisaBO">

      <property name="dao">

            <ref local="qualquerCoisaDAO" />

      </property>

</bean>

 

Este outro trecho, retirado do arquivo de configuração applicationContext.xml, demonstra que a classe de negócio QualquerCoisaBO possui uma injection de outra classe QualquerCoisaDAO para a persistência, onde todo o controle é feito pelo framework Spring.

 

Considerações Finais

A curva de aprendizado se mostra muito menos significativa que o aumento da produtividade e o tempo de desenvolvimento de cada componente ou subsistema, demonstrando assim o poder fornecido pela integração destas três tecnologias.

 

Bibliografia

Gimenes, I. M. S (org.), & Huzita, E.H.M (org.) (2005): Desenvolvimento Baseado em Componentes: Conceitos e Técnicas. Rio de Janeiro: Ciência Moderna, 2005.

 

Walls, C. e Breidenbach, R. Spring in Action. EUA: Manning, 2005.

 

JSF (2006): JavaServer Faces. Implementação de referência da Sun disponível em http://java.sun.com/j2ee/javaserverfaces. Última visita em 27/11/2006.

 

Spring (2006): Página oficial do framework Spring disponível em http://www.springframework.org. Última visita em 27/11/2006.

 

Hibernate (2006): Página oficial do framework Hibernate disponível em http://www.hibernate.org. Última visita em 27/11/2006.