JSF 2 Spring 3の統合の例

JSF 2 + Spring 3統合の例

このチュートリアルでは、次を使用してJSF 2.0とSpring 3を統合する方法を示します。

  1. JSF XML faces-config.xml

  2. 春のアノテーション

  3. JSR-330標準インジェクション

使用されるツールとテクノロジー:

  1. JSF 2.1.13

  2. Spring 3.1.2.RELEASE

  3. メーベン3

  4. Eclipse 4.2

  5. Tomcat 6または7

1. ディレクトリ構造

デモンストレーション用の標準Mavenプロジェクト。

jsf2-spring-example-folder

2. プロジェクトの依存関係

JSF 2、Spring 3、JSR-330インジェクト、および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の統合

Spring IocコンテキストのSpring Bean、およびJSF IocコンテキストのJSF管理Bean、両方を連携させる方法 解は、SpringのSpringBeanFacesELResolverfaces-config.xmlで定義します。 このofficial Spring guideを確認してください。

faces-config.xml



    
        
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        
    

JSFマネージドBeanにSpringのBeanを注入するには、次の3つの例を参照してください。

3.1. XMLスキーマの例

多くの開発者は、依然としてXMLを使用してBeanを管理することを好みます。 SpringBeanFacesELResolverでは、EL${userBo}を使用してSpringのBeanをJSFのマネージドBeanに注入します。

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アノテーションを使用しています。 @ManagedBean@Autowired@Componentの通常のBeanのように注入しますが、期待どおりに機能します。

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を使用できます。次の新しいバージョンを参照してください。これは純粋な春であり、機能します。

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.13.2、および3.3の例は、まさにそのことを実行しています–userBoをJSF Beanに注入しますが、実装は異なります。 次に、簡単な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
  

jsf2 and spring integration

ソースコードをダウンロード

ダウンロード–JSF2-Spring-Example.zip(31KB)