|
|
| |
2002/02/03 田中宏和 |
| Last Update
2002/11/27 |
|
 |
EJB
(Stateless Session Bean)編 |
 |
◆EJBとは? |
| EJBとはEnterprise Java Beansの略です。サーバーサイドのコンポーネント技術の仕様です。EJBにはデーターベースへの接続、トランザクション処理、リモートアクセスなどの機能がすでに実装されているので、開発者はビジネスロジックのみに集中することができ、開発効率を向上することができます。さらに、EJBはコンポーネント技術であるので、一度作ったコンポーネント(部品)の再利用が容易にできるというのも大きな特徴です。 |
| ◆Stateless Session Beanとは? |
| EJBの中にも以下のような種類があります。 |
| Session
Bean |
Stateless Session
Bean |
ビジネスロジックを実行するBean(状態を保持しない) |
| Stateful Session
Bean |
ビジネスロジックを実行するBean(状態を保持する) |
| Entity
Bean |
CMP Entity Bean |
データベースへのアクセスをカプセル化する永続的オブジェクト(永続化処理をEJBコンテナが行ってくれる) |
| BMP Entity Bean |
データベースへのアクセスをカプセル化する永続的オブジェクト(永続化処理はこのBean自身が行わなければならない) |
|
| ここではStateless Session Beanを作成します。Stateless Session
Beanとは状態を保持しないBeanなので、一つのメソッドで処理は完結します。 |
| ◆ここでの環境 |
| OS |
Windows XP |
| J2SE SDK |
1.4.1_01 |
| J2EE SDK |
1.3.1 |
|
|
|
|
| ◆Java実行環境の構築 |
| アプリケーション編を参考にしてJavaの実行環境を構築してください。 |
| ◆EJBを動かす環境の構築 |
(注意)
J2EE SDK 1.3.1のサポートはWindows NT 4.0、Windows 2000 Professionalのみのようです。それ以外のOSの場合は正常に動作しない可能性がありますのでご了承願います。(試したところXPでも動作しました) |
| ■J2EEのダウンロードとインストール |
| J2EE SDKをダウンロードしましょう。 |
| ダウンロード → J2EE
SDK |
| インストールされるとC:\j2sdkee1.3.1(バージョン1.3.1の場合)の下にJ2EEの開発環境が入ります。 |
| ■環境変数の設定 |
| 1.以下の環境変数を新規に設定します。 |
| J2EE_HOME → C:\j2sdkee1.3.1 (バージョン1.3.1の場合) |
| 2.PATHに以下のフォルダを追加します。 |
| %J2EE_HOME%\bin |
| 3.CLASSPATHに以下のファイルを追加します。 |
| %J2EE_HOME%\lib\j2ee.jar |
| ■J2EEサーバーの起動 |
| EJBを利用するにはJ2EEサーバーが必要です。起動してみましょう。起動するにはMS-DOSプロンプト(コマンドプロンプト)を開いて j2ee
-verbose というコマンドを入力してください。 |
| コマンドプロンプト |
C:\>j2ee
-verbose
J2EE server listen port: 1050
Naming service started:1050
Binding DataSource, name = jdbc/DB2, url = jdbc:cloudscape:rmi:CloudscapeDB;crea
te=true
Binding DataSource, name = jdbc/Cloudscape, url = jdbc:cloudscape:rmi:Cloudscape
DB;create=true
Binding DataSource, name = jdbc/DB1, url = jdbc:cloudscape:rmi:CloudscapeDB;crea
te=true
Binding DataSource, name = jdbc/InventoryDB, url = jdbc:cloudscape:rmi:Cloudscap
eDB;create=true
Binding DataSource, name = jdbc/EstoreDB, url = jdbc:cloudscape:rmi:CloudscapeDB
;create=true
Binding DataSource, name = jdbc/XACloudscape, url = jdbc/XACloudscape__xa
Binding DataSource, name = jdbc/XACloudscape__xa, dataSource
= COM.cloudscape.co
re.RemoteXaDataSource@a89ce3
Starting JMS service...
Initialization complete - waiting for client requests
Binding: < JMS Destination : jms/Topic , javax.jms.Topic
>
Binding: < JMS Destination : jms/Queue , javax.jms.Queue
>
Binding: < JMS Cnx Factory : jms/TopicConnectionFactory
, Topic , No properties
>
Binding: < JMS Cnx Factory : jms/QueueConnectionFactory
, Queue , No properties
>
Binding: < JMS Cnx Factory : QueueConnectionFactory
, Queue , No properties >
Binding: < JMS Cnx Factory : TopicConnectionFactory
, Topic , No properties >
Starting web service at port: 8000
Starting secure web service at port: 7000
J2EE SDK/1.3.1
Starting web service at port: 9191
J2EE SDK/1.3.1
J2EE server startup complete. |
|
| これで起動されました。環境変数が正しく設定されていないと起動できないので注意してください。 |
| ■J2EEサーバーの停止 |
| J2EEサーバーを停止するにはMS-DOSプロンプト(コマンドプロンプト)を開いて j2ee -stopというコマンドを入力してください。 |
| コマンドプロンプト |
C:\>j2ee
-stop
Shutting down the J2EE server.
C:\> |
|
|
|
| ◆EJB(Stateless Session Bean)編で使用するソース |
|
| ◆EJBをの作成 |
| EJBは3つのクラスから構成されます。以下がそのソースです。 |
| ■Remoteインターフェース |
| RemoteインターフェースはRemoteを継承しなければなりません。インターフェースEJBObjectがRemoteを継承しています。Remoteインターフェースにはリモートメソッドの定義を記述します。 |
| HelloWorldE.java(ここからダウンロード) |
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface HelloWorldE extends EJBObject {
public String sayHelloWorld() throws RemoteException;
} |
|
| ■Homeインターフェース |
| 上のRemoteインターフェース(HelloWorldE)を返すcreateメソッドを持つインターフェースです。インターフェースEJBHomeを継承します。EJBHomeもインターフェースRemoteを継承してますので、HomeインターフェースもRemoteインターフェースです。つまり、createメソッドはリモートから呼ばれます。 |
| HelloWorldEHome.java(ここからダウンロード) |
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloWorldEHome extends EJBHome {
public HelloWorldE create() throws RemoteException, CreateException;
} |
|
| ■Beanクラス |
| Beanクラスにはリモートメソッドの中身を含めて記述します。 |
| HelloWorldEBean.java(ここからダウンロード) |
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class HelloWorldEBean implements SessionBean {
public String sayHelloWorld() {
return "Hello World";
}
public void setSessionContext(SessionContext sc) {}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
} |
|
|
| ■メソッドの説明 |
| メソッド |
説明 |
| setSessionContext() |
セッションBeanのインスタンス生成後、コンテナによって呼び出され、セッションBeanと、コンテナが保有するコンテキストとの関連付けを行う。 |
| ejbCreate() |
クライアントがcreateメソッドを呼び出したときコンテナによって呼び出されます。 |
| ejbRemove() |
クライアントがremoveメソッドを呼び出した場合、またはセッションのタイムアウトの場合に、セッションオブジェクトが消滅する前にコンテナによって呼びだれます。 |
| ejbActivate() |
非活性状態→活性状態になるときに呼び出されます。このメソッドではejbPassvate()メソッドで開放したリソースを取得しなければなりません。 |
| ejbPassivate() |
活性状態→非活性状態になるときに呼び出されます。リソースの開放を行います。 |
|
(注釈)活性状態と非活性状態について
コンテナは使用していないセッションビーンをコンテナプール(2次記憶装置)に保存し非活性状態になります。これを非活性化といいます。また、セッションビーンのインスタンスをが必要になった場合、コンテナはコンテナプール(2次記憶装置)からオブジェクトを読み込みます。これを活性化といいます。 |
| ◆コンパイル |
| コマンドプロンプト |
C:\JavaHello\EJB>javac
HelloWorldE.java HelloWorldEHome.java HelloWorldEBean.java
C:\JavaHello\EJB> |
|
| コンパイルが終了しました。 |
|
|
| ◆EJBの設定とデプロイ |
| EJBを利用可能にするにはdeploy(配置)という作業が必要です。MS-DOSプロンプト(コマンドプロンプト)を開いて deploytool というコマンドで起動できます。 |
| コマンドプロンプト |
C:\>deploytool
Starting Deployment tool, version 1.3.1
(Type 'deploytool -help' for command line options.) |
|
 |
| ■新規アプリケーションの作成 |
| まず、新規にアプリケーションを作成します。メニューの「File」→「New」→「Application」で作成できます。ここではHelloWorldEAppliという名前で作成しました。 |
 |
| ■Enterprise Beanの追加 |
| 次にEJBを作成します。メニューの「File」→「New」→「Enterprise Bean...」で作成します。作成画面が表示されましたら。まず一回「Next」ボタンで画面をすすめてください。 |
 |
| 上のような画面がでましたら、「JAR Display Name」を入力してください。画面に表示されるEJBの名前になります。ここでは「HelloWorldEJB」にしました。次に「Contents」のところの「Edit」ボタンを押してEJBを構成するクラスと追加します。 |
 |
| 上でコンパイルした3つのクラスファイルを選んで「Add」ボタンで追加してください。追加したら「OK」ボタンを押してください。「Next」ボタンで次の画面に進みます。 |
| ■EJBのタイプと3つのクラスの選択 |
 |
まず、EJBのタイプを選びますここでは、Stateless Session Beanを作成するので「Session」→「Stateless」にチェックを入れます。
次に「Enterprise Bean Class」と「Remote Home Interface」と「Remote Interface」を設定します。上で追加した3つのクラスをそれぞれ選んでください。
Enterprise Bean Class → HelloWorldEBean
Remote Home Interface → HelloWorldEHome
Remote Interface → HelloWorldE |
| 選びましたら、「Finish」ボタンで終了してください。まだいろいろ設定できることはありますが、ここでは必要最低限の設定だけあればいいので他は設定しないことにします。 |
| ■JNDI名の設定 |
| JNDIとはJava Naming and Directory Interface の略です。名前によってオブジェクトを探すことができるようにする、Java
APIです。 |
| 上で追加した、HelloWorldEJBの「JNDI Names」のタブを選択してJNDI名を入力します。ここでは「HelloWorldE」と入力しました。 |
 |
| ■サーバーの追加 |
| サーバーを追加します。メニューの「File」→「Add Server...」で追加してください。ここではローカルマシンでサーバーとクライアントを兼ねるので、「Server
Name」には localhost と入力します。J2EEサーバーが動いていれば正常に追加されます。 |
| ■デプロイ |
| これで準備が整ったのでデプロイしてみましょう!HelloWorldEJBを選んでメニューの「Tools」→「Deploy...」を選んでください。 |
| |
| 画面が表示されましたら、「Return Client Jar」にチェックを入れて「Finish」ボタンを押してください。正常に終了すると、右上のような画面がでてDeployment
of HelloWorldEAppli is completeと表示されます。 |
|
|
| ◆クライアント側のプログラムの作成 |
| ■ソースコード |
| HelloWorldEClient.java(ここからダウンロード) |
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class HelloWorldEClient {
public static void main(String[] args) {
try {
// ネーミングコンテキスト取得
Context initial = new InitialContext();
// JNDI名をルックアップしてホームインターフェースを取得
HelloWorldEHome home =
(HelloWorldEHome) PortableRemoteObject.narrow(initial.lookup("HelloWorldE"),
HelloWorldEHome.class);
// リモートインターフェースを作成
HelloWorldE helloworld = home.create();
// メソッドを呼び出してその戻り値を表示
System.out.println(helloworld.sayHelloWorld());
} catch (Exception e) {
e.printStackTrace();
}
}
} |
|
|
| ■コンパイル |
| コマンドプロンプト |
| C:\JavaHello\EJB>javac
HelloWorldEClient.java C:\JavaHello\EJB> |
|
| ■実行 |
| 実行する前に、上で「Return Client Jar」にチェックを入れることにより生成した、HelloWorldEAppliClient.jarファイルをクラスパスに追加してください。このファイルにはクライアントのプログラムから呼ばれるスタブが含まれています。 |
| コマンドプロンプト |
| C:\JavaHello\EJB>set
CLASSPATH=%CLASSPATH%;HelloWorldEAppliClient.jar
C:\JavaHello\EJB>java HelloWorldEClient
Hello World
C:\JavaHello\EJB> |
|
| おおおおおお!!!!表示されましたね! |
|
|
| ◆別のコンピューターから実行 |
| EJBにはリモートアクセスの機能が実装されているので、別のコンピューターからもEJBにアクセスできます。別のコンピューターからでも実行できるようにソースを変更します。ここではJ2EEサーバーのアドレスを192.168.0.1にしています。 |
| ■ソースコード |
| HelloWorldERemoteClient.java(ここからダウンロード) |
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.util.Properties;
public class HelloWorldEClient {
public static void main(String[] args) {
try {
Properties env = new Properties();
// 使用する初期コンテキストファクトリを設定
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory");
// 使用するサービスプロバイダのURLを設定
env.put(Context.PROVIDER_URL, "iiop://192.168.0.1:1050");
// ネーミングコンテキスト取得
Context initial = new InitialContext(env);
// JNDI名をルックアップしてホームインターフェースを取得
HelloWorldEHome home =
(HelloWorldEHome) PortableRemoteObject.narrow(initial.lookup("HelloWorldE"),
HelloWorldEHome.class);
// リモートインターフェースを作成
HelloWorldE helloworld = home.create();
// メソッドを呼び出してその戻り値を表示
System.out.println(helloworld.sayHelloWorld());
} catch (Exception e) {
e.printStackTrace();
}
}
} |
|
|
| ■ネーミングコンテキスト生成時に設定しているプロパティの説明 |
| プロパティ |
説明 |
(Javaの定数)
Context.INITIAL_CONTEXT_FACTORY
(定数の値)
"java.naming.factory.initial" |
使用する初期コンテキストファクトリを完全修飾クラス名で指定します。このプロパティは、初期コンテキストコンストラクタに渡される環境パラメータ、アプレットパラメータ、システムプロパティ、またはアプリケーションリソースファイルで指定されます。プロパティがこれらのソースで指定されていない場合に、初期コンテキストでオペレーションの完了が必要になると、NoInitialContextException
がスローされます。 |
(Javaの定数)
Context.PROVIDER_URL
(定数の値)
"java.naming.provider.url" |
使用するサービスプロバイダのURLを指定します。このプロパティは、環境、アプレットパラメータ、システムプロパティ、またはリソースファイルで指定されます。これらのソースが指定されていない場合、デフォルトの構成はサービスプロバイダによって決定されます。 |
|
| ■スタブの用意 |
| HelloWorldEAppliClient.jarを実行するフォルダにコピーしてください。 |
| ■コンパイルと実行 |
| J2EEサーバーが動いているコンピューターとは別のコンピューターで実行します。 |
| コマンドプロンプト |
| C:\JavaHello\EJB>set
CLASSPATH=%CLASSPATH%;HelloWorldEAppliClient.jar
C:\JavaHello\EJB>javac HelloWorldERemoteClient.java
C:\JavaHello\EJB>java HelloWorldERemoteClient
Hello World
C:\JavaHello\EJB>
|
|
| おおおおお!!!表示されましたね! |
|
|
■関連 EJB(エンティティビーン)編 |
|
| |
|
|
| ツールの部屋
- Java関連の書籍
- デザインパターン - 情報交換掲示板
- HOME |