表 3 Servlet の代勺なメソッド javax. servlet servlce servlce doDeIete() javax. servlet. http init() doGet() doPost() doTrace() doOptions( mimeservlets. properties は、 MIME タイプをある ServIet に対応させるプロノヾティで、 mime-type/subtype= く servlet-name 〉 という書式で指定します。呼出し側の ServIet が次に呼 びたい Servlet の MIME タイプを Content-Type: へ ッダに出力すると、 Java Web Server がこれを判断して Chaining します。 ただし、このカ 1 去カイ吏えるのは、「 Servlet の使用力 1 去」 の節で紹介する ServIet 対応の Web サーバーのうち、 Java Web Server や JRun などの一部の環境に限られ ています。対応 / 非対応はそれぞれの環境のドキュメント て確認してください。 Servlet Chaining の 2 つ目のカ 1 去は、ある ServIet か ら別の ServIet のメソッドを直接起動するガ去です。たと えは、 Java Developer Connection (http://develop- er.javasoft.com/) では、セッション管理、用の Servlet を 経由して FiIeServIet へ ServIet Chaining しています。 "Cookie" response . setHeader ( public void service ( (Fi1eServIet) context . getServ1et fi1eServ1et public void init ( プログラムの一部を示します。 UNIX MAGAZINE 1998.6 fi1eServIet . service (request , response) ; "SessionServ1et=" + session. getld() ) ; HTTP リクエストが発生すると service() メソッドが 次に呼ぶ FiIeServIet をあらかしめ取得しておきます。 getServlet() メソッドを利用し、 Servlet Chaining で ロードされたときに実行される init() メソッドのなかで このプログラムでは、 Servlet が Servlet Engine に J ava のサーバー技術 実行されるので、そのセッションの HTTP Cookie を 取得しようと試み、失敗した場合は HTTP Cookie を setHeader() メソッドで HTTP ヘッダに追加してクライ アントに返します。次に service() メソッドか実行された ときには、 HTTP Cookie を HTTP ヘッダに付加してか ら、あらかじめ取得しておいた FileServlet の service( メソッドを実行します。 ただし、この方法では init() メソッドを実行した点 て呼び出される側の Servlet がロードされていない可能生 があります。その場合、 getServIet() メソッドを実行し ても Servlet のインスタンスか彳等られないので、 Servlet Chaining は実現できません。したがって、確実にロード しておくためには、呼び出される側の ServIet を起重加芋に ロードされるように設定する必要があります。 ServIet の実装 Servlet API は、 1997 年 9 月にリリースされた Java doPut() 61 doGet() 、 doPost() 、 doPut() 、 doDelete() 、 doTrace を利用したい場合には、 javax. servlet. http パッケージの service() メソッドとして実装します。 HTTP 固有の機能 生したときに実行されます。 ServIet の機能は、通常は service() メソッドは、クライアントのリクエストが発 let のさまざまな初期設定をおこなうように実装します。 ードされるときに実行されます。このメソッドは、 Serv- init() メソッドは、 Servlet が Servlet Engine 上にロ される代表的なメソッドを示します。 表 3 に、最斤の ServIet API で ServIet の実装に使用 実装します。 servlce ( ) 、 doGet() などのメソッドを 作成し、 init() 、 javax. servlet. http.HttpServlet クラスのサプクラスを ラス、とくに HTTP に依存した機能を使用するときは 般には javax. servlet. GenericServlet クラスのサプク ッドが追加されています。 ServIet を作成する場合、 し、とくに javax.gervlet. http ノヾッケージに多数のメソ Web Server 1.1 AIpha から HTTP 1.1 [ 5 ] に対応
ServIet ( ) 、 doOptions() などのメソッドを実装します。 service ( ) メソッドがリクエストされた HTTP Method4 に対応 するメソッドを起動するように実装されています。前項で 紹介した Java Developer Connection の例のように すべての HTTP Method に Cookie を付加するような 処理を実現するには se Ⅳ ice ( ) メソッドを実装します。 マルチスレッド里 ServIet では、基本的に複数のスレッドが 1 つの Serv- let インスタンスを共有して重川乍します。 Servlet では、クラスがロードされてインスタンス化さ れるときにⅲ it ( ) メソッドか実行さインスタンス化さ れた状態で ServIet Engine に常駐します。 service() を はしめ、 doGet() や doPost() などのメソッドはスレッド プールのなかのスレッドか実行しますが、メソッドの処理 カ鮗了する前にアクセプタが次のリクエストを受け付ける と、別のスレッドか実行を開始します。このため、 init() 以、タ ) メソッドは並行に実行される可能性があります。 メソッドが並行処理されていてもインスタンスは 1 つ なので、インスタンス変数やクラス変数はメソッドを実行 しているスレッド間で共有変数となります。あるスレッド か共有変数にアクセスしている最中にほかのスレッドか勝 手に書き換えないように synchronized 旦言を用いて排 他制御する必要があります。 1997 年 12 月にリリースされた Java Web Server 1.1 で、シングルスレッド・モテルが追加されました。 れは 1 つの ServIet インスタンスに対して 1 つのス レッドを割り当てるモテフレで、ある Servlet インスタン スの service() メソッドが複数のスレッドによって同時 に実行されないことを保証します。 javax. servlet. Single ThreadModel インターフェイスの実装によって使用で きます。シングルスレッド・モデルを利用すると、たとえ は ServIet を呼び出すたびにインスタンス変数を独立に操 作できます。従来の 1 インスタンスーマルチスレッドのモ デルのように、インスタンス変数を操作するときにも羽馳 制御を考える必要はなく、しかも上如く癇単に効率のいい Thread Safe なプログラムを書くことができます。ただ し、クラス変数は共有されるので、このインターフェイス 4 ここでは HTTP のメソッドを、、 Method" 、 Java のメソッドを、メ ソッド " と表記します。 62 を実装しただけでは完全に Thread Safe になるわけでは ありません。また、多くのインスタンスを作成し、インス タンス・フ。ールを管理する手間がかかるぶん効率カ氏下す るので、シングルスレッド・モデルを使う必喫がなければ、 イ吏用しないほうがいいでしよう。 ロセキュリティ・モテル Servlet のセキュリティ・モデルとしては、 Sandbox と いわれる Java 特有のモテフレと、 ACL (Access ControI List) が用意されています。 Sandbox Sandbox は、 Java VM 上にバイトコードがロードさ れて実行されるときに、システムに危害をおよはすおそれ のある処理は実行しないというセキュリティ・モデルです。 ロードするバイトコードに電子署名がある (signed) か、 ない (unsigned) かによって夫行範囲か袂定されます。 Servlet には、 3 つのセキュリティ・レベルがあります。 1 つは Trusted ServIets (Java Web Server-Internal Servlets 、 Local Servlets) で、 Servlet Engine がロー カルなパスからロードします。 Sandbox は適用されない ので実行・範用は制限されません。 2 つ目は、 Signed Network Servlets です。ネット ワークを介してロードされる電子署名のある ServIet で、 Sandbox は適用されますが、署名があるので実彳囲は 制限されません。 3 つ目は Unsigned Network ServIets です。ネット ワークを介してロードされる電子署名のない ServIet で、 Sandbox によって実行範囲か厳しく制限されます。 電子署名がある ServIet とは、 tar に似た形式の JAR (Java Archive) ファイル [ 3 ] に作成者のサインを付け たものです。この電イ署名をなんらかの手段で認証できれ ば、ネットワーク経由でロードした ServIet は実イ危囲に 制限を受けません。電子署名のない ServIet が Sandbox によって制限されるのは、 Applet の場合と同様にファイ ル入出力やソケット通信などの処理に関してで、かなりの 制約を受けます。 UNIX MAGAZINE 1998.6
$ ⅵ e Java のサーバー技術 ー原田洋子 図 1 Applet の竟 ServIet とは何か ダウンロード Applet Web サーバー Applet Java Virtual Machine Web ブラウザ クライアント Java といえば、すぐに Applet を思い浮カヾる人が多 いのではないでしようか。 AppIet はクライアント側で動 きますが、 ServIet はサーバー側で動くプログラム・モジ ュールです。ここで、、プログラム・モジュール " と書いた 図 2 Servlet の竟 のは、 Servlet も Applet と同様に単豸虫では動かないプロ Web サーバー グラムだからです。 Servlet Applet の場合は、 HTML ファイルにアクセスしたと きに、ファイルに言当された指定にもとづいて必要なクラ スファイルが、 Veb サーバーからプラウサ側の Java VM (Virtual Machine) 上にロードさ起動します ( 図 1 ) 。 これとは逆に、 Servlet の場合には、 Web サーバーか起動 時もしくは Servlet や Servlet カ甘旨定されている HTML ファイルの URL にアクセスしたときに、必要なクラス ファイルが Web サーバー側の Java VM 上にロードさ れてから起動します ( 図 2 ) 。 す。 Servlet API は、 HTTP にかぎらす、さまざまな Java プログラミングの観点からみると、 ServIet は ネットワーク・サーピスに対応できるように設計されて Javax. servlet. Servlet インターフェイスを実装している います。現時点でサポートされているのは HTTP だけ クラス」と定義することができます。 ServIet をプログラ ですが、新たなプロトコルに対応させたい場合は、 javax ・ ミングするための API が、、 Servlet API" です。 javax. servlet. http ノヾッケージと同様に、新しいノヾッケージを servlet. Servlet は、この Servlet API のなかで定義さ 追加します。 れています。 機育顎勺な面からみると、 ServIet はサーバーの機能を実 Servlet API のパッケージ構成とおもなクラスを表 1 現する手段といえます。 ServIet は CGI 的に使われるケ に示します。 ースが多いのですが、 HTML ページの重加勺な生成、 SSI Servlet API には、 Servlet の重川乍とーイ勺な通信につ (Server Side lnclude) 、フォームの処理、 URL リダイ いて定義したクラス君第である javax. servlet と、 HTTP レクション、 HTTP Cookie 、セッション管理など、い に依存した通信について定義したクラス群である javax ままで CGI て夫現されていた機能は ServIet でより効率 . servlet. http の 2 種類のパッケージが用意されていま 的に実現できます。さらに、 CGI 相当の機能を実装する PULL Servlet PULL GET Web プラウザ クライアント Servlet Servlet Java Virtual Machine Servlet Engine Web サーバー 57 UNIX MAGAZINE 1998.6
Java のサーバー技術 図 6 Socket と HTTP を組み合わせたミ言モデル Web サーバー Web サーバー Java. net. URLConnection Servlet Servlet ja 、 'a. net. Socket ja 、 . net. Socket デーモン デーモン 図 4 Servlet Sandbox Web サーバー Web サーバー Servlet Servlet Servlet unsigned ブラウサ Applet local signed Servlet Sandbox Servlet バーの機能に依存します。 Java Web Server ではサポー トされていますが、その他のすべての竟てサポートされ ているわけではありません。 セキュリティ対策か施されていない Servlet は自由度 が高く、システムにとって脅威となる ServIet も作れま す。この点ではこれまでの CGI と変わらないので、言 には注意が必要です。 ServIet の通信 Servlet Java Virtual Machine ServIet Engine Web サーバー 図 5 3 層モデル ブラウザ AppIet Servlet セキュリティ上の制約を受けない Servlet には、 JDK Web サーバー Core API て提供される、 ・ソケット通信 ACL ・ HTTP 通信 ACL は ServIet ごとに実彳 - 」範囲を制限するもので、以 う攵オプジェクト間通信 下の各項目について可 / 不可の設定かできます。 などの通信形態が適用できます。これらの通信形態を組み ・ ServIet のロード 合わせると、次のようなモデルが考えられます。 ・ファイル出力 3 層モデル ・ファイル入力 ・ソケット接続 おそらくもっともポピュラーな多層モテルです ( 図 5 ) 。 ポートの listen Applet—ServIet 間の通信は java. net. URLConnection ・外部フ。ロセスの起動 で、 Servlet—トランザクション・サーバー間は JDBC な ・ライプラリのリンク どの API によってコネクションを張ります。 Servlet の ・システム・プロノヾティのアクセス セッション管理の機能を組み合わせると、クライアントご とのトランザクション管理も可能です。 複数のユーザーが Servlet を登録して使う環境を考え ると、ファイル入出力を一律に禁止するのではなく実彳 - 薺危 Socket と HTTP を組み合わせた通信モデル 囲を設けたいところですが、朋大ではそのようなことはで Servlet どうしの通信と、さらに Servlet がソケット きません。 を張れるデーモンと通信する形態です ( 図 6 ) 。 Java では、 Web サーバーによる違い TCP で接続するための java. net. Socket と、 UDP で接 続するための java. net. DatagramSocket が用意されて Sandbox と ACL の機能は Servlet API だけでは実 います。 ServIet 間を java. net. URLConnection で接 現できないので、 Servlet Engine と連携する Web サー J ava. net. U RLConnection トランザクション サーバー タス 63 UNIX MAGAZINE 1998.6
ServIet 図 9 セッション情報 セッション管理 Se Ⅳ t セッション・キャッシュ セッション Session セッション Session User ID Expire URL るかを識別します。 UserlD Expire URL ブラウザ HTTP Cookie ブラウザ たとえは図 9 のように、 HTTP Cookie にはイ寸加でき なかった HTTP ヘッダ情報などを含むオプジェクトを作 成してセッションを管理し、各サーピスを提供する URL には、セッション管理用の Servlet を経由してリダイレ クトしたり、 Servlet Chaining の次の Servlet にリクエ ストをリダイレクトするガ去が可能です。 このほかに、従来からある HTML FORM の HID- DEN フィールドを利用するガ去も使えます。これは、 do- Get() メソッドで HIDDEN フィールドを重加勺に生成し、 dopost() メソッドて利用します。 HTTP の限界として、リクエストを受けたときにはし めてなんらかの処理が実行されるサービスであり、みすか らはアクテイプに行重丿、きないという問題があります。 の点では、 Servlet もこれまでよく使われてきた CGI と 同しです。ただし、 ServIet の場合は Java のサーバー としても重川乍する Servlet が作れます。このサーバーは、 Servlet への最初のリクエストが発生したときに Servlet のロードとともに起動されます。また、 JavaWeb Server では管理ツールを用いてあらかしめ起動しておくこともで 並行里モデル きます。 68 なるメソッドか 1 司時に実行される可能性もあります。 Method に対応するメソッドを実装しているときは、異 性があります。さらに、 1 つの Servlet か馥数の HTTP リクエストを処理するメソッドは並行に実行される可能 行処理モデルを利用しています。 Java 言語がサポートしているマルチスレッドを使った並 Servlet の動作の概要で説明しましたが、 Servlet は 並行処理した場合に、ほかのスレッドからインスタンス 変数の値を勝手に書き換えられることを防ぐには、排他制 御が必要です ServIet のなかで、さらにユーサーがスレッドを生成し、 HTTP のリクエストーレスポンス・シーケンスとは無関係 に並列に処理を実行させることもできます。 これは、を要する処理やクライアントへのレスポン スを必要としない処理には有効です。 Servlet は、ま可判月 で次の HTTP リクエストを受けられる状態になります。 Servlet BOF ロ Java カンファレンスは、 Java の利用のイ眉隹や普及、発 展を目指す非営利団体です 9 。 ServIet は、点でもっとも進歩的な Web サーバー の機能拡張カ 1 去ですが、誕生したばかりの Servlet という 技術についての情報はまだ少ないのか夫状です。しかも、 Servlet を実装するためには、オプジェクト孑匍旬プログラ ミングや分散プログラミン久マルチスレッド・プログラ ミングなど、 Java に関するさまざまな知識が要求される こともあって、とまどう人も多いのではないでしようか。 そこで、 Java カンファレンス内に Servlet についての 技術面、運用面での言義をひろくおこなう場として 1997 年 11 月に、、 ServIet BOF" が設けられました。 Serv- let BOF には、 Java カンファレンスの会員でなくても、 servlet に興未をもつ人なら誰でも参加できます。義は、 servlet-ml と呼ばれるメーリングリストと、定期的に翩崔 されるミーティングでおこなわれます。 1998 年 4 月現在、 登録されているメンバーの数は約 70 名です。 Servlet BOF は、たんに Servlet について言義する だけの場ではありません。作成した ServIet を実験した り、ひろく公開するためには、 ServIet に対応する Web サーバーが必要です。しかし、このような Web サーバー を自前で準備するのは簡単ではありません。たとえローカ ルに実験できる環竟を整えられたとしても、ファイアウォ ールの外部にまでは公開できない場合も多いのではないで しようか。しかも、鄲点では、はとんどのプロバイダの web サーバーは ServIet に対応していません。そこで、 ServIet BOF では 1998 年 3 月から、メンバーに対して 9 http://www.java-conf.gr ・ jp/ UNIX MAGAZINE 1998.6
ServIet たとえは、クライアントから Servlet に要求があった 場合は、次のように衄乍します。 1. アクセプタがクライアントからのリクエストを受け取 る。 2. Servlet が Servlet Engine 上にロードされていない場 合は、ローダか実行に必要な Java バイトコードをロー ドしてからインスタンスを生成する。 3. スレッドプールからスレッドを 1 っ取り出し、 Servlet のインスタンスに割り当てる。 4. そのスレッドで Servlet のメソッドを実行する。 いったん作成された Servlet のインスタンスは、明示 的にアンロードされないかぎり Servlet Engine 上に常駐 します。 Java プログラムの実行を高速化するために、実 行時にバイトコードからネイテイプコードにコンパイルす る JIT (Just-11 ト Time) コンパイラが多く使われること もあり、 2 回目以降のリクエストでは Ser ⅵ et のロードや コンパイルのオーバーヘッドがなく、 1 回目より高速に処 理できます。 通常、 Applet はセキュリティ上の理由から、ダウン ロード元の web サーバーか川乍しているマシン上のアプ リケーションやサーバーとしかコネクションを張れませ ん。このため、別のマシン上のサーバーと接続するときは、 Applet のための中間サーバーを Web サーバーと同一の マシン上に置き、中間サーバーとそのさきのサーバー間で もう 1 つのコネクションを張るという多層モデルを構成 します。中間サーバーを ServIet にすると、このような多 層モデルを用いたシステムでは、別のサーバーへの接続を ServIet のメソッド呼出しとは無関係に糸できるので、 クライアントからのリクエストごとにコネクションを張り なおすオーバーヘッドを削減できます。 Servlet の再ロード 通常、 Java アプリケーションではいったんロードされ たクラスを更新する際にアプリケーションを再起動しま す。しかし、 servlet Engine は Web サーバーとともに 動くアプリケーションなので、ロードされている Servlet のクラスを更新するたびにすべてを再動するのはリ巨見実 的です。 そこで、クラスが変更されたときに、該当する旧いク 60 ラス定義を 1 回アンロードしてから新しいクラスの定義 を再ロードできるように、クラスのアンロード機能をも つ Servlet 専用のクラスローダが用意されています。 のクラスローダがバイトコードの作成日時をチェックし、 servlet の更新時に自動的に再ロードできるようになっ ています。この機能は、 1997 年 3 月にリリースされた JavaServer Beta から導入されました。 ただし、すべての ServIet か再ロードできるわけではあ りません。サーバーの起動こロードされる Servlet につ いては、このクラスローダカイ吏われないため、クラスファ イルが更新されても再ロードできません。 ServIet Chaining servlet Chaining とは、あらかじめ決められだ側で ServIet を連勺に使用するガ去です。フィルタリングと も呼はれます。たとえは、 FileServlet を呼ぶ前に、はか の servlet を使って別の処理を加えたい場合などに使い ます。 servlet Chaining には、次の 2 つのカ去があります。 1 つ目は、 Web サーノヾーが ServIet Chaining をお こなうように設定するカ 1 去です。この方法では、 Servlet Eng ⅲ e のクラスローダによってクラスがロードされるの で、クラスファイルか史新されたときに再ロードされます し、 servlet の組合をを簡単に変更することもできます。 Java Web server では、 rules. properties もしくは mimeservlets. properties という Java のフ。ロノヾティを 用いて ServIet の系目 . 合ぜを指定します。 前者は、 Servlet の工イリアスを指定するプロバティで す。複数の ServIet を組み合わせて使うときは、 く脚叩観ん〉 = く se 理 let - れ佖 me の , く se " 兄 e 仁れ佖 me2 〉 という書式で指定します。たとえは、 /mysample=myfilter , file と記述した場合、 http://host:port/mysample にアク セスすると、 myfilter 、 file3 の順で実行されます。 serv- let の糸目 . 合せを変更するときは、く servlet-name 〉を書き 換えます (Java Web Server ではプラウサから変更でき ます ) 。 3 file は FiIeServIet の工イリアス名てす。 UNIX MAGAZINE 1998.6
ServIet 表 1 Servlet API のパッケージとおもなクラス クラス / インターフェイス名 機能 Javax ・ servlet ′ヾッケージ このインターフェイスはかならす実装しなければいけない。生成・重川い消滅に必要なメソッ Servlet ドカ症義されている 特定のプロトコルに依存しない汎用のメソッドを用いて Servlet を実装するためのクラス GenericServlet クライアントからデータを受信するためのインターフェイス ServIet Request クライアントに MIME 形式のデータを送信するためのインターフェイス Servlet Response Javax. servlet. http / ヾッケージ HTTP を処理する ServIet を作成するためのクラス HttpServIet HTTP および HTTPS 上で Cookie を扱うためのクラス Cookie HTTP でクライアントのデータを受信するためのインターフェイス (HTTP 特有のヘッ HttpServIetRequest ダも処理する ) HTTP でクライアントにデータを送信するためのインターフェイス (HTTP 特有のヘッ HttpServletResponse ダも処理する ) せん。 Java Web Server などの Java で実装されてい だけでなく、 Apache のモジュールのように、 ServIet を るサーバーでは、サーバーカ吶部て利用しているクラスを 利用してサーバー自身の機能を実装できます。たとえば、 Ser ⅵ et からも使えることがあります。しかし、このよう JavaSoft からリリースされている Java Web Server で な畤定のサーバー依存の機能を使用していない Servlet な ーとしてのすべての機能が Servlet で実 は、 Web サー らは、 Windows 95 - ーヒの Java Web Server でも、 So- 現されています。 Java Web Server のコア部分は Serv- laris 2 上の Servlet Engine を組み込んだ Apache でも let を動作させる機能をもつサーバーだけです。そして、 重川乍します。 このコアサーバー上で、指定された URL のファイルを送 信する FileServIet 、 CGI を実行する CgiServlet 、 SSI ーにアクセスするための JDBC さらに、 SQL サー を実現するための SSIncludeServlet などのさまざまな (Java Database Connectivity) など、 Java には豊富 Servlet を重川させることで Web サーバーの機能を実現 な API が用意されているので、複数の開発竟を使い分 しています。 Java Web Server については、別の記事国 けすに Java だけでアプリケーションカ鯛発できます。 を参考にしてください 1 もう 1 つの利点は、マルチスレッド処理を前提に言 - されていることです。このため、 Servlet は複数のプロセ ServIet の利点 スを起重丿ける CGI よりはるかに小さなコストでプログラ ムカ起動でき、しかも複数のリクエストを同時に受け付け ServIet にはいくつかの利点がありますが、とくに大き た場合のスケジューリングも軽くなります。 なものは次の 2 つです。 次の「動作メカニズム」の節で説明しますが、 ServIet ます、、、 Java 言語で記述できる " 点が挙げられます。 はマルチスレッド・モデルを用いています。 ServIet を使 衄はオプジェクト指向、マルチスレッド処理、 Java ロロロ、 うことで、マルチスレッド化された効率のよいプログラム ガべージ・コレクションなど、さまざまなソフトウェア技 を簡単に書くことかできます。 術の成果を採り入れています。しかも、既存のプログラミ ング言言韶 ) 長所噬可斤を徹底的に斤して、簡潔な信様と Apache 上でおこなった CGI 、 mod-perl 、 Servlet の べンチマーク・テストの結果を表 2-a に示します。このテ 強力な言当能力をあわせもつように日されています。 ストには、「 WWW サーバーの育て方」 [ 2 ] にある去を 、 100 % pure Java " の規定に材処して作られた Java プ 利用しました。 ServIet については、同等の処理をおこな ログラムは、 "Write Once, Run Anywhere ”のオ垣五に う Servlet を作成しました。処理の内容は、 URL のパラ 區われているとおり、特定のプラットホームに依存しま メータを読み込んで出力するものです。テストでは、 50 回 1 この記事では、リリース当衫、、 Jeeves" という名前て召介されていま 繰り返し呼び出しています。 す。 1 三ロ 58 UNIX MAGAZINE 1998.6
表 2 Apache 上でのべンチマーク・テスト果 ローダ 図 3 ServIet の乍メカニズム 〇スレッド リクエストリクエスト Java のサーバー技術 リクエスト CGI Perl Servlet Perl Servlet 11 secs ( 0.34 usr 0.11 sys = 0.45 cpu) 1 secs ( 0.08 usr 0.04 sys = 0.12 cpu) 4 secs ( 0.16 usr 0.02 sys = 0.18 cpu) 37 secs ( 0.32 usr 0.13 sys = 0.45 cpu) 27 secs ( 0.23 usr 0.03 sys = 0.26 cpu) ServIet Engine aServlet Se rvlet アクセプタ 〇〇 - スレッドプール テストに利用した竟は以下のとおりです。 ・ Solaris 2.5.1 (Sun Ultra 2 ) ・ Apache 1.3b5 ・ mod-perl 1.10 ・ Serv 0.9.10 (Servlet) ・ JDK (Java Development Kit) 1.1.4 (JIT) このべンチマークでは、 mod-perl のはうがよい結果が 出ています。これは、現在の Apache の実装では別プロ セスとして起動されている Servlet Engine を呼び出すよ うになっていて、その部うゞまた効率的に実装されていな いからでしよう。たとえは、同 bServlet を JavaWeb Server ー E で重川させると、 mod-perl と同し、、 1 秒 " とい う結果か得られます。 同じべンチマーク・テストを mod-perl と Servlet に 対して 10 個すつはは 1 司時に起動したときの平均を表 2-b に示します。 この結果から、同時アクセス数か増加した場合の速度低 下は明らかに Servlet のほうが少なく、アクセス数が多く 負荷の高い Web サーバーほど Servlet か有利になること が分かります。 同様に、 mod-perl と Java Web server 上の serv- let に対して、 10 個すつほは 1 司時にべンチマーク・テス トを起動すると、平均で mod-perl では 27 秒、 Java Web Server では 22 秒という結果か得ら Java Web Server 上でも ServIet の動作性能がよいことが分かり ます。 さらに、今後、実行時プロファイリングを利用して、 C 十十などの青勺コンパイルよりも高速なコードにコンパ イルすることのできる H 。 tsp 。 t2 技術力磴場する予定で す。そのときには、さらに高速に処理できるようになるで しよう。 2 http://java ・ sun ・ com/javaone/javaone98/sessions/T103/ UNIX MAGAZINE 1998.6 Ser ⅵ et の動作メカニズム 、 Servlet Engine" と呼はれる Java 高 S ervlet は、 語で記述されたアプリケーション上で動作します。 Java Web Server のコア部分も Servlet Engine と同じ機能 をもっていますが、このような呼ひ方はせず、 Java Web Server と呼びます。ここではイ更産十 . 、 Java Web Server のコア部分も Servlet Engine と呼ぶことにします。 ServIet の動作メカニズムの概要を、図 3 に示します。 Servlet のロードと起動 3 番目の去は、一引殳に基卓勺な重川乍をする ServIet に に設定されている場合 3. サーバーの起動と同時に Servlet がロードされるよう Chaining) 2. ほかの ServIet から連鎖的に動作する場合 (ServIet 1. クライアントから要求された場合 ServIet がロードされるのは、次の 3 通りの場合です。 59 ードされるように設定されています。 CGI を起動する CgiServIet などがサーバー起重加にロ る FiIeServIet 、 SSI 機能を提供する SSIncludeServlet 、 供する ServIet として、リクエストされたページを提供す 適用されます。 Java Web Server では、基本機能を提
表 6 JDK 1.2 Servlet API サーパー Java Web Server 1.1 ( 1.1.1 ) JServ 0.9.10 JRun 滝 4 アーカイフ名 」 ws ・」 ar servclasses. zi p Jrun ・ Jar た。その他、 Java Web Server 1.1 とクラス構成に 変化はありませんが、セッション管理関係でいくつかの メソッドか削除されました。 現在はこのバージョンが主流となっていて、 JDK 1.2 に伺属しているところから、これを、、 JDK 1.2 ServIet API" と呼ぶことが多いようです。 これらのあいだには、かならすしも互換性はありませ ん。たとえば、書籍などでよくみかける、もっとも旧い Java. servlet や java. servlet. http というノヾッケージを利 用した Servlet は現在は重川乍しません。 Servlet API の履歴を表 5 に示します。 ServIet API のアーカイフ ServIet API は、 Java Web Server ではほかのクラス と同しアーカイプ・ファイルに含まれていますが、 JSDK や JST では独立したアーカイプ・ファイルになってい ます。 JDK では、 1.2 滝 2 ではコア API と同しファイルに 含まれていましたが、 1.2 3 から独立したアーカイプ・ ファイルになりました。さらに、表 6 の ServIet 対応の Web サーバーでは、 Servlet API か表に示したアーカイ プ名で伺梱されて提供されています。 Ser ⅵ et を用いたシステム設計 Servlet を利用するシステムの言叔こは、 Servlet の 有効性を支えるさまざまな新しい技術を最大限に活用した システムにするために、おもに次の要素を考えます。 1. どのようなオプジェクト・モデルを構友するか。 2. 通信形態と通イ大態の糸財寺に何を利用するか。 3. 並行処理をどのように扱うか。 オフジェクト・モデル Servlet は、オプジェクト指向言語である Java 言語と、 オプジェクト指向言 t にもとづいて作られたクラス群を用 ロ UNIX MAGAZINE 1998.6 Java のサーバー技術 いて作成します。 ServIet を使用したシステムを言 t する には、ます、何をオプジェクトにしてどのようなメソッド を用意するかといったオプジェクト・モデルの構成を考え る必要があります。 たとえば、カウンタを ServIet で作るとします。カウ ンタをオプジェクトにして、カウンタ・オプジェクトの状 態の 1 っとしてカウンタ値を設けます。そして、カウン タをインクリメントするメソッドを用意します。 ServIet は、カウンタ・オプジェクトをロード時にインスタンス化 し、リクエストがあるとカウンタ・オプジェクトのメソッ ドを起動してカウンタ値をインクリメントし、その結果を クライアントに返します。 オプジェクト指向言語で記したシステムのキ致を活か した拡張生やオプジェクトの再利用性を高めるには、デザ インパターン [ 6 ] をはじめとするオプジェクト指向設引法 を学ぶことも重要でしよう。 Java 言語では、 Object Serialization を用いてオプ ジェクトを転送する機能か供されているので、 HTTP 上でオプジェクトを使って通信することができます。 このような手枷友にするときには、シリアライズはフィー ルド ( インスタンス変数のを送り込むもので、メソッ ドは転送先のオプジェクト定義に従うという点を考慮し、 転送元と転送先でオプジェクトのバージョンを統一する なんらかのガ去をシステム構成に組み入れる必要がありま す。 ServIet の通信についてさきに述べましたが、 Servlet がどのような手段で通信をおこなうかはシステム設言 t の 1 つの要素となります。 HTTP で通信する場合、 HTTP 仕様による限界や寺 徴を考慮する必喫があります。たとえば、 HTTP はでき るだけ早くコネクションが切れるように言 t されたプロト コルなので、原則として 1 回のリクエスト - レスポンス・ シーケンスでコネクションが切れます。 また、各 HTTP リクエストは基本的に独立なので、ユ ーサーごとにセッション管理が必要になる場合がありま す。セッション管理をおこなうには、 Servlet API の javax. servlet. http.C00kie クラスが提供する HTTP Cookie を利用し、どのクライアントとのセッションであ 通信形態 67
表 4 アドオンで使える Servlet Engine ServIet Engine ( べンダー ) jserv (The Java-Apache Project) http://java ・ apache.org/ -JRun (Live Software) http://www.livesoftware.com/products/jrun/ ServletExec (New Atlanta Communication http://www.newatlanta.com ServIetExpress (IBM) http://www.ibm.com/java/servexp/ Netscape FastTrack/Enterprise Java のサーバー技術 サポートする、 veb サーパー Apache (UNIX 、 NT) Apache (UNIX 、 Win95/NT) 、 IIS 、 NS* (Solaris 、 UP-UX 、 IRIX 、 AIX 、 NT) IIS 、 NS* (Solaris 、 NT) Apache (Solaris 、 AIX) 、 IIS 、 - NS* (Solaris 、 AIX 、 NT) ServletEngine は、 1 つ目と 2 つ目のタイプのどちらと もいえない実装になっています。 Jigsaw は 100 % Pure Java の Web サーバーで、サーバーのコア部分のつくりは Servlet Engine とよく似ています。コア部分にリソース を追加してサーバーの機能を孑劇長するところは Java Web Server と同し方式ですが、 Jigsaw にリソースを追加す る API は Servlet API に準尠匙していません。このため、 Jigsaw で Servlet を使う場合は、 Servlet API を利用す るのに必要なリソース ServletWrapper を追加します 7 Servlet を使える Web サーバーの情報は、 JavaSoft の「 Java Servlets Out ln the world 」 8 の一覧で石寉認 してください。 ひろく普及している Web サーバーでは、一殳に Serv- let Engine を、、アドオン " として使用します。この種の Servlet Engine には、表 4 に示すものがあります。 Apache にアドオンで追加する Servlet Engine は、通 常、組込みモジュールが用意されています。このモジュー ルを Apache に糸はみ込み、 S ervlet Engine を動かす成疋 をすれば ServIet か使えるようになります。 ServIet A 曰の配布形態と履歴 Servlet API の配布形態 Servlet API は、次の 4 不職頁の方法でリリースされた 点で Java の API のなかでも異色の存です。 1. Java Web Server JavaSoft か版売している Java で実装された Web サ 7 http://www.w3.org/Jigsaw/User/Reference/w3c.jigsaw. servlet. ServletWrapper. html 8 http://jserv.javasoft.com/products/java-server/servlets envrronments. htrnl UNIX MAGAZINE 1998.6 ーバーです。リリース当初は Jeeves と呼はれていまし たが、現在は Java Web Server と改称されました。 2. JSDK (Java Servlet Development Kit) Servlet の開発キットです。 Java Web Server を使 わなくてもテストできるように、 ServIetRunner と呼 ばれるスタンドアローン・サーバーが含まれています。 このほかに、 Netscape Enterprise サーノヾーや Mi- crosoft IIS 、 Apache で ServIet を重川乍させるモジュ ールを組み込むためのコードも提供されています。 65 1.0 が FCS (Final Customer Shipment) される直 1.1996 年 8 月 ~ 1997 年 6 月頃まで (Java Web Server よって次の 4 つに大別できます。 これらの ServIet API は、リリース時期と配布形態に のかが分かりにくくなっています。 れぞオ功ゞどう違うのか、またどのように使い分けたらいい API にはバージョン番号が付いていません。そのため、そ のように頻繁にリリースされたにもかかわらず、 ServIet 形態で合わせて 20 回を超えるリリースがありました。 Servlet API は、 1996 年 8 月から上記の 4 つの配布 ServIet API の履歴 ようになりました。 になり、 1997 年 12 月から JDK に含めて配布される JDK 1.2 から Servlet API は Standard Extensions 4. JDK (Java DeveIopment Kit) 供されています。 ビスの一例として、 Java Web Server の基本機能力甘是 て起動・管理する機能があります。ネットワーク・サー Web サーバーを含むネットワーク・サーピスを一舌し Java のサーバー・アプリケーション開発キットです。 3. JST (JavaServer Toolkit)