Integración de la capa de presentación utilizando JSF con Spring

LIBP-0054 (Libro de pautas)

Uno de los objetivos principales de cualquier arquitectura software es reducir el acoplamiento a la tecnología que la implementa.

Es importante conseguir reducir la complejidad y el acoplamiento de la integración entre las capas de negocio y presentación, buscando que esta conexión sea independiente de la tecnología con la que se implementa JSF.

Pautas

TítuloCarácter
Conectar JSF con Spring
Declarar los servicios a manejar
Declarar anotaciones en el bean de respaldo
Declaración de objeto en el ApplicationContext.xml
Declarar la factoría de Spring

Conectar JSF con Spring

El modo recomendado para integrar Spring con JSF es configurar el DelegatingVariableResolver de Spring en el faces-context.xml. Los elementos de un fichero faces-config.xml permiten a una aplicación basada en Faces registrar clases personalizadas para sustituir la implementación estándar de VariableResolver. El DelegatingVariableResolver de Spring primero delega al resolver original de la implementación subyacente de JSF, para luego delegar al WebApplicationContext raíz de Spring.Esto permite configurar los Spring Beans como propiedades gestionadas por los Managed Beans de JSF. Por ejemplo, el catalogService Spring Bean está configurado como una managed property del ItemController JSF

Ejemplo de código de: faces-context.xm

<application>
  <variable-resolver>
    org.springframework.web.jsf.DelegatingVariableResolver
  </variable-resolver>
</application>
<managed-bean>
  <managed-bean-name>item</managed-bean-name>
  <managed-bean-class>
     sessionpagination.ItemController
  </managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
  <managed-property>
    <property-name>catalogService</property-name>
    <value>#{catalogService}</value>
  </managed-property>
</managed-bean>

Declarar los servicios a manejar

Es necesario incluir una anotación @Service en las clases referenciadas para ser manejadas a través de Spring

import org.springframework.stereotype.Service;
import com.cc.blog.dvdstore.domain.DVD;

@Service
public class DVDService implements IDVDService{
   public void salvarDVD(DVD dvd) {      
   //Referencia al Repositorio de implementaciones de y persistencia de DVD  
   } 
}

Declarar anotaciones en el bean de respaldo

  • Se debe de anotar dentro del bean de respaldo la clase como un componente con la etiqueta @Component
  • La dependencia de la clase es inyectada a través de la anotación @Autowired
  • @Qualifier es importante porque especifica el nombre del bean de jsf. Este nombre es referenciado en las páginas jsf
  • El ámbito esta definido para recibir peticiones a través de @Scope(”request”)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cc.blog.dvdstore.domain.DVD;
import com.cc.blog.dvdstore.service.IDVDService;

@Component
@Scope("request")
@Qualifier("saveDVDBean")
public class SaveDVDBean {   
    private DVD dvd;   
   @Autowired   
   private IDVDService dvdService;    
   public SaveDVDBean() {        
       //NOop
   }    
   public DVD getDvd() {        
      if(dvd == null)          
      dvd = new DVD();        
      return dvd;    
   }
   
   public void setDvd(DVD dvd) {      
      this.dvd = dvd;    
   }    
   public String save() {        
      dvdService.saveDVD(dvd);        
      return null;   
  }
}

Declaración de objeto en el ApplicationContext.xml

Es necesario declarar un objeto en el ApplicationContext. Se puede hacer referencia desde los managed beans declarados en WEB-INF/faces-config.xml a ese objeto

<?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
0http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
  
  <bean id="dvdService" class="com.cc.blog.dvdstore.service.DVDService"></bean>
   
  <bean id="saveDVDBean" class="com.cc.blog.dvdstore.view.SaveDVDBean" scope="request">       
    <property name="service">           
       <ref bean="dvdService"/>        
    </property>    
  </bean>
</beans>

Declarar la factoría de Spring

Se debe declarar el Factory de Spring para que esté disponible en nuestra aplicación web. En el archivo web.xml se agrega el listener, referenciando a todos los XML de Spring que sean necesarios:

<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>       
        classpath:business.xml,
        classpath:interceptors.xml,
        classpath:web-ejb.xml
     </param-value>
 </context-param>