JSF 2 Spring 3の統合の例

このチュートリアルでは、Spring 3とJSF 2.0を統合する方法について説明します。

  1. JSF XML faces-config.xml

  2. 春の注釈

  3. JSR-330標準注入

使用されるツールと技術:

  1. JSF 2.1.13

  2. Spring 3.1.2.RELEASE

  3. Maven 3

  4. Eclipse 4.2

  5. Tomcat 6または7

1.ディレクトリ構造

デモ用の標準Mavenプロジェクト。

jsf2-spring-example-folder、title = "jsf2-spring-example-folder"、width = 327、height = 455

プロジェクトの依存関係

JSF 2、Spring 3、JSR-330注入、Tomcatの依存関係を宣言します。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/maven-v4__0__0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.common</groupId>
    <artifactId>JavaServerFaces</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>JavaServerFaces Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <dependencies>

        <!-- Spring framework -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

        <!-- JSR-330 -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>

        <!-- JSF -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.13</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- EL -->
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>

        <!-- Tomcat 6 need this -->
        <dependency>
            <groupId>com.sun.el</groupId>
            <artifactId>el-ri</artifactId>
            <version>1.0</version>
        </dependency>

    </dependencies>

    <build>
    <finalName>JavaServerFaces</finalName>

    <plugins>
       <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
       </plugin>
    </plugins>
    </build>
</project>

3. JSF 2 + Spring統合

Spring IocコンテキストのSpring Bean、JSF IocコンテキストのJSFのマネージドBean、どのように連携させるか?この解決策は faces-config.xml`にSpringの SpringBeanFacesELResolver`と定義されています。これをhttp://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/web-integration.html#jsf-springbeanfaceselresolver’official Spring guide」で確認してください。

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-facesconfig__2__1.xsd"
    version="2.1">

    <application>
        <el-resolver>
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application>

</faces-config>

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

3.1. XMLスキーマの例

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

UserBo.java

package com.mkyong.user.bo;

public interface UserBo{

    public String getMessage();

}

UserBoImpl.java

package com.mkyong.user.bo.impl;

import com.mkyong.user.bo.UserBo;

public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java - JSFバッキングBean

package com.mkyong;

import java.io.Serializable;
import com.mkyong.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 - userBo Beanを宣言します。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="userBo" class="com.mkyong.user.bo.impl.UserBoImpl"></bean>

</beans>

faces-config.xml - マネージドBeanを宣言し、userBoを挿入する

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-facesconfig__2__0.xsd"
    version="2.0">

    <managed-bean>
        <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>com.mkyong.UserBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>userBo</property-name>
            <value>#{userBo}</value>
        </managed-property>
    </managed-bean>

</faces-config>

3.2. 春の注釈 - オートスキャン

この例では、春の注釈を使用しています。 @ManagedBean 、` @ Autowired`、および `@Component`を持つ通常のBeanのように注入すると、期待どおりに動作します。

UserBoImpl.java

package com.mkyong.user.bo.impl;

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

@Service
public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java

package com.mkyong;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.mkyong.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 - コンポーネントの自動スキャンを有効にする

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.mkyong"/>

</beans>

実際には、ただ一つの `@ Component`を使うことができます。新しいバージョンに続いて、純粋なSpringです。

UserBean.java

package com.mkyong;

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

import com.mkyong.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以降、 JSR-330注入標準のSpring提供のサポート これで、 @Imject`を @ Autowired`に置き換え、 @Interject`を @Component`に置き換えることができます。

これは、JSR-330標準に準拠したソリューションとして推奨され、アプリケーションを他の環境に移植しやすくし、Springフレームワークでうまく動作します。

UserBoImpl.java

package com.mkyong.user.bo.impl;

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

@Named
public class UserBoImpl implements UserBo{

    public String getMessage() {

        return "JSF 2 + Spring Integration";

    }

}

UserBean.java

package com.mkyong;

import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import com.mkyong.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 - コンポーネントの自動スキャンも必要

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.mkyong"/>

</beans>

4.デモ

  • 3.1 3.2 3.3 ** の例はまさにそのことをやっています - JSF beanに `userBo`を注入するだけです。さて、単純なJSFページを作成して結果を表示します。

default.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      >

    <h:body>

        <h1>JSF 2.0 + Spring Example</h1>

    #{userBean.printMsgFromSpring()}

    </h:body>

</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app__2__5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app__2__5.xsd"
    id="WebApp__ID" version="2.5">

  <display-name>JavaServerFaces</display-name>

  <!-- Add Support for Spring -->
  <listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
  </listener>

  <!-- Change to "Production" when you are ready to deploy -->
  <context-param>
    <param-name>javax.faces.PROJECT__STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <!-- Welcome page -->
  <welcome-file-list>
    <welcome-file>default.jsf</welcome-file>
  </welcome-file-list>

  <!-- JSF Mapping -->
  <servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>** .jsf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>** .xhtml</url-pattern>
  </servlet-mapping>

</web-app>

完了、出力を参照してください: http://localhost:8080/JavaServerFaces/default.jsf

jsf2とspring integration、title = "jsf2-spring"、width = 593、height = 297

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

ダウンロード - リンク://wp-content/uploads/2010/12/JSF2-Spring-Example.zip[JSF2-Spring-Example.zip](31KB)

参考文献

リファレンス - SpringBeanFacesELResolver]。 Spring

あなたのセッションリスナーに依存性注入を行う方法]。 link://spring3/spring-3-and-jsr-330-inject-and-named-example/[Spring 3

JSR-330 @Injectと@Namedの例]

リンク://タグ/統合/[統合]リンク://タグ/jsf2/[jsf2] spring spring3