Revised: 11th/June/2002
サーブレットは、 Java の拡張パッケージ javax.servlet
のメンバを使ってコーディングする。
あるクラスが Web サーバ上でサーブレットとして機能するためには、 Servlet
インタフェースを実装するか、実装クラスを継承しなければならない。 javax.servlet.Servlet
インタフェースは javax.servlet.GenericServlet
抽象クラスで実装されており、これを継承すれば Servlet
インタフェースで宣言されたメソッドを実装する必要はなくなる。これを更に継承して HTTP 固有のメソッドを実装したものが javax.servlet.http.HttpServlet
クラスであり、普通はこれを継承してサーブレットを記述する。
クライアント要求と応答はオブジェクトとして扱われる。サーブレットは、クライアント要求を ServletRequest
インタフェース型オブジェクトにカプセル化して受け取り、応答は ServletResponse
インタフェース型オブジェクトにカプセル化して受け渡すことになる。要求/応答をインスタンス化することは無いので、具体的な実装クラスを自分で定義する必要はない。これを継承して HTTP 固有のメソッドを宣言したインタフェースが javax.servlet.http.HttpServletRequest
/ javax.servlet.http.HttpServletResponse
であり、普通はこのインタフェース型にカプセル化して要求/応答を受け取る。要求/応答をオブジェクトとして扱うことで、サーブレット、 JSP、 Bean 間で受け渡すことが可能になり、処理を委譲することができます。
サーブレットにも、アプレットと似たようなライフサイクルがあります。それらは、javax.servlet.Servlet
インタフェースの init()
, service()
, destroy()
で表現されており、全てのサーブレットは、これらを実装する必要がある。
このインタフェースを実装した抽象クラスである javax.servlet.GenericServlet
, javax.servlet.http.HttpServlet
を継承すれば、直接実装する義務はなくなる。
init(ServletConfig config)
public void init(ServletConfig config) throws ServletException
サーブレットコンテナがサーブレットの初期化時に呼ぶ。オーバーライドするときは、内部で super.init(config)
も呼んで通常の処理もさせる必要がある。
service(ServletRequest req, ServletResponse res)
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
サーブレットがクライアントの要求に応答するときに、サーブレットコンテナに呼ばれる。javax.servlet.http.HttpServlet
を実装していれば、HTTP の標準的な要求は doGet()
, doPost()
などのメソッドで扱えるので、 service()
メソッドをオーバーライドすることはない。
destroy()
public void destroy()
メモリ上のサーブレットのインスタンスが破壊されるときに、サーブレットコンテナに呼ばれる。終了作業が必要なときにオーバーライドする。
サーブレットは *.java
ファイルで作成し、サーバには javac
でコンパイルした *.class
ファイルを用意しておきます。このファイルを Web Application の一部と認識させるために、サーバのコンテキスト・ルートには web.xml
ファイルを作成します。
web.xml
は Deployment Deplicator と呼ばれ、サーブレットのクラスファイルの所在をアプリケーションサーバに知らせる働きを持ちます。
Sun Microsystems のサーブレット仕様では、サーブレットのファイルは、ドキュメント・ルートとして指定したフォルダの中の /WEB-INF/classes/
の中に配備します。これを参照するサーブレット名を /WEB-INF/web.xml
に記述することになります。このあたりの実装は、サーバ製品によって異なるので、製品ごとの仕様の確認が必要ですが、 Tomcat は Sun Microsystems の Servlet Specification に従っています。