Sun ONE ロゴ     前へ      目次      索引      次へ     
Sun ONE Application Server 7 サーバーアプリケーションの移行および再配備



移行に関する注意事項および手法

このmoduleでは、Sun ONE Application Server 6.0 または 6.5 から Sun ONE Application Server 7 に、J2EE アプリケーションを移行する場合の注意事項と手法について説明します。

この節では、コンポーネントレベルでの特定の移行作業についても説明します。

次の項目について説明します。

Sun ONE Application Server 6.0/6.5 について

Sun ONE Application Server 6.0 は、J2EE 1.2 仕様を全面的にベースにしたマルチプラットフォームのアプリケーションサーバーです。Windows NT/2000、Solaris、AIX、HP-UX などのプラットフォームがサポートされています。

また、Sun ONE Application Server 6.0 は、付属の専用 Web コネクタプラグインによって、多数の Web サーバーを統合化します。これらのコネクタによって、Sun ONE Web Server、Microsoft IIS、Apache などの Web サーバーと連携して動作することが可能になります。

次の図は、Sun ONE Application Server 6.0/6.5 のアーキテクチャを示しています。

   Sun ONE Application Server 6.0/6.5 のアーキテクチャ
Sun ONE Application Server 6.0/6.5 の 4 つの内部サーバーを示す図

「Sun ONE Application Server 6.0/6.5 のアーキテクチャ」の図に示されるように、一般的にエンジンまたはプロセスと呼ばれる 4 つの内部サーバーが存在します。これらのプロセスが、Sun ONE Application Server でのすべての処理を実行します。Sun ONE Application Server 6.0/6.5 の 4 つの内部サーバーには、次のようなものがあります。

実行サーバー - ほとんどのシステムサービスを提供する (一部のサービスは、「管理サーバー」によって管理される)

管理サーバー - Sun ONE Application Server の管理および障害復旧用のシステムサービスを提供する

Java サーバー - Java アプリケーションのサービスを提供する

C++ サーバー - C++ で作成されたコンポーネントは、「C++ サーバー」で動作する

Web サーバーが Sun ONE Application Server 6.0/6.5 に要求を転送すると、要求はまず「実行サーバー」プロセス (KXS) によって受信されます。KXS プロセスは、その要求を「Java サーバー」プロセス (KJS) または「C++ サーバー」プロセス (KCS) のどちらかに転送します。KJS プロセスが Java プログラミングロジックを実行するのに対し、KCS プロセスは C++ プログラミングロジックを実行します。KJS プロセスと KCS プロセスはそれぞれ、特定数のスレッドを管理し、それらのスレッドでプログラミングロジックを最後まで実行します。結果は Web サーバーに返されてから、クライアントブラウザに送信されます。

Sun ONE Application Server 6.x から 7 への移行に関する問題

この節では、Sun ONE Application 6.0 または 6.5 から Sun ONE Application Server 7 に、標準的な J2EE アプリケーションの主要コンポーネントを移行する場合に生じる可能性のある問題について説明します。

この節で説明する移行時の問題点は、オンラインバンキングサービスをシミュレートする iBank という名前の J2EE アプリケーションを Sun ONE Application Server 6.0 または 6.5 から Sun ONE Application Server 7 に、実際に移行したときのプロセスに基づいています。このアプリケーションは、通常の J2EE アプリケーションを構成するすべての要素を反映しています。

iBank アプリケーションに適用される J2EE 仕様の重要なポイントとして、次のようなものが挙げられます。

  • サーブレット、特に JSP ページへの切り替えを行うサーブレット (model-view-controller アーキテクチャ)
  • JSP ページ、特に静的および動的なページの取り込みを含む JSP ページ
  • JSP カスタムタグライブラリ
  • HTTP セッションの作成および管理
  • JDBC API 経由のデータベースアクセス
  • Enterprise JavaBeans (ステートフル、またはステートレスなセッション Beans、CMP、および BMP エンティティ Beans)
  • J2EE アプリケーションの標準パッケージ化メソッドを使用した、ラインへのアセンブリおよび配備

iBank アプリケーションの詳細については、Module A の「iBank アプリケーションの仕様」を参照してください。

次の移行プロセスについては、以下に説明します。

JDBC コードの移行

JDBC API を使用したデータベースアクセスには、2 つの方法があります。

  • DriverManager インタフェース経由の接続の確立
  • (JDBC 1.0 API)。特定のドライバを読み込み、接続 URL を提供します。この方法は、IBM の WebSphere 4.0 のような他のアプリケーションサーバーで使用されます。

  • JDBC 2.0 データソースの使用方法
  • データソースインタフェース (JDBC 2.0 API) は、設定可能な接続プールを介して使用できます。J2EE 1.2 に従って、データソースは JNDI ネーミングサービス経由でアクセスされます。

DriverManager インタフェース経由の接続の確立

この方法でデータベースにアクセスするのは、古い方法であまり効率的でないためお勧めしませんが、まだこの方法を使用しているアプリケーションもいくつか存在します。

この場合、アクセスコードは、以下のようになります。

public static final String driver = "oracle.jdbc.driver.OracleDriver";

public static final String url = "jdbc:oracle:thin:tmb_user/tmb_user@iben:1521:tmbank";

Class.forName(driver).newInstance();

Properties props = new Properties();

props.setProperty("user", "tmb_user");

props.setProperty("password", "tmb_user");

Connection conn = DriverManager.getConnection(url, props);

このコードは、Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 に完全に移植できます。ただし、Sun ONE Application Server が適切な JDBC ドライバを読み込むのに必要なクラスを検出できることが前提になります。Sun ONE Application Server 7 に配備されたアプリケーションにアクセスできる、必要なクラスを作成するには、次のいずれかの方法を実行します。

  • Sun ONE Application Server 7 のインストールディレクトリ内の /lib ディレクトリに、ドライバ実装用のアーカイブ (JAR または ZIP) を置きます。
  • 管理サーバーの GUI を介して、ドライバのパスを設定し、CLASSPATH を修正します。サーバーインスタンス「server1」をクリックした後、右側のペインの「JVM 設定」タブをクリックします。次に、「パス設定」オプションをクリックし、テキスト入力ボックスの「クラスパスのサフィックス」にパスを追加します。設定変更を行ったら、「保存」をクリックして、新しい設定を適用します。サーバーを再起動すると、設定ファイル server.xml が変更されます。

「JVM 設定を使用したクラスパスのサフィックスの設定」の図では、GUI を介して、「クラスパスのサフィックス」にドライバのパスを追加しています。

   JVM 設定を使用したクラスパスのサフィックスの設定
CLASSPATH サフィックスを追加するのに使用する JVM パス設定を示す図

JDBC 2.0 データソースの使用方法

データベースへのアクセスに JDBC 2.0 データソースを使用すると、透過的な接続プーリングなど、パフォーマンス上の利点があります。コードや実装を単純化することで、生産性を向上させ、コードの移植性を高めることができます。

アプリケーション内のデータソースを使用するには、初期設定のフェーズを実行する必要があります。その後で、アプリケーションサーバーの JNDI ネーミングコンテキスト内でデータソースを登録します。データソースを登録すると、アプリケーションでは、JNDI コンテキストから対応する DataSource オブジェクトを取り出すことによって、データベースへの接続を簡単に取得できます。これらの作業については、次の項目で説明します。

データソースの設定

Sun ONE Application Server 6.0 では、データソースとそれに対応する JDBC ドライバを、サーバーのグラフィック管理コンソールから設定します。接続プールは、アプリケーションサーバーによって自動的に管理され、その管理ツールはプロパティの設定に使用できます。組み込まれている Type 2 の JDBC ドライバを使用すると、接続プールのプロパティは、ドライバごとに定義され、そのドライバを使用するすべてのデータソースで共有されます。

一方、サードパーティの JDBC ドライバを使用した場合、接続プールのプロパティは、データソースごとに定義されます。サードパーティの JDBC ドライバは、管理ツールから、または別のユーティリティ (Sun Solaris では db_setup.sh、Windows NT/2000 では jdbcsetup) から設定できます。さらに、コマンド行ユーティリティ iasdeploy を使用すると、プロパティを記述している XML ファイルからデータソースを設定できます。これらのユーティリティはすべて、Sun ONE Application Server のインストールルートディレクトリ内のサブディレクトリ /bin/ に格納されています。

Sun ONE Application Server 7 では、サーバーのグラフィック管理コンソールまたはコマンド行ユーティリティ asadmin を使用して、データソースを設定できます。コマンド行ユーティリティ asadmin を起動するには、Windows の場合は asadmin.bat ファイルを、また Solaris の場合は asadmin ファイルをそれぞれ実行します。これらのファイルは、Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されています。次に、asadmin プロンプトから次のコマンドを入力すると、接続プールと JNDI リソースが作成されます。

asadmin ユーティリティを起動して、接続プールを作成するための構文は、次のとおりです。

asadmin>create-jdbc-connection-pool -u username -w password -H hostname -p adminport [-s] [--instance instancename] --datasourceclassname classname [--steadypoolsize=8] [--maxpoolsize=32] [--maxwait=60000] [--poolresize=2] [--idletimeout=300] [--isconnectvalidatereq=false] [--validationmethod=auto-commit] [--validationtable tablename] [--failconnection=false] [--description text] [--property (name=value)[:name=value]*] connectionpoolid

次に例を示します。

asadmin>create-jdbc-connection-pool -u admin -w password -H cl1 -p 4848 instance server1 --datasourceclassname oracle.jdbc.pool.OracleConnectionPoolDataSource --property (user-name=ibank_user):(password=ibank_user) oraclepool

この場合、Oracle データベース用の JDBC 接続プール「oraclepool」は、「ibank_user」というユーザー名と「ibank_user」というパスワードを持つデータベーススキーマを使用して作成されます。

JDBC リソースを作成する構文は、次のとおりです。

asadmin>create-jdbc-resource -u username -w password -H hostname -p adminport [-s] [--instance instancename] --connectionpoolid id [--enabled=true] [--description text] [--property (name=value)[:name=value]*] jndiname

次に例を示します。

asadmin>create-jdbc-resource -u admin -w password -H cl1 -p 4848 --instance server1 --connectionpoolid oraclepool jdbc/IBANK

この場合、上記の「jdbc/IBANK」という JNDI 名で作成された接続プールに対して、JDBC リソースが作成されます。

グラフィカルインタフェースを使用して、Sun ONE Application Server 7 にデータソースを登録する場合の実行手順は以下のとおりです。

  1. データソースのクラス名を登録します。
    1. Sun ONE Application Server 7 のインストールディレクトリ内の /lib ディレクトリに、データソースのクラス実装用のアーカイブ (JAR または ZIP) を置きます。
    2. 管理サーバーの GUI を介して、ドライバのパスを設定し、CLASSPATH を修正します。サーバーインスタンス「server1」をクリックした後、「JVM 設定」タブをクリックします。次に、「パス設定」をクリックして、「クラスパスのサフィックス」にパスを追加します。設定変更を行ったら、変更内容を保存して、新しい設定を適用します。サーバーを再起動すると、設定ファイル server.xml が変更されます。

  2. データソースを登録します。

Sun ONE Application Server 7 では、データソースとそれに対応する JDBC ドライバを、サーバーのグラフィック管理インタフェースから設定します。

左側のペインには、Sun ONE Application Server で設定できるすべての項目がツリー表示されます。左側のペインにある「接続プール」をクリックすると、関連するエントリを指定できるページが右側のペインに表示されます。

GUI を使用した接続プールの設定
Sun ONE Application Server で「接続プール」を設定している図

同様に、「データソース」をクリックすると、データソースのセットアップに必要なエントリが右側のペインに表示されます。

Sun ONE Application Server 7 固有の配備記述子 sun-web.xml は、それに応じて変更する必要があります。

たとえば、iBank アプリケーションに新しいデータソースを設定する場合、sun-web.xml は次のようなエントリを保持します。

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'Http://localhost:8000/sun-web-app_2_3.dtd'>

<sun-web-app>

   <resource-ref>

      <res-ref-name>jdbc/iBank</res-ref-name>

      <jndi-name>jdbc/iBank</jndi-name>

      <default-resource-principal>

          <name>ibank_user</name>

          <password>ibank_user</password>

      </default-resource-principal>

   </resource-ref>

</sun-web-app>

JNDI 経由でのデータソースの検索および接続の取得

データソースから接続を取得するためのプロセスは、以下のようになります。

  • 初期 JNDI コンテキストを取得する
  • JNDI 検索を使用して、データソースへの参照を取得する
  • この参照を使用して、接続を取得する

  1. 初期 JNDI コンテキストを取得する
  2. 異なる環境間での移植性を保証するため、InitialContext オブジェクト (サーブレット、JSP ページ、または EJB 内にある) を取得するのに使用するコードは、次のような単純なものにする必要があります。

       InitialContext ctx = new InitialContext();

  3. データソースへの参照を取得する
  4. JNDI コンテキストにバインドされたデータソースへの参照を取得するには、初期のコンテキストオブジェクトから、データソースの JNDI 名を検索します。次に、この方法で検索されたオブジェクトを、DataSource タイプオブジェクトとしてキャストします。

       ds = (DataSource)ctx.lookup(JndiDataSourceName);

  5. 接続を取得する
  6. この操作は非常に単純なもので、次のようなコード行を指定する必要があります。

       conn = ds.getConnection();

Sun ONE Application Server 6.0/6.5 および 7 はどちらも上記の技術に従って、データソースから接続を取得します。つまり、移行を行うときにコードを変更する必要はありません。

Java Server Pages および JSP カスタムタグライブラリの移行

Sun ONE Application Server 6.0/6.5 が JSP 1.1 仕様に準拠しているのに対し、Sun ONE Application Server 7 は JSP 1.2 仕様に準拠しています。

JSP 1.2 仕様には、多数の新機能に加えて、JSP 1.1 仕様ではあまり適切ではなかった部分の修正および説明が含まれています。

最も重要な変更点を以下に示します。

  • JSP 1.2 は、サーブレット 2.3 および Java 2 に基づいている。JSP 1.2 アプリケーションは、JDK 1.1 だけをサポートするプラットフォームでは動作しない。JSP 1.2 は、JSP 1.1 との下位互換性があるため、JSP 1.1 アプリケーションは JSP 1.2 に準拠するコンテナを調整しなくても動作する
  • JSP ページ用の XML 構文の定義が確定している。このため、JSP 1.2 に準拠するコンテナは、JSP 1.1 形式と JSP Document と呼ばれる新しい XML 形式の両方のファイルを受け入れる必要がある
  • タグライブラリでは、サーブレット 2.3 のイベントリスナーを利用できる
  • タグライブラリに、JSP ページを検証する新しいタイプの検証が追加されている
  • タグライブラリの配布および配備用の新しいオプションが追加されている

基本的に、これらの変更は機能の拡張なので、JSP ページを JSP API 1.1 から 1.2 に移行する場合には必要ありません。

Sun ONE Application Server 6.0 または 6.5 の JSP カスタムタグライブラリの実装は、J2EE 仕様に準拠します。このため、JSP カスタムタグライブラリを Sun ONE Application Server 7 に移行する場合に、特別な問題が生じたり、修正が必要になることはありません。

サーブレットの移行

Sun ONE Application Server 6.0 および 6.5 で、サーブレット 2.2 API がサポートされているのに対し、Sun ONE Application Server 7 では、サーブレット 2.3 API がサポートされます。

サーブレット API 2.3 では、サーブレットのコアは比較的変更を受けずに残されており、ほとんどの変更は、コアの外側に追加された新しい機能に関係しています。

最も重要な機能を以下に示します。

  • サーブレットには JDK 1.2 以降が必要
  • フィルタメカニズムを新たに作成
  • アプリケーションライフサイクルイベントを追加
  • 新しい国際化サポートを追加
  • 新しいエラーおよびセキュリティ属性を追加
  • HttpUtils クラスを廃止
  • 複数の DTD 動作を拡張、明確化

基本的に、これらの変更は機能の拡張なので、サーブレットをサーブレット API 2.2 から 2.3 に移行する場合には必要ありません。

ただし、アプリケーション内のサーブレットが JNDI を使用して J2EE アプリケーションのリソース (データソース、EJB など) にアクセスする場合、ソースファイルまたは配備記述子の変更が必要な場合があります。

これらの変更の詳細については、次の節で説明します。

最後のケースとして、JSP ページが既存の Java クラスと同じ名前を持つ場合に、Sun ONE Application Server で命名の競合が発生するため、サーブレットのコード修正が必要になることがあります。この場合、競合は問題の生じている JSP ページの名前を修正することで解決します。また、さらに、この JSP ページを呼び出すサーブレットのコードを編集する必要があります。Sun ONE Application Server 6.0/6.5 と比べて、Sun ONE Application Server 7 では新しいクラスローダ階層が採用されているため、この問題は解決しています。この新しい方式では、特定のアプリケーションについて、1 つのクラスローダがすべての EJB モジュールを読み込み、別のクラスローダが Web モジュールを読み込みます。これらの 2 つのローダ同士は通信しないため、命名の競合が発生することはありません。

JNDI コンテキストからのデータソースの取得

JNDI コンテキストにバインドされたデータソースへの参照を取得するには、初期のコンテキストオブジェクトから、データソースの JNDI 名を検索します。次に、この方法で検索されたオブジェクトを、DataSource タイプオブジェクトとしてキャストします。

ds = (DataSource)ctx.lookup(JndiDataSourceName);

詳細については、前述の「JDBC コードの移行」を参照してください。

JNDI コンテキスト内での EJB の宣言

Module C の「JNDI コンテキスト内での EJB の宣言」を参照してください。

EJB の移行

「Sun ONE Application Server 7 について」で説明したように、Sun ONE Application Server 6.0 および 6.5 で EJB 1.1 仕様がサポートされているのに対し、Sun ONE Application Server 7 では EJB 2.0 仕様もサポートされます。EJB 2.0 仕様は、次のような新機能をアーキテクチャに導入しています。

  • メッセージ駆動型 Beans (MDB)
  • コンテナ管理による持続性 (CMP) の向上
  • CMP によるエンティティ Beans のコンテナ管理関係
  • ローカルインタフェース
  • EJB クエリ言語 (EJB QL)

Sun ONE Application Server 7 でも、EJB 1.1 仕様は引き続きサポートされますが、その拡張機能を活用するためには、EJB 2.0 アーキテクチャの使用をお勧めします。

EJB 1.1 から EJB 2.0 への移行については、付録 C を参照してください。

Sun ONE Application Server 7 に対応した EJB の変更

Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 に EJB を移行する場合、EJB のコード自体を変更する必要はありません。ただし、次のような DTD の変更が必要となります。

セッション Beans :

  • ejb-jar.xml のような J2EE 標準 DD に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。
  • ias-ejb-jar.xml ファイルを、DD に従って手動で作成した sun-ejb-jar.xml という名前の修正バージョンのファイルに置き換えます。詳細については、下記の URL を参照してください。
  • <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>

  • sun-ejb-jar.xml の場合、すべての EJB の JNDI 名は ejb/ で開始する必要があります。これは Sun ONE Application Server 6.5 の場合に必要です。EJB の JNDI 名には、 ejb/<ejb-name> だけしか指定できません。<ejb-name> には、ejb-jar.xml 内で宣言した EJB の名前が入ります。ただし、Sun ONE Application Server 7 では、EJB の JNDI 名を宣言できる新しいタグが sun-ejb-jar.xml 内に導入されたため、この点が変わりました。このような柔軟性が Sun ONE Application Server 7 で提供されたので、アプリケーション全体で JNDI 名を変更するのを避けるために、EJB の JNDI 名は <jndi-name> タグ内で、 ejb/<ejb-name> と宣言することをお勧めします。

エンティティ Beans :

  • ejb-jar.xml のような J2EE 標準 DD に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。
  • ejb-jar.xml のすべての CMP に対して、1.1 の値を指定した <cmp-version> タグを挿入します。
  • すべての <ejb-name>-ias-cmp.xml ファイルを、手動で作成した 1 つの sun-cmp-mappings.xml ファイルに置き換えます。詳細については、下記の URL を参照してください。
  • <!DOCTYPE sun-cmp-mappings PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 OR Mapping //EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-cmp_mapping_1_0.dtd'>

  • Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されている capture-schema ユーティリティを使用して dbschema を生成し、エンティティ Beans 用の META-INF フォルダより上位に置きます。
  • ias-ejb-jar.xml を、Sun ONE Application Server 7 で sun-ejb.jar.xml という名前に変更された新しいバージョンのファイルに置き換えます。
  • Sun ONE Application Server 6.5 では、ファインダ sql が <ejb-name>-ias-cmp.xml 内に直接組み込まれていましたが、Sun ONE Application Server 7 では、数学式を使用して、さまざまな検索メソッド用の <query-filter> を宣言するように変更されています。

Web アプリケーションの移行

Sun ONE Application Server 6.0 および 6.5 で、サーブレット (サーブレット API 2.2) と JSP (JSP 1.1) がサポートされているのに対し、Sun ONE Application Server 7 では、サーブレット (サーブレット API 2.3) と JSP (JSP 1.2) がサポートされます。

これらの環境内では、異なるアプリケーションコンポーネント (サーブレット、JSP、HTML ページ、およびその他のリソース) を 1 つのアーカイブファイル (J2EE 標準 Web アプリケーションモジュール) にまとめてから、そのアーカイブファイルをアプリケーションサーバー上に配備する必要があります。

J2EE 1.3 仕様によると、Web アプリケーションは、次のような構造を持ったアーカイブファイル (.WAR ファイル) です。

  • HTML ページ、JSP ページ、画像、およびその他の「静的な」アプリケーションのリソースを含むルートディレクトリ
  • 使用している SDK のバージョン情報、およびアーカイブに含まれるファイルのリスト (オプション) などが入ったアーカイブマニフェストファイル (MANIFEST.MF) を含む META-INF/ ディレクトリ
  • アプリケーション配備記述子 (web.xml ファイル)、およびアプリケーションで使用されるすべての Java クラスとライブラリを含む WEB-INF/ ディレクトリ。次のように構成される
      • サブディレクトリ classes/ には、アプリケーションのコンパイル済みのクラス (サーブレット、補助クラスなど) がツリー構造で格納され、パッケージに編成される
      • lib/ ディレクトリには、アプリケーションによって使用される任意の Java ライブラリ (.jar ファイル) が含まれる

Web アプリケーションモジュールの移行

Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 にアプリケーションを移行する場合、Java/JSP のコードを変更する必要はありませんが、次のような変更が必要です。

  • web.xml
  • Sun ONE Application Server 7 は J2EE 1.3 標準に準拠しているため、WAR 内の web.xml ファイルは、改訂された DTD に従う必要があります。この改訂版 DTD は、http://java.sun.com/dtd/web-app_2_3.dtd から入手できます。幸い、この DTD は以前のバージョンの DTD のスーパーセットなので、移行する web.xml 内の <! DOCTYPE 定義だけを変更する必要があります。修正した <! DOCTYPE 宣言は、次のようになります。

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  "http://java.sun.com/dtd/web-app_2_3.dtd">

  • ias-web.xml
  • Sun ONE Application Server 7 では、このファイルの名前は sun-web.xml に変更されています。

    この XML ファイルは、Web アプリケーションで必要な Sun ONE Application Server 7 固有のプロパティまたはリソースを宣言するときに使用します。

    注 : このファイルの内容については、次の節を参照してください。

    Sun ONE Application Server 6.5 アプリケーションの ias-web.xml が存在し、Sun ONE Application Server 6.5 固有のプロパティが宣言されている場合、Sun ONE Application Server 7 標準に移行するときに、このファイルが必要となります。ファイル名は sun-web.xml に変更する必要があります。その他の詳細については、下記を参照してください。

    <!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 Servlet 2.3//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd'>

前述した方法で web.xmlias-web.xml を移行すると、管理サーバーの Sun ONE Application Server 7 の GUI インタフェース、またはコマンド行ユーティリティ asadmin を使用して、Web アプリケーション (.WAR アーカイブ) を配備することができます。配備コマンドでは、アプリケーションのタイプを web として指定する必要があります。

コマンド行ユーティリティ asadmin を起動するには、Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されている asadmin.bat ファイルを実行します。

asadmin プロンプトから入力するコマンドは、次のようになります。

asadmin> deploy -u username -w password -H hostname -p adminport --type web [--contextroot contextroot] [--force=true] [--name component-name] [--upload=true] [--instance instancename] filepath

「Sun ONE Application Server 7 でのアプリケーションの配備」に記載されるように、配備は Sun ONE Studio 開発環境からでも行うことができます。

サーブレットおよび JSP の移行時の特定の障害

Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 に、サーブレット/JSP アプリケーションのコンポーネントを実際に移行する場合、コンポーネントのコードを修正する必要はありません。

Web アプリケーションがデータソースなどのサーバーリソースを使用している場合、Sun ONE Application Server 7 では、このリソースを web.xml 内および sun-web.xml 内で同様に宣言する必要があります。jdbc/iBank という名前のデータソースを宣言する場合、web.xml 内で宣言される <resource-ref> タグは、次のようになります。

    <resource-ref>

      <res-ref-name>jdbc/iBank</res-ref-name>

      <res-type>javax.sql.XADataSource</res-type>

      <res-auth>Container</res-auth>

      <res-sharing-scope>Shareable</res-sharing-scope>

    </resource-ref>

これに対応する sun-web.xml 内の宣言は、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>

<! DOCTYPE FIX ME: need confirmation on the DTD to be used for this file

<sun-web-app>

   <resource-ref>

      <res-ref-name>jdbc/iBank</res-ref-name>

      <jndi-name>jdbc/iBank</jndi-name>

   </resource-ref> </sun-web-app>

エンタープライズ EJB モジュールの移行

Sun ONE Application Server 6.0 および 6.5 で、EJB 1.1 API がサポートされているのに対し、Sun ONE Application Server 7 では、EJB 2.0 API がサポートされます。その結果、どちらも以下のものをサポートできます。

  • ステートフル、またはステートレスなセッション Beans
  • Bean 管理による持続性 (BMP)、またはコンテナ管理による持続性 (CMP) を持つエンティティ Beans

ただし、EJB 2.0 API では、セッション Beans およびエンティティ Beans に加えて、メッセージ駆動型 Beans と呼ばれる新しいタイプの Enterprise Java Beans が導入されています。

J2EE 1.3 仕様によると、EJB のさまざまなコンポーネントは、次のような構造を持った JAR ファイルにまとめる必要があります。

  • ejb-jar.xml という名前の XML 配備記述子を持つ META-INF/ ディレクトリ
  • パッケージ内のホームインタフェースおよびリモートインタフェース、Bean の実装クラスおよび補助クラスに対応する .class ファイル

Sun ONE Application Server では、このアーカイブ構造を維持します。ただし、EJB 1.1 仕様では、各 EJB コンテナベンダーに、適切であると思われる次のような機能を実装する余地を残しています。

  • CMP EJB のデータベースの持続性 (特に、データベース表内の Bean の CMP フィールドとカラム間でのマッピング設定)
  • CMP Beans 用カスタムファインダメソッドのロジックの実装

予期されていたように、Sun ONE Application Server 6.0 または 6.5 と Sun ONE Application Server 7 では、異なる点がいくつか存在するため、アプリケーションを移行する場合に、特別な留意が必要な部分があります。以下のように、いくつかの XML ファイルを修正する必要があります。

  • ejb-jar.xml のような J2EE 標準 DD に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。
  • ias-ejb-jar.xml ファイルを、DTD に従って手動で作成した sun-ejb-jar.xml という名前の修正バージョンのファイルに置き換えます。下記の URL を参照してください。
  • <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>

  • すべての <ejb-name>-ias-cmp.xml ファイルを、手動で作成した 1 つの sun-cmp-mappings.xml ファイルに置き換えます。下記の URL を参照してください。
  • <!DOCTYPE sun-cmp-mappings PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 OR Mapping //EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-cmp_mapping_1_0.dtd'>

  • CMP エンティティ Beans についてのみ、Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されている capture-schema ユーティリティを使用して dbschema を生成し、エンティティ Beans 用の META-INF フォルダより上のディレクトリに置きます。

エンタープライズアプリケーションの移行

J2EE 仕様によると、エンタープライズアプリケーションは、次のような構造を持った EAR ファイルです。

  • application.xml という名前の J2EE アプリケーションの XML 配備記述子を持つ META-INF/ ディレクトリ
  • エンタープライズアプリケーションの EJB モジュール用の .JAR アーカイブファイルと Web モジュール用の .WAR アーカイブファイル

アプリケーション配備記述子では、エンタープライズアプリケーションと Web アプリケーションのコンテキストルートを構成するモジュールを定義します。

Sun ONE Application Server 6.0/6.5 と 7 では、主に J2EE モデルがサポートされます。このモデルでは、アプリケーションがエンタープライズアーカイブ (EAR) ファイル (拡張子は .ear) の形式でパッケージ化されます。アプリケーションはさらに J2EE モジュールの集まりに分割され、EJB 用の Java アーカイブ (拡張子が .jar の JAR ファイル) とサーブレットおよび JSP 用の Web アーカイブ (拡張子が .war の WAR ファイル) にパッケージ化されます。

このため、エンタープライズアプリケーションを配備する前に、以下の手順を実行する必要があります。

  • EJB を 1 つ以上の EJB モジュールにパッケージ化します。
  • Web アプリケーションのコンポーネントを Web モジュールにパッケージ化します。
  • EJB モジュールと Web モジュールをエンタープライズアプリケーションモジュールにアセンブルします。
  • エンタープライズアプリケーションのルートコンテキスト名を定義します。これによって、アプリケーションにアクセスするための URL を特定します。

注 : Sun ONE Application Server 7 では、Sun ONE Application Server 6.0/6.5 にはなかった新しいクラスローダ階層を使用しています。この新しい方式では、特定のアプリケーションについて、1 つのクラスローダがすべての EJB モジュールを読み込み、別のクラスローダが Web モジュールを読み込みます。これら 2 つには、親子階層の関係があり、JAR モジュールクラスローダが WAR モジュールクラスローダの親モジュールになります。このため、JAR クラスローダによって読み込まれたクラスはすべて、WAR モジュールでも使用可能またはアクセス可能ですが、反対にWAR クラスローダによって読み込まれたクラスを JAR モジュールからアクセスすることはできません。したがって、JAR ばかりでなく WAR が必要とするクラスが存在する場合、そのクラスは JAR モジュール内だけでパッケージ化します。この指針に従わない場合、ClassCastException のクラス競合が発生する可能性があります。

アプリケーションルートコンテキストとアクセス URL

アプリケーションのアクセス URL (アプリケーションの Web モジュールのルートコンテキスト) に関して、Sun ONE Application Server 6.0/6.5 と Sun ONE Application Server 7 では、特別な違いが 1 つあります。

hostname という名前のサーバー上に配備されたアプリケーションのルートコンテキスト名が AppName である場合、このアプリケーションのアクセス URL は、使用されるアプリケーションサーバーによって異なります。

  • Sun ONE Application Server 6.0 または 6.5 の場合、常に Web フロントエンドと連携して使用されるので、アプリケーションのアクセス URL は、次のような形式になる (Web サーバーは、標準の HTTP ポート番号 80 で設定されているものとする)
  • http://hostname/NASApp/AppName/

  • Sun ONE Application Server 7 の場合、URL は次のような形式になる
  • http://hostname:port/AppName/

Sun ONE Application Server 7 がデフォルトで使用する TCP ポートは、ポート番号 80 です。

Sun ONE Application Server 6.0/6.5 と Sun ONE Application Server 7 でのアクセス URL についての違いはわずかなものに見えますが、絶対 URL 参照を使用するアプリケーションを移行する場合に、問題が生じる可能性があります。このような問題が発生する場合、Sun ONE Application Server 6.0/6.5 用の Web サーバープラグインで使用される固有のマーカーが付加されないように、コードを編集して、絶対 URL 参照を更新する必要があります。

固有の拡張子の移行

Sun ONE Application Server 6.0/6.5 環境独自の多数のクラスが、アプリケーションで使用されている可能性があります。Sun ONE Application Server 6.x で使用される独自の Sun ONE パッケージの一部を以下に示します。

  • com.iplanet.server.servlet.extension
  • com.kivasoft.dlm
  • com.iplanetiplanet.server.jdbc
  • com.kivasoft.util
  • com.netscape.server.servlet.extension
  • com.kivasoft
  • com.netscape.server

これらの API は、Sun ONE Application Server 7 ではサポートされていません。上記のパッケージに属するクラスを使用するアプリケーションの場合、アプリケーションが標準 J2EE API を使用するように作成し直す必要があります。また、カスタム JSP タグと UIF フレームワークを使用するアプリケーションについても、標準 J2EE API を使用するように作成し直す必要があります。

移行例 : iBank

この節では、Sun ONE Application 6.0 または 6.5 から Sun ONE Application Server 7 に、標準的な J2EE アプリケーションの主要コンポーネントを移行するためのプロセスについて説明します。状況ごとに、移行によって生じる問題に焦点をあてて、それらの問題に対する実用的な解決策を提言します。

この移行プロセスで示す J2EE アプリケーションは、「iBank」という名前で、これは、 Sun ONE Application Server 6.0 または 6.5 から Sun ONE Application Server 7 への iBank アプリケーションの実際の移行に基づいています。iBank はオンラインバンキングサービスをシミュレートし、通常の J2EE アプリケーションに付随するあらゆる特徴を持っています。

iBank アプリケーションに適用される J2EE 仕様の重要なポイントを以下に示します。

  • サーブレット、特に JSP ページへの切り替えを行うサーブレット (model-view-controller アーキテクチャ)
  • JSP ページ、特に静的および動的なページの取り込みを含む JSP ページ
  • JSP カスタムタグライブラリ
  • HTTP セッションの作成および管理
  • JDBC API 経由のデータベースアクセス
  • Enterprise JavaBeans (ステートフル、またはステートレスなセッション Beans、CMP、および BMP エンティティ Beans)
  • J2EE アプリケーションの標準パッケージ化メソッドに対応したアセンブリおよび配備

iBank アプリケーションの詳細については、Module A の「iBank アプリケーションの仕様」を参照してください。

iBank アプリケーションを Sun ONE Application Server 7 に移行するには、配備記述子を手動で変更するか、または Sun ONE Studio や Sun ONE Migration Tool を使用します。上記の 3 つのプロセスの中で、お勧めするのは Sun ONE Migration Tool です。CMP を 2.0 に変換しないで移行を行う必要がある場合は、次の「iBank アプリケーションの手動移行」を行うか、または Sun ONE Migration Tool を使用します。

このガイドでは、手動の移行プロセスと Sun ONE Studio を使用した移行について説明します。Sun ONE Migration Tool を使用して、iBank を自動的に移行する手順については、Migration Tool に付属するマニュアルを参照してください。

iBank アプリケーションの手動移行

Sun ONE Application Server 7 で CMP 1.1 がサポートされているため、手動の移行でソースコードを大幅に修正する必要はありません。ただし、アプリケーションを手動で移行する場合、以下の点について、いくつか変更が必要になります。

Web アプリケーションの変更

Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 に iBank を移行する場合、iBank アプリケーションの Web アプリケーション部分を変更する必要はありません。ソースディレクトリから ias-web.xml ファイルを削除します。これは Sun ONE Application Server 7 の配備記述子 sun-web.xml ファイル内の対応するデータにアクセスできる情報がこのファイルに入っていないからです。web.xml は変更する必要ありません。

ただし、一般的には、サーバー固有のリソースにマップする必要がある web.xml 内に情報が含まれていることがあるため、このような場合、sun-web.xml での宣言が必要となります。たとえば、web.xml ファイルで javax.sql.Datasource タイプのリソース参照が宣言されている場合、sun-web.xml 内で、サーバー上の実際のデータソースの JNDI 名に、その参照をマップする必要があります。

移行を行う場合は、新しい sun-web.xml を作成する必要があります。作成プロセスは、以下のとおりです。

  1. 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
  2. <!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 Servlet 2.3//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd'>

    sun-web.xml という名前で、このファイルを保存します。

  1. DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-web です。DTD では、この要素は次のように定義します。
  2. <!ELEMENT sun-web-app (security-role-mapping*, servlet*, session-config?, resource-env-ref*, resource-ref*, ejb-ref*, cache?, class-loader?, jsp-config?, locale-charset-info?, property*)>

    上記の宣言から、タグはすべて任意指定であることが明らかなので、デフォルトの sun-web.xml は、次のようになります。

    <!DOCTYPE sun-web-app SYSTEM "http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd">

    </sun-web-app>

  3. リソース参照を宣言する場合、要素の宣言は、次のようになります。
  4. <!ELEMENT resource-ref (res-ref-name, jndi-name, default-resource-principal?)> サブ要素は、次のようになります。

    <!ELEMENT res-ref-name (#PCDATA)>

    <!ELEMENT default-resource-principal (name, password)>

    <!ELEMENT jndi-name (#PCDATA)>

    iBank のリソース参照の詳細の場合、sun-web.xml は、次のようになります。

    <sun-web-app>

      <resource-ref>

        <res-ref-name>jdbc/IBank</res-ref-name>

        <jndi-name>jdbc/IBank</jndi-name>

        <default-resource-principal>

          <name>ibank_user</name>

          <password>ibank_user</password>

        </default-resource-principal>

      </resource-ref>

    </sun-web-app>

EJB の変更

Sun ONE Application Server 6.5 から Sun ONE Application Server 7 に iBank を移行する場合、EJB のコードを変更する必要はありません。

セッション Beans :

ejb-jar.xml : ejb-jar.xml に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。この新しい定義は、次のようになります。

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>

ias-ejb-jar.xml : Sun ONE Application server 6.5 の ias-ejb-jar.xml は、Sun ONE Application server 7 の sun-ejb-jar.xml に置き換えられています。これらの 2 つの XML ファイルの DTD は、根本的に異なっているため、移行を行う場合は、ejb-jar.xmlias-ejb-jar.xml から必要な情報を抽出して、新しい sun-ejb-jar.xml を作成する必要があります。作成プロセスは、以下のとおりです。

  1. 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
  2. <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>

    このファイルに sun-ejb-jar.xml という名前を付けて、修正した ejb-jar.xml と一緒に保存します。

  3. DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-ejb-jar です。DTD では、この要素は次のように定義します。
  4. <!ELEMENT sun-ejb-jar (security-role-mapping*,enterprise-beans)>

    security-role-mapping タグは、ejb-jar.xml で宣言されているセキュリティロールをマッピングするためのものです。iBank アプリケーションの場合、ejb-jar.xml ファイルで宣言されているセキュリティがないので、security-role-mapping タグ (任意指定) は飛ばして、enterprise-beans タグに重点を置きます。現在、sun-ejb-jar.xml ファイルは、次のようになっています。

    <sun-ejb-jar>

        <enterprise-beans>

        </enterprise-beans>

    </sun-ejb-jar>

    注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。

  5. enterprise-beans 要素は、次のように DTD で定義します。
  6. <!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>

    任意指定の name 要素には、enterprise-beans の正準名が入ります。この要素には、任意の名前を付けることができます。ここでは、このタグは省略します。

    unique-id 要素は、Sun ONE Application Server で使用されるもので、アプリケーションの配備時に、Application Server によって自動的に挿入されます。ここでは、このタグは省略します。

    ここで着目すべきタグは、 EJB 要素です。このタグは、単一の EJB の実行時バインドを指定する要素です。これは、次のように DTD で定義します。

    <!ELEMENT ejb (ejb-name, jndi-name?, ejb-ref*, resource-ref*, resource-env-ref*, pass-by-reference?, cmp?, principal?, mdb-connection-factory?, jms-durable-subscription-name?, jms-max-messages-load?, ior-security-config?, is-read-only-bean?, refresh-period-in-seconds?, commit-option?, gen-classes?, bean-pool?, bean-cache?)>

    この場合、ejb 要素に ejb-name 要素が含まれます。ejb-name 要素には、EJB の正準名が入ります。この名前は、その EJB 用の ejb-jar.xmlejb-name 要素内で宣言された名前と同じになります。また、この要素には、EJB の jndi-name も含まれます。Sun ONE Application Server 6.5 から 7 で改善された点の 1 つは、Bean の開発者が EJB の ejb-namejndi-name を自由に変更できるようになったという柔軟性です。Sun ONE Application Server 6.5 では、EJB のJNDI 名はデフォルトで ejb/<ejb-name> に設定されていました。

    移行を円滑に行うためには、EJB の jndi-name をそのままの状態にしておき、その他のすべてのリソースについても Sun ONE Application Server 6.5 のときと同じものにしておく必要があります。このため、ここではすべての EJB の ejb-nameejb/<ejb-name> と宣言します。

    上記のロジックを使用すると、sun-ejb-jar.xml は、次のようになります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>BankTeller</ejb-name>

             <jndi-name>ejb/BankTeller</jndi-name>

          </ejb>

          <ejb>

             <ejb-name>InterestCalculator</ejb-name>

             <jndi-name>ejb/InterestCalculator</jndi-name>

          </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

  7. ejb-jar.xml 内の各 <ejb-ref> 要素について、sun-ejb-jar.xml 内に対応する <ejb-ref> 要素が存在します。ejb-jar.xml 内の <ejb-ref> 要素は、その EJB の Bean クラス内から、参照されるすべての EJB を宣言するのに使用します。Bean クラスコードは、<ejb-ref-name> を使用して、EJB を参照するときに、この <ejb-ref-name> をアプリケーションサーバー上の Bean の実際の <jndi-name> にマップする必要があります。このため、これは EJB 実装で参照される名前と Bean の実際の JNDI 名の間に、抽象化層を追加するためのメカニズムとして機能します。
  8. 上記で説明したロジックを使用して、BankTellerEJB について見てみます。ejb-jar.xml では、2 つの <ejb-ref> 宣言がこの EJB 内に存在します。1 つめの宣言は、Cutomer EJB (エンティティ Bean モジュールのエンティティ Bean) 用です。前述の 3 で説明したように、すべての EJB の JNDI 名は、ejb/<ejb-name> のままにしておき、この宣言を sun-ejb-jar.xml 内に追加します。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>BankTeller</ejb-name>

             <jndi-name>ejb/BankTeller</jndi-name>

             <ejb-ref>

                <ejb-ref-name>Customer</ejb-ref-name>

                <jndi-name>ejb/Customer</jndi-name>

             </ejb-ref>

          </ejb>

          <ejb>

             <ejb-name>InterestCalculator</ejb-name>

             <jndi-name>ejb/InterestCalculator</jndi-name>

          </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

    同様に、Account EJB 用の <ejb-ref> タグを追加します。InterestCalculator Bean の場合、<ejb-ref> タグは、ejb-jar.xml 内に存在しないため、sun-ejb-jar.xml 内でも必要ありません。現在、sun-ejb-jar.xml ファイルは、次のようになっています。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>BankTeller</ejb-name>

             <jndi-name>ejb/BankTeller</jndi-name>

             <ejb-ref>

                <ejb-ref-name>Customer</ejb-ref-name>

                <jndi-name>ejb/Customer</jndi-name>

             </ejb-ref>

             <ejb-ref>

                <ejb-ref-name>Account</ejb-ref-name>

                <jndi-name>ejb/Account</jndi-name>

             </ejb-ref>

          </ejb>

          <ejb>

             <ejb-name>InterestCalculator</ejb-name>

             <jndi-name>ejb/InterestCalculator</jndi-name>

          </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

  9. ejb 要素には、pass-by-reference 要素 <!ELEMENT pass-by-reference (#PCData) が含まれます。
  10. pass-by-reference 要素は、参照渡しセマンティクスの使用を制御します。EJB 仕様では、デフォルトの動作モードとなる参照渡しを必要としています。これは、対応できない操作やより高速なパフォーマンスに向けて、true を設定することができます。これは、閉ざされた環境にある EJB モジュールすべてに適用できます。設定できる値は、true と false です。デフォルト値は false です。

  11. ejb 要素には、bean-cache 要素も含まれます。
  12. <!ELEMENT bean-cache (max-cache-size?, is-cache-overflow-allowed?, cache-idle-timeout-in-seconds?, removal-timeout-in-seconds?, victim-selection-policy?)>

    この要素は、ステートフルセッション Beans とエンティティ Beans だけに使用されます。iBank の場合、BankTeller セッション Bean だけが、このエントリを含みます。

    このタグでは、max-cache-size によって、キャッシュ内の Beans の最大数を定義します。cache-idle-timeout-in-seconds では、ステートフルセッション Bean やエンティティ Bean がアイドル状態でキャッシュ内に存在できる最大時間を指定します。この時間の経過後、Bean はバックアップストアに非活性化されます。この時間は、サーバーが参考にします。cache-idle-timeout-in-seconds のデフォルト値は 10 分です。

    Bean が非活性化される (バックアップストアでアイドル状態になっている) 時間は、removal-timeout-in-seconds パラメータによって制御されます。Bean は removal-timeout-in-seconds の値を超えた時間アクセスされなかった場合、バックアップストアから削除されてしまうので、クライアントからアクセスできなくなります。removal-timeout-in-seconds のデフォルト値は 60 分です。

    上記のエントリが追加されて、sun-ejb-jar.xml ファイルは、次のようになります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>BankTeller</ejb-name>

             <jndi-name>ejb/BankTeller</jndi-name>

             <ejb-ref>

                <ejb-ref-name>Customer</ejb-ref-name>

                <jndi-name>ejb/Customer</jndi-name>

             </ejb-ref>

             <ejb-ref>

                <ejb-ref-name>Account</ejb-ref-name>

                <jndi-name>ejb/Account</jndi-name>

             </ejb-ref>

             <pass-by-reference>false</pass-by-reference>

             <bean-cache>

                <cache-idle-timeout-in-seconds>

                   0

                </cache-idle-timeout-in-seconds>

                <removal-timeout-in-seconds>

                   0

                </removal-timeout-in-seconds>

             </bean-cache>

          </ejb>

          <ejb>

             <ejb-name>InterestCalculator</ejb-name>

             <jndi-name>ejb/InterestCalculator</jndi-name>

             <pass-by-reference>false</pass-by-reference>

          </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

  13. ステートレスセッション Bean とメッセージ駆動型 Bean のプールだけに使用される要素は、bean-pool です。
  14. <!ELEMENT bean-pool (steady-pool-size?, resize-quantity?, max-pool-size?, pool-idle-timeout-in-seconds?, max-wait-time-in-millis?)>

    Beans の初期数と最小数を指定する steady-pool-size は、プールで保持する必要があります。

    resize-quantity では、プールが「プールマネージャ」によってサービスが実行されている場合に、作成または削除する Bean の数を指定します。

    max-pool-size では、プールの最大サイズを指定します。指定できる値は、0 から MAX_INTEGER の範囲です。

    pool-idle-timeout-in-seconds では、ステートレスセッション Bean やメッセージ駆動型 Bean がアイドル状態でプール内に存在できる最大時間を指定します。

    最終的に、sun-ejb-jar.xml は、次のような構成になります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>BankTeller</ejb-name>

             <jndi-name>ejb/BankTeller</jndi-name>

             <ejb-ref>

                <ejb-ref-name>Customer</ejb-ref-name>

                <jndi-name>ejb/Customer</jndi-name>

             </ejb-ref>

             <ejb-ref>

                <ejb-ref-name>Account</ejb-ref-name>

                <jndi-name>ejb/Account</jndi-name>

             </ejb-ref>

             <pass-by-reference>false</pass-by-reference>

             <bean-cache>

                <cache-idle-timeout-in-seconds>

                   0

                </cache-idle-timeout-in-seconds>

                <removal-timeout-in-seconds>

                   0

                </removal-timeout-in-seconds>

             </bean-cache>

          </ejb>

          <ejb>

             <ejb-name>InterestCalculator</ejb-name>

             <jndi-name>ejb/InterestCalculator</jndi-name>

             <pass-by-reference>false</pass-by-reference>

             <bean-pool>

                <pool-idle-timeout-in-seconds>

                   0

                </pool-idle-timeout-in-seconds>

             </bean-pool>

          </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

エンティティ Beans :

ejb-jar.xml : ejb-jar.xml に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。この新しい定義は、次のようになります。

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD  Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>

ejb-jar.xml のすべての CMP に対して、1.1 の値を指定した <cmp-version> タグを挿入します。

エンティティ Bean のエントリは、次のようになります。

   <entity>

         <description>Account CMP entity bean</description>

         <ejb-name>Account</ejb-name>

         <home>com.sun.bank.ejb.entity.AccountHome</home>

         <remote>com.sun.bank.ejb.entity.Account</remote>

         <ejb-class>com.sun.bank.ejb.entity.AccountEJB</ejb-class>

         <persistence-type>Container</persistence-type>

         <prim-key-class>

         com.sun.bank.ejb.entity.AccountPK

         </prim-key-class>

         <reentrant>False</reentrant>

         <cmp-version>1.x</cmp-version>

    <cmp-field>

           <field-name>branchCode</field-name></cmp-field>

    <cmp-field>

          <field-name>accTypeId</field-name></cmp-field>

    <cmp-field>

             <field-name>accBalance</field-name></cmp-field>

    <cmp-field>

             <field-name>custNo</field-name></cmp-field>

    <cmp-field>

             <field-name>accNo</field-name></cmp-field>

   </entity>

同様に、すべての CMP Beans がこのエントリを保持します。

セッション Beans と同様に、Sun ONE Application server 6.5 の ias-ejb-jar.xml は、Sun ONE Application server 7 の sun-ejb-jar.xml に置き換えられています。これらの 2 つの XML ファイルの DTD は、根本的に異なっているため、移行を行う場合は、ejb-jar.xmlias-ejb-jar.xml から必要な情報を抽出して、新しい sun-ejb-jar.xml を作成する必要があります。作成プロセスは、以下のとおりです。

  1. 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
  2. <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>

    このファイルに sun-ejb-jar.xml という名前を付けて、修正した ejb-jar.xml と一緒に保存します。

  3. DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-ejb-jar です。DTD では、この要素は次のように定義します。
  4. <!ELEMENT sun-ejb-jar (security-role-mapping*, enterprise-beans) >

    security-role-mapping タグは、ejb-jar.xml で宣言されているセキュリティロールをマッピングするためのものです。iBank アプリケーションの場合、ejb-jar.xml ファイルで宣言されているセキュリティがないので、security-role-mapping タグ (任意指定) は飛ばして、enterprise-beans タグに重点を置きます。現在、sun-ejb-jar.xml ファイルは、次のようになっています。

    <sun-ejb-jar>

       <enterprise-beans>

       </enterprise-beans>

    </sun-ejb-jar>

    注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。

  5. enterprise-beans 要素は、次のように DTD で定義します。
  6. <!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>

    任意指定の name 要素には、enterprise-beans の正準名が入ります。この要素には、任意の名前を付けることができます。ここでは、このタグは省略します。

    unique-id 要素は、Sun ONE Application Server で使用されるもので、アプリケーションの配備時に、Application Server によって自動的に挿入されます。ここでは、このタグは省略します。

    ここで着目すべきタグは、 ejb 要素です。このタグは、単一の EJB の実行時バインドを指定する要素です。これは、次のように DTD で定義します。

    <!ELEMENT ejb (ejb-name, jndi-name?, ejb-ref*, resource-ref*, resource-env-ref*, pass-by-reference?, cmp?, principal?, mdb-connection-factory?, jms-durable-subscription-name?, jms-max-messages-load?, ior-security-config?, is-read-only-bean?, refresh-period-in-seconds?, commit-option?, gen-classes?, bean-pool?, bean-cache?)>

    この場合、ejb 要素に ejb-name 要素が含まれます。ejb-name 要素には、EJB の正準名が入ります。この名前は、その EJB 用の ejb-jar.xmlejb-name 要素内で宣言された名前と同じになります。また、この要素には、EJB の jndi-name も含まれます。Sun ONE Application Server 6.5 から 7 で改善された点の 1 つは、Bean の開発者が EJB の ejb-namejndi-name を自由に変更できるようになったという柔軟性です。Sun ONE Application Server 6.5 では、EJB の JNDI 名はデフォルトで ejb/<ejb-name> に設定されていました。

    移行を円滑に行うためには、EJB の jndi-name をそのままの状態にしておき、その他のすべてのリソースについても Sun ONE Application Server 6.5 のときと同じものにしておく必要があります。このため、ここではすべての ejb の ejb-nameejb/<ejb-name> と宣言します。

    上記のロジックを使用すると、sun-ejb-jar.xml は、次のようになります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>Account</ejb-name>

             <jndi-name>ejb/Account</jndi-name>

          </ejb>

          <ejb> --- </ejb>

          <ejb> --- </ejb>

                           other ejb's

          <ejb> --- </ejb>

          <ejb> --- </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

  7. ejb 要素には、pass-by-reference 要素 <!ELEMENT pass-by-reference (#PCData) が含まれます。
  8. pass-by-reference 要素は、参照渡しセマンティクスの使用を制御します。EJB 仕様では、デフォルトの動作モードとなる参照渡しを必要としています。これは、対応できない操作やより高速なパフォーマンスに向けて、true を設定することができます。これは、閉ざされた環境にある EJB モジュールすべてに適用できます。設定できる値は、true と false です。デフォルト値は false です。

  9. CMP エンティティ Beans の場合、cmp 要素を宣言し、EJB1.1 および EJB2.0 の Beans の CMP EntityBean オブジェクトに関する実行時情報を記述します。
  10. <!ELEMENT cmp (mapping-properties?, is-one-one-cmp?, one-one-finders?)>

    この mapping-properties には、持続性ベンダー固有の O/R マッピングファイルの場所が入ります。is-one-one-cmp フィールドは、CMP 1.1 を古い記述子として扱う場合に使用します。CMP 1.1 を古い記述子とする場合、このフィールドに true を指定します。one-one-finders には、CMP 1.1 のファインダが入ります。

    このルート要素 finder には、メソッド名とクエリパラメータを持つ CMP 1.1 のファインダが入ります。

    <!ELEMENT finder (method-name, query-params?, query-filter?, query-variables?)>

    method-name 要素には、クエリフィールドのメソッド名が入ります。query-params 要素には、CMP 1.1 ファインダのクエリパラメータが入ります。

    query-filter は、CMP 1.1 ファインダのクエリフィルタが入る任意指定の要素です。

    上記の iBank のエントリを作成すると、sun-ejb-jar は、次のようになります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>Account</ejb-name>

             <jndi-name>ejb/Account</jndi-name>

             <pass-by-reference>false</pass-by-reference>

             <cmp>

               <mapping-properties>

                META-INF/sun-cmp-mappings.xml

               </mapping-properties>

               <is-one-one-cmp>true</is-one-one-cmp>

               <one-one-finders>

                 <finder>

                 <method-name>

                    findOrderedAccountsForCustomer

                 </method-name>

                 <query-params>int custNo</query-params>

                 <query-filter>

                    custNo == custNo

                 </query-filter>

                 </finder>

               </one-one-finders>

             </cmp>

          </ejb>

          <ejb> --- </ejb>

          <ejb> --- </ejb>

                             other ejb's

          <ejb> --- </ejb>

          <ejb> --- </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

    Account は、主キー以外のファインダを持つエンティティ Bean だけです。このため、上記のファインダのエントリは、Account Bean の場合だけになります。

  11. <!ELEMENT commit-option (#PCDATA)> では、コミットのオプションを指定します。
  12. ejb 要素には、bean-cache 要素も含まれます。
  13. <!ELEMENT bean-cache (max-cache-size?, is-cache-overflow-allowed?, cache-idle-timeout-in-seconds?, removal-timeout-in-seconds?, victim-selection-policy?)>

    この要素は、ステートフルセッション Bean とエンティティ Bean だけで使用されます。このタグでは、max-cache-size によって、キャッシュ内の Beans の最大数を定義します。cache-idle-timeout-in-seconds では、ステートフルセッション Bean やエンティティ Bean がアイドル状態でキャッシュ内に存在できる最大時間を指定します。この時間の経過後、Bean はバックアップストアに非活性化されます。この時間は、サーバーが参考にします。cache-idle-timeout-in-seconds のデフォルト値は 10 分です。

    Bean が非活性化される (バックアップストアでアイドル状態になっている) 時間は、removal-timeout-in-seconds パラメータによって制御されます。Bean は removal-timeout-in-seconds の値を超えた時間アクセスされなかった場合、バックアップストアから削除されてしまうので、クライアントからアクセスできなくなります。removal-timeout-in-seconds のデフォルト値は 60 分です。

    上記のエントリが追加されて、sun-ejb-jar.xml ファイルは、次のようになります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>Account</ejb-name>

             <jndi-name>ejb/Account</jndi-name>

             <pass-by-reference>false</pass-by-reference>

             <cmp>

               <mapping-properties>

                META-INF/sun-cmp-mappings.xml

               </mapping-properties>

               <is-one-one-cmp>true</is-one-one-cmp>

               <one-one-finders>

                 <finder>

                <method-name>

                   findOrderedAccountsForCustomer

                </method-name>

                <query-params>int custNo</query-params>

                <query-filter>

                   custNo == custNo

                </query-filter>

                 </finder>

               </one-one-finders>

              </cmp>

              <commit-option>C</commit-option>

              <bean-cache>

                      <max-cache-size>60</max-cache-size>

                 <cache-idle-timeout-in-seconds>

                    0

                 </cache-idle-timeout-in-seconds>

              </bean-cache>

          </ejb>

          <ejb> --- </ejb>

          <ejb> --- </ejb>

                              other ejb's

          <ejb> --- </ejb>

          <ejb> --- </ejb>

       </enterprise-beans>

    </sun-ejb-jar>

  14. <!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>
  15. pm-descriptors 要素は、<!ELEMENT pm-descriptors (pm-descriptor+, pm-inuse)> になります。持続マネージャの記述子には、1 つ以上の pm 記述子が含まれますが、特定の時間にその 1 つが使用されている必要があります。

    pm-descriptor は、エンティティ Bean に関連付けられた持続マネージャのプロパティを示します。pm-identifier 要素は、PM 実装を提供したベンダーを示します。さらに、pm-version では、使用する PM ベンダー製品のバージョンを指定します。pm-config では、使用するベンダー固有の設定ファイルを指定します。pm-class-generator では、ベンダー固有の具象クラスジェネレータを指定します。このクラスの名前はベンダーによって異なります。pm-mapping-factory では、ベンダー固有のマッピングファクトリを指定します。このクラスの名前はベンダーによって異なります。pm-insue では、この特定の PM を使用する必要があるかどうかを指定します。

    cmp-resource 要素には、ejb-jar の CMP Bean を格納するのに使用するデータベースが入ります。<!ELEMENT cmp-resource (jndi-name, default-resource-principal?)>

    jndi-name 要素では、JNDI 名の文字列を指定します。default-resource-principal 要素には、リソースへのアクセス時に何も指定しない場合に使用する要素名とパスワードがあります。

    <!ELEMENT default-resource-principal (name, password)>

    最終的に、sun-ejb-jar.xml は、次のような構成になります。

    <sun-ejb-jar>

       <enterprise-beans>

          <ejb>

             <ejb-name>Account</ejb-name>

             <jndi-name>ejb/Account</jndi-name>

             <pass-by-reference>false</pass-by-reference>

             <cmp>

               <mapping-properties>

                META-INF/sun-cmp-mappings.xml

               </mapping-properties>

               <is-one-one-cmp>true</is-one-one-cmp>

               <one-one-finders>

                 <finder>

                <method-name>

                   findOrderedAccountsForCustomer

                </method-name>

                <query-params>int custNo</query-params>

                <query-filter>

                   custNo == custNo

                </query-filter>

                 </finder>

               </one-one-finders>

             </cmp>

             <commit-option>C</commit-option>

             <bean-cache>

                     <max-cache-size>60</max-cache-size>

                <cache-idle-timeout-in-seconds>

                   0

                </cache-idle-timeout-in-seconds>

             </bean-cache>

          </ejb>

          <ejb> --- </ejb>

          <ejb> --- </ejb>

                              other ejb's

          <ejb> --- </ejb>

          <ejb> --- </ejb>

          <pm-descriptors>

             <pm-descriptor>

             <pm-identifier>IPLANET</pm-identifier>

             <pm-version>1.0</pm-version>

             <pm-class-generator>

                com.iplanet.ias.persistence.

                internal.ejb.ejbc.JDOCodeGenerator

             </pm-class-generator>

             <pm-mapping-factory>

             com.iplanet.ias.cmp.NullFactory

             </pm-mapping-factory>

             </pm-descriptor>

             <pm-inuse>

             <pm-identifier>IPLANET</pm-identifier>

             <pm-version>1.0</pm-version></pm-inuse>

          </pm-descriptors>

          <cmp-resource>

          <jndi-name>jdo/pmf</jndi-name>

          </cmp-resource>

       </enterprise-beans>

    </sun-ejb-jar>

Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されている capture-schema ユーティリティを使用して、dbschema を生成します。bin ディレクトリに格納されている capture-schema.bat ファイルを実行して、データベース URL、ユーザー名、パスワードについて有効な値を指定した後、スキーマを生成する必要がある表を指定します。デフォルトでは、アプリケーションで使用されるすべての表について、スキーマを生成する必要があります。iBank の場合、スキーマを生成する必要がある表は 6 つです。このスキーマファイルには、myschema.dbschema という名前を付けます。iBank で使用される表を以下に示します。

ACCOUNT

ACCOUNT_TYPE

BRANCH

CUSTOMER

TRANSACTION_HISTORY

TRANSACTION_TYPE

この myschema.dbschema ファイルをエンティティ Beans の META-INF フォルダ上に置きます。

<ejb-name>-ias-cmp.xml : Sun ONE Application Server 6.0/6.5 のすべての <ejb-name>-ias-cmp.xml ファイルを 1 つの sun-cmp-mappings.xml ファイルに置き換えます。このファイルは、1 つ以上の Beans のセットを特定の db スキーマの表およびカラムにマップします。これらの 2 つの XML ファイルの DTD は、根本的に異なっているため、移行を行う場合は、以下に示す手順に従って、新しいファイルを実際に作成する必要があります。

  1. 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
  2. <!DOCTYPE sun-cmp-mappings PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7 OR Mapping //EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-cmp_mapping_1_0.dtd'>

    sun-cmp-mappings.xml という名前で、このファイルを保存します。

  3. DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-cmp-mappings です。DTD では、この要素は次のように定義します。
  4. <!ELEMENT sun-cmp-mappings ( sun-cmp-mapping+ ) >

    sun-cmp-mapping 要素は、次のようになります。

    <!ELEMENT sun-cmp-mapping ( schema, entity-mapping+) >

    この場合、schema 要素は、スキーマファイルへのパス名になります。

    cmp Bean は、名前、主表、1 つ以上のフィールド、0 個以上の関係、0 個以上の二次表、および整合性チェック用フラグを持ちます。entity-mapping 要素は、次のような要素を保持します。

    <!ELEMENT entity-mapping (ejb-name, table-name, cmp-field-mapping+, cmr-field-mapping*, secondary-table*, consistency?)>

    ejb-name 要素は、標準 EJB-jar DTD の EJB 名です。table-name 要素は、データベース表の名前です。cmp-field-mapping は、フィールド、すなわち、cmr-field mapping にマップする 1 つ以上のカラムを持ちます。cmr フィールドは、関係を定義する名前および 1 組以上のカラムペアを持ちます。secondary-table 要素は、使用する二次表です。iBank では、二次表は使用しません。

    現在、Account エンティティ Bean のエントリを持つ
    sun-cmp-mappings.xml ファイルは、次のようになっています。

      <sun-cmp-mapping>

        <schema>mySchema</schema>

        <entity-mapping>

          <ejb-name>Account</ejb-name>

          <table-name>ACCOUNT</table-name>

          <cmp-field-mapping>

             <field-name>custNo</field-name>

             <column-name>CUST_NO</column-name>

          </cmp-field-mapping>

          <cmp-field-mapping>

             <field-name>branchCode</field-name>

             <column-name>BRANCH_CODE</column-name>

          </cmp-field-mapping>

          <cmp-field-mapping>

             <field-name>accTypeId</field-name>

             <column-name>ACCTYPE_ID</column-name>

          </cmp-field-mapping>

          <cmp-field-mapping>

             <field-name>accNo</field-name>

             <column-name>ACC_NO</column-name>

          </cmp-field-mapping>

          <cmp-field-mapping>

             <field-name>accBalance</field-name>

             <column-name>ACC_BALANCE</column-name>

          </cmp-field-mapping>

       </entity-mapping>

    </sun-cmp-mapping>

    注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。

    すべての CMP エンティティ Beans について、エントリを作成する必要があります。

上記の変更内容については、このガイドに付属する iBankWithCMP1.1.zip ファイルで参照することができます。

配備用アプリケーションのアセンブル

Sun ONE Application Server 7 では、主に J2EE モデルがサポートされます。このモデルでは、アプリケーションがエンタープライズアーカイブ (EAR) ファイル (拡張子は .ear) の形式でパッケージ化されます。アプリケーションはさらに J2EE モジュールの集まりに分割され、EJB 用の Java アーカイブ (拡張子が .jar の JAR ファイル) とサーブレットおよび JSP 用の Web アーカイブ (拡張子が .war の WAR ファイル) にパッケージ化されます。

このため、すべての JSP とサーブレットが WAR ファイルに、またすべての EJB が JAR ファイルに、それぞれパッケージ化され、最終的には WAR ファイルと JAR ファイルが配備記述子と一緒に EAR ファイルにパッケージ化されます。この EAR ファイルは、配備が可能なコンポーネントです。

asadmin ユーティリティを使用した Sun ONE Application Server 7 での iBank アプリケーションの配備

最後の作業は、Sun ONE Application Server 7 のインスタンスでのアプリケーションの配備です。アプリケーションを配備するプロセスは、以下に示すとおりです。

Sun ONE Application Server 7 の asadmin には、「ヘルプ」メニューからアクセスできる配備に関するヘルプ項目が含まれています。

コマンド行ユーティリティ asadmin を起動するには、Windows の場合は asadmin.bat ファイルを、また Solaris の場合は asadmin ファイルをそれぞれ実行します。これらのファイルは、Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリ (<Install_dir>/AppServer7/appserv/bin など) に格納されています。

asadmin プロンプトから、次のような配備用のコマンドを入力します。

asadmin> deploy -u username -w password -H hostname -p adminport [--type application|ejb|web|client|connector] [--contextroot contextroot] [--force=true] [--name component-name] [--upload=true] [--instance instancename] filepath

サーバーインスタンスを再起動してから、ブラウザにhttp://<machine_name>:<port_number>/IBank という URL を入力して、アプリケーションをテストします。有効なユーザー名とパスワード、たとえば「jatkins」というユーザー名と「Monday」というパスワードを使用してテストを行います。これによって、iBank アプリケーションのメインメニューページが表示されます。

Sun ONE Studio for Java 4.0 を使用した iBank の移行

「iBank」という名前で定義を行ったサンプルアプリケーションは、基本的なオンラインバンキングサービスをシミュレートし、次のような機能を実行できます。

  • オンラインバンキングサービスへのログオン
  • 個人データおよび支店データの表示および編集
  • 清算勘定を示す預金口座の概要表示
  • 個々のトランザクション履歴を表示するために、口座ごとにドリルダウンする機能
  • 口座から口座へ資金をオンラインで移動できる振替サービス
  • 一定の元本および年利回り率で複数年に及ぶ複利配当額の見積り

iBank アプリケーションを移行する場合に実行する主な手順を以下に示します。

  • この移行で、最初に行うべき最も重要な要件は、Sun ONE Application Server 7 と Sun ONE Studio のインストールです。
  • ローカルディレクトリ内に zip 形式で格納されているアプリケーションを抽出します。
  • iBank アプリケーションのソース (iBank65.zip) は、移行サイト http://www.sun.com/migration/sunonetools.html から入手できます。iBank65.zip ファイルを解凍すると、次のようなディレクトリ構造が作成されます。

    このディレクトリ構造内には、 DocrootSessionContentEntityContent 、および Scripts の 4 つのサブディレクトリが作成されます。

    • Docroot には、HTML ファイル、JSP ファイル、および画像ファイルがそのルートに含まれます。また、サーブレットや EJB などのソースファイルも、パッケージ構造 com.sun.bank.* に従って、サブフォルダ WEB-INF¥ クラスに含まれます。WAR ファイルは、このディレクトリの内容から生成されます。
    • SessionContent には、パッケージ構造 com.sun.bank.ejb.session に従って、セッション Beans のソースコードが含まれます。このディレクトリは、セッション Beans の EJB モジュールを構成します。
      1. EntityContent には、パッケージ構造 com.sun.bank.ejb.entity に従って、エンティティ Beans が含まれます。このディレクトリは、エンティティ Beans の EJB モジュールを構成します。

    • Scripts には、データベースセットアップ用の SQL スクリプトが含まれます。

  • Scripts フォルダに入っている SQL スクリプトを実行して、iBank アプリケーションのスキーマをセットアップします。これらのスクリプトは、Oracle データベース用です。これらのスクリプトによって、ユーザーの作成、表の作成、および表へのデータの挿入が行われます。次の順序で、スクリプトを実行します。
    • 01_iBank_CreateUser.sql
    • 02_iBank_CreateTables.sql
    • 03_iBank_InsertData.sql

    手動移行の場合は、次の手順が必要です。

    1. サーブレット、JSP、および JSP カスタムタグライブラリの移行
    2. セッション Beans の移行
    3. エンティティ Beans の移行
    4. JDBC コードの移行

    これらの手順は手動で行う必要があり、必要に応じて、以降の節で手順を説明します。移行ツールをオプションとして使用する場合、この時点で実行する必要があります。手動による方法を実行する場合は、以降の節で説明するように、変更を行う必要があります。

  • サンプルアプリケーションの「iBank」のアセンブルと配備を行うために、Sun ONE Studio を用意します。
  • Sun ONE Studio を起動するには、<Sun ONE App Server ROOT>/<AppServ>/<SUN ONE STUDIO FOR JAVA_ROOT>/bin ディレクトリに格納されている runide.exe ファイル (Solaris の場合は、runide.sh ファイル) を実行します。

    (注 : 次の手順を開始する前に、Sun ONE Application Server 7 を起動しておく必要があります)

    • 「エクスプローラ」ウィンドウを開きます。
    • 「実行時」タブをクリックします。
    • 「サーバーレジストリ」をクリックします。
    • 「インストールされたサーバー」をクリックします。
    • 「Sun ONE Application Server」を選択します。
    • 「Sun ONE Application Server」を右クリックし、「管理サーバーを追加」を選択して、管理サーバーをセットアップします。
    • ホストの詳細 (ローカルマシン名)、ポート番号 (デフォルトは 4848)、ユーザー名、およびパスワードを入力します。
    • 管理サーバーのセットアップ後、管理サーバーをクリックして、サーバーインスタンスをインストールします。
    • このサーバーインスタンスをデフォルトサーバーとして設定するには、サーバーインスタンスを右クリックし、そのインスタンスをデフォルトとして設定するためのオプションを選択します。

  • 「Sun ONE Studio for Java での Web アプリケーションモジュールの作成」に記載される指示に従って、Web モジュールを作成します。
  • アプリケーションの移行で、移行ツールを使用しない場合は、EJB を手動で移行します。手動移行については、「EJB の移行」を参照してください。この手順を実行するには、Sun ONE Studio で EJB のソースコードを開いて、修正します。
  • アプリケーションの移行で、移行ツールを使用しない場合は、「JDBC コードの移行」に従って、JDBC コードを移行します。
  • iBank アプリケーションは、CMP 1.1 のエンティティ Bean を持つため、移行ツールを使用してアプリケーションを移行しない場合は、「CMP エンティティ EJB の移行」に記載される手動移行の手順に従って、これらのエンティティ Beans を CMP 2.0 に変換させる必要があります。
  • ツールを使用してアプリケーションを移行する場合は、 Account エンティティ Bean のように、コードで列挙 (Enumeration) を使用しているエンティティ Bean を除いたすべてのエンティティ Beans が移行されます。このコードは、「CMP エンティティ EJB の移行」に記載される指示に従って、手動で変更する必要があります。CMP を 1.1 から 2.0 に変換する変更作業の例については、「CMP エンティティ EJB の 1.1 から 2.0 への変換」を参照してください。

  • 「Sun ONE Studio for Java での EJB モジュールの作成」に記載される指示に従って、エンティティ Beans とセッション Beans について、別々の EJB モジュールを作成します。
  • 「Sun ONE Studio for Java でのエンタープライズアプリケーションの作成」に記載される指示に従って、エンタープライズアプリケーションを作成します。これには、Web モジュールと EJB モジュールも含まれます。この手順を実行すると、最終的に配備が可能な .ear ファイルが作成されます。
  • 「Sun ONE Application Server 7 でのアプリケーションの配備」に記載される指示に従って、Sun ONE Application server 7 で .ear ファイルを配備します。

Sun ONE Studio for Java での Web アプリケーションモジュールの作成

Sun ONE Studio for Java で Web アプリケーションモジュールを作成するには、以下の手順を実行します。

  1. 「ファイルシステム」を右クリックし、マウントのオプションを選択して、Sun ONE Studio for Java の「エクスプローラのファイルシステム」ウィンドウ内で、ソースファイル、すなわち「Docroot」が格納されているディレクトリをマウントします。
  2. ソースファイルが格納されているルートディレクトリ構造で、Web モジュール用に、「WarContent」などの空のディレクトリを作成します。
  3. 「ファイルシステム」を右クリックし、マウントのオプションを選択して、Sun ONE Studio for Java の「エクスプローラのファイルシステム」ウィンドウ内に、新しく作成したディレクトリ「WarContent」をマウントします。
  4. ソースファイルディレクトリ構造に、「EntityContent」や「SessionContent」など、EJB を含むその他のディレクトリをマウントします。
  5. フォルダ名を右クリックし、Web モジュールへの変換オプションがあるツールを選択して、ファイルシステム (WarContent) を Web モジュールに変換します。
  6. ソースの JSP、HTML、および画像ファイルを Web アプリケーションルートに、すなわち、「Docroot」ディレクトリから「WarContent」ディレクトリにコピーします。
  7. サーブレットと補助クラスソースを WEB-INF/classes ディレクトリにコピーします。すなわち、「Docroot」ディレクトリ内のサブフォルダ「com」を「WarContent」ディレクトリの WEB-INF/classes ディレクトリにコピーします。
  8. 「Docroot」ディレクトリの WEB-INF にあるタグライブラリを、「WarContent」ディレクトリの WEB-INF にコピーします。
  9. ソースコードを Sun ONE Application Server 7 に移行する必要がある場合 (移行ツールを使用して変更しない場合) は、以下の手順に従ってソースコードを編集します。
    • 変更する必要がある JSP を見つけます。
    • カスタム JSP タグがアプリケーションで使用されているかどうかを調べます。
    • ファイルを右クリックし、「開く」オプションを選択して、Sun ONE Studio で指定した JSP コードを開きます。
    • 「Java Server Pages および JSP カスタムタグライブラリの移行」に記載される手順に従って、ソースを修正します。
    • 同様に、「サーブレットの移行」に記載される手順に従って、サーブレットを移行します。

  10. アプリケーションをアセンブルし、(WEB-INF/ ディレクトリ内の) 配備記述子 web.xml に必要な情報を入力します。web.xml ファイルをクリックし、このファイルのプロパティを編集します。すなわち、このアセンブリフェーズでは、各サーブレット、JSP ページ、および JSP タグライブラリの他に、Web アプリケーションで使用される EJB またはデータソース参照も設定します。

次の画面ショットは、Sun ONE Studio for Java を使用して、このアセンブリフェーズを実行しているところです。

サーブレットの設定

Web モジュールで、Web をクリックし、「プロパティ」ウィンドウを表示します。

web.xml の「プロパティ」ウィンドウ内の「配備」タブをクリックします。次に、サーブレットを設定するために、「サーブレット」をクリックします。

プロパティエディタが表示されるので、「追加」ボタンをクリックして、新しいサーブレットを追加します。

Web アプリケーションの各サーブレットについて、「ブラウズ」ボタンをクリックして、サーブレット名、サーブレットの実装クラスの完全名を指定します。また、「マッピング」をクリックして、サーブレットのマッピング要素を、さらに、初期パラメータを指定します。

   サーブレットの設定
Sun ONE Studio を使用したサーブレットの設定を示す図

iBank アプリケーションのサーブレットとそれらのマッピングについてのリストを以下に示します。

   サーブレットとマッピング 

サーブレット名

表示名

マッピング

LoginServlet

 

LoginServlet

 

/CheckLogin

 

CheckTransferServlet

 

CheckTransferServlet

 

/CheckTransfer

 

CustomerProfileServlet

 

CustomerProfileServlet

 

/CustomerProfile

 

DataSourceTestServlet

 

DataSourceTestServlet

 

/DataSourceTest

 

HelloWorldServlet

 

HelloWorldServlet

 

/HelloWorld

 

LookUpDataSourceTestServlet

 

LookUpDataSourceTestServlet

 

/LookUpDataSourceTest

 

ProjectEarningsServlet

 

ProjectEarningsServlet

 

/ProjectEarnings

 

ShowAccountSummaryServlet

 

ShowAccountSummaryServlet

 

/ShowAccountSummary

 

TestContextServlet

 

TestContextServlet

 

/TestContext

 

TransferFundsServlet

 

TransferFundsServlet

 

/TransferFunds

 

UpdateCustomerDetailsServlet

 

UpdateCustomerDetailsServlet

 

/UpdateCustomerDetails

 

上記のサーブレットはすべて、web.xml にすべてのサーブレットのエントリが保持されるように設定する必要があります。

最終的に、「配備」タブに 11 個のサーブレットのマッピングとサーブレットが表示されます。

JSP タグライブラリの設定

web.xml の「Properties」ウィンドウ内の「Deployment」タブをクリックします。「Tag Libraries」をクリックして、タグライブラリを設定します。

Web アプリケーションの配備記述子で、JSP タグライブラリを定義するには、ライブラリの URI (JSP ページがライブラリにアクセスするための識別子) とライブラリの配備記述子 (.tld ファイル) へのパスを指定します。

iBank には、1 つの JSP タグライブラリ TMBHisto.tld があります。この配備記述子は、WEB-INF に格納されます。次のようなエントリを作成する必要があります。

   タグライブラリの設定
Sun ONE Application Server のアーキテクチャを示す図

リソース参照の追加

web.xml の「Properties」ウィンドウ内の「References」タブをクリックします。「Resource Reference」をクリックして、新しいリソースを追加します。次の画面ショットは、iBank に新しいデータソースのリソース jdbc/iBank を追加しているところです。

   リソース参照の追加
Sun ONE Studio を使用して、Sun ONE Application Server 用の JDBC リソースを設定するためのダイアログボックスを示す図

「Sun ONE App Server」タブをクリックして、「JNDI 名」に「jdbc/IBank」を設定し、さらに、使用するデータベーススキーマに応じたユーザー名とパスワードも設定します。

   Sun ONE Application Server 用のリソース参照エントリの追加
Sun ONE Studio を使用して、Sun ONE Application Server 用の JDBC リソース参照を追加するためのダイアログボックスを示す図

コンテキストパラメータの追加

JNDI 名のコンテキストパラメータのエントリを追加し、iBank データソースを検索します。

次の画面ショットは、コンテキストパラメータのエントリを示しています。これは、web.xml の「配備」タブで、「プロパティ」ウィンドウ内の「コンテキストパラメータ」をクリックすることで表示されます。

   コンテキストパラメータの追加
Sun ONE Studio を使用して、Sun ONE Application Server 用のコンテキストパラメータを追加するためのダイアログボックスを示す図

Welcome ファイルの指定

「開始ファイル」をクリックして、「プロパティ」ウィンドウ内の Welcome ファイルを指定します。

iBank の場合、index.jsp が開始ファイルです。これについて説明します。

CMP エンティティ EJB の 1.1 から 2.0 への変換

「CMP エンティティ EJB の移行」に記載される手動プロセスを参照して、CMP 1.1 から CMP 2.0 に変換した Account エンティティ Bean の例を以下に示します。

Account Bean の関連ファイルには、次のようなものがあります。

Account.java

AccountEJB.java

AccountHome.java

AccountPK.java

実行する変更の詳細について、以下に示します。

  • Account.java :
  • 主キーのセッターをコメントアウトする以外は、コードを大幅に変更する必要はありません。その他のセッターは、そのままの状態にしておきます。

    修正前のコードを以下に示します。

       public String getBranchCode()

          throws RemoteException;

       public void setBranchCode(String branchCode)

          throws RemoteException;

       public String getAccNo()

          throws RemoteException;

       public void setAccNo(String accNo)

          throws RemoteException;

             ------

             ------

       -----other getters and setters----

    branchCode や accNo など、主キーのセッターをコメントアウトした後のコードは、以下のようになります。

       public String getBranchCode()

          throws RemoteException;

       /* public void setBranchCode(String branchCode)

          throws RemoteException; */

       public String getAccNo()

          throws RemoteException;

       /* public void setAccNo(String accNo)

          throws RemoteException; */

             ------

             ------

       -----other getters and setters----

  • AccountEJB.java :
  • Bean クラスに取り入れられる変更は、以下のとおりです。

    • Bean クラス宣言の先頭に、キーワード「abstract」を付けます。
    • 修正前 :

      public class AccountEJB implements EntityBean

      {

      --

      --

      }

      修正後 :

      public abstract class AccountEJB implements EntityBean

      {

      --

      --

      }

    • すべての cmp フィールドをコメントアウトし、accessor メソッドの前にキーワード「abstract」を付けます。メソッドのコード行がコメントになるので、メソッドの後ろにセミコロンを付けます。つまり、下記の「修正前」のコードを「修正後」のコードに置き換えます。
    • 修正前 :

         public String branchCode;

         public String accNo;

         public int custNo;

         public String accTypeId;

         public double accBalance;

         public String accTypeDesc;

         public double accTypeInterestRate;

         private EntityContext context;

         public String getBranchCode() {

                return(branchCode);

         }

         public void setBranchCode(String branchCode) {

         this.branchCode = branchCode;

         }

         public String getAccNo() {

                return(accNo);

         }

         public void setAccNo(String accNo) {

         this.accNo = accNo;

         }

         public int getCustNo() {

                return(custNo);

         }

         public void setCustNo(int custNo) {

                this.custNo = custNo;

         }

         public String getAccTypeId() {

                return(accTypeId);

         }

         public void setAccTypeId(String accTypeId) {

                this.accTypeId = accTypeId;

         }

         public BigDecimal getAccBalance() {

                return new BigDecimal(accBalance);

         }

         public void setAccBalance(BigDecimal accBalance) {

                this.accBalance = accBalance.doubleValue();

         }

        

      修正後 :

         private EntityContext context;

         public abstract void setBranchCode(String branchCode);

         public abstract String getBranchCode();

         public abstract void setAccNo(String accNo);

         public abstract String getAccNo();

         public abstract void setCustNo(int custNo);

         public abstract int getCustNo();

         public abstract void setAccTypeId(String accTypeId);

         public abstract String getAccTypeId();

         public abstract void setAccBalance(BigDecimal accBalance);

         public abstract BigDecimal getAccBalance();

    • すべての ejbCreate() メソッド本体 (複数の ejbCreate が存在する場合もある) を読み込みます。「<cmp-field>=値またはローカル変数」のパターンを探して、それを「abstract ミュテータメソッド名 (値またはローカル変数)」の形式に置き換えます。したがって、コードの変更は、以下のようになります。
    • 修正前 :

         public void setEntityContext(EntityContext ec) {

                context = ec;

         }

         public void unsetEntityContext() {

                this.context = null;

         }

         public void ejbActivate() {

                this.branchCode = ((com.sun.bank.ejb.entity.AccountPK)


      context.getPrimaryKey()).branchCode;

                this.accNo = ((com.sun.bank.ejb.entity.AccountPK)

                       context.getPrimaryKey()).accNo;

         }

         public void ejbPassivate() {

         }

         public void ejbLoad() {

         }

         public void ejbStore() {

         }

        

         public AccountPK ejbCreate(String branchCode,

                String accNo, int custNo, String accTypeId,

                BigDecimal accBalance) {

                this.branchCode = branchCode;

                this.accNo      = accNo;

                this.custNo     = custNo;

                this.accTypeId = accTypeId;

                this.accBalance = accBalance.doubleValue();

                return null;

         }

         public void ejbPostCreate(String branchCode,

                String accNo, int custNo, String accTypeId,

                BigDecimal accBalance) {

         }

         public void ejbRemove() {

         }

      修正後 :

         public void setEntityContext(EntityContext ec) {

                context = ec;

         }

         public void unsetEntityContext() {

                this.context = null;

         }

         public void ejbActivate() {

         }

         public void ejbPassivate() {

         }

         public void ejbLoad() {

         }

         public void ejbStore() {

         }

         public AccountPK ejbCreate(String branchCode,

                String accNo, int custNo, String accTypeId,

                BigDecimal accBalance) {

                setBranchCode(branchCode);

                setAccNo(accNo);

                setCustNo(custNo);

                setAccTypeId(accTypeId);

                setAccBalance(accBalance);

                return null;

         }

         public void ejbPostCreate(String branchCode,

                String accNo, int custNo, String accTypeId,

                BigDecimal accBalance) {

         }

         public void ejbRemove() {

         }

  • AccountPK.java
  • このファイルは、変更する必要がありません。

  • AccountHome.java
  • Bean のホームインタフェースでは、検索メソッドの戻り値の型が java.util.Enumeration のときにだけ、変更が必要となります。Account Bean の場合、ホームインタフェースは戻り値の型が列挙 (Enumeration) であるファインダ findOrderedAccountsForCustomer を保持します。このような場合、戻り値の型を Collection に変更する必要があります。また、この変更によって影響を受けるコード、すなわち、この検索メソッドを使用するセッション Bean のコードも、Collection でこの検索メソッドの結果を受け付けられるように、変更する必要があります。

    ホームインタフェースで行う修正を以下に示します。

    修正前 :

    public interface AccountHome extends EJBHome

    {

       public Account findByPrimaryKey(AccountPK key)

              throws FinderException, RemoteException;

       public Enumeration findOrderedAccountsForCustomer(int custNo)

              throws FinderException, RemoteException;

    }

    修正後 :

    public interface AccountHome extends EJBHome

    {

       public Account findByPrimaryKey(AccountPK key)

              throws FinderException, RemoteException;

       public Collection findOrderedAccountsForCustomer(int custNo)

              throws FinderException, RemoteException;

    }

    上記の変更の結果、この検索メソッドにアクセスするセッション Bean の BankTeller についても、Collection で検索メソッドの結果を受け付けられるように変更する必要があります。

    次の抜粋コードは、BankTellerEJB.java への変更内容を示しています。

    検索メソッド findOrderedAccountsForCustomer を使用するメソッド getAccountSummary について見てみます。

    修正前 :

    public AccountSummary getAccountSummary()

    throws EJBException

    {

        int custNo            = 0;

        Enumeration   accEnum = null;

        AccountSummary accSum = new AccountSummary();

        -----

        ----

        try

        {

          AccountHome home=(AccountHome) PortableRemoteObject.

              narrow(accHomeHandle.getEJBHome(), AccountHome.class);

          AccountTypeHome accTypeHome = (AccountTypeHome)

    PortableRemoteObject.narrow(accTypeHomeHandle.getEJBHome(),

    AccountTypeHome.class);

          accEnum  = (Enumeration) home.

                findOrderedAccountsForCustomer(this.custNo);

          AccountTypePK accTypePK  = new AccountTypePK();

          Account      accRef      = null;

          AccountType  accTypeRef  = null;

          String       accTypeDesc = null;

          int i = 0;

          while(accEnum.hasMoreElements())

          {

            i++;

            accRef = (Account) accEnum.nextElement();

            accTypePK.accTypeId = accRef.getAccTypeId();

            accTypeRef  = (AccountType) PortableRemoteObject.

    narrow(accTypeHome.findByPrimaryKey(accTypePK),

                     AccountType.class);

            accTypeDesc =  accTypeRef.getAccTypeDesc();

            accSum.addElement(

                              accRef.getBranchCode(),

                              accRef.getAccNo(),

                              accRef.getAccBalance(),

                              accTypeDesc

                             );

          }

        }

       -----

       ----

    }

    修正後 :

    public AccountSummary getAccountSummary()

    throws EJBException

    {

        int custNo            = 0;

        //Enumeration   accEnum = null;

        Collection   accEnum = null;

        AccountSummary accSum = new AccountSummary();

       ---

       ---

        try

        {

          AccountHome home  = (AccountHome) PortableRemoteObject.

         narrow(accHomeHandle.getEJBHome(), AccountHome.class);

          AccountTypeHome accTypeHome = (AccountTypeHome)

              PortableRemoteObject.narrow(accTypeHomeHandle.

              GetEJBHome(), AccountTypeHome.class);

        //  accEnum  = (Enumeration) home.

        //  findOrderedAccountsForCustomer(this.custNo);

          accEnum  = (Collection) home.

                findOrderedAccountsForCustomer(this.custNo);

          AccountTypePK accTypePK  = new AccountTypePK();

          Account      accRef      = null;

          AccountType  accTypeRef  = null;

          String       accTypeDesc = null;

          int i = 0;

       Iterator iterator = accEnum.iterator();

        //  while(accEnum.hasMoreElements())

          while(iterator.hasNext())

          {

            i++;

           // accRef = (Account) accEnum.nextElement();

       accRef = (Account) PortableRemoteObject.

                    narrow(iterator.next(), Account.class);

            accTypePK.accTypeId = accRef.getAccTypeId();

            accTypeRef  = (AccountType) PortableRemoteObject.

    narrow(accTypeHome.findByPrimaryKey(accTypePK),

                    AccountType.class);

            accTypeDesc =  accTypeRef.getAccTypeDesc();

            accSum.addElement(

                              accRef.getBranchCode(),

                              accRef.getAccNo(),

                              accRef.getAccBalance(),

                              accTypeDesc

                             );

          }

        }

       ----

       ----

      }

Sun ONE Studio for Java での EJB モジュールの作成

ここでは、既存のソースファイルを使用して、Sun ONE Studio for Java で EJB モジュールを作成する方法について説明します。

セッション Beans 用のモジュールの作成

  1. セッション Beans 用の SessionContent ディレクトリには、次のようなものが含まれます。
  2. 次のセッション Beans の Bean クラスとインタフェースがあります。

    BankTeller

    InterestCalculater

    この他に、例外クラスも含まれます。

  3. 既存のソースファイルから、新しい EJB を作成します。
  4. Sun ONE Studio for Java では、既存のソースファイルから EJB を作成することができます。

    マウントされたディレクトリ SessionContent を選択し、パッケージ session が表示されるまで、そのサブフォルダを展開します。session を右クリックし、新しい J2EE のオプションを選択してから、「セッション EJB」をクリックすると、新しい EJB ウィザードが表示されます。

    EJB の主な特性 (セッション、ステートフル、またはステートレスなど) を指定し、EJB の名前とパッケージを定義した後で、既存のソースファイルと EJB の別のコンポーネント (実装クラス、ホームインタフェース、およびリモートインタフェース) を一致させます。既存のソースファイルと一致させるには、ダイアログボックスの「Modify」ボタンを使用し、「Select an existing source file」を選択します。

    セッション Beans はすべて同じ方法で作成する必要があります。

    次の画面ショットは、ステートフルセッション Bean となるセッション Bean BankTeller を作成しているところです。このように、指定している状態がステートフルであるのに対し、InterestCalculator セッション Bean はステートレスになるため、InterestCalculator Bean を作成する間は、指定する状態をステートレスにする必要があります。「Browse」ボタンをクリックして、パッケージを指定します。

   新しいセッション Bean の作成
Sun ONE Studio for Sun ONE Application Server 7 を使用したセッション Bean の作成を示す図

次の画面ショット (「次へ 」をクリックした後の画面) は、Bean クラス、ホームインタフェース、およびリモートインタフェースを指定しているところです。「インタフェースを変更」ボタンをクリックし、既存のクラスを使用するオプションを選択すると、選択が可能な既存ファイルが表示されます。

   Bean クラス、ホームインタフェース、およびリモートインタフェースの指定
Sun ONE Studio for Sun ONE Application Server 7 を使用したセッション Bean の Bean クラス、ホームインタフェース、およびリモートインタフェースの作成を示す図

同じ方法で、InterestCalculator セッション Bean を作成します。

  1. EJB のプロパティを編集します。
  2. EJB のプロパティを編集すると、EJB リソース参照を宣言し、EJB の環境エントリを指定することができます。

   BankTeller セッション Bean の「プロパティ」ウィンドウ
セッション Bean のプロパティを示す図

次の画面ショットは、BankTeller セッション Bean の環境エントリを宣言しているところです。InterestCalculator Bean では、このエントリは必要ありません。

「参照」タブの「環境エントリ」をクリックしてから、「追加」をクリックして、DSN の新しいエントリを追加します。

   BankTeller セッション Bean への環境エントリの追加
Sun ONE Studio を使用してセッション Bean の環境エントリを追加するダイアログボックスを示す図

BankTeller セッション Bean の「プロパティ」ウィンドウ内の「参照」のタブで、「リソース参照」をクリックして、新しいリソースを追加します。次の画面ショットは、iBank に新しいデータソースのリソース jdbc/iBank を追加しているところです。

   リソース参照の追加
Sun ONE Studio を使用してセッション Bean にリソースを追加するダイアログボックスを示す図

「Sun ONE App Server」タブをクリックして、「JNDI 名」に jdbc/iBank を設定し、さらに、使用するデータベーススキーマに応じたユーザー名とパスワードも設定します。

InterestCalculator Bean では、このエントリは必要ありません。

   Sun ONE Application Server 用のリソース参照の追加
Sun ONE Studio を使用してセッション Bean にリソースを追加するダイアログボックスを示す図

「Properties」ウィンドウ内の「Reference」タブで、「EJB Reference」をクリックして、EJB 参照を追加します。次の画面ショットは、BankTeller セッション Bean の EJB 参照を追加しているところです。BankTeller セッション Bean には、エンティティ Bean の「Account」と「Customer」の参照があります。このため、両方のエンティティ Bean について、エントリを作成する必要があります。

ホームインタフェースとリモートインタフェースについては、「Modify」ボタンをクリックし、既存の Beans のソースを選択して指定する必要があります。

   EJB 参照の追加
Sun ONE Studio を使用してセッション Bean への EJB 参照を作成するダイアログボックスを示す図

次に、「EJB 参照」の「Sun ONE App Server」タブをクリックして、JNDI 名を指定します。次の画面ショットは、Account エンティティ Bean 用に作成した JNDI エントリ ejb/Account を示しています。同様に、Customer Bean の EJB 参照が追加されると、「Sun ONE App Server」タブで指定した JNDI 名が jndi/Customer になります。

   Sun ONE Application Server 用の EJB 参照エントリの追加
Sun ONE Studio を使用して、Sun ONE Application Server への EJB 参照を追加するダイアログボックスを示す図

  1. ソースファイルをコンパイルします。
  2. EJB モジュールを作成し、モジュール内で EJB をアセンブルします。
  3. J2EE 1.2 仕様に従い、Sun ONE Application Server 7 で、複数の EJB を EJB モジュールにまとめる必要があります。ルートディレクトリ SessionContent で、新しい EJB モジュール SessionModule を作成します。これを行うには、フォルダを右クリックし、「新規」を選択した後、J2EE を選択してから、最後に「新規 EJB モジュール」を選択します。新しい EJB モジュールが作成されたら、そこにセッション EJB を追加します。

    次の画面ショットは、BankTeller EJB と InterestCalculator EJB を EJB モジュール SessionModule に追加しているところです。

   EJB モジュールへのセッション Beans の追加
Sun ONE Studio を使用して、EJB モジュールに EJB を追加している図

エンティティ Beans 用のモジュールの作成

  1. エンティティ Beans のディレクトリには、次のようなものが含まれます。
  2. 次のエンティティ Beans の Bean クラス、リモートインタフェース、およびホームインタフェース

    1. Account
    2. AccountType
    3. Branch
    4. Customer
    5. Transaction
    6. TransactionType

    Customer エンティティ Bean は Bean 管理で、その他のエンティティ Bean はコンテナ管理になります。

  3. JDBC ドライバを設定します。
  4. 「エクスプローラ」の「実行時」ビュー内の「Databases / Drivers / Add Driver:」で、ドライバ名、実装クラス、および関連 URL の接頭辞を指定します。対応するドライバ用の JAR または ZIP は、Sun ONE Studio for Java にアクセスできるようにする必要があるため、<SUN ONE STUDIO FOR JAVA_ROOT>/lib/ext ディレクトリにコピーする必要があります。

    Solaris で、適切な Sun ONE Studio for Java ディレクトリにドライバクラスを格納するには、シェル (sh または ksh) から次のコマンド行を実行します。

    cp $ORACLE_HOME/jdbc/lib/classes12.zip  <SUN ONE STUDIO FOR JAVA_ROOT>/lib/ext

  5. データベース接続プロパティを定義します。
  6. 「エクスプローラ」の「実行時」ビュー内の「Databases」の「接続を追加」では、使用するドライバ、完全な接続 URL、ユーザー名とパスワード、および適切なデータベーススキーマを指定します。

   Sun ONE Studio for Java でのデータベース接続 (Oracle) の設定
Sun ONE Studio でデータベース接続を設定するダイアログボックスを示す図

  1. 既存のソースファイルから、新しい EJB を作成します。
  2. Sun ONE Studio for Java では、既存のソースファイルから EJB を作成することができます。マウントされたディレクトリ EntityContent を選択し、 entity サブフォルダが表示されるまで、ディレクトリを展開します。 entity サブフォルダを右クリックして、新しい J2EE のオプションを選択してから、「エンティティ EJB(CMP/BMP)」をクリックすると、新しい EJB ウィザードが表示されます。

    EJB の主な特性 (エンティティ、BMP、または CMP) を指定し、EJB の名前とパッケージを定義した後で、既存のソースファイルと EJB の別のコンポーネント (実装クラス、ホームインタフェース、およびリモートインタフェース) を一致させます。既存のソースファイルと一致させるには、ダイアログボックスの「インタフェースを変更」ボタンを使用し、「既存ユーザ実装クラスを選択」を選択します。エンティティ Beans の場合は、さらに cmp フィールドと表のマッピングを指定する必要があります。「エクスプローラのファイルシステム」ビューで、「新規」「CMP エンティティ Bean」オプションを選択した後、EJB フィールドの持続性に使用するデータベース表を指定できるようにするために、「データベース接続からの表」オプションを選択します。

   コンテナ管理による持続性を保持するエンティティ Bean の作成
Sun ONE Studio で CMP エンティティ Bean を作成および設定するウィザードを示す図

次の画面ショットでは、定義されているデータベース接続のリストから、適切な接続を選択することができます。

接続を選択すると、この接続からアクセスできる表のリストが表示されるので、適切な表を選択します。

   CMP Bean フィールドのマッピング用の表の選択
Sun ONE Studio でデータベース表を選択して、CMP エンティティ Bean フィールドにマップするウィザードを示す図

次の画面では、選択した表のカラムと Bean の CMP フィールド間でのマッピングを設定します。ここでは、Bean のフィールド名と対応する Java タイプを正しく指定するように、注意する必要があります。

   表のカラムと Bean の CMP フィールド間でのマッピング
Sun ONE Studio でデータベース表フィールドと CMP エンティティ Bean フィールド間でのマッピングを示す図

次の画面ショットは、エンティティ Bean のソースファイルを指定しているところです。

   エンティティ Bean のソースファイルの指定
Sun ONE Studio で CMP エンティティ Beans のソースファイルを指定するウィザードを示す図

次に、「クラスを変更」ボタンをクリックして、既存のソースファイルから EJB を作成することを Sun ONE Studio for Java に指定します。

既存のソースファイルを選択したときに、エラーが発生した場合、前の手順をきちんと行っていないか、あるいはソースが正しく移行されていない可能性があります。このようなエラーが発生した場合、修正を行って対処する必要があります。

次の画面ショットは、EJB Bean クラス用に、既存のソースファイルを選択しているところです。

   既存のソースファイルのオプションを選択した EJB Bean クラスの指定
既存の Bean クラスを選択して Bean クラスを作成している図

次の作業では、必要に応じて、新しい EJB のプロパティを編集します。

エンティティ Beans はすべて同じ方法で作成する必要があります。

(注 : ここでは、既存のクラスを選択するオプションを表示するか、または別のクラスを使用するエラーが発生する場合があるので、「このクラスを使用」をクリックします。このような状況では、Sun ONE Studio で予期せぬ結果が生じる可能性があるため、Sun ONE Studio をいったん終了し、再起動してください。)

  1. EJB のプロパティを編集します。
  2. プロパティがプロパティインスペクタに表示されるように、「エクスプローラ」ウィンドウで、新しい EJB を選択します。

    「プロパティ」ウィンドウの「参照」タブを選択し、「リソース参照」ラベルの右側のテキストゾーンをクリックしてから、このテキストゾーンの右端にある省略符号 ("ノ") を示すボタンをクリックします。

    次のようなプロパティは、エンティティ Bean Customer だけで設定する必要があります。

    次の画面ショットは、エンティティ Bean Customer のリソース参照を追加しているところです。

    「標準」タブで、データソースの完全名 ( jdbc/DataSourceName ) とリソースタイプ (javax.sql.DataSource) を指定し、このリソースへのアクセスを管理するオプション (「認証」) のドロップダウンリストから、「コンテナ」を選択します。

   リソース参照の追加
CMP エンティティ Bean へのリソース参照を追加している図

宣言を作成したら、「Sun ONE App Server」タブを選択し、前に定義したリソース参照に対応するエントリの JNDI 名のカラムに、データソースの JNDI 名jdbc/iBankを指定します。ユーザー名とパスワードも指定します。

   リソース参照の編集
Sun ONE App Server へのリソース参照を追加している図

「プロパティ」ウィンドウの「Sun ONE AS」タブを選択し、「リソース参照マッピング」をクリックしてから、使用する必要があるサーバーインスタンスで、データソース jdbc/IBank を選択します。次の画面ショットは、同じ内容を表しています。

   Sun ONE Application Server 用のリソース参照のマッピング
Sun ONE Application Server へのリソース参照のマッピングを示す図

  1. findByPrimaryKey メソッド以外の検索の EJB QL を設定します。
  2. EJB QL は、検索に対して指定する必要があります。CMP 2.0 仕様に従って、検索は EJB QL を使用します。

    iBank アプリケーションの場合、このタイプの編集が必要なエンティティ Bean は Account Bean です。Sun ONE Studio の「エクスプローラ」ウィンドウで、AccountEJB ノードを選択し、そのノードのファインダメソッドを展開します。findByPrimaryKey 以外の検索メソッドをクリックして、その「プロパティ」ウィンドウを開きます。

   ファインダメソッドのプロパティ
ファインダメソッドのプロパティを示す図

「EJBQL 照会」をクリックして、クエリを入力します。次の画面ショットは、クエリを入力したところです。

   検索メソッドの EJB QL の編集
EJB QL スクリプトを編集できるダイアログボックスを示す図

  1. EJB モジュールを作成し、モジュール内で EJB をアセンブルします。
  2. EntityModule という名前で、新しい EJB モジュールを作成し、このモジュールにすべてのエンティティ Beans を追加します。これを行うには、EJB モジュールを右クリックし、EJB を追加するオプションを選択します。J2EE 1.2 仕様に従って、EJB は 1 つの EJB モジュールにまとめる必要があります。

  3. 新しいデータベーススキーマを作成します。
  4. 「ファイル」メニューから「新規」をクリックし、新しいデータベーススキーマを選択します。スキーマを取り込む必要があるデータベースの接続情報を定義します。

  5. Sun ONE Application Server 7 のデータベースエントリをマップします。
  6. EJB モジュールの EJB ノードを選択し、このノードを右クリックして、「プロパティ」ウィンドウを選択し、さらに「Sun ONE AS」タブを選択します。この特定のエンティティ Bean について、データベーススキーマと主表名を指定します。EJB モジュール内の他のエンティティ Bean についても、同様のプロセスを繰り返します。

    次の画面ショットは、エンティティ Bean「Account」の主表を選択しているところです。

   データベースのマッピング
Bean とデータベース間でのマッピングを示す図

「次へ 」をクリックして、Bean の cmp フィールドと表フィールドのマッピングを指定します。

次に、「プロパティ」ウィンドウから「Sun ONE マッピング」タブを選択し、同じマッピングを入力します。

次の画面ショットは、Account EJB のマッピングを示しています。

   エンティティ Bean「Account」のプロパティ
Sun ONE Application Server のアーキテクチャを示す図

同様に、すべてのエンティティ Beans のマッピングを設定する必要があります。

データベース表フィールドに対応する特定のエンティティ Bean のマッピングについては、「Module A」を参照してください。

  1. CMP リソースを追加します。
  2. EntityModule を選択し、そのプロパティを表示して、「Sun ONE AS」タブをクリックします。続いて、「CMP リソース」をクリックして、持続マネージャのファクトリを設定します。

    次の画面ショットは、設定を行っているところです。

   CMP リソースの追加
CMP リソース用のプロパティエディタを示す図

Sun ONE Studio for Java でのエンタープライズアプリケーションの作成

Web アプリケーションと EJB ファイルを作成したら、今度はすべてのモジュールを 1 つにまとめるエンタープライズアプリケーションを作成します。エンタープライズアプリケーションの作成プロセスは、以下のとおりです。

  1. ソースに利用できる同じパッケージの下にある新しいディレクトリ IBank に、新しいエンタープライズアプリケーションモジュールを作成します。
  2. Web モジュールと EJB モジュールをエンタープライズアプリケーションモジュールに追加します。
  3. 次の画面ショットは、 WarContent という名前の Web モジュールと SessionModule と EntityModule という名前の EJB モジュールを含んだ iBank という名前のエンタープライズアプリケーションを示しています。

   アプリケーションへのモジュールの追加
Sun ONE Studio でアプリケーションを作成し、そのアプリケーションに EJB モジュール、セッションモジュール、Web モジュールを追加している図

次の画面ショットは、3 つのモジュールを含んだ iBank アプリケーションを示しています。

   異なるモジュールを含む iBank アプリケーションを示すファイルシステム
異なるモジュールを含んだ iBank アプリケーションのファイルシステムを示す図

  1. エンタープライズアプリケーションのプロパティを編集します。
  2. プロパティエディタを使用すると、エンタープライズアプリケーションモジュールに、異なるプロパティを設定することができます。特に、このエディタでは、エンタープライズアプリケーションの Web モジュールについて、ルートコンテキスト名を定義します。

   Web コンテキストの指定
Web コンテキストを指定している図

  1. EAR ファイルをエクスポートします。
  2. エンタープライズアプリケーションを右クリックし、EAR ファイルをエクスポートするオプションを選択して、EAR ファイルをエクスポートします。この EAR ファイルには、JAR ファイル、WAR ファイル、および XML ファイルが含まれます。この EAR ファイルには、Sun ONE Application Server 7 での配備に必要な Sun ONE 固有の XML ファイルが含まれます。この EAR ファイルは、これで配備することができます。

Sun ONE Application Server 7 でのアプリケーションの配備

最後の作業は、Sun ONE Application Server 7 のインスタンスでのアプリケーションの配備です。アプリケーションを配備するプロセスは、以下に示すとおりです。

  1. Sun ONE Studio for Java から Sun ONE Server 7 のインスタンスへのアプリケーションの配備
  2. EAR ファイルを右クリックし、「配備」オプションを選択します。これによって、デフォルトのサーバーインスタンスに、アプリケーションが配備されます。サーバーインスタンスを再起動し、アプリケーションをテストします。

  3. Sun ONE Application Server 7 の asadmin ユーティリティを使用した、Sun ONE Application Server 7 のインスタンスへのアプリケーションの配備
  4. Sun ONE Studio for Java を使用しないで、Sun ONE サーバーインスタンスに、エンタープライズアプリケーションを配備する場合、Sun ONE Studio for Java からアプリケーションの EAR アーカイブを作成およびエクスポートした後で、Sun ONE Application Server 7 の asadmin ユーティリティを使用します。

    asadmin 配備ユーティリティを使用した iBank アプリケーションの配備手順については、「iBank アプリケーションの手動移行」内の「asadmin ユーティリティを使用した Sun ONE Application Server 7 での iBank アプリケーションの配備」を参照してください。

BEA WebLogic Server v6.1 および IBM WebSphere v4.0 からの移行

BEA WebLogic v6.1 および IBM WebSphere v4.0 についての J2EE アプリケーション移行プロセスとサンプルアプリケーションの移行の詳細は、移行サイトから該当するマニュアルを参照してください。


前へ      目次      索引      次へ     
Copyright 2002 Sun Microsystems, Inc. All rights reserved.