ヘッダーをスキップ

Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド
10g(10.1.3.1.0)

B31852-03
目次
目次
索引
索引

戻る 次へ

11 EJB 2.1セッションBeanの実装

この章では、次のようなEJB 2.1セッションBeanの実装方法を説明します。

詳細は、次を参照してください。

EJB 2.1ステートレス・セッションBeanの実装

表11-1に、EJB 2.1ステートレス・セッションBeanの重要な構成要素をまとめ、次の手順でこれらの構成要素の実装方法を説明します。一般的な実装は、「Javaの使用方法」を参照してください。詳細は、「ステートレス・セッションBeanとは」を参照してください。

表11-1    EJB 2.1ステートレス・セッションBeanの構成要素 
構成要素  説明 

ホーム・インタフェース(リモートまたはローカル) 

javax.ejb.EJBHomeおよびjavax.ejb.EJBLocalHomeを拡張し、引数を取らない
1つのcreate()ファクトリ・メソッド、および1つのremove()メソッドを必要とします。 

コンポーネント・インタフェース(リモートまたはローカル) 

リモート・インタフェースの場合はjavax.ejb.EJBObjectを拡張し、ローカル・インタフェースの場合はjavax.ejb.EJBLocalObjectを拡張します。また、Bean実装で実装されるビジネス・ロジック・メソッドを定義します。 

TimedObjectインタフェース 

オプションで、javax.ejb.TimedObjectインタフェースを実装します。詳細は、
「EJBタイマー・サービスについて」を参照してください。 

Beanの実装 

SessionBeanを実装します。このクラスは、パブリックとして宣言する必要があり、パブリックで空のデフォルト・コンストラクタを含み、finalize()メソッドは使用しません。また、コンポーネント・インタフェースで定義されたメソッドを実装します。ホーム・インタフェースのcreate()メソッドに一致するような、引数を持たない1つのejbCreateメソッドが含まれている必要があります。ejbRemoveなどのコンテナ・サービス・メソッド用の空の実装を含めます。 

  1. Beanのホーム・インタフェースを作成します(「ホーム・インタフェースの実装」を参照)。

    リモート・ホーム・インタフェースは、クライアントがBeanをインスタンス化するためにリモートで起動できるcreateメソッドを定義します。ローカル・ホーム・インタフェースは、Beanをインスタンス化するために同一JVM上のBeanがローカルで起動できるcreateメソッドを定義します。

    1. リモート・ホーム・インタフェースを作成するには、javax.ejb.EJBHomeを拡張します(「リモート・ホーム・インタフェースの実装」を参照)。

    2. ローカル・ホーム・インタフェースを作成するには、javax.ejb.EJBLocalHomeを拡張します(「ローカル・ホーム・インタフェースの実装」を参照)。

  2. Beanのコンポーネント・インタフェースを作成します(「コンポーネント・インタフェースの実装」を参照)。

    リモート・コンポーネント・インタフェースは、クライアントがリモートで起動できるビジネス・メソッドを宣言します。ローカル・インタフェースは、同一JVM上のBeanがローカルで起動できるビジネス・メソッドを宣言します。

    1. リモート・コンポーネント・インタフェースを作成するには、javax.ejb.EJBObjectを拡張します(「リモート・コンポーネント・インタフェースの実装」を参照)。

    2. ローカル・コンポーネント・インタフェースを作成するには、javax.ejb.EJBLocalObjectを拡張します(「ローカル・コンポーネント・インタフェースの実装」を参照)。

  3. 次のようにステートレス・セッションBeanを実装します。

    1. ホーム・インタフェースのcreateメソッドに一致する、パラメータを持たない1つのejbCreateメソッドを実装します。

    2. ホームおよびコンポーネント・インタフェースで宣言されたビジネス・メソッドを実装します。

    3. javax.ejb.SessionBeanインタフェースを実装して、定義するコンテナ・コールバック・メソッドを実装します(「EJB 2.1セッションBeanのライフ・サイクル・コールバック・メソッドの構成」を参照)。

    4. SessionContextのインスタンスを取得するsetSessionContextメソッドを実装します(「setSessionContextメソッドの実装」を参照)。

      ステートレス・セッションBeanでは、このメソッドは通常は何も行いません(実際にはSessionContextをセッションBeanの状態に追加しません)。

  4. Bean実装と一致するようにejb-jar.xmlファイルを構成します(「デプロイXMLの使用方法」を参照)。

Javaの使用方法

例11-1に、ステートレス・セッションBeanの一般的な実装を示します。

例11-1    EJB 2.1ステートレス・セッションBeanの実装

package hello;
import javax.ejb.*;

public class HelloBean implements SessionBean {

    /* ----------------------------------------
    * Begin business methods. The following methods
    * are called by the client code.
    * -------------------------------------- */

    public String sayHello(String myName) throws EJBException {
        return ("Hello " + myName);
    }

    /* ----------------------------------------
    * Begin private methods. The following methods
    * are used internally
    * -------------------------------------- */

...

    /* ------------------------------------------------------
    * Begin EJB-required methods. The following methods are called
    * by the container, and never called by client code
    * ------------------------------------------------------- */

    public void ejbCreate() throws CreateException {
        // when bean is created
    }

    public void setSessionContext(SessionContext ctx) {
    }

// Life Cycle Methods

    public void ejbActivate() {
    }

    public void ejbPassivate() {
    }

    public void ejbCreate() {
    }

    public void ejbRemove() {
    }
}

デプロイXMLの使用方法

例11-2に、例11-1に示したステートレス・セッションBeanに対応するejb-jar.xmlセッション要素を示します。

例11-2    ステートレス・セッションBeanのejb-jar.xml

...
    <enterprise-beans>
        <session>
            <ejb-name>Hello</ejb-name>
            <home>hello.HelloHome</home>
            <remote>hello.Hello</remote>
            <ejb-class>hello.HelloBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
        </session>
    </enterprise-beans>
...

 

デプロイ・ファイルの詳細は、第26章「デプロイメント・ディスクリプタ・ファイルの構成」を参照してください。

EJB 2.1ステートフル・セッションBeanの実装

表11-2に、EJB 2.1ステートフル・セッションBeanの重要な構成要素をまとめ、次の手順でこれらの構成要素の実装方法を説明します。一般的な実装は、「Javaの使用方法」を参照してください。詳細は、「ステートフル・セッションBeanとは」を参照してください。

表11-2    EJB 2.1ステートフル・セッションBeanの構成要素 
構成要素  説明 

ホーム・インタフェース(リモートまたはローカル) 

javax.ejb.EJBHomeおよびjavax.ejb.EJBLocalHomeを拡張し、1つ以上のcreate()ファクトリ・メソッドおよび1つのremove()メソッドを必要とします。 

コンポーネント・インタフェース(リモートまたはローカル) 

リモート・インタフェースの場合はjavax.ejb.EJBObjectを拡張し、ローカル・インタフェースの場合はjavax.ejb.EJBLocalObjectを拡張します。また、Bean実装で実装されるビジネス・ロジック・メソッドを定義します。 

Beanの実装 

SessionBeanを実装します。このクラスは、パブリックとして宣言する必要があり、パブリックで空のデフォルト・コンストラクタを含み、finalizeメソッドは使用しません。また、リモート・インタフェースで定義されたメソッドを実装します。ホーム・インタフェースで定義されたcreateメソッドに対応するejbCreateメソッドが含まれている必要があります。つまり、各ejbCreateメソッドは、パラメータ・シグネチャによって、ホーム・インタフェースで定義されているcreateメソッドに一致している必要があります。ejbRemoveなどのコンテナ・サービス・メソッドを実装します。また、オプションでコンテナ管理のトランザクション用のSessionSynchronizationインタフェースを実装します。これには、afterBeginbeforeCompletionおよびafterCompletionが含まれます。 

  1. Beanのホーム・インタフェースを作成します(「ホーム・インタフェースの実装」を参照)。

    リモート・ホーム・インタフェースは、クライアントがBeanをインスタンス化するためにリモートで起動できるcreateメソッドを定義します。ローカル・ホーム・インタフェースは、Beanをインスタンス化するために同一JVM上のBeanがローカルで起動できるcreateメソッドを定義します。

    1. リモート・ホーム・インタフェースを作成するには、javax.ejb.EJBHomeを拡張します(「リモート・ホーム・インタフェースの実装」を参照)。

    2. ローカル・ホーム・インタフェースを作成するには、javax.ejb.EJBLocalHomeを拡張します(「ローカル・ホーム・インタフェースの実装」を参照)。

  2. Beanのコンポーネント・インタフェースを作成します(「コンポーネント・インタフェースの実装」を参照)。

    リモート・コンポーネント・インタフェースは、クライアントがリモートで起動できるビジネス・メソッドを宣言します。ローカル・インタフェースは、同一JVM上のBeanがローカルで起動できるビジネス・メソッドを宣言します。

    1. リモート・コンポーネント・インタフェースを作成するには、javax.ejb.EJBObjectを拡張します(「リモート・コンポーネント・インタフェースの実装」を参照)。

    2. ローカル・コンポーネント・インタフェースを作成するには、javax.ejb.EJBLocalObjectを拡張します(「ローカル・コンポーネント・インタフェースの実装」を参照)。

  3. 次のようにステートフル・セッションBeanを実装します。

    1. ホーム・インタフェースのcreateメソッドに一致するejb<METHOD>メソッドを実装します。

      ステートフル・セッションBeanの場合は、ホーム・インタフェースの各createメソッドに対応する引数リストをejbCreateメソッドに提供します。

    2. ホームおよびコンポーネント・インタフェースで宣言されたビジネス・メソッドを実装します。

    3. javax.ejb.SessionBeanインタフェースを実装して、定義するコンテナ・コールバック・メソッドを実装します(「EJB 2.1セッションBeanのライフ・サイクル・コールバック・メソッドの構成」を参照)。

    4. SessionContextのインスタンスを取得するsetSessionContextメソッドを実装します(「setSessionContextメソッドの実装」を参照)。

      ステートフル・セッションBeanでは、このメソッドは通常はSessionContextをセッションBeanの状態に追加します。

  4. Bean実装と一致するようにejb-jar.xmlファイルを構成します(「デプロイXMLの使用方法」を参照)。

Javaの使用方法

例11-3に、ステートフル・セッションBeanの一般的な実装を示します。

例11-3    EJB 2.1ステートフル・セッションBeanの実装

package hello;
import javax.ejb.*;

public class HelloBean implements SessionBean {
    /* ----------------------------------------
    * State
    * -------------------------------------- */

    private SessionContext ctx;
    private Collection messages;
    private String defaultMessage = "Hello, World!";

    /* ----------------------------------------
    * Begin business methods. The following methods
    * are called by the client code.
    * -------------------------------------- */

    public String sayHello(String myName) throws EJBException {
        return ("Hello " + myName);
    }

    public String sayHello() throws EJBException {
        return defaultMessage;
    }

    /* ----------------------------------------
    * Begin private methods. The following methods
    * are used internally.
    * -------------------------------------- */

...

    /* ------------------------------------------------------
    * Begin EJB-required methods. The following methods are called
    * by the container, and never called by client code.
    * ------------------------------------------------------- */

    public void ejbCreate() throws CreateException {
        // when bean is created
    }

    public void ejbCreate(String message) throws CreateException {
        this.defaultMessage = message;
    }

    public void ejbCreate(Collection messages) throws CreateException {
        this.messages = messages;
    }

    public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
    }

// Life Cycle Methods

    public void ejbActivate() {
    }

    public void ejbPassivate() {
    }

    public void ejbCreate() {
    }

    public void ejbRemove() {
    }
}

デプロイXMLの使用方法

例11-4に、例11-3に示したステートフル・セッションBeanに対応するejb-jar.xmlセッション要素を示します。

例11-4    ステートフル・セッションBeanのejb-jar.xml

...
    <enterprise-beans>
        <session>
            <ejb-name>Hello</ejb-name>
            <home>hello.HelloHome</home>
            <remote>hello.Hello</remote>
            <ejb-class>hello.HelloBean</ejb-class>
            <session-type>Stateful</session-type>
            <transaction-type>Container</transaction-type>
        </session>
    </enterprise-beans>
...

デプロイ・ファイルの詳細は、第26章「デプロイメント・ディスクリプタ・ファイルの構成」を参照してください。

ホーム・インタフェースの実装

ホーム・インタフェース(リモートおよびローカル)は、セッションBeanインスタンスの作成に使用され、Beanのcreateメソッドを定義します。表11-3に示すように、定義するcreateメソッドのタイプは、作成しているセッションbeanのタイプによって決まります。

表11-3    ホーム・インタフェースのcreateメソッド 
セッションBeanタイプ  createメソッド 

ステートレス・セッションBean 

パラメータなしの1つのcreateメソッドのみ。 

ステートフル・セッションBean 

Beanの状態を定義するパラメータを持つ1つ以上のcreateメソッド。 

createメソッドにつき、対応するejbCreateメソッドをBean実装で定義します。

リモート・ホーム・インタフェースの実装

リモート・クライアントは、リモート・インタフェースを介してEJBを起動します。クライアントは、リモート・ホーム・インタフェースで宣言されたcreateメソッドを起動します。コンテナは、Bean実装内の、適切なパラメータ・シグネチャを持つejbCreateメソッドにクライアント・コールを渡します。リモート・ホーム・インタフェースを開発するための要件は次のとおりです。

例11-5に、ステートレス・セッションBeanのHelloHomeというリモート・ホーム・インタフェースを示します。

例11-5    ステートレス・セッションBeanのリモート・ホーム・インタフェース

package hello;

import javax.ejb.*;
import java.rmi.*;

public interface HelloHome extends EJBHome {
public Hello create() throws CreateException, RemoteException;
}

 

例11-6に、ステートフル・セッションBeanのHelloHomeというリモート・ホーム・インタフェースを示します。
様々なcreateメソッドに渡される引数を使用して、セッションBeanの状態を初期化します。

例11-6    ステートフル・セッションBeanのリモート・ホーム・インタフェース

package hello;

import javax.ejb.*;
import java.rmi.*;

public interface HelloHome extends EJBHome {
public Hello create() throws CreateException, RemoteException;
public Hello create(String message) throws CreateException, RemoteException;
public Hello create(Collection messages) throws CreateException, RemoteException;
}

ローカル・ホーム・インタフェースの実装

EJBは、同じコンテナに存在するクライアントからローカルでコールできます。したがって、同一JVM上のBean、JSPまたはサーブレットは、ローカル・ホーム・インタフェースで宣言されたcreateメソッドを起動します。コンテナは、Bean実装内の、適切なパラメータ・シグネチャを持つejbCreateメソッドにクライアント・コールを渡します。ローカル・ホーム・インタフェースを開発するための要件は、次のとおりです。

例11-7に、ステートレス・セッションBeanのHelloLocalHomeというローカル・ホーム・インタフェースを示します。

例11-7    ステートレス・セッションBeanのローカル・ホーム・インタフェース

package hello;

import javax.ejb.*;

public interface HelloLocalHome extends EJBLocalHome {
public HelloLocal create() throws CreateException;
}

例11-8に、ステートフル・セッションBeanのHelloLocalHomeというローカル・ホーム・インタフェースを示します。
様々なcreateメソッドに渡される引数を使用して、セッションBeanの状態を初期化します。

例11-8    ステートフル・セッションBeanのローカル・ホーム・インタフェース

package hello;

import javax.ejb.*;

public interface HelloLocalHome extends EJBLocalHome {
public HelloLocal create() throws CreateException;
public HelloLocal create(String message) throws CreateException;
public HelloLocal create(Collection messages) throws CreateException;
}

コンポーネント・インタフェースの実装

コンポーネント・インタフェースでは、クライアントから起動可能なBeanのビジネス・メソッドを定義します。

リモート・コンポーネント・インタフェースの実装

リモート・インタフェースでは、リモート・クライアントによって起動可能なビジネス・メソッドを定義します。リモート・コンポーネント・インタフェースを開発するための要件は、次のとおりです。

例11-9に、Helloというリモート・コンポーネント・インタフェースとその定義済のメソッドを示します。各メソッドは、対応するセッションBeanで実装されます。

例11-9    EJB 2.1セッションBeanのリモート・コンポーネント・インタフェース

package hello;

import javax.ejb.*;
import java.rmi.*;

public interface Hello extends EJBObject {
    public String sayHello(String myName) throws RemoteException;
    public String sayHello() throws RemoteException;
}

ローカル・コンポーネント・インタフェースの実装

ローカル・コンポーネント・インタフェースでは、ローカル(同一JVM上の)クライアントから起動可能なBeanのビジネス・メソッドを定義します。ローカル・コンポーネント・インタフェースを開発するための要件は、次のとおりです。

例11-10に、HelloLocalというローカル・コンポーネント・インタフェースとその定義済のメソッドを示します。各メソッドは、対応するセッションBeanで実装されます。

例11-10    EJB 2.1セッションBeanのローカル・コンポーネント・インタフェース

package hello;

import javax.ejb.*;

public interface HelloLocal extends EJBLocalObject {
    public String sayHello(String myName);
    public String sayHello();
}

setSessionContextメソッドの実装

このメソッドを使用して、Beanのコンテキストの参照を取得します。セッションBeanには、コンテナによって維持され、Beanから使用可能なセッション・コンテキストが存在します。Beanは、セッション・コンテキスト内のメソッドを使用して、コンテナへのコールバック・リクエストを送信できます。

コンテナは、Beanをインスタンス化した後、setSessionContextメソッドを起動して、Beanからセッション・コンテキストを取得できるようにします。コンテナは、トランザクション・コンテキストからはこのメソッドをコールしません。この時点でBeanがセッション・コンテキストを保存しなかった場合、Beanは二度とセッション・コンテキストにアクセスできなくなります。

コンテナはこのメソッドをコールする際、SessionContextオブジェクトの参照をBeanに渡します。Beanは、この参照を後の使用のために格納できます。

例11-11に、セッション・コンテキストをsessctx変数に格納するセッションBeanを示します。

例11-11    setSessionContextメソッドの実装

import javax.ejb.*;

public class myBean implements SessionBean {
   SessionContext sessctx;

   public void setSessionContext(SessionContext ctx) {
      sessctx = ctx;   // session context is stored in instance variable
   }
   // other methods in the bean
}

戻る 次へ
Oracle
Copyright © 2002, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引