initメソッドとdestroyメソッド

広告

前のページでサーブレットのライフサイクルに関して見ていきましたが、サーブレットのインスタンスが作成された後、そして破棄される前にそれぞれ特定のメソッドを呼びだすことが出来ます。

initメソッド

インスタンスが作成された後で実際の処理が行われる前に呼び出されるのが「init」メソッドです。最初のリクエストに対してスレッドが作成され実際の処理が行われる前に呼び出されることが保証されています。その為、インスタンス自体に対して初期化するような処理を記述するのに利用されます。(「init」メソッド内にローカルの初期化処理を記述してもインスタンスの初回作成時にしか実行されませんので注意して下さい)。

「init」メソッドは「HttpServlet」クラスの親クラスである「GenericServlet」クラスで定義されています。

A convenience method which can be overridden so that there's no need
to call super.init(config). 

Instead of overriding init(ServletConfig), simply override this method
and it will be called by GenericServlet.init(ServletConfig config). 
The ServletConfig object can still be retrieved via getServletConfig(). 

Throws: 
  ServletException - if an exception occurs that interrupts the 
    servlet's normal operation

「init」メソッドには引数の異なる「init(ServletConfig config)」と言うメソッドがありますがあまり意識しなくても結構です。通常は引数無しの「init」メソッドをオーバーライドして使います。

実際の使い方としては次のような感じとなります。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
  public void init() throws ServletException{
    /* 初期化処理 */
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    /* ... */

  }
}

「init」メソッドはインスタンス作成後に一度だけ呼ばれるメソッドですので、インスタンス変数の初期化などに利用します。

destroyメソッド

サーブレットが破棄される前に呼び出されるのが「destroy」メソッドです。インスタンス変数の値をファイルに書き出したり、インスタンスで共有していたデータベース接続の切断処理を行ったりといった処理を行うのに使います。

「destroy」メソッドは「HttpServlet」クラスの親クラスである「GenericServlet」クラスで定義されています。

Called by the servlet container to indicate to a servlet that the 
servlet is being taken out of service. See Servlet.destroy().

実際に使う場合には「destroy」メソッドをオーバーライドして処理したい内容を記述します。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
  public void init() throws ServletException{
    /* 初期化処理 */
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    /* ... */

  }

  public void destroy(){
    /* 終了処理 */
  }
}

サンプルプログラム

では簡単なサンプルで試して見ます。

Sample3.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample3 extends HttpServlet {

  int count;

  public void init() throws ServletException{
    count = 100;
    log("カウント開始します");
  }

  public void destroy(){
    log("カウントの最終値は" + count + "でした");
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    StringBuffer sb = new StringBuffer();

    sb.append("<html>");
    sb.append("<head>");
    sb.append("<title>サンプル</title>");
    sb.append("</head>");
    sb.append("<body>");

    count++;
    sb.append("<p>訪問人数:");
    sb.append(count);
    sb.append("</p>");

    sb.append("</body>");
    sb.append("</html>");

    out.println(new String(sb));

    out.close();
  }
}

「init」メソッドでカウンターの初期値を設定し、「destroy」メソッドでサーブレットが破棄される時のカウンターの最終値をログに記録します。

サンプルプログラムをコンパイルして作成した「Sample3.class」ファイルと別途作成した「web.xml」ファイルを次のように配置します。

D:¥ -- servlet-sample
        |
        +-- WEB-INF
             |
             +-- (web.xml)
             |
             +-- classes
                  |
                  +-- (Sample3.class)

web.xmlファイルは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>Sample3</servlet-name>
    <servlet-class>Sample3</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Sample3</servlet-name>
    <url-pattern>/Sample3</url-pattern>
  </servlet-mapping>
</web-app>

コンテキストファイルを作成し「(Tomcatをインストールしたディレクトリ)¥Tomcat 5.5¥conf¥Catalina¥localhost¥」ディレクトリに「sample.xml」ファイルとして保存します。内容は以下の通りです。

<Context path="/sample"
docBase="d:/servlet-sample/sample">
</Context>

準備は以上です。ではTomcatを再起動してから「http://localhost:8080/sample/Sample3」へブラウザでアクセスして下さい。

initメソッドとdestroyメソッド

このようにカウンターの初期値が設定されています。ではカウンターが増えるようにリロードなどを行って下さい。

initメソッドとdestroyメソッド

ここでTomcatを停止します。コンテナであるTomcatが停止すればサーブレットも破棄されますのでログにカウンターの値が記録されます。実際にログを確認してみると次のように記録されていました。

2006/11/15 20:41:52 org.apache.catalina.core.ApplicationContext log
情報: Sample3: カウント開始します
2006/11/15 20:42:10 org.apache.catalina.core.ApplicationContext log
情報: Sample3: カウントの最終値は112でした

※ログは「(Tomcatをインストールしたディレクトリ)¥Tomcat 5.5¥logs」ディレクトリの中にあります。

( Written by Tatsuo Ikura )