ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Web アプリケーション、サーブレット、JSP の開発
11g リリース 1 (10.3.1)
B55521-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

17 WebLogic EJB-to-JSP 統合ツールの使い方

以下の節では、WebLogic EJB-to-JSP 統合ツールを使用して、JavaServer Page (JSP) で EJB を呼び出すための JSP タグ ライブラリを作成する方法について説明します。ここでは、読者が少なくとも EJB と JSP の両方についてある程度の知識を持っていることを前提としています。

WebLogic EJB-to-JSP 統合ツールの概要

EJB jar ファイルを使用する場合、WebLogic EJB-to-JSP 統合ツールで JSP タグ拡張ライブラリを生成します。このライブラリのタグは、その jar ファイルの EJB を呼び出すようにカスタマイズされます。クライアントから見た場合、EJB はそのリモート インタフェースによって表されます。次に例を示します。

public interface Trader extends javax.ejb.EJBObject {
  public TradeResult buy(String stockSymbol, int shares);
  public TradeResult sell(String stockSymbol, int shares);
}

EJB を呼び出す Web アプリケーションの場合、JSP スクリプトレット (<% ... %>) 内から Java コードを使用して EJB を呼び出すのが一般的な方法です。EJB 呼び出しの結果は HTML としてフォーマット化され、Web クライアントに提供されます。このアプローチは面倒で、エラーを引き起こしやすくなります。EJB の呼び出しに必要な Java コードは最も単純なケースでも非常に長く、HTML 表現を担当するほとんどの設計者のスキルを超えています。

EJB-to-JSP ツールは、Java コードの必要性を排除することによって、EJB 呼び出しプロセスを簡素化します。代わりに、EJB 用にカスタム生成される JSP タグ ライブラリを使用して、EJB を呼び出します。たとえば、上の Trader Bean のメソッドは、次のように JSP で呼び出されます。

<%@ taglib uri="/WEB-INF/trader-tags.tld" prefix="trade" %>
<b>invoking trade: </b><br>

<trade:buy stockSymbol="BEAS" shares="100"/>

<trade:sell stockSymbol="MSFT" shares="200"/>

この結果として生成される JSP ページは、より明確で直感的に理解できます。タグは EJB の各メソッドに対して (オプションで) 生成されます。これらのタグは、対応する EJB メソッド呼び出し用のパラメータに変換される属性を取ります。EJB 呼び出しの面倒な機構は隠され、生成されるタグ ライブラリのハンドラ コードの内部にカプセル化されます。生成されるタグ ライブラリは、ステートレス セッション Bean とステートフル セッション Bean、およびエンティティ Bean をサポートします。これらのケースでは、タグの使用方法にそれぞれ若干の相違があります (後述の説明を参照)。

基本的な処理

WebLogic EJB-to-JSP 統合ツールは、コマンドライン モードで、次のコマンドを使用して実行できます。

java weblogic.servlet.ejb2jsp.Main

またはグラフィカル モードで次のようにします。もっとも単純な EJB 以外は、グラフィカル ツールを使用する方法が適しています。

次のようにグラフィカル ツールを呼び出します。

java weblogic.servlet.ejb2jsp.gui.Main

最初は、Web アプリケーションによって ejb2jsp プロジェクトがロードされません。新しいプロジェクトを作成するには、[File|New] メニューを選択し、ファイル選択欄を参照して EJB jar ファイルを見つけ、そのファイルを選択します。初期化が済んだら、ejb2jsp プロジェクトを修正、保存、および再ロードできます。

生成されるタグ ライブラリの構成は単純です。jar ファイル内の EJB のメソッドごとに、そのメソッドと同名の JSP タグが生成されます。各タグには、対応するメソッドのパラメータと同数の属性を指定できます。

インタフェース ソース ファイル

新しい EJB jar がロードされると、統合ツールは EJB のホーム インタフェースとリモート インタフェース用の Java ソース ファイルを見つけようとします。これは、変換ツールは EJB クラスを参照するだけでタグを生成できますが、それらのタグ (対応する EJB メソッドがパラメータを取る) に意味のある属性名を割り当てることができないからです。「WebLogic EJB-to-JSP 統合ツールの概要」の Trader の例では、EJB jar がロードされると、変換ツールは Trader.java というソース ファイルを探します。続いてこのファイルが解析され、buy() メソッドが stockSymbol および shares パラメータを取ることが検出されます。これにより、対応する JSP タグは適切な名前が付けられた属性 (buy() メソッドのパラメータに対応する) を持つようになります。

新しい EJB jar がロードされると、変換ツールは、EJB jar が存在するディレクトリとソース ディレクトリが同じであるという前提で動作します。この前提に当てはまらない場合でも、エラーは致命的ではありません。新しいプロジェクトのロード後に、[Project Build Options] パネルで、[EJB Source Path] 要素を調節して適切なディレクトリを指定できます。次に、[File|Resolve Attributes] メニューを選択して、解決プロセスを再実行します。

インタフェース クラスに対応する java ソース ファイルを探すときに、統合ツールは指定されたディレクトリと、そのインタフェースの Java パッケージによって示唆されるサブディレクトリの両方を検索します。たとえば、my.ejb.Trader の場合、指定されたディレクトリが C:/src であれば、統合ツールは C:/src/Trader.javaC:/src/my/ejb/Trader.java の両方を検索します。

ソース ファイルへのアクセスは必須ではありません。統合ツールを使用することにより、プロジェクトの各タグの属性名を常に変更できます。しかし、EJB のパブリック インタフェースのソース ファイルの解析は、意味のある属性名を割り当てるための最も迅速な方法として開発されました。

[Build Options] パネル

このパネルは、プロジェクトの構築に必要なローカル ファイル システムに関連するすべてのパラメータを設定するために使用します。Java コンパイラ、生成される JSP タグ ハンドラの Java パッケージ、およびプロジェクト構築後に生成される Java コードを保持するかどうか (デバッグに役立つ) を指定します。

また、このパネルでは、タグ ライブラリ出力の種類を指定できます。J2EE Web アプリケーションの場合、タグ ライブラリは次の 2 通りの方法のいずれかでパッケージ化する必要があります。1 つは別個のクラス ファイルとタグ ライブラリ記述子 (.tld) ファイルで、もう 1 つは単一の taglib jar ファイルです。いずれかの出力タイプを [Output Type] プルダウン メニューで選択します。開発およびテストのために、DIRECTORY 出力をお勧めします。jar ファイルは、WebLogic Server の Web アプリケーションを再配布しなければ上書きできないからです。

DIRECTORY または JAR のいずれかについて、出力先を適切に選択して、タグ ライブラリが Web アプリケーションによって検索されるようにします。たとえば、ディレクトリ C:/mywebapp をルートとする Web アプリケーションでタグ ライブラリを使用する場合、[DIRECTORY classes] フィールドには次のように指定する必要があります。

C:/mywebapp/WEB-INF/classes

また、[DIRECTORY .tld File] フィールドには次のように指定する必要があります。

C:/mywebapp/WEB-INF/trader-ejb.tld

前述のソース パスも [Build Options] パネルで編集します。タグ ライブラリがコア WebLogic Server または J2EE API に存在しない他のクラスに依存する場合は、[Extra Classpath] フィールドを使用できます。通常、このフィールドには何も追加する必要はありません。

トラブルシューティング

エラーや衝突によって、プロジェクトの構築に失敗する場合があります。この節では、これらのエラーの理由と解決方法について説明します。

JSP ページでの EJB タグの使い方

生成された EJB タグを JSP ページで使用するには、そのページでタグ ライブラリを宣言し、他のタグ拡張と同じようにそのタグを呼び出します。

<% taglib uri="/WEB-INF/trader-ejb.tld"
 prefix="trade" %>
<trade:buy stockSymbol="XYZ" shares="100"/>

void 以外の戻り値の型を持つ EJB メソッドのために、「_return」という特別なオプションのタグが組み込まれています。このタグが存在する場合、このメソッドから返される値は将来の処理のためにページ上で使用できます。

<% taglib uri="/WEB-INF/trader-ejb.tld"
  prefix="trade" %>
<trade:buy stockSymbol="XYZ"
 shares="100" _return="tr"/>
<% out.println("trade result: " + tr.getShares()); %>

プリミティブ数値型を返すメソッドの場合、返される変数は、その型に対応する Java オブジェクトです (「int」-> java.lang.Integer、など)。

EJB ホーム メソッド

EJB 2.0 では、EJB ホーム インタフェースのメソッド (create() または find() 以外) を使用できます。これらのホーム インタフェース用のタグも生成されます。混乱を避けるため、新規プロジェクトがロードされるときに、EJB のホームの各メソッドに対応するタグの先頭に「home-」という文字列が付加されます。必要な場合は、これらのメソッドの名前を変更できます。

ステートフル セッション Bean とエンティティ Bean

「ステートフル」Bean の一般的な用途は、Bean のホーム インタフェースからそのインスタンスを取得し、単一の Bean インスタンスの複数のメソッドを呼び出すことです。このプログラミング モデルも、生成されるタグ ライブラリに保存できます。ステートフル EJB メソッド用のメソッド タグは、EJB ホーム インタフェースの (そのホームの find() または create() に対応する) タグの内部に配置する必要があります。find/create タグの内部に存在するすべての EJB メソッド タグは、終了タグによって検索または作成される Bean インスタンスで処理されます。ステートフル Bean のメソッド タグがそのホームの find/create タグで閉じられていない場合、実行時例外が発生します。たとえば、次の EJB が存在するとします。

public interface AccountHome extends EJBHome {

  public Account create(String accountId, double initialBalance);
  public Account findByPrimaryKey(String accountID);
    /* 残高がしきい値以上の口座をすべて検索する */
  public Collection findBigAccounts(double threshold);
}
  
public interface Account extends EJBObject {
  public String getAccountID();
  public double deposit(double amount);
  public double withdraw(double amount);
  public double balance();
}
この場合、正しいタグの使い方は次のようになります。
<% taglib uri="/WEB-INF/account-ejb.tld" prefix="acct" %>
<acct:home-create accountId="103"
  initialBalance="450.0" _return="newAcct">
 <acct:deposit amount="20"/>
 <acct:balance _return="bal"/>
 Your new account balance is: <%= bal %>
</acct:home-create>

find/create タグで「_return」属性が指定されている場合、検索/作成された EJB インスタンスを参照するページ変数が作成されます。エンティティ Bean の検索メソッドも、EJB インスタンスのコレクションを返す場合があります。Bean のコレクションを返すメソッドを呼び出すホーム タグは、そのコレクションの Bean ごとにタグ本体で繰り返されます。「_return」が指定されている場合、それはその繰り返しの内部の現在の Bean に設定されます。

<b>Accounts above $500:</b>
<ul>
<acct:home-findBigAccounts threshold="500" _return="acct">
<li>Account <%= acct.getAccountID() %>
     has balance $<%= acct.balance() %>
</acct:home-findBigAccounts>
</ul>

上の例では、残高が $500 を超えるすべての口座 Bean の HTML リストが表示されます。

デフォルト属性

デフォルトでは、各メソッドのタグでは、そのすべての属性 (メソッド パラメータ) が各タグ インスタンスに設定される必要があります。しかし、統合ツールでは、JSP タグに属性が指定されていない場合に備えて、「デフォルト」のメソッド パラメータを指定することもできます。デフォルトの属性/パラメータは、EJB-to-JSP ツールの [Attribute] ウィンドウで指定できます。パラメータのデフォルトは、単純な EXPRESSION から取得されるか、より複雑な処理が必要な場合、デフォルト METHOD 本文が記述されます。たとえば、「WebLogic EJB-to-JSP 統合ツールの概要」の Trader の例で、何も指定されていない場合、株式シンボルの「XYZ」に対して「buy」タグを動作させるとします。この場合、「buy」タグの「stockSymbol」属性の属性パネルで、[Default Attribute Value] フィールドを EXPRESSION に設定し、[Default Expression] フィールドに "XYZ" (引用符を含む) と入力します。この結果、buy タグは stockSymbol="XYZ" 属性が存在するかのように動作します (他の値が指定されていない場合)。

また、「buy」タグの株式属性を 0 ~ 100 のランダムな数値にしたい場合、[Default Attribute Value] を METHOD に設定し、[Default Method Body] 領域に、int 型 (「buy」メソッドの「shares」属性に対応する型) を返す Java メソッドの本文を記述します。

long seed = System.currentTimeMillis();
java.util.Random rand = new java.util.Random(seed);
int ret = rand.nextInt();
/* 正の数であることを確認 */
ret = Math.abs(ret);
/* 100 より小さいことを確認 */
return ret % 100;

デフォルトのメソッド本文は JSP タグ ハンドラの内部に現れるため、作成するコードは pageContext 変数にアクセスできます。JSP PageContext から、現在の HttpServletRequest または HttpSession へのアクセスを取得し、セッション データまたは要求パラメータを使用してデフォルト メソッド パラメータを生成できます。たとえば、ServletRequest パラメータから「buy」メソッドの「shares」パラメータを取得するには、次のコードを記述します。

HttpServletRequest req =
 (HttpServletRequest)pageContext.getRequest();
String s = req.getParameter("shares");
if (s == null) {
  /* webapp エラー ハンドラが、この例外のエラー ページに
   * リダイレクトされる
   */
  throw new BadTradeException("no #shares specified");
}
int ret = -1;
try {
  ret = Integer.parseInt(s);
} catch (NumberFormatException e) {
  throw new BadTradeException("bad #shares: " + s);
}
if (ret <= 0)
  throw new BadTradeException("bad #shares: " + ret);
return ret;

生成されるデフォルト メソッドは例外を送出するものと見なされます。処理中に発生した例外は、JSP の errorPage によって処理されるか、Web アプリケーションの登録済み例外処理ページによって処理されます。