Exemple d’intégration JSF 2 + Spring 3

Exemple d'intégration JSF 2 + Spring 3

Dans ce tutoriel, nous allons vous montrer comment intégrer JSF 2.0 avec Spring 3 en utilisant:

  1. JSF XML faces-config.xml

  2. Annotations de printemps

  3. Injection standard JSR-330

Outils et technologies utilisés:

  1. JSF 2.1.13

  2. Spring 3.1.2.RELEASE

  3. Maven 3

  4. Eclipse 4.2

  5. Tomcat 6 ou 7

1. Structure du répertoire

Un projet Maven standard pour démonstration.

jsf2-spring-example-folder

2. Dépendances du projet

Déclare les dépendances JSF 2, Spring 3, JSR-330 et Tomcat.

pom.xml



    4.0.0
    com.example.common
    JavaServerFaces
    war
    1.0-SNAPSHOT
    JavaServerFaces Maven Webapp
    http://maven.apache.org

    

        
        
            org.springframework
            spring-core
            3.1.2.RELEASE
        

        
            org.springframework
            spring-web
            3.1.2.RELEASE
        

        
        
            javax.inject
            javax.inject
            1
        

        
        
            com.sun.faces
            jsf-api
            2.1.13
        
        
            com.sun.faces
            jsf-impl
            2.1.13
        

        
            javax.servlet
            jstl
            1.2
        

        
            javax.servlet
            servlet-api
            2.5
        

        
            javax.servlet.jsp
            jsp-api
            2.1
        

        
        
            org.glassfish.web
            el-impl
            2.2
        

        
        
            com.sun.el
            el-ri
            1.0
        

    

    
    JavaServerFaces

    
       
        org.apache.maven.plugins
        maven-compiler-plugin
        2.3.1
        
            1.6
            1.6
        
       
    
    

3. Intégration JSF 2 + Spring

Le bean Spring dans le contexte Spring Ioc et le bean géré JSF dans le contexte JSF Ioc, comment faire fonctionner les deux ensemble? La solution est définie enSpringBeanFacesELResolver de Spring enfaces-config.xml. Vérifiez ceofficial Spring guide.

faces-config.xml



    
        
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        
    

Voir les 3 exemples suivants pour injecter le bean Spring dans un bean géré JSF.

3.1. Exemple de schéma XML

De nombreux développeurs préfèrent toujours utiliser XML pour gérer les beans. AvecSpringBeanFacesELResolver, utilise simplement EL${userBo} pour injecter le bean de Spring dans le bean géré par JSF.

UserBo.java

package com.example.user.bo;

public interface UserBo{

    public String getMessage();

}

UserBoImpl.java

package com.example.user.bo.impl;

import com.example.user.bo.UserBo;

public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java – JSF backing bean

package com.example;

import java.io.Serializable;
import com.example.user.bo.UserBo;

public class UserBean{

        //later inject in faces-config.xml
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    public String printMsgFromSpring() {

        return userBo.getMessage();

    }

}

applicationContext.xml – Declares userBo bean



    

faces-config.xml – Declares managed bean and inject userBo



    
        user
        com.example.UserBean
        session
        
            userBo
            #{userBo}
        
    

3.2. Annotations de printemps - Analyse automatique

Cet exemple utilise des annotations Spring. S'injecte comme un bean normal avec@ManagedBean,@Autowired et@Component, cela fonctionne juste comme prévu.

UserBoImpl.java

package com.example.user.bo.impl;

import org.springframework.stereotype.Service;
import com.example.user.bo.UserBo;

@Service
public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java

package com.example;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.example.user.bo.UserBo;

@Component
@ManagedBean
@SessionScoped
public class UserBean{

    @Autowired
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    public String printMsgFromSpring() {
        return userBo.getMessage();
    }

}

applicationContext.xml – Enable the component auto scan



    

Mixed use of both JSF and Spring annotations fonctionne bien, mais cela semble étrange et dupliqué -@Component et@ManagedBean ensemble. En fait, vous ne pouvez utiliser qu'un seul@Component, voir la nouvelle version suivante, c'est du printemps pur, et ça marche!

UserBean.java

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.example.user.bo.UserBo;

@Component
@Scope("session")
public class UserBean{

    @Autowired
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    public String printMsgFromSpring() {
        return userBo.getMessage();
    }

}

3.3. Annotation JSR-330

Depuis le printemps 3.0,Spring offer supports for JSR-330 injection standard. Maintenant, vous pouvez utiliser@Inject pour remplacer@Autowired et@Named pour@Component. Ceci est recommandé pour la solution, suivez la norme JSR-330 pour rendre l'application plus portable dans d'autres environnements, et cela fonctionne très bien dans le cadre Spring.

UserBoImpl.java

package com.example.user.bo.impl;

import javax.inject.Named;
import com.example.user.bo.UserBo;

@Named
public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java

package com.example;

import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import com.example.user.bo.UserBo;

@Named
@Scope("session") //need this, JSR-330 in Spring context is singleton by default
public class UserBean {

    @Inject
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    public String printMsgFromSpring() {
        return userBo.getMessage();
    }

}

applicationContext.xml – Need component auto scan also



    

4. Demo

Exemple dans3.1,3.2 et3.3 font exactement la chose - InjectezuserBo dans le bean JSF, juste une implémentation différente. Maintenant, créez une page JSF simple pour afficher le résultat.

default.xhtml




    

        

JSF 2.0 + Spring Example

#{userBean.printMsgFromSpring()}

web.xml



  JavaServerFaces

  
  
    
        org.springframework.web.context.ContextLoaderListener
    
  
  
    
        org.springframework.web.context.request.RequestContextListener
    
  

  
  
    javax.faces.PROJECT_STAGE
    Development
  

  
  
    default.jsf
  

  
  
    facesServlet
    javax.faces.webapp.FacesServlet
    1
  
  
    facesServlet
    *.jsf
  
  
    facesServlet
    *.xhtml
  

jsf2 and spring integration

Télécharger le code source

Téléchargez-le -JSF2-Spring-Example.zip (31 Ko)