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