• Nenhum resultado encontrado

JSF 2 Templating com exemplo Facelets

8. JSF e Spring

Antes de entrar em detalhes como é realizada a Integração Spring-JSF, é importante conhecer um pouco dos detalhes básicos.

Lado Spring

Spring é um framework que suporta de Inversão de Controle (IoC). IoC permite separar

vários componentes que se encaixam em um aplicativo. Na terminologia do Spring isto é um

Spring Bean que são nada mais que classes regulares java. É possível externalizar o

estado dos objetos do Bean, especificando-os no arquivo padrão XML. Um Spring Bean tem um ciclo de vida que passa por várias fases. IoC do Spring é responsável por ler o arquivo XML e construir o Spring Beans a partir da informação de meta-dados diferentes. Assim, a principal responsabilidade da IoC é fazer com que os Spring Beans disponível para o aplicativo cliente. E no núcleo do IoC fornecer uma ligação entre Spring Beans. Assim, em vez de códificar o aplicativo manualmente gerenciamos o relacionamento entre os Beans, sendo que o problema e manter este. Vejamos o seguinte Bean exemplo:

<bean id="pessoaBean" class="x25.com.tutorial.Pessoa"> <property name="nome">

<value>Anônimo</value> </property>

</bean>

O exemplo acima define um Spring Bean do tipo Pessoa com um identificador chamado

pessoaBean. Também define uma propriedade simples chamada nome com valor anônimo. Também é possível relacionar valores compostos (como referências a outro

objeto) ou conjuntos de valores (array, mapa, lista) como o seguinte trecho de código irá mostrar:

<bean id="funcionario1" class="x25.com.tutorial.Funcionario"> <property name="nome">

<value>Func1</value> </property>

</bean>

<bean id="funcionario2" class="x25.com.tutorial.Funcionario"> <property name="nome">

<value>Func2</value> </property>

</bean>

<bean id="gerente1" class="x25.com.tutorial.Gerente"> <property name="nome"> <value>Gerente1</value> </property> <property name="funcionarios"> <ref bean="funcionario1"/> <ref bean="funcionario2"/> </property> </bean>

identificadores funcionario1 e funcionario2. Esses dois objetos de funcionário estarão associados com um objeto de Gerente. Este é um exemplo de uma relação composta, uma vez que estamos relacionando Gerente com Funcionário. Isto é conseguido através da tag de referência dentro da declaração de propriedade.

Lado Java Server Faces

Depois de ter visto sobre como IoC do Spring gerencia e mantém os Spring Beans, vamos ver uma visão geral sobre a gestão da Java Server Faces sobre seus componentes. JSF é responsável por fornecer um componente de desenvolvimento orientado para a camada de interface do usuário em uma aplicação Web. A pedido do cliente é mapeada diretamente para uma ação na camada Web, o que significa que o mecanismo de manipulação de eventos se assemelha ao que vemos nas bibliotecas SWING ou AWT.

Se o mecanismo de manipulação de eventos da SWING é para aplicações desktop, em seguida, a arquitetura JSF orientada evento é para aplicações Web. Semelhante aos Spring

Beans, em JSF temos é chamado de Managed Beans ou BackBeans. Estes beans são

responsáveis pela manipulação de todos os tipos de ações em uma aplicação Web. Como um componente da interface do usuário associado a uma determinada ação e facilmente configurável no arquivo XML. O código a seguir mostra a declaração de um Managed Bean da JSF. <managed-bean> <managed-bean-name>timerBean</managed-bean-name> <managed-bean-class> x25.com.tutorial.TimerBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

Um Managed Bean é também uma classe Java regular em JSF e está configurado no arquivo faces-config.xml e disponibilizado para o aplicativo pela JSF.

Spring Beans no ambiente JSF

Agora que vimos os beans na visão do Spring e da JSF, vamos ver sobre Integração e qual o componente fica integrado. Spring utiliza Spring Beans e JSF os Managed Beans. Spring fornece suporte, de tal modo que um Spring Bean torna-se visível para o ambiente

JSF. Precisamente, o Spring Bean que configuramos no arquivo XML pode ser visto

diretamente no faces-config.xml como se fosse um bean gerenciado pela JSF. <bean id="pessoaBean" class="x25.com.tutorial.Pessoa">

<property name="nome"> <value>Anônimo</value> </property>

</bean>

O código acima define um Spring Bean. Agora, consideremos o seguinte trecho: <managed-bean>

<managed-bean-name>pessoaBean</managed-bean-name> <managed-bean-class> x25.com.tutorial.Pessoa </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

Utilizamos o Spring Bean de Pessoa que foi previamente determinado na configuração do Spring para a JSF.

Apoio da API para a integração

Retornando o foco para a API da Distribuição do Spring que estão relacionados com JSF para o apoio à integração. A API do Spring contém diversas classes de suporte para a Integração de JSF e estão disponíveis nos pacotes:

• org.springframework.web.jsf • org.springframework.web.jsf.el

Para realizar a integração, precisamos conhecer sobre os Spring Resolvers.

No contexto JSF, resolver um processo de identificação de um objeto através de um determinado símbolo. Mais especificamente, um identificador do framework JSF constrói e associa o objeto do identificador. Vamos retornar à declaração do Managed Beans,

<managed-bean> <managed-bean-name>timerBean</managed-bean-name> <managed-bean-class> x25.com.tutorial.TimerBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

Na declaração acima, temos um identificador (ou variável) chamado timerBean. O objetivo da implementação de um JSF Resolver que deve associar um objeto do tipo

x25.com.tutorial.TimerBean para timerBean. Vejamos o que acontece quando tentamos

identificar uma variável que não é gerida pelo contexto da aplicação JSF, mas no contexto de uma aplicação Spring. A implementação JSF simplesmente lança um erro informando que a variável não pode ser resolvida. Não importa se a implementação JSF conhece ou não sobre os Beans que são mantidos no Contexto da aplicação Spring.

Assim, a fim de resolver as variáveis no contexto da aplicação Spring, temos que substituir a implementação JSF para resolver a implementação do Spring Resolver. A implementação do Spring tenta resolver as variáveis do contexto do aplicativo. Em vez de definir um

Resolver personalizado, a distribuição do Spring vem com um Resolver variável

Documentos relacionados