Integrando JSF 2 e Spring

É muito fácil encontrar material sobre JSF 2 de qualidade na internet, mas não se encontra uma forma fácil de realizar a integração com Spring, e quando encontrada, geralmente a integração é feita via xml. Nesse post será mostrado como fazer a integração entre essas duas ferramentas de uma maneira simples usando anotações e um mínimo de xml.

Para trabalhar com o JSF são necessários dois jars:

compile 'com.sun.faces:jsf-api:2.2.0-m04'
compile 'com.sun.faces:jsf-impl:2.2.0-m04'

Por parte do Spring, são os mesmos jars usados para integração com Struts:

compile 'org.springframework:spring-asm:3.1.1.RELEASE'
compile 'org.springframework:spring-beans:3.1.1.RELEASE'
compile 'org.springframework:spring-context:3.1.1.RELEASE' 
compile 'org.springframework:spring-core:3.1.1.RELEASE'
compile 'org.springframework:spring-expression:3.1.0.RELEASE'
compile 'org.springframework:spring-web:3.1.1.RELEASE'

A configuração no web.xml fica assim:

<web-app version=”2.5″ xmlns=”http://java.sun.com/xml/ns/j2ee&#8221;
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
</web-app>
view raw web.xml This Gist brought to you by GitHub.

As tags servlet e servlet-name são para o uso “padrão” do JSF. A classe ContextLoaderListener é quem vai subir o contexto do Spring, também uma configuração comum. O que merece atenção aqui é o RequestContextListener, o qual vai expor o request para que o Spring possa manipulá-lo, permitindo assim que ele faça as injeções no momento adequado.

Por fim, há mais uma alteração que deve ser colocada no faces-config.xml:

<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

JSF utiliza Expression Language (EL) para determinar a qual classe a página xhtml se refere. Fazendo uso de uma classe chamada ELResolver ele pega a String passada, a interpreta e faz a referência adequada. A classe SpringBeanFacesELResolver proporciona a integração entre os dois frameworks interceptando a requisição e passando-a para o contexto do Spring, o qual a manipula para prover as dependências requeridas pelos ManagedBeans, devolvendo-a em seguida para o ELResolver do próprio JSF.

Para ficar mais claro, vamos ao código. Abaixo, um Dao gerenciado pelo Spring:

@Repository("carroDao")
public class JdbcCarroDao implements CarroDao {

    // métodos aqui
}

Ao utilizar a anotação @Repository, se houver apenas uma implementação para CarroDao, geralmente para o Spring não é necessário que um nome seja especificado, mas ele se faz necessário ao trabalhar com JSF:

@ManagedBean
public class CarroBean {

    @ManagedProperty(name = "dao", value = "#{carroDao}")
    private CarroDao dao;

    public void setDao(final CarroDao dao) {
        this.dao = dao;
    }
}

Agora a anotação @ManagedProperty será usada não apenas para se referir ao que está no escopo web, mas também para lidar com os beans do Spring. A propriedade name é usada para indicar o nome do campo do managedBean, para que o JSF chame o setter adequado, enquanto a propriedade value vai ser usada para referenciar o nome do bean, no caso o carroDao anteriormente especificado.

E é só isso. Fazendo uso do fluxo do próprio JSF, e com algumas poucas configurações, o Spring proporciona uma integração simples e natural, que não altera em nada a forma de trabalhar com JSF.

Fonte: SimpleDev – Juliano Alves

Advertisements

About Gustavo Amaro

+ Formado em Tecnologia e Análise de Sistemas + MBA em Desenvolvimento de Aplicações JAVA – SOA

Posted on 5 de Abril de 2013, in Java, Java Web, JSF 2.0, Spring and tagged , , , , , , , , , , , , , , , , . Bookmark the permalink. 1 Comentário.

  1. Da hora Manow.
    parebéns pelo post

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: