Criando uma camada de serviço com Spring 2.0.8 e JSF 1.1

Eu sei que existem versões/opções muito superiores ao JSF 1.1 e Spring 2.0.8. Componentes poderosos, simples anotações, etc. Porém como nem tudo são flores e muita gente tem que trabalhar com versões antigas, aqui está um exemplo do que tive que fazer recentemente aqui no serviço: Criar uma camada de serviço e injetá-la no managed-bean através do spring. A idéia aqui é deixar transparente ao managed bean o que está vindo. Ele saberá que precisa de uma informação, uma ação ou algo do tipo, mas para ele pouco importa se você está chamando um mock, enviando uma transação, consultando um banco, etc.

Como estou utilizando maven neste projeto, colocarei as dependências aqui:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.0.8</version>
    </dependency>

    <dependency>
        <groupId>myfaces</groupId>
        <artifactId>myfaces-all</artifactId>
        <version>1.1.1</version>
    </dependency>
<dependencies>

Até aqui, nada d+. Agora criaremos um managed-bean simples, contendo os atributos usuario e senha:

package marques.exemplo.bean;

public class ExemploBean {
    private String usuario;
    private String senha;

    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
         this.senha = senha;
    }
    public String getUsuario() {
        return usuario;
    }
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
}

Qual é a idéia? Provalvemente será necessário adicionar alguma ação neste managed-bean, como uma action chamada salvar, ou coisa que o valha. Na nossa página .jsp, provavelmente teria um form com dois inputText um commandButton, chamando a action #{exemploBean.logar} por exemplo. A idéia aqui é deixar estas ações o mais transparente possível. O managed-bean não é obrigado a saber se você está acessando um banco de dados, um arquivo xml, etc. Ele precisa apenas de algo que ele possa falar: “Vem cá, eu sei que você loga o usuário, mas não me interessa como! Pega essas informações e se vira!”.
Para isso, criaremos uma interface chamada ExemploService:

package marques.exemplo.servico; 

public interface ExemploService { 

    boolean logar(); 

} 

Agora, definindo um atributo com o tipo ExemploService em seu managed-bean, independente de qual classe implementar esta interface, você sempre terá a certeza de que o cara que está sendo chamado possui o método logar implementado. Tendo isto em mente, o nosso managed-bean ficará da seguinte maneira:

package marques.exemplo.bean;

public class ExemploBean {
    private String usuario;
    private String senha;
    private ExemploService service; 

    public String logar() {
        String retorno = service.logar() ? "ok" : "fake";
        return retorno; 
    }

    public String getService() {
        return service;
    }
    
    public void setService(ExemploService service) {
         this.service = service;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
         this.senha = senha;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
}

Agora só nos falta três passos:

  • Criar uma classe que implemente a interface de serviço;
  • Declarar o managed-bean
  • Configurar o serviço para ser injetado no managed-bean

Isso será bem simples! A classe que implementa a interface de serviço pode ser do jeito que você bem entender.

package marques.exemplo.servicoImpl;
 
import marques.exemplo.servico;

public class ExemploServiceImpl implements ExemploService { 

    public boolean logar() {
     // código para logar
    } 
} 

Agora criaremos os seguintes arquivos:

  • applicationContext-managedBean.xml
  • applicationContext-serviceImpl.xml

Criaremos uma referência no web.xml:

<context-param:
     <param-name>contextConfigLocation</param-name>
     <param-value>
         /WEB-INF/applicationContext-managedBeans.xml
         /WEB-INF/applicationContext-serviceImpl.xml
     <param-value>
 </context-param>

Agora basta dizer ao Spring que ele deverá injetar algo no managed bean. Segue como ficará o arquivo applicationContext-managedBean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
default-autowire="byName"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <bean id="exemploBean" class="marques.exemplo.bean.ExemploBean" scope="request">
        <property name="service">
	    <ref bean="exemploService"/>
        </property>
    </bean>

</beans>

E o arquivo applicationContext-serviceImpl ficará:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
default-autowire="byName"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <bean id="exemploService" class="marques.exemplo.servicoImpl.ExemploServicoImpl"></bean>

</beans>

Pronto, já temos tudo funcionando 😉

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s