第1章 概説 (Overview)
1.1
サーブレットとは何か? (What is a Servlet?)
サーブレットはウェブのコンポネントであり、コンテナにより管理され、ダイナミックなコンテンツを生成するものである。サーブレットはコンパクトで、プラットフォームに依存しないクラスの集まりで、アーキテクチャに非依存のバイトコードにコンパイルされ、ウェブサーバにダイナミックにロードされ実行される。サーブレットはサーブレット コンテナに実装された要求(Request)/応答(Response)のパラダイムを介してウェブク ライアントとかかわりあう。この要求/応答モデルは、ハイパーテキスト転送プロトコル(HTTP: Hyper Text Transfer Protocol)の動作をベースとしている。
1.2
サーブレット コンテナとは何か? (What is a Servlet Container?)
サーブレットコンテナは、ウェブサーバまたはアプリケーション サーバとともになって、要求と応答がセットされるネットワーク サービスを行い、MIMEベースの要求をデコードし、MIMEベースの応答のフォーマットを作成する。サーブレット コンテナはまた、サーブレットをそのライフサイクルにわたって包含しかつ管理する。
サーブレット コンテナはホストのウェブ サーバに組み込まれるか、そのサーバのネーティブの拡張を介してウェブ サーバにアドオンのコンポネントとしてインストールされる。サーブレット コンテナはまた、ウェブ対応アプリケーション サーバのなかに組み込み、あるいはインストールされ得る。
全てのサーブレットコンテナは要求と応答のプロトコルとしてHTTPをサポートしなければならないが、たとえばHTTPS(HTTP over SSL)のような付加的な要求/応答ベースのプロトコルにも対応しても良い。コンテナが実装しなければならないHTTPの最低要求バージョンはHTTP/1.0である。HTTP/1.1仕様も実装したコンテナを強く推奨する。
サーブレット コンテナは、サーブレットが実行する環境上でのセキュリティの制約を課してもよい。Java 2 プラットフォーム スタンダード エディション1.2(J2SE)または、Java 2 プラットフォーム エンタープライズ エディション1.2(J2EE)環境においては、Java 2プラットフォームで定義された許可のアーキテクチャを使ってこれらの制約が課されなければならない。例えば、ハイエンドのアプリケーション サーバでは、このコンテナの他のコンポネントに絶対マイナスのインパクトを与えないように、Threadオブジェクトの生成のようなある種のアクションには制限を課しても良い。
1.3
事例 (An Example)
ウェブのブラウザの如きクライアント プログラムがウェブ サーバをアクセスしてHTTP要求を行う。この要求はウェブ サーバによって処理され、サーブレット コンテナに引き渡される。サーブレット コンテナは、内部の構成に基づき呼び出すべきサーブレットを確定し、要求と応答を表現するオブジェクトを付けてこれを呼び出す。サーブレット コンテナはホストのウェブ サーバと同じプロセスの中で、あるいは同じホストの別のプロセスの中で、あるいはウェブ サーバと別のホスト上で実行させ要求を処理することができる。
サーブレットはこの要求のオブジェクトを使ってリモート ユーザは誰か、この要求の部分としてどのようなHTMLのフォーム パラメタが送られてきたか、あるいは他の関連データを見出すことが出来る。サーブレットは次にプログラムされた何らかのビジネス ロジックを実行し、クライアントに送り返すべきデータを作り出す。サーブレットは次にこのデータを応答のオブジェクトを使ってクライアントに送り返す。
このサーブレットが概要求の処理を終了したら、サーブレット コンテナは応答が正しく吐き出されたことを確認して、制御をホストのウェブ サーバに戻す。
1.4
サーブレットと他のテクノロジとの比較 (Comparing Servlets with Other
Technologies)
機能的にはサーブレットは共通ゲートウェイ インターフェイス(CGI: Common Gateway Interface)とネットスケープ サーバAPI(NSAPI: Netscape Server API)やApacheモジュールの如き独自のサーバ拡張機能との間に属するといえる。
サーブレットはサーバ拡張のメカニズムと比較して次のような特徴がある:
· 異なったプロセス モデルを使っているので、CGIスクリプトよりは一般にはるかに高速である
· 多くのウェブサーバが対応している標準のAPIを使っている
· 開発の容易性とプラットフォームからの独立性を含むJavaプログラミング言語の全部の優位性を保持する
· Javaプラットフォーム用に使える大量のAPIセットにアクセスできる
1.5
Java 2
プラットフォーム エンタープライズ版との関係 (Relationship to Java 2 Platform
Enterprise Edition)
サーブレットAPIは、Java 2 エンタープライズ エディション v1.21が要求しているAPIである。J2EE仕様には、J2EE環境で実行するサーブレット コンテナと、それに使われるサーブレットに対する追加的な要求が記されている。
注1: 下記のURLから取得できるJava 2 エンタープライズ エディションの仕様書を参照のこと。
http://java.sun.com/j2ee/
1.6
配布可能サーブレット コンテナ (Distributable Servlet Containers)
本仕様書の今回の版で新規のものとして、ウェブ アプリケーションにdistributable(配布可能)としてマークできるようになったことがある。この表示により、同一ホストあるいは複数のホスト上で実行している複数のJavaバーチャル マシンをまたがるウェブ アプリケーションに、サーブレット コンテナの供給者がこのサーブレットを使えるようになる。配布可能なアプリケーションをサポートするコンテナがクラスタリングとかフェイルオーバとかの特徴を実装できるように、配布可能としてマークされたアプリケーションにはいくつかの制約に従わねばならない。
スケーラビリティ、クラスタリング、およびフェイルオーバが許容される(例えばJ2EE実装対応)高性能の環境下で走らねばならないような全てのウェブ アプリケーションは、配布可能なウェブ アプリケーションとして書かれねばならない。これによりアプリケーションはこれらの機能を持つサーバの利点を最大に活かすことが出来る。このようなサーバに非配布可能なアプリケーションを採用してしまうと、そのようなサーバに与えられている特長を十分に活かすことが出来なくなる。
1.7
2.1版からの変更 (Changes Since Version 2.1)
第2.1版から本仕様になされた主要な変更点は以下のとおりである:
· ウェブ アプリケーションのコンセプトの導入
· ウェブ アプリケーションのアーカイブ ファイルの導入
· 応答のバッファリングの導入
· 配布可能サーブレットの導入
· RequestDispatcherの名前による取得の可能化
· RequestDispatcherの相対パスを使った取得の可能性
· 国際化の改善
· サーブレット エンジンの言葉の意味の明確化
以下の変更がAPIになされている:
· getServletNameメソッドをServletConfigインターフェイスに追加し、サーブレットに名前を持たせ、必要ならシステムがそれを知ることを可能とした
· ServletContextインターフェイスにgetInitParameterとgetParameterNamesメソッドを追加し、初期化パラメタがアプリケーション レベルで設定でき、このアプリケーションに含まれる全てのサーブレットで共有できるようにした
· ServletRequestインターフェイスにgetLocaleメソッドを追加し、クライアントがどの地域にいるかの決定に役立てる
· ServletRequestインターフェイスにisSecureメソッドを追加、概要求がHTTPSのようなセキュアなトランスポート経由で送られてきたかどうかを示すようにした
· 既存のコンストラクタのシグネチュアではデベロッパでの混乱が生じたため、UnavailableExceptionのコンストラクト法を置換えた。これらのコンストラクタはよりシンプルはシグネチュアに置換えられた
· HttpServletRequestインターフェイスにgetHeadersメソッドを追加、特定の名前のを持つ全てのヘッダをその要求から取り出せるようにした
· HttpServletRequestインターフェイスにgetContextPathメソッドを追加、ウェブ アプリケーションに関連した要求パスの一部が取得できるようにした
· IsUserInRoleとGetUserPrincipleメソッドをHttpServletRequestインターフェイスに追加し、サーブレットが抽象ロール ベースの認証を使えるようにした
· HttpServletResponseインターフェイスにaddHeader、addIntHeaderおよびaddDateHeaderメソッドを追加、同じヘッダ名で複数のヘッダが生成できるようにした
· HttpSessionインターフェイスにgetAttribute、getAttributeNames、setAttributeおよびremoveAttributeメソッドを追加、APIのネーミング規約を改良した。本変更の一環としてgetValue、betValueNames、setValueおよびremoveValueメソッドは使用不可(deprecated)とした
加えて、本仕様書では数多くの不明確な個所の明確化がなされている。