リスト1 ●文字列「Hello World 」を表示するサーブレット「HelloServlet 」(sample0 )
リスト1 ●文字列「Hello World 」を表示するサーブレット「HelloServlet 」(sample0 )
[画像のクリックで拡大表示]
図1●WebブラウザからHelloServletを呼び出したところ(sample0)
図1●WebブラウザからHelloServletを呼び出したところ(sample0)
[画像のクリックで拡大表示]
図2●HelloServletが動作する手順(sample0)。文字を表示するだけだが,HTTPを利用するれっきとしたWebアプリケーションだ
図2●HelloServletが動作する手順(sample0)。文字を表示するだけだが,HTTPを利用するれっきとしたWebアプリケーションだ
[画像のクリックで拡大表示]

【要約】 JavaはもともとクライアントのWebブラウザ上で動作する技術として開発されました。しかし現在では,サーバーサイドのアプリケーションを構築する技術として大活躍しています。今や,Javaプログラミングをものにするのに,サーバーサイドの知識の習得は避けて通れません。ここではサーバーサイドJavaを基礎から解説していきます。

【本文】 サーバーサイドJavaの仕様である「Java Enterprise Edition(Java EE)」*1が企業の情報システムの構築によく使われるようになったのには,いくつか理由があります。

 まず,Java自体が優れた特徴を持っている点です。特集2で解説したように,オブジェクト指向をうまく利用することで効率のよいプログラミングができます。Windows,Linux,各種商用UNIXなど,多くのプラットフォームに実行環境が用意されている点も見逃せません。メモリー管理が自動化されているため,C/C++で問題になっていたメモリーの解放ミスに起因するメモリー・リークを気にする必要がないことも,開発者にとって大きなメリットです。

 もう一つの理由は,Java EEにはサーバーサイド・アプリケーションを構築するために必要な様々な技術があらかじめ用意されていることです。HTTP(Hypertext Transfer Protocol)のリクエストを処理してレスポンスを返す「サーブレット」,WebページにJavaプログラムを埋め込む「JavaServer Pages(JSP)」,サーバーサイドで動作するコンポーネントを実現する「Enterprise JavaBeans(EJB)」などがあります。

 現在のサーバーサイド・アプリケーションでは,クライアントにWebブラウザを利用するWebアプリケーションが主流です。こうしたアプリケーションでは,サーブレットを核に,JSPやEJBなどを組み合わせた構成を採るのが一般的になっています。JSPだけでWebアプリケーションを構築することも可能ですが,JSPでWebページに大量のJavaコードを埋め込むと,可読性や保守性が著しく悪くなってしまいます。そこで今回は,サーブレットを中心に解説していきます。JSPは,最後にサーブレットから表示関係の処理を抜き出す際に取り上げます*2

サーブレットの基礎とセッション管理

 実際にサーブレットを作ってみましょう。リスト1[拡大表示]にサーブレットとして動作する最低限のコードを示しました(sample0)。プログラミングのサンプルとしておなじみの「Hello World」です*3。これを実行すると図1[拡大表示]のように表示されます。

 「サーバーサイドJavaは難しい」と思っている人には拍子抜けするくらい簡単なコードですが,必要最低限の機能を持ったWebアプリケーションとしてはこれで十分です。サーブレットの位置を示すURLにWebブラウザからアクセスすると,Webコンテナがサーブレットを起動します(図2[拡大表示])。そして,サーブレットの実行結果を,Webブラウザに送って表示させます。クライアントであるWebブラウザとサーバー上で動作するサーブレットの間では,HTTPによる通信が必ず行われます*4

サーブレットの記述には「決まりごと」がある

 リスト1の内容を詳しく見ていきましょう。最初に属するパッケージを宣言しています。これは特集2にも出てきましたね。次の三つのimport文で,サーブレットに必要なクラスを宣言しています。「*」はそのパッケージの下にあるすべてのクラスを指します。それなら,「javax.servlet.*があればjavax.servlet.http.*は要らないんじゃないの」と思うかもしれません。しかし実際には,*が表すのはパッケージの直下のクラスだけで,その下のパッケージのクラスは含まないのでそうはいきません。javax.servletパッケージにはサーブレット一般に関するクラス,javax.servlet.httpパッケージにはサーブレットでHTTPを扱うためのクラス,java.ioパッケージにはシステム入出力に関するクラスがそれぞれ入っています。

 サーブレットの本体に相当するのがHelloServletクラスです。サーブレットのクラスは,サーブレットの基本機能を備えた既存のHttpServletクラスを継承する決まりになっています。通常のWebアクセスを処理するサーブレットは,HttpServletクラスにあらかじめ用意されているdoGetメソッドをオーバーライドして,その中に処理を記述します(doGetの意味はあとで説明します)。

 doGetメソッドはHttpServletRequest型とHttpServletResponse型の二つの引数を取ります。前者はWebブラウザからの「リクエスト・メッセージ」のオブジェクト,後者はWebブラウザに返信する「レスポンス・メッセージ」のオブジェクトを表します。サーブレットの処理を一言で表すと「リクエストを受け取り,それに基づく結果をレスポンスとして返す」ことです。

 throwsの後には二つの例外クラスを記述します。最初は「こう書くものだ」と考えておけばいいでしょう。実際のシステムで使われるサーブレットには,例外が起こったときの処理を明示的にプログラミングする必要があります。

 ここまでがサーブレットを書くときの「決まりごと」です。したがって動作を表すコードは,後に続く2行しかありません。最初の行で,レスポンス・オブジェクトのgetWriterメソッドを呼び出し,文字列を表示するためのPrintWriterオブジェクトを取得しています。次の行で,このオブジェクトに「Hello World」という文字列を出力しています。これがHTMLのデータとしてブラウザに返信されるのです。