ステートフルセッションBean |
|
 |
ステートフルセッションBeanは内部状態を保持するセッションBeanです。クライアントが同じBeanスタブに対してメソッド呼び出しを行うと、コンテナ内の常に同じBeanインスタンスに呼び出しが渡されます。つまり、Beanインスタンスのすべてのフィールド変数は、クライアントアプリケーションがBeanスタブ(ローカルクライアントの場合は参照)を持ち続ける間は値を保持します。ステートフルセッションBeanは次のようなアプリケーションで、状態を追跡するためによく使われます。
- Webアプリケーションでは、サーブレット(またはJSPページ)でBeanスタブを
HttpSession オブジェクトの属性として格納します。こうすることで、HTTPセッションの状態をBeanインスタンスに保持し、追跡することができます。
- リッチクライアントJavaアプリケーション(たとえばSwingアプリケーション)では、アプリケーション独自のセッションを作り、そこにステートフルセッションBeanのスタブを保持します。
|
|
|
 |
このトレイルでは、同じセッションで行った、過去の計算履歴を記録する投資計算プログラムを作成してみましょう。同じセッションからJSPページにアクセスするといつも同じ投資計算Beanのスタブを取得し、セッションの履歴データをEJB 3.0コンテナ内の同じBeanインスタンスからロードします。
|
|
|
 |
Calculator インタフェースは、セッションBeanのローカルビジネスインタフェースです。セッションの状態プロパティにアクセスするメソッドを追加することに注目してください。<Integer> <Double>はArrayList 内のオブジェクトの型を示します。JDK 1.5の総称(generics)についてはSunのWebサイトをご覧ください。
public interface Calculator {
public double calculate (int start, int end,
double growthrate, double saving);
public ArrayList <Integer> getStarts ();
public ArrayList <Integer> getEnds ();
public ArrayList <Double> getGrowthrates ();
public ArrayList <Double> getSavings ();
public ArrayList <Double> getResults ();
}
|
|
|
 |
StatefulCalculator ステートフルBeanの実装はとても率直なコードです。実装クラスを@Stateful でアノテーションし、ArrayList オブジェクトを使ってセッションBeanインタフェースで定義したBeanのプロパティを記述します。ArrayList オブジェクトは、クライアントセッションの開始時にBeanインスタンスが作成される際に初期化されます。次に示すのは、StatefulCalculator クラスの全コードです。ステートフルセッションBeanはSerializable インタフェースを実装することを忘れないでください。使用中でないBeanインスタンスを、状態を保持したまま外部媒体に保存するには、コンテナはオブジェクトをシリアライズする必要があるからです。
@Stateful
public class StatefulCalculator implements Calculator, Serializable {
public ArrayList <Integer> starts = new ArrayList <Integer> ();
public ArrayList <Integer> ends = new ArrayList <Integer> ();
public ArrayList <Double> growthrates = new ArrayList <Double> ();
public ArrayList <Double> savings = new ArrayList <Double> ();
public ArrayList <Double> results = new ArrayList <Double> ();
public double calculate (int start, int end,
double growthrate, double saving) {
// calculate the result ...
starts.add(Integer.valueOf(start));
ends.add(Integer.valueOf(end));
growthrates.add(Double.valueOf(growthrate));
savings.add(Double.valueOf(saving));
results.add(Double.valueOf(result));
return result;
}
public ArrayList <Integer> getStarts () {
return starts;
}
// Other getter methods for the attributes ...
}
|
|
|
 |
JSPクライアントでは、StatefulCalculator のBeanスタブを取得し、HttpSession オブジェクトに関連付けます。こうすることにより同じセッションからは常に同じスタブ、つまりコンテナ内の同じBeanインスタンスにアクセスできます。次に示すのはJSPページの抜粋です。
Calculator cal =
(Calculator) session.getAttribute("sfsb_cal");
if (cal == null) {
try {
InitialContext ctx = new InitialContext();
cal = (Calculator) ctx.lookup(
"EJB3Trail/StatefulCalculator/local");
session.setAttribute ("sfsb_cal", cal);
} catch (Exception e) {
e.printStackTrace ();
}
}
// Make use of the cal object
|
|
|
 |
EJBサーバ
EJBクライアント
|
|
|
 |
このトレイルでは、WebアプリケーションでステートフルセッションBeanを使ってユーザセッションの履歴を管理する方法を議論しました。セッションBeanのライフサイクルは、セッションBeanの内部状態を管理するためのとても重要なコンセプトです。では続けて、次のトレイルに行ってみましょう。
|
|