通常、Web上のページは、Webサーバ上のファイルとして格納されており、クライアントからのリクエストに応じて、Webサーバが指定されたファイルの内容をクライアントに送信することで、ページが表示されるようになっています。Webサーバだけでページを提供している場合、その内容は固定された静的なもので、どのクライアントに対しても同じ内容しか提供できません。
Webアプリケーションとは、Webサーバ上で動作するアプリケーションのことです。Webクライアントからの要求に応じて、Webサーバ側に対しリクエストを投げ、その結果をサーバが、動的にHTMLとして作成し、Webクライアントへ返します。身近な例として、検索サイトやショッピングサイトがあります。
Webアプリケーションと言えば敷居が低く、低コストと言うことから CGIと呼ばれる仕組みが普及しています。 CGIでは Webサーバが要求されたリクエストに応じて CGIのプロセスを起動しサーバ側で処理を行って結果を標準出力から提供します。
しかし CGIではリクエストのたびに新たなプロセスを起動されるため、大規模なシステムになってしまうと対応することが出来なくなってしまいます。
Servlet(サーブレット)とは、Java言語で記述された Webアプリケーションの形態になります。 Web サーバーを通じて、クライアント コンピュータと対話処理を行う サーバー コンピュータ上で実行される Java のサーバー プログラムのことです。
Servletは一度呼び出されるとメモリに常駐するため、呼び出しの度にプロセスが起動する CGIに比べると高速に動作します。また、Servletは Webサーバの一部として動作するため、セッション管理や、複数のユーザ間で情報を共有することもできます。
サーブレットを実行するためには、Tomcatなどの Java Server APIに対応したWebサーバ( Servletコンテナ、Webコンテナ、又はアプリケーションサーバとも呼ばれる )が必要です。 ApacheなどのWebサーバの場合、Java Server APIに対応するためのプログラムと連携することで対応することができます。
Servletコンテナは、Servlet APIモジュールとともに、ApacheなどのWebサーバを、Servlet/JSPを動作させるために拡張するためのモジュールで、サーブレットエンジンとも呼びます。 サーブレットコンテナには、Tomcat(オープンソース)や、IBMのWebShere、BEAのWebLogicなどがあります。
Servlet APIは サーブレットを動作させるために必要なモジュールです。Servlet APIは、Javaエクステンションで、javaxの標準パッケージとして提供されます。Servlet APIには、ApacheのJakartaプロジェクトのTomcatや、IBMのWebShere等が提供しています。
このサイトで説明している Tomcatは、Sun Microsystemsから、ソースライセンスの提供を受けてリリースされています。ファイルで言うと、servlet.jarが、ServletAPIになります。後述する GenericServletクラス、HttpServletクラスもこのAPIに含まれます。
GenericServletクラス
プロトコルに依存しない Servletの動作を定義した抽象メソッドです。一般的な Webアプリケーションでは Httpプロトコルを使用する HttpServletクラスを継承してサーブレットを作成しますので、このクラスを直接継承してサーブレットを作ることはあまりありません。
java.lang.Object
|
+--javax.servlet.GenericServlet
GenericServletの主なメソッド
| メソッド名 |
概要 |
| public void destroy() |
Servletコンテナが呼び出すメソッドで、Servlet がサービス提供を停止するときに一度だけ呼び出されます。 |
| public void init(ServletConfig config) |
Servletコンテナが呼び出すメソッドで、このServletがサービスを開始できる状態になった時に一度だけ実行されます。 |
public abstract void service (ServletRequest req, ServletResponse res) |
Servletコンテナが呼び出すメソッドで、リクエストに対する応答を返します。 |
|
HttpServletクラス
HTTPプロトコルを使用する Servletを作成する場合は基本的に HttpServletクラスを継承します。HttpServletクラスとはサーブレットとして動作するために必要なメソッドをメソッドとして定義してある抽象クラスになります。実際の実装は各サーブレットコンテナよにって行われています。
java.lang.Object
|
+--javax.servlet.GenericServlet
|
+--javax.servlet.http.HttpServlet
HttpServletの主なメソッド
| メソッド名 |
概要 |
protected void doGet (HttpServletRequest req, HttpServletResponse resp) |
ServletにGETリクエストを処理可能にさせるため、(serviceメソッドを通じて)サーバによって呼び出されます。 |
protected void doPost (HttpServletRequest req, HttpServletResponse resp) |
ServletにPOSTリクエストを処理可能にさせるため、(serviceメソッド経由で)サーバによって呼び出されます。 |
protected void service (HttpServletRequest req, HttpServletResponse resp) |
publicで定義されたserviceメソッド経由で標準HTTPリクエストを受け取り、それらをこのクラスで定義されたdoXXXメソッドにディスパッチします。 |
|
サーブレットのライフサイクル
HttpServletクラスを継承した一般的なServletプログラムのライフサイクルは以下のようになります。
生成
クラスファイルがサーブレットコンテナからJava VM上にロードされます。
Servletの初期化(initメソッドの呼び出し)
Servletプログラムに初めてリクエストがあったときにサーブレットコンテナ(Tomcatなど)は Servletプログラムを初期化します。その際に initメソッドが一度だけ呼び出されます。そのため、データベースの接続などServletプログラムを実行する前に事前設定が必要な処理をinitメソッドに記述しておきます。
Servletの応答
Servletプログラムにリクエストがあるたびにserviceメソッドが呼び出されます。serviceメソッドはリクエストのHTTPメソッドを解析し、対応するdoXxxメソッドを呼び出します。
一般的な Servletプログラムでは、doGetか doPostのいずれか、または両方をオーバーライドして実際の Servletの処理を記述することになります。
Servletの破棄(destroyメソッドの呼び出し)
サーブレットコンテナは一定時間Servletプログラムにアクセスがない場合や、自身を終了する場合などにサーブレットコンテナから destroyメソッドを一度だけ呼び出します。 そのため destroyメソッドではデータベースへの切断処理など Servletプログラムの終了処理を記述します。
一度destroyメソッドが呼び出されると、同じインスタンスに対して再度serviceメソッドが呼び出されることはありません。もう一度 Servletのロードから行われることになります。
一般的な Webアプリケーションでは HTTPプロトコルを使用する HttpServletクラスを継承してサーブレットを作成するということは前述しました。 HttpServletクラスでは HTTPリクエストのメソッドの応じたメソッドが用意されており(下記参照)、HttpServletクラス serviceメソッドがリクエストを分析して対応するメソッドが呼び出されます。
HTTPリクエストとメソッドの対応
| HTTPメソッド |
HttpServletクラスのメソッド |
| GET |
doGet() |
| POST |
doPost() |
| HEAD |
doHead() |
| PUT |
doPut() |
| DELETE |
doDelete() |
| OPTIONS |
doOptions() |
| TRACE |
doTrace() |
|
HttpServletクラスではそれぞれ空の実装を提供しています。サーブレットを記述する際にはこれらのメソッドをオーバーライドしてサーブレットに行わせる処理を実装します。
SJC-WCで出題されるのは GET、POST、HEADメソッドくらいです。受験される方はその中でも GETメソッド、POSTメソッドの違いは理解しておきましょう。それぞれのメソッドの特徴や制限、どのような処理に向いているか否かが出題されます。