JavaBeans は MVC デザインパターンに従うように JSP ページから Java オブジェクトを
使用する方法です。この方法を使用する目的は
Pull モデル
(日本語訳)
と同様のものを実装することです。例えば、
 |
 |
 |
 |
<jsp:useBean id="name" scope="page|request|session|application"
class="className" type="typeName">
|
 |
 |
 |
 |
上記のコードの構文を調べて、すぐ最初に思い浮かぶのは scope 属性の使用です。
スコープに関するプログラミング概念がわかっている
HTML デザイナがどのくらいいるでしょうか?
Web デザイナの大部分は CGI の仕組についてほとんどわかってないと思っておいて
間違いありません。だからといって、彼らを軽んじているわけではありません。
そうではなくて、ただ単にデザインとソフトウェア工学は全く異なるスキルセット
であると指摘しているのです。Java プログラマが印刷や Web で表示に問題ない
カラーパレットを選べることを期待しないですよね?
このような議論に対する一般的な反応は、デザイナは単にこうしたタグを無視して、
他の人が定義・実装すればいいのではないか、というものです。
この方法の問題は、デザイナがうっかりアプリケーションが壊してしまう
可能性があり、その場合、複雑なスコープの問題はなかなか表にでないことがあるため、
デバッグしづらいということです。
 |
 |
 |
 |
Java のコード:
public class HelloBean {
private String name = "World";
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
JSP のコード:
<jsp:useBean id="hello" class="HelloBean">
<jsp:setProperty name="hello" property="*" />
</jsp:useBean>
<HTML>
<HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>
Hello, <jsp:getProperty name="hello" property="name" />
</H1>
</BODY>
</HTML>
|
 |
 |
 |
 |
上記のコードは、ページで Bean を使う非常に単純な例を示しています。
この Bean にいくつかのプロパティを渡して、それから結果を取り出します。
これは JSP を使う際の正しいやり方です。
しかし、Velocity でまったく同じことをする例を見れば、
プロパティを取り出すためだけに必要な余分なタイピングが
いささかバカらしくなります。
もちろん現実には、タイピングを過去の遺物とする、GUIベースの
ドラッグ&ドロップ ツールが、前々からあります。
現在、JSP と Struts での開発向けに、
素晴らしいドラッグ&ドロップビュー機能を提供する商用のソリューションがいくつかあります。
しかし、これらのツールの多くは、まだ第一世代のツールです。
これらのツールは多くの場合は問題の一部しか解決しておらず、
GUI では難しいことや、GUIでは不可能な場合に関して核心まで掘り下げる必要があります
(Tango という製品を覚えていませんか?)
[訳注: Tango はデータベースアクセスを目的とした CGI のプログラミングツール]。
また、これらのツールが生成するコードは、高い負荷のサイト向けに最適化されていない
ことが多く、既存のアプリケーションを大規模向けに拡張しようとすると、
完全に書き直しが必要になることがあります。繰り返しますが、
決めるのは我々ではなくあなたです。ここでもう一点注意すべきことは、こうしたツールは高価
(マシン1台あたり1,000ドルをこえる) であるということです。
ドットコムならぬドットボムな経済状況で、
こうしたツールに実際にお金を費やす人がいるのでしょうか?
 |
 |
 |
 |
Java コード:
context.put ("hello", new HelloBean());
Velocity コード:
$hello.setName("*")
<HTML>
<HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>
Hello, $hello.Name
</H1>
</BODY>
</HTML>
|
 |
 |
 |
 |
この例では、HelloBean() オブジェクトを作成してコンテキストに設定しています。
そうすると、テンプレートのランタイム実行時に $variable として利用できます。
この変数は、オブジェクトでイントロスペクションを行うことで、JavaBean仕様を使用可能です。
例えば、Velocity では Bean スタイルのイントロスペクションを使って、
メソッド呼び出しを $hello.getName() から上記に示したように短縮できます。
Velocity を Turbine と組み合わせると、HelloBean オブジェクトは設定オプションとして、
処理中のどの時点でもコンテキストに加えることができます。これによって、
コンテキスト内のオブジェクトで「スコープ」を提供できます。
JSP で JavaBeans を使う際のもう一つの「なるほど…そういうことか!」
について、ジェイソンの書籍から再び引用します。
 |
 |
 |
 |
注意: サーバ (Tomcat 3.2を含む) によっては、
「セッション」スコープまたは「アプリケーション」スコープの Bean
において、Bean の実装を変更すると、変更後のリクエスト時に
ClassCastException になるかもしれません。この例外が発生するのは、
生成された Servlet コードは Bean のインスタンスを
セッションやアプリケーションから取り出した形でキャストしなければならず、
その結果、セッションやアプリケーションに格納されている古い Bean の型が期待される新しい
Bean の型とマッチしないためです。一番簡単な解決策は、サーバを再起動することです。
|
 |
 |
 |
 |
[どちらを選ぶかは] あなたが判断してください。
[ エラー処理 <- 前 |
次 -> サンプルアプリケーション ]