J2EE Tutorial の最初に載っていた簡単な Session Bean をちょっとやってみました。(ちなみにの J2EE Tutorial には日本語版の PDF もダウンロード可能になっています。書籍として購入も可能です)
開発とデプロイを同時にやっていきますので、最初にいれものとしての EAR ファイルを作成しておきます。
deploytool を起動し、新規アプリケーションを作成します。

ファイル名はまあなんでもいいのですが、Converter.ear としました。

Remote インターフェイス、Home インターフェイス、実装クラスを作成します。
以下のように J2EE_Tutorial というディレクトリを作成し、それぞれ Notepad で入力し、J2 SDK 1.4.0 の javac でコンパイルしました。

まず最初に Remote インターフェイスである Converter.java です。
要は公開されているビジネスメソッドですね。
| import javax.ejb.EJBObject; import java.rmi.RemoteException; import java.math.*; public interface Converter extends EJBObject { public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException; public BigDecimal yenToEuro(BigDecimal yen) throws RemoteException; } |
次に Home インターフェイスである ConverterHome.java です。
Converter という Session Bean のライフサイクルをつかさどるインターフェイスになります。この
Home インターフェイスを通じて、EJB の作成をお願いし、返された上記のインターフェイスに対してコーディングを行う、というファクトリ・パターン的な構造になっています。
| import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface ConverterHome extends EJBHome { Converter create() throws RemoteException, CreateException; } |
実装を行う ConverterBean.java です。
上の 2つがインターフェイスであるのに対しての、実装クラスです。
ビジネスメソッドに対する実装もありますし、ライフサイクルに関する実装もあります。上記
2つのインターフェイスに定義されているものは必ずここで実装されている、という関係になります。(Home
インターフェイスの create メソッドは ejbCreate メソッドになっています)
| import java.rmi.RemoteException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import java.math.*; public class ConverterBean implements SessionBean { BigDecimal yenRate = new BigDecimal("121.6000"); BigDecimal euroRate = new BigDecimal("0.0077"); public BigDecimal dollarToYen(BigDecimal dollars) { BigDecimal result = dollars.multiply(yenRate); return result.setScale(2,BigDecimal.ROUND_UP); } public BigDecimal yenToEuro(BigDecimal yen) { BigDecimal result = yen.multiply(euroRate); return result.setScale(2,BigDecimal.ROUND_UP); } public ConverterBean() { } public void ejbCreate() { } public void ejbRemove() { } public void ejbActivate() { } public void ejbPassivate() { } public void setSessionContext(SessionContext sc) { } } |
それぞれコンパイルを行ったら、ejb-jar ファイルにまとめます。
新規エンタープライズ Bean の作成を行います。

以下のように JAR ファイルの名前を指定し、中に含めるクラスとしてコンパイル済みの上記 3つのクラスを追加します。

続く画面で、Bean タイプを指定し、それぞれのクラスを対応する機能に指定します。
次の画面は省略していますが、この次の画面に行ったところで「完了」ボタンが使えるようになります。この後に続く画面で特に指定するところは今のところはないので、「完了」ボタンを押して
ejb-jar を作成してください。

EJB にアクセスするアプリケーションクライアントを作成します。
今回もまた Notepad で入力し、J2 SDK 1.4.0 でコンパイルしました。

こちらがアプリケーションクライアントである ConverterClient.java です。
| import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import java.math.BigDecimal; public class ConverterClient { public static void main(String[] args) { try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objref, ConverterHome.class); Converter currencyConverter = home.create(); BigDecimal param = new BigDecimal ("100.00"); BigDecimal amount =currencyConverter.dollarToYen(param); System.out.println(amount); amount = currencyConverter.yenToEuro(param); System.out.println(amount); System.exit(0); } catch (Exception ex) { System.err.println("Caught an unexpected exception!"); ex.printStackTrace(); } } } |
最初に初期コンテキストを作成し、JNDI 名でルックアップして Home オブジェクトへの参照を取得します。
Context initial = new InitialContext();
Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter");
参照は Object として取得されますので、Home インターフェイスに変換を行います。
ConverterHome home =
(ConverterHome)PortableRemoteObject.narrow(objref, ConverterHome.class);
Home インターフェイスを通じ、Remote インターフェイスを戻り値に指定して EJB を作成してもらいます。
Converter currencyConverter = home.create();
作成されたインスタンスに Remote インターフェイスを通して、定義されているメソッドを使用してアプリケーションロジックを実行します。
BigDecimal amount =currencyConverter.dollarToYen(param);
新規アプリケーションクライアントのデプロイを行います。

上記のアプリケーションクライアントのクラスを追加します。

クラスを「メインクラス」に指定し、表示名の入力、「コンテナ管理クラスによる認証を使用」の選択を行って「次へ」行った画面で「完了」です。

「EJB 参照」タブ画面から「追加」ボタンを押して、このアプリケーションクライアントのルックアップに使用している ejb/SimpleConverter を「コード化名」に、使用する EJB のタイプや Home インターフェイス、Remote インターフェイスの名前などを指定します。
この画面は後から取った画面なので一番下の「JNDI名」に値が入っていますが、これはなくても今のところは OK です。

notepad で EJB にアクセスする JSP ファイルを作成します。

index.jsp です。
jspInit のところで、上のアプリケーションクライアントと同じように JNDI ルックアップを行って
Home インターフェイスの取得、インスタンスの作成と Remote インターフェイスを通してのその取得が行われています。
その後、ビジネスメソッドが実行されています。
| <%-- Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. This software is the proprietary information of Sun Microsystems, Inc. Use is subject to license terms. --%> <%@ page import="Converter,ConverterHome,javax.ejb.*, java.math.*, javax.naming.*, javax.rmi.PortableRemoteObject, java.rmi.RemoteException" %> <%! private Converter converter = null; public void jspInit() { try { InitialContext ic = new InitialContext(); Object objRef = ic.lookup("java:comp/env/ejb/TheConverter"); ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class); converter = home.create(); } catch (RemoteException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (CreateException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (NamingException ex) { System.out.println("Unable to lookup home: "+ "TheConverter "+ ex.getMessage()); } } public void jspDestroy() { converter = null; } %> <html> <head> <title>Converter</title> </head> <body bgcolor="white"> <h1><b><center>Converter</center></b></h1> <hr> <p>Enter an amount to convert:</p> <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> <% String amount = request.getParameter("amount"); if ( amount != null && amount.length() > 0 ) { BigDecimal d = new BigDecimal (amount); %> <p> <%= amount %> dollars are <%= converter.dollarToYen(d) %> Yen. <p> <%= amount %> Yen are <%= converter.yenToEuro(d) %> Euro. <% } %> </body> </html> |
新規 Web コンポーネントの作成です。

WAR 表示名を指定し、上記の JSP ファイルを追加します。

タイプとして JSP を選択します。

JSP ファイル名を選択し、Web コンポーネント名を指定して「完了」です。

WAR ファイルの EJB タブの「追加」で、JSP の中で使用している JNDI 参照名を「コード化名」に、使用している EJB のタイプや Home インターフェイス、Remote インターフェイスの名前などを指定します。
この画面は後から取った画面なので一番下の「JNDI名」に値が入っていますが、これはなくても今のところは OK です。

最後にアプリケーション (.ear) ファイルの「JNDI 名」で EJB コンポーネントの JNDI 名を指定し、アプリケーションクライアントで指定した参照名/Web コンポーネントで指定した参照名と JNDI 名を結び付けます。

「ツール」-「配備」でデプロイを行います。

エンタープライズ・アプリケーションのファイルとターゲットサーバを指定します。
「クライアント Jar を返します」にチェックをいれ、新規アプリケーションクライアントの追加時に生成されたクライアント JAR ファイルを指定します。

JNDI 名の確認です。

JSP ファイルをアクセスする時の URL パスです。

ここで「完了」です。

こんな状況表示用のダイアログボックスが出ています。
進捗情報を表示します。
全部終わった状態です。「了解」でこのダイアログボックスを閉じてください。
deploytool を起動した元の画面でもメッセージが出て状況を知らせています。

アプリケーションクライアントを動かしてみましょう。
以下のように実行が確認できます。

Web コンポーネントの方を動かしてみましょう。
ポートはデフォルトの場合 8000 です。デプロイ時に指定した URL パスを指定してアクセスしてみましょう。
最初はこんな画面です。

200 と入力すると

答えが返ってきます。

|
|