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