| Sun ONE Application Server 7, Enterprise Edition サーバーアプリケーションの移行および再配備 |
第 6 章
6.5 アプリケーションの Sun ONE Studio へのインポートこの章では、Sun ONE Studio による Sun ONE Application Server 6.5 で開発したアプリケーションの移行について説明します。Sun ONE Studio for Java を使って各アプリケーションコンポーネントを移行する手順を示します。Sun ONE Application Server 6.5 付属の iBank サンプルアプリケーションを使って具体的な手順を解説します。
iBank アプリケーションの詳細については、付録 A 「iBank アプリケーションの仕様」を参照してください。
アプリケーションの移行の準備
Sun ONE Studio を使用した移行作業に先立ち、次の手順を実行し、開発環境を移行するためのセットアップを行います。
- 開発環境に Sun ONE Application Server 7 EE および Sun ONE Studio for Java 4.0 をインストールします。
Sun ONE Application Server 7 EE および Sun ONE Studio のインストール方法については、『インストールガイド』を参照してください。
- ローカルディレクトリ内に zip 形式で格納されているアプリケーションを抽出します。
iBank アプリケーションのソース (iBank65.zip) は、移行サイト http://www.sun.com/migration/sunonetools.html から入手できます。iBank65.zip ファイルを解凍すると、次のようなディレクトリ構造が作成されます。
iBank
/docroot
/session
/entity
/script
- /docroot のルートには、HTML ファイル、JSP ファイル、および画像ファイルが含まれます。また、サーブレットや EJB のソースファイルも、パッケージ構造 com.sun.bank.* に従って、サブフォルダ WEB-INF¥classes に含まれます。WAR ファイルは、このディレクトリの内容から生成されます。
- /session には、パッケージ構造 com.sun.bank.ejb.session に従ってセッション Beans のソースコードが含まれます。このディレクトリはセッション Beans の EJB モジュールを形成します。
- /entity には、パッケージ構造 com.sun.bank.ejb.entity に従ってエンティティ Beans が含まれます。このディレクトリはエンティティ Beans の EJB モジュールを形成します。
- /scripts には、データベースセットアップ用の SQL スクリプトが含まれます。
- /scripts フォルダに入っている SQL スクリプトを実行して、iBank アプリケーションのスキーマをセットアップします。これらのスクリプトは、Oracle データベース用です。これらのスクリプトによって、ユーザーの作成、表の作成、および表へのデータの挿入が行われます。次の順序で、スクリプトを実行します。
- Sun ONE Application Server を起動します。
詳細については、『入門ガイド』を参照してください。
- サンプルアプリケーションの「iBank」のアセンブルと配備を行うために、Sun ONE Studio を準備します。
次の場所に格納されている runide.sh ファイルを使って、Sun ONE Studio ツールを起動します。
Sun ONE App Server_Root/AppServ/Sun ONE Studio forJava_Root/bin
- IDE のエクスプローラウィンドウで「Runtime (実行時)」タブを選択します。
- 「Server Registry (サーバーレジストリ)」をクリックします。
- 「Installed Servers (インストールされたサーバー)」をクリックします。
- 「Sun ONE Application Server」を選択します。
- 「Sun ONE Application Server」ノードを右クリックし、「Add Admin Server (管理サーバーを追加)」を選択して、管理サーバーをセットアップします。
- 次の情報を入力します。
- 管理サーバーのセットアップ後、管理サーバーをクリックして、サーバーインスタンスをインストールします。
- このサーバーインスタンスをデフォルトサーバーとして設定するには、サーバーインスタンスを右クリックし、「Set As Default (デフォルトとして設定)」を選択します。
アプリケーションコンポーネントの移行
この節では、iBank アプリケーションの各コンポーネントの移行手順を説明します。
配備記述子の移行方法の詳細については、「配備記述子の移行」を参照してください。
- 「Sun ONE Studio for Java での Web アプリケーションモジュールの作成」の指示に従って、Web モジュールを作成します。
- EJB を移行します。Sun ONE Studio は EJB の移行をサポートしません。EJB は手動で移行する必要があります。ただし、Sun ONE Studio でも、EJB のソースコードを開いて変更することは可能です。EJB の移行方法の詳細については、「EJB の移行」を参照してください。
- JDBC コードを移行します。JDBC コードの移行方法の詳細については、「JDBC コードの移行」を参照してください。
- iBank アプリケーションには CMP 1.1 のエンティティ Beans が付属しています。エンティティ Beans の CMP 1.1 を CMP 2.0 に変換する方法については、「CMP エンティティ EJB の移行」を参照してください。
Account エンティティ Bean のコードには Enumeration が使用されています。このコードは、「CMP エンティティ EJB の移行」に記載される指示に従って、手動で変更する必要があります。CMP を 1.1 から 2.0 に変換する変更作業の例については、「CMP エンティティ EJB の移行」を参照してください。
- エンティティ Beans とセッション Beans それぞれに EJB モジュールを作成します。「Sun ONE Studio for Java での EJB モジュールの作成」を参照してください。
- エンタープライズアプリケーションを作成します。「Sun ONE Studio for Java でのエンタープライズアプリケーションの作成」の手順に従ってください。EJB モジュールの作成手順のほか、Web モジュールの作成手順も記載されています。この手順を実行すると、最終的に配備が可能な .ear ファイルが作成されます。
- 「Sun ONE Application Server 7 でのアプリケーションの配備」に記載される指示に従って、Sun ONE Application server 7 で .ear ファイルを配備します。
Sun ONE Studio for Java での Web アプリケーションモジュールの作成
Sun ONE Studio for Java で Web モジュールを作成するには、以下の手順を実行します。
- ソースファイルが格納されている /docroot ディレクトリをマウントします。Sun ONE Studio for Java でディレクトリをマウントするには、左側のペインの「FileSystems Explorer (FileSystems Explorer)」タブを選択します。「File (ファイル)」メニューから「Mount the FileSystem (ファイルシステムをマウント)」を選択します。「Browser (ブラウザ)」ダイアログボックスで、マウントするディレクトリを選択します。
- ソースファイルディレクトリ構造 (entity およびsession) に、EJB が格納されているディレクトリをマウントします。
- ルートディレクトリ構造に Web モジュール用の空ディレクトリを作成します。たとえば、WarContent などです。
- 新しく作成した WarContent ディレクトリをマウントします。
- ファイルシステム WarContent を Web モジュールに変換します。マウントしたディレクトリをエクスプローラで選択し、右クリックして、「Tools (ツール)」サブメニューから「Convert FileSystem to Web Module (ファイルシステムを Web モジュールに変換)」オプションを選択します。
- ソースの JSP、HTML、および画像ファイルを docroot ディレクトリから Web アプリケーションルート、すなわち、「WarContent」ディレクトリにコピーします。
- サーブレットと補助クラスソースを WEB-INF/classes ディレクトリにコピーします。つまり、docroot ディレクトリのサブフォルダ com を WEB-INF/classes ディレクトリにコピーすることになります。
- docroot ディレクトリの WEB-INF にあるタグライブラリを、WarContent ディレクトリの WEB-INF にコピーします。
- ソースコードを Sun ONE Application Server 7 に移行する必要がある場合 (移行ツールを使用して変更しない場合) は、以下の手順に従ってソースコードを編集します。
- 変更する必要がある JSP を確認します。
- カスタム JSP タグがアプリケーションで使用されているかどうかを確認します。
- 選択した JSP コードを Sun ONE Studio で開きます。Sun ONE Studio で JSP ファイルを開くには、左側のペインで JSP ファイルを選択し、右クリックして、ポップアップメニューから「Open (開く)」オプションを選択します。
- 「Java Server Pages および JSP カスタムタグライブラリの移行」に記載される手順に従って、ソースを修正します。
- 同様に、「サーブレットの移行」に記載される手順に従って、サーブレットを移行します。
- アプリケーションをアセンブルし、(WEB-INF/ ディレクトリ内の) 配備記述子 web.xml に必要な情報を入力します。web.xml ファイルをクリックし、要素のプロパティを編集します。このアセンブリ段階で、EJB や Web アプリケーションで使用するデータソース参照に加えて、各サーブレット、JSP ページ、および JSP タグライブラリを設定します。
以下では、Sun ONE Studio for Java で Web アプリケーションをアセンブルする方法について説明します。
サーブレットの設定
配備記述子内のサーブレットを設定するには:
- Warcontent フォルダの Web モジュールを選択します。Web モジュールを右クリックし、ポップアップメニューからプロパティオプションを選択します。「Properties (プロパティ)」ウィンドウが表示されます。
- サーブレットを設定するには、「Deployment (配備)」タブの「Servlets (サーブレット)」ボタンをクリックします。「Servlets (サーブレット)」ダイアログボックスが表示されます。
- 「Add (追加)」をクリックしてサーブレットを追加します。Web アプリケーションの各サーブレットについて、「Browse (ブラウズ)」ボタンをクリックして、サーブレット名、サーブレットの実装クラスの完全名を指定します。また、「Mapping (マッピング)」をクリックして、サーブレットのマッピング要素を、さらに、初期パラメータを指定します。
図 6-1 サーブレットの設定
iBank アプリケーションのサーブレットとそのマッピングについて、「サーブレットとマッピング」の表に示します。左の欄にサーブレット名、中央の欄に表示名、右の欄にマッピングを示します。
web.xml に上記のすべてのサーブレットのエントリが追加されるように、すべてのサーブレットの設定を行います。
上記の手順が完了すると、「Deployment (配備)」タブに 11 個のサーブレットのマッピングと 11 個のサーブレットが表示されます。
JSP タグライブラリの設定
JSP タグライブラリを設定するには:
- 「Properties (プロパティ)」ウィンドウの「Deployment (配備)」タブの「Tag Libraries (タグライブラリ)」ボタンをクリックします。「Tag Libraries (タグライブラリ)」ダイアログボックスが表示されます。
- Web アプリケーションの配備記述子で JSP タグライブラリを定義するには、「Add (追加)」をクリックします。続いて、「Add Taglib (タグライブラリの追加)」ダイアログボックスで、ライブラリの URI (JSP ページがライブラリにアクセスするための識別子) とライブラリの配備記述子 (.tld ファイル) へのパスを指定します。
iBank には、1 つの JSP タグライブラリ TMBHisto.tld があります。配備記述子は WEB-INF フォルダに格納されます。
図 6-2 タグライブラリの設定
リソース参照の追加
配備記述子にリソース参照を追加するには:
- 「Properties (プロパティ)」ウィンドウの「References (参照)」タブを選択します。「Resource Reference (リソース参照)」ボタンをクリックします。
- 新しいリソースを追加するには、「Add (追加)」をクリックします。「Resource Reference (リソース参照)」ダイアログボックスの「Standard (標準)」タブで、リソース参照の詳細情報を入力します。次の図は、iBank にデータソースの新しいリソース jdbc/iBank を追加する画面です。
図 6-3 リソース参照の追加
- 「Sun ONE App Server」タブをクリックして、JNDI 名を jdbc/IBank に設定し、さらに、使用するデータベーススキーマに応じたユーザー名とパスワードも設定します。
図 6-4 Sun ONE Studio を使用して、Sun ONE Application Server 用の JDBC リソース参照を追加するためのダイアログボックスを示す図
コンテキストパラメータの追加
JNDI 名のコンテキストパラメータを追加し、iBank データソースを検索するには:
Welcome ファイルの指定
「Deployment (配備)」タブの「Welcome Files (Welcome ファイル)」ボタンをクリックして、Welcome ファイルを指定します。iBank の場合、Welcome ファイルは index.jsp です。
CMP エンティティ EJB の 1.1 から 2.0 への変換
iBank アプリケーションには CMP 1.1 のエンティティ Beans が付属しています。エンティティ Beans の CMP 1.1 を CMP 2.0 に変換する方法については、「CMP エンティティ EJB の移行」を参照してください。
Account エンティティ Bean のコードには Enumeration が使用されています。このコードは手動で変更する必要があります。ここでは、Account エンティティ Bean を CMP 1.1 から CMP 2.0 へ変換する手順を示します。
Account エンティティ Bean の関連ファイルは次のとおりです。
Account.java
AccountEJB.java
AccountHome.java
AccountPK.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----
Bean クラスには、次の変更を加える必要があります。
修正前 :
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();
修正前のコードは以下のようになります。
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() {
}
検索メソッドの戻り型が java.util.Enumeration でなければ、Bean のホームインタフェース内で変更を加える必要はありません。Account Bean の場合、ホームインタフェースに戻り型が Enumeration の検索メソッド findOrderedAccountsForCustomer があります。この場合、戻り型を Collection に変更する必要があります。さらに、この検索メソッドを使用するセッション Bean も変更する必要があります。これは、検索メソッドの戻り型 Collection を受け付けるためです。
ホームインタフェースで行う修正を以下に示します。
修正前のコードは以下のようになります。
修正後のコードは以下のようになります。
上記の変更の結果、この検索メソッドにアクセスするセッション 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 用のモジュールの作成
session フォルダには、次の Bean クラスと、次のセッション Beans のインタフェースが格納されています。
セッション Beans のモジュールを作成するには:
- 左のペインの「FileSystems (ファイルシステム)」タブで、マウントされたディレクトリ session を選択します。com サブフォルダに移動し、session パッケージを選択します。
- session パッケージを右クリックします。「File (ファイル)」メニューから「New (新規)」を選択します。「New Wizard (新規作成ウィザード)」のオプションから「J2EE」->「EJB Module (EJB モジュール)」を選択します。
- EJB の主な特性、たとえば EJB 名、Bean の状態 (ステートフルまたはステートレス)、EJB のパッケージなどを指定します。次の図は、セッション Bean BankTeller の作成画面です。このセッション Bean はステートフルセッション Bean ですが、InterestCalculator セッション Bean はステートレスです。「Browse (参照)」ボタンをクリックして、パッケージを指定します。
図 6-6 新しいセッション Bean の作成
- 既存のソースフィルに一致する実装クラス、ホームインタフェース、およびリモートインタフェースを指定するには、ダイアログボックスの「Modify (変更)」ボタンをクリックし、「Select an existing source file (既存のソースファイルを選択)」を選択します。
上記の手順を繰り返して、すべてのセッション Beans を作成します。
次の図は、セッション Bean の Bean クラス、ホームインタフェース、およびリモートインタフェースを指定する画面です。「Modify (インタフェースを変更)」ボタンをクリックし、既存のクラスを使用するオプションを選択すると、選択が可能な既存ファイルが表示されます。
図 6-7 Bean クラス、ホームインタフェース、およびリモートインタフェースの指定
上記の手順に従って、 InterestCalculator セッション Bean を作成します。
- EJB のプロパティを編集します。
EJB のプロパティを編集すると、EJB リソース参照を宣言し、EJB の環境エントリを指定することができます。
図 6-8 BankTeller セッション Bean の「Properties (プロパティ)」ウィンドウ
次の図は、BankTeller セッション Bean の環境エントリを宣言する画面です。InterestCalculator Bean では、このエントリは必要ありません。
「References (参照)」タブの「Environment Entries (環境エントリ)」をクリックしてから、「Add (追加)」をクリックして、データソース名の新しいエントリを追加します。
図 6-9 BankTeller セッション Bean への環境エントリの追加
BankTeller セッション Bean の「Properties (プロパティ)」ウィンドウ内の「References (参照)」タブで、「Resource Reference (リソース参照)」をクリックして、新しいリソースを追加します。iBank にデータソースの新しいリソース jdbc/iBank を追加します。
「Sun ONE App Server」タブをクリックして、「JNDI Name (JNDI 名)」に jdbc/iBank を設定し、さらに、使用するデータベーススキーマに応じたユーザー名とパスワードも設定します。
InterestCalculator Bean では、このエントリは必要ありません。
「Properties (プロパティ)」ウィンドウ内の「Reference (参照)」タブで、「EJB Reference (EJB 参照)」をクリックして、EJB 参照を追加します。次の図は、BankTeller セッション Bean の EJB 参照を追加する画面です。BankTeller セッション Bean には、Account エンティティ Bean とCustomer エンティティ Bean の参照が含まれています。これらのエンティティ Bean の参照を BankTeller セッション Bean に追加する必要があります。
「Modify (変更)」ボタンをクリックし、ホームインタフェースとリモートインタフェースを指定します。Beans オプションでは既存のソースを選択します。
図 6-10 EJB 参照の追加
「EJB Reference (EJB 参照)」の「Sun ONE App Server」タブをクリックして、JNDI 名を指定します。次の図に、Account エンティティ Bean の JNDI エントリ ejb/Account を示します。同様に、Customer Bean の EJB 参照を追加した場合は、「Sun ONE App Server」タブで JNDI 名 jndi/Customer を指定します。
図 6-11 Sun ONE Studio を使用して、Sun ONE Application Server への EJB 参照を追加するダイアログボックスを示す図
- ソースファイルをコンパイルします。
- EJB モジュールを作成し、モジュール内で EJB をアセンブルします。
J2EE 1.3 仕様に基づいて、Sun ONE Application Server 7 EE では、EJB モジュールをグループ化する必要があります。ルートディレクトリ session で、SessionModule として新しい EJB モジュールを作成します。新しいセッション EJB モジュールを作成するには、session フォルダを選択します。「File (ファイル)」メニューから「New (新規)」->「J2EE」->「EJB Module (EJB モジュール)」を選択します。EJB モジュールが作成されたら、そこにセッション EJB を追加します。
次の図は、BankTeller EJB と InterestCalculator EJB を EJB モジュール SessionModule に追加する画面です。
図 6-12 Sun ONE Studio を使用して、EJB モジュールに EJB を追加している図
エンティティ Beans 用のモジュールの作成
- エンティティ Beans のフォルダには、次のエンティティ Bean の Bean クラス、リモートインタフェース、ホームインタフェースが格納されています。
- JDBC ドライバを設定します。
エクスプローラの「Runtime (実行時)」ビューで、ツリーから「Database (データベース)」の下の「Drivers (ドライバ)」を選択します。右クリックして、ポップアップメニューから「Add Driver (ドライバの追加)」を選択します。「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
- データベース接続プロパティを定義します。
エクスプローラの「Runtime (実行時)」ビューで「Database (データベース)」を選択します。右クリックして、ポップアップメニューから「Add Connection... (接続を追加)」を選択します。「New Database Connection (新規データベース接続)」ダイアログボックスで、使用するドライバ、完全な接続 URL、ユーザー名とパスワード、および適切なデータベーススキーマを指定します。
図 6-13 Sun ONE Studio でデータベース接続を設定するダイアログボックスを示す図
- 既存のソースファイルから、新しい EJB を作成します。
エクスプローラの「File Systems (ファイルシステム)」タブを選択します。マウントされたディレクトリ entity を選択します。「File (ファイル)」メニューから「New (新規)」->「J2EE」->「CMP Entity EJB (CMP エンティティ EJB)」を選択します。New EJB Wizard (EJB の新規作成ウィザード) が表示されます。
EJB 名を指定し、EJB のパッケージを定義します。「Source for Entities and Fields (エンティティのソースとフィールド)」ペインで「Table from Database Connection (データベース接続表)」を選択して、EJB フィールドの持続性のために使用するデータベース表を指定します。
図 6-14 コンテナ管理による持続性を保持するエンティティ Bean の作成
次の図のウィザード画面で、定義されているデータベース接続のリストから適切な接続を選択します。接続を選択すると、この接続からアクセスできる表のリストが表示されるので、適切な表を選択します。
図 6-15 CMP Bean フィールドのマッピング用の表の選択
次の画面では、選択した表のカラムと Bean の CMP フィールド間でのマッピングを設定します。ここでは、Bean のフィールド名と対応する Java タイプを正しく指定するように、注意する必要があります。
図 6-16 表のカラムと Bean の CMP フィールド間でのマッピング
次の画面では、エンティティ Bean のソースファイルを指定します。
図 6-17 表のカラムと Bean の CMP フィールド間でのマッピング
次の手順では、「Modify Class (クラスを変更)」ボタンをクリックして既存のソースファイルから EJB を作成することを Sun ONE Studio for Java に通知します。
既存のソースファイルを選択したときに、エラーが発生した場合、前の手順をきちんと行っていないか、あるいはソースが正しく移行されていない可能性があります。このようなエラーが発生した場合、修正を行って対処する必要があります。
次の画面ショットは、EJB Bean クラス用に、既存のソースファイルを選択しているところです。
図 6-18 既存の Bean クラスを選択して Bean クラスを作成している図
上記の手順を繰り返して、すべてのエンティティ Beans を作成します。
- EJB のプロパティを編集します。
エクスプローラで新しい EJB を選択し、右クリックして、ポップアップメニューから「Properties (プロパティ)」を選択します。「Properties (プロパティ)」ウィンドウが表示されます。
「Properties (プロパティ)」ウィンドウの「References (参照)」タブで、このテキストフィールドの右側の「Resource References (リソース参照)」ボタンをクリックします。
「Add Resource Reference (リソース参照の追加)」ダイアログボックスで、エンティティ Bean Customer に次のプロパティを設定します。
「Standard (標準)」タブで、データソースの完全名 (jdbc/DataSourceName) とリソースタイプ (javax.sql.DataSource) を指定し、このリソースへのアクセスを管理するオプション (「Authorization (認証)」) のドロップダウンリストから、「Container (コンテナ)」を選択します。
宣言を作成したら、「Sun ONE App Server」タブを選択し、前に定義したリソース参照に対応するエントリの JNDI 名のカラムに、データソースの JNDI 名jdbc/iBankを指定します。ユーザー名とパスワードも指定します。
「Properties (プロパティ)」ウィンドウの「Sun ONE AS」タブを選択し、「Reference Resource Mapping (リソース参照マッピング)」をクリックしてから、使用する必要があるサーバーインスタンスで、データソース jdbc/IBank を選択します。
図 6-19 Sun ONE Application Server 用のリソース参照のマッピング
- findByPrimaryKey メソッド以外の検索の EJB QL を設定します。
EJB QL は、検索に対して指定する必要があります。CMP 2.0 仕様に従って、検索は EJB QL を使用します。
iBank アプリケーションの場合、このタイプの編集が必要なエンティティ Bean は Account Bean です。Sun ONE Studio のエクスプローラウィンドウで、AccountEJB ノードを選択し、そのノードのファインダメソッドを展開します。findByPrimaryKey 以外の検索メソッドをクリックして、その「Properties (プロパティ)」ウィンドウを開きます。
図 6-20 検索メソッドのプロパティ
「EJBQL Query (EJBQL 照会)」フィールドをクリックして、クエリを入力します。次の図は、クエリが入力されているところです。
図 6-21 検索メソッドの EJB QL の編集
- EJB モジュールを作成し、モジュール内で EJB をアセンブルします。
EntityModule という名前の新しい EJB モジュールを作成します。作成できたら右クリックし、EJB を追加するオプションを選択して、このモジュールにすべてのエンティティ Beans を追加します。J2EE 1.3 仕様に基づいて、EJB モジュールをグループ化する必要があります。
- 新しいデータベーススキーマを作成します。
「File (ファイル)」メニューから「New (新規)」を選択し、新しいデータベーススキーマを選択します。スキーマを取り込む必要があるデータベースの接続情報を定義します。
- Sun ONE Application Server 7 のデータベースエントリをマップします。
EJB モジュールの EJB ノードを選択し、このノードを右クリックして、「Properties (プロパティ)」ウィンドウを選択し、さらに「Sun ONE AS」タブを選択します。この特定のエンティティ Bean について、データベーススキーマと主表名を指定します。EJB モジュール内の他のエンティティ Bean についても、同様のプロセスを繰り返します。
次の図は、エンティティ Bean Account の主表を選択しているところです。
図 6-22 データベースのマッピング
「Next (次へ)」をクリックして、Bean の cmp フィールドと表フィールドのマッピングを指定します。
次に、「Properties (プロパティ)」ウィンドウから「Sun ONE Mapping (Sun ONE マッピング)」タブを選択し、再度マッピングを入力します。
次の図は、Account EJB のマッピングを示しています。
図 6-23 エンティティ Bean「Account」のプロパティ
同様に、すべてのエンティティ Beans のマッピングを設定します。
データベース表フィールドに対応する特定のエンティティ Bean のマッピングについては、「エンティティ Bean の関係の定義」を参照してください。
- CMP リソースを追加します。
EntityModule を選択し、プロパティを表示します。「Sun ONE AS」タブを選択し、今度は「CMP Resource (CMP リソース)」ボタンをクリックして持続性マネージャファクトリを設定します。
次の図に設定のようすを示します。
図 6-24 CMP リソースの追加
Sun ONE Studio for Java でのエンタープライズアプリケーションの作成
Web アプリケーションと EJB ファイルを作成したら、今度はすべてのモジュールをグループ化するエンタープライズアプリケーションを作成します。エンタープライズアプリケーションの作成プロセスは、以下のとおりです。
- ソースに利用できる同じパッケージの下にある新しいディレクトリ IBank に、新しいエンタープライズアプリケーションモジュールを作成します。
- Web モジュールと EJB モジュールをエンタープライズアプリケーションモジュールに追加します。
次の図は、WarContent という Web モジュール、および SessionModule と EntityModule という EJB モジュールを含んだ iBank エンタープライズアプリケーションを示しています。
図 6-25 アプリケーションへのモジュールの追加
次の図は、3 つのモジュールを含んだ iBank アプリケーションを示しています。
図 6-26 異なるモジュールを含んだ iBank アプリケーションのファイルシステムを示す図
- エンタープライズアプリケーションのプロパティを編集します。
プロパティエディタを使用すると、エンタープライズアプリケーションモジュールに、異なるプロパティを設定することができます。特に、このエディタでは、エンタープライズアプリケーションの Web モジュールについて、ルートコンテキスト名を定義します。
図 6-27 Web コンテキストの指定
- EAR ファイルをエクスポートします。
エンタープライズアプリケーションを右クリックして 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 のインスタンスでのアプリケーションの配備です。アプリケーションを配備するプロセスは、以下に示すとおりです。
- Sun ONE Studio for Java から Sun ONE Server 7 のインスタンスへのアプリケーションの配備
EAR ファイルを右クリックし、「Deploy (配備)」オプションを選択します。これによって、デフォルトのサーバーインスタンスに、アプリケーションが配備されます。サーバーインスタンスを再起動し、アプリケーションをテストします。
- Sun ONE Application Server 7 の asadmin ユーティリティによるインスタンスへのアプリケーションの配備
Sun ONE Studio for Java を使用しないで、Sun ONE サーバーインスタンスに、エンタープライズアプリケーションを配備する場合、Sun ONE Studio for Java からアプリケーションの EAR アーカイブを作成およびエクスポートした後で、Sun ONE Application Server 7 の asadmin ユーティリティを使用します。