JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > EJB (Stateless Session Bean)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  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)編で使用するソース
HelloWorldE.java Remoteインターフェイス
HelloWorldEHome.java Homeインターフェース
HelloWorldEBean.java Beanクラス
HelloWorldEClient.java EJBを利用するクライアント
◆EJBをの作成
EJBは3つのクラスから構成されます。以下がそのソースです。
■Remoteインターフェース
RemoteインターフェースはRemoteを継承しなければなりません。インターフェースEJBObjectRemoteを継承しています。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