JavaServer Faces(JSF)とSpring

Springを使用したJavaServer Faces(JSF)

1. 概要

この記事では、Spring Beanにビジネスロジックの実行を委任するために、JSFマネージドBeanおよびJSFページ内からSpringで定義されたBeanにアクセスするためのレシピを見ていきます。

この記事は、読者がJSFとSpringの両方を個別に事前に理解していることを前提としています。 この記事は、JSFのthe Mojarra implementationに基づいています。

2. 春に

Springで次のBeanを定義してみましょう。 UserManagementDAO Beanは、ユーザー名をメモリ内ストアに追加します。これは、次のインターフェイスによって定義されます。

public interface UserManagementDAO {
    boolean createUser(String newUserData);
}

Beanの実装は、次のJava構成を使用して構成されます。

public class SpringCoreConfig {
    @Bean
    public UserManagementDAO userManagementDAO() {
        return new UserManagementDAOImpl();
    }
}

または、次のXML構成を使用します。


BeanをXMLで定義し、CommonAnnotationBeanPostProcessorを登録して、@PostConstructアノテーションが確実に取得されるようにします。

3. 設定

次のセクションでは、SpringコンテキストとJSFコンテキストの統合を可能にする構成アイテムについて説明します。

3.1. web.xmlのないJava構成

WebApplicationInitializerを実装することにより、プログラムでServletContext.を構成できます。以下は、MainWebAppInitializerクラス内のonStartup()実装です。

public void onStartup(ServletContext sc) throws ServletException {
    AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
    root.register(SpringCoreConfig.class);
    sc.addListener(new ContextLoaderListener(root));
}

AnnotationConfigWebApplicationContextは、Spring’gコンテキストをブートストラップし、SpringCoreConfigクラスを登録することによってBeanを追加します。

同様に、Mojarraの実装には、FacesServlet.を構成するFacesInitializerクラスがあります。この構成を使用するには、FacesInitializer.を拡張するだけで十分です。MainWebAppInitializer,の完全な実装は次のとおりです。次のように:

public class MainWebAppInitializer extends FacesInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext sc) throws ServletException {
        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(SpringCoreConfig.class);
        sc.addListener(new ContextLoaderListener(root));
    }
}

3.2. web.xmlを使用

まず、アプリケーションのweb.xmlファイルでContextLoaderListenerを構成します。


    
        org.springframework.web.context.ContextLoaderListener
    

このリスナーは、Webアプリケーションの起動時にSpringアプリケーションコンテキストを起動します。 このリスナーは、デフォルトでapplicationContext.xmlという名前のSpring構成ファイルを探します。

3.3. faces-config.xml

ここで、face-config.xmlファイルでSpringBeanFacesELResolverを構成します。

org.springframework.web.jsf.el.SpringBeanFacesELResolver

ELリゾルバーは、JSFフレームワークでサポートされるプラグ可能なコンポーネントであり、Expression Language(EL)式を評価する際のJSFランタイムの動作をカスタマイズできます。 このELリゾルバにより、JSFランタイムはJSFで定義されたEL式を介してSpringコンポーネントにアクセスできます。

4. JSFでSpringBeanにアクセスする

この時点で、JSF Webアプリケーションは、JSFバッキングBeanまたはJSFページからSpring Beanにアクセスできるように準備されています。

4.1. バッキングBeanJSF2.0から

Spring BeanにJSFバッキングBeanからアクセスできるようになりました。 実行しているJSFのバージョンに応じて、2つの方法があります。 JSF 2.0では、JSFマネージドBeanで@ManagedPropertyアノテーションを使用します。

@ManagedBean(name = "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @ManagedProperty(value = "#{userManagementDAO}")
    transient private IUserManagementDAO theUserDao;

    private String userName;
    // getters and setters
}

@ManagedProperty. Nowを使用する場合はgetterとsetterが必須であることに注意してください。マネージドBeanからSpring Beanのアクセシビリティをアサートするために、createNewUser()メソッドを追加します。

public void createNewUser() {
    FacesContext context = FacesContext.getCurrentInstance();
    boolean operationStatus = userDao.createUser(userName);
    context.isValidationFailed();
    if (operationStatus) {
        operationMessage = "User " + userName + " created";
    }
}

メソッドの要点は、userDao Spring Beanを使用し、その機能にアクセスすることです。

4.2. JSF2.2のバッキングBeanから

JSF2.2以降でのみ有効な別のアプローチは、CDIの@Injectアノテーションを使用することです。 これは、JSFマネージドBean(@ManagedBeanアノテーション付き)およびCDIマネージドBean(@Namedアノテーション付き)に適用されます。

実際、CDIアノテーションを使用すると、これがBeanを注入する唯一の有効な方法になります。

@Named( "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @Inject
    UserManagementDAO theUserDao;
}

このアプローチでは、ゲッターとセッターは必要ありません。 EL式が存在しないことにも注意してください。

4.3. JSFビューから

createNewUser()メソッドは、次のJSFページからトリガーされます。


    
        
        
        
        
        
    

ページをレンダリングするには、サーバーを起動して次の場所に移動します。

http://localhost:8080/jsf/index.jsf

JSFビューでELを使用して、Spring Beanにアクセスすることもできます。 テストするには、以前に導入したJSFページの行番号7を次のように変更するだけで十分です。

ここでは、Spring DAOで直接createUserメソッドを呼び出し、JSFページ内からメソッドにuserNameのバインド値を渡して、マネージドBeanをすべて回避します。

5. 結論

SpringとJSFコンテキストの間の基本的な統合を検討しました。そこでは、JSF BeanとページでSpring Beanにアクセスできます。

JSFランタイムは、Springフレームワークが統合コンポーネントを提供できるプラガブルなアーキテクチャを提供しますが、SpringフレームワークからのアノテーションはJSFコンテキストでは使用できず、その逆も同様です。

これは、@Autowired@Componentなどの注釈を使用できないことを意味します。 JSF管理対象Beanで使用するか、Spring管理対象Beanで@ManagedBeanアノテーションを使用します。 ただし、JSF 2.2以降のマネージドBeanとSpring Beanの両方で@Injectアノテーションを使用できます(SpringはJSR-330をサポートしているため)。

この記事に付属するソースコードは、GitHubで入手できます。