Пример интеграции JSF 2 + Spring 3

Пример интеграции JSF 2 + Spring 3

В этом руководстве мы покажем вам, как интегрировать JSF 2.0 с Spring 3, используя:

  1. JSF XML face-config.xml

  2. Весенние аннотации

  3. Стандартная инъекция JSR-330

Используемые инструменты и технологии:

  1. JSF 2.1.13

  2. Весна 3.1.2. РЕЛИЗ

  3. Maven 3

  4. Затмение 4.2

  5. Tomcat 6 или 7

1. Структура каталогов

Стандартный проект Maven для демонстрации.

jsf2-spring-example-folder

2. Зависимости проекта

Объявляет зависимости JSF 2, Spring 3, JSR-330 inject и 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. JSF 2 + Spring Integration

Bean-компонент Spring в контексте Spring Ioc и управляемый bean-компонент JSF в контексте JSF Ioc, как заставить оба работать вместе? Решение определяется SpringSpringBeanFacesELResolver вfaces-config.xml. Отметьте этотofficial Spring guide.

faces-config.xml




    
        
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        
    

Смотрите следующие 3 примера, чтобы внедрить bean-компонент Spring в управляемый bean-компонент JSF.

3.1. Пример схемы XML

Многие разработчики по-прежнему предпочитают использовать XML для управления bean-компонентами. СSpringBeanFacesELResolver просто использует EL${userBo} для внедрения bean-компонента Spring в управляемый bean-компонент 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. Spring Annotations - Auto Scan

В этом примере используются аннотации Spring. Внедряет как обычный bean-компонент с@ManagedBean,@Autowired и@Component, он работает так, как ожидалось.

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 работают нормально, но выглядят странно и дублировано -@Component и@ManagedBean вместе. Фактически, вы можете просто использовать один@Component, смотрите следующую новую версию, это чистый Spring, и он работает!

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. JSR-330 Аннотация

Начиная с Spring 3.0,Spring offer supports for JSR-330 injection standard. Теперь вы можете использовать@Inject для замены@Autowired и@Named на@Component. Это рекомендуется для решения, следуйте стандарту JSR-330, чтобы сделать приложение более переносимым для других сред, и оно отлично работает в среде 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

Пример в3.1,3.2 и3.3 делают именно то, что делают - вводятuserBo в компонент JSF, просто другая реализация. Теперь создайте простую страницу JSF, чтобы показать результат.

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
  

Готово, см. Вывод:http://localhost:8080/JavaServerFaces/default.jsf

jsf2 and spring integration

Скачать исходный код

Скачать -JSF2-Spring-Example.zip (31 КБ)