[索引]
サーブレットとJSPとの相違 |
JSPのライフサイクル |
JSP要素 |
サーブレットとJSPの連携 |
MVCモデル |
JSPカスタムタグの活用

サーブレットは強力なサーバサイドシステムですが、内容はJavaのプログラムそのものなので、Microsoft社のASP(Active Server Pages)に比べてプログラム開発が難しいと言われていました。 Sun Microsystems社はこのような問題に対応するためASPと同じアーキテクチャーのJSPを開発しました。 JSPはHTMLをベースに記述するという基本構成だけでなく、その名前も同様な呼び名になっています。
JSPは、サーブレットと同様にWebブラウザからの要求を処理して応答をHTMLで送信するサーバサイドシステムです。 サーブレットとJSPのソースを見てください。 サーブレットがJavaプログラムそのものであるのに対し、JSPはHTMLの中に特殊なタグを埋め込んで記述します。 これはASPとまったく同じやり方です。
図のサーブレットとJSPソースは同じ結果を出力します。 見てすぐわかるようにJSPはサーブレットに比べてソースが見やすく、画面の変更に対して保守性が優れています。 しかし、これはロジックが少ないからであって、ロジックが複雑な場合はかえって見にくくなってしまいます。
JSPはサーブレットに変換されてサーブレットとして実行されます。 Sun社の技術者達はJSPを直接処理するエンジンを作る代わりに、サーブレットに変換する部分だけを作り、あとはサーブレットのエンジンに任せる道を選んだのです。 皆さんがSun社の技術者だったらどうしますか。

JSPにもライフサイクルがあります。 JSPファイルは、JSPコンテナに配備されます。 JSPコンテナとは、JSPの実行環境のことです。 JSPコンテナは、JSPファイルに対して、初めてのリクエストを受信すると、JSPファイルをサーブレットのソースファイルに変換し、コンパイルしてサーブレットのクラスファイルを作成します。 その後、サーブレットクラスファイルをロードして、サーブレットとして動作させます。
(1) JSPコンテナは、初回リクエストを受信すると対応するJSPを探します。
(2) JSPファイルを解析してサーブレットソースに変換します。
(3) サーブレットソースをコンパイルしクラスファイルを作ります。
(4) それをメモリ上にロードします。
(5) プログラムを実行します。
(6) プログラムの実行結果としてブラウザに応答を返します。
(7) 同じJSPに対し2度目の要求が来ると、そのプログラムはロード済なのでそのまま実行できます。
(8) 2度目の要求に対応してプログラムを実行します。
(9) 2度目の要求に対応する応答を返します。
(10) JSP消滅時には消滅処理を実行します。
(注) (4)以降の処理は、サーブレットと同じです。

HTMLドキュメント内にJSPを記述するには、JSP独自の構成要素を使用します。 この構成要素はHTML文の中に記述するため、タグ( < > )で囲んで記述するが、通常のHTML文と区別するために < のすぐ後に % を記述します。 以下にJSP構成要素を示します。
JSPがサーブレットに変換される際の設定情報を定義します。 pageディレクティブ、includeディレクティブ、taglibディレクティブの3種があります。
JSPの基本部分。 Javaのプログラムを記述します。 スクリプトレットで記述したJavaプログラムは、_jspServiceメソッド内に展開されます。
式はJavaの出力文に変換されます。
<%= "abc" %> → out.print("abc");
宣言は_jspServiceメソッドの外に展開されます。 ここにはプログラムも書けるので、基本的にサーブレットでできることは何でもできてしまいます。
jsp:include、jsp:forward、jsp:useBeanなどが定義されています。

JSPは小規模なロジックを手軽に実装するのが得意です。 機能が豊富で基本的にサーブレットでできることはJSPでもできます(サーブレットに変換されるのですから)。 しかし、JSPには図のような限界があり、業務で使用する実用的なアプリをJSPだけで開発するのは薦められません。
プレゼンテーションに強くロジックに弱いJSPとまったく逆の特徴を持つのがサーブレットです。 実用的なアプリケーション開発ではロジックはサーブレット、画面描画はJSPのように連携プレーで対応します。 これは以前から望ましい設計モデルとされていたMVCモデルの考え方を実現する構造となっています。

ここでちょっとMVCについて説明します。 MVCとは次のコンポーネント構成で設計を進めていこうとする設計方法論です。
モデル: データとそのデータに対する処理を行う。
ビュー: ディスプレイを通して、モデルからユーザーへ情報を提供する。
コントローラ: ユーザー入力を解釈して、モデルとビューに適切な調整を施す。
ロジック(モデル)と表示(ビュー)とを切り離すことによって、お互いに影響を受けにくい柔軟な構造が実現できます。 MVCモデル自身は古くから提唱(1970年代のSmallTalk)されていましたが、実現手段がなく考え方のレベルに停まっていました。 ビューをJSPで、コントローラーやモデルをサーブレットで構築することによりMVCモデルの実現が現実的なものになりました。 現在では多くのJ2EEシステムはこの構成で作られています。
MVCの身近な例としてテレビの天気予報が挙げられます。 ソースは気象庁が発表した同じ情報ですが、各テレビ局により表示方法は様々です。 これはモデルが同じでビューが異なる例と言えます。

フレームワーク(アプリケーションフレームワーク)とは多くのプログラムで共通的に使用出来る部分を標準化して「枠組み」として提供するものです。 開発者に個別部分に専念させることで、開発の大幅な効率化をねらった仕組みです。 MVCはフレームワークでも採用されています。 代表的なフレームワークであるStruts(ストラッツ)について説明しましょう。
StrutsはJavaサーブレットとJSPを用いてWebアプリケーションを開発する際に使われるフレームワークです。 Strutsはオープンソースなので、誰でも無償で使用できます。 またソースに手を入れて変更することも自由です。
Strutsを使うと、MVCモデルに基づいた構造のアプリケーションが開発できます。 Strutsは特にCの部分の仕組みの提供に重点を置いています。 VとMの部分は自分で作ることになります。 Strutsは、また入力データのチェックを独立に行う機能も持っています。
この図はStrutsの動作の仕組みを表したものです。 Strutsの主な仕事はクライアントからのリクエストをJavaBeansに振り分け、その応答を基にJSPを呼ぶことです。 JavaBeansがモデルの役割り、Struts自体はコントローラーの役割りを果たしていることがわかります。

もう1つのフレームワークの例として富士通のWebcoordinator(ウェブコーディネータ)について紹介します。 これもMVCを実現するフレームワークです。
ウェブコーディネータはInterstage Application Framework Suite(IAFS)という製品に含まれています。 仕組みはもちろんStrutsとは異なりますが、考え方はStrutsと同じで、コントローラーの部分を支援するものです。 富士通のフレームワークの特徴は、このウェブコーディネータ以外にEJBやSOAPアプリケーションと連結するBCコーディネータ、電子フォームアプリケーションと連結するフォームコーディネータなどいくつかのフレームワークがあり、これらが相互に連携して動作することにあります。
フレームワークはうまく使うと生産性向上に大変役立ちます。 特に多数の開発者が協力して開発する大規模システムでは、全体の作りを統一化するために大変有効です。 しかし、フレームワークを使いこなすには一定の訓練と経験が必要ですので、チームの構成員に教育をする必要があります。
そこでフレームワークを活かすコツとして、フレームワークは必ず使うこと、使うフレームワークは色々変えるのではなく、会社やチーム単位で統一的なものを決めておくことなどが重要です。 いつも同じフレームワークを使い続けてそれに付随するノウハウを蓄積していくことがさらなる開発効率化のポイントになります。

JSPには、Javaのプログラムを1行ずつ記述する機能(スクリプト)以外に、ひとつのまとまった処理を実行するアクションという機能があります。 標準で実行できるアクションは7種に限られていますが、それ以外に実行する内容をユーザーが独自に定義することができます。 この機能をカスタムタグと言います。
これまで述べたようにJSPでロジックを書くのは勧められませんが、他人がよく吟味して作ったカスタムタグをロジックとして使うのは問題ありません。 有償や無償の様々なカスタムタグが提供されています。 カスタムタグはStrutsやウェブコーディネータでも利用しています。
画面表示機能を向上させるためのカスタムタグも提供されています。 図はFFC株式会社がGkittaglibと言う製品として提供しているタグの例です。 この他に画面ボタンの2度押し防止のためのタグやフレーム制御用のタグなど様々な機能のタグが提供されています。

次にWebシステムで良く使われるJavaScriptについて説明します。 JavaScriptはJ2EEではありませんが、その知識はJ2EEのエンジニアにとって重要です。 JavaScriptはJavaと言う名前が付いていますが、Javaとはまったく別の言語です。 もともとはWebブラウザの機能向上を目的にネットスケープ社が開発しました。 ブラウザ上で動作するので、サーバにアクセスしないぶんだけ軽快です。 サーバサイドシステムでも入力データの事前チェックなど、操作性を向上する目的で補完的に使われます。
サーバサイドシステムでは誤って送信ボタンを2度押してしまうと、リクエストごとに新たな処理を起動するサーブレットの利点がアダになり、処理が2回実行されてしまうことがあります。 このような問題への対処はクライアントサイドシステムであるJavaScriptが得意です。 1度押されたことを覚えていてサーバが第一のデータを受け入れるまでキー入力を無効にすればよいのです。
JavaScriptはセキュリティのためファイル入出力処理はありません。 入出力処理は画面とキーボードだけです。 しかし入力制御は意外と多彩で画面のテキストポックスの内容が少しでも変化したらプログラムを起動する(onChange)、何かキー入力があったら起動する(onKeyDown)など様々な制御ができます。
JSPと同じようにJavaScriptでもロジックの記述は勧められません。 しかし入力チェックや二度押し防止のための対策には有効です。 また、JavaScriptはブラウザの機能ですので、ブラウザの種類(Internet Explorerかネットスケープか)や版数によって微妙に仕様が異なります。 さらにJavaScriptはセキュリティ確保のためユーザが動作を無効にすることができるようになっています。 したがって、JavaScriptでチェックしても再度サーブレットでも同じチェックをするなどJavaScriptの機能を無効にされても問題ないように設計する必要があります。 以上からJavaScriptの使用に際しての留意点をまとめると図のようになります。
図にJavaScriptのサンプルを示します。 このようにJavaScriptはHTMLから見るとコメント文になるように作ります。 これはボタンを押すと現在の日時を表示します。