Servlet

1月 1, 2003 · Posted in Java Servlet · Comment 

フィルタとは。

フィルタとはリクエストやリダイレクトに対してフィルタリングを行うメカニズムのこと。任意のサーブレットやJSPへのリクエストに対し、そのプログラムを実行する前にフィルタとして登録してあるクラスを実行することで、ロギング・認証などの仕組みをオリジナルのリソースを変更することなく、実現することが可能となる。

フィルタを後から追加する場合でも、すでにあるリソースやフィルタに変更を加えることなく追加することができる。

フィルタ実現の手順

フィルタの作成は以下の手順で行います。

  1. フィルタクラスを作成する。
  2. web.xml ファイルにフィルタを設定する。

フィルタクラスの作成

フィルタクラスを作成するには、javax.servlet.Filter インタフェースを実装する。Filter インタフェースには init(), doFilter(), destroy() という Servlet に良く似た3つのメソッドが用意されている。

各メソッドの役割も Servlet と同様で、

  • init():フィルタロード時の処理を記述
  • doFilter():フィルタクラス実行時の処理を記述
  • destroy():フィルタ破棄時の処理を記述

という役割になっている。

サンプル

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ConsoleFilter implements Filter{
    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("Filter初期化");
    }

    public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain){

        System.out.println("Filter通過");

        try{
            // 次のフィルタに処理を送る
            chain.doFilter(request, response);
        }catch(ServletException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public void destroy() {

        System.out.println("Filter破棄");
    }
}

次の処理にフィルタを送るメソッド chain.doFilter() を使用しているが、これは他のフィルタが存在する場合、そのフィルタに処理を送り、他のフィルタが存在しない場合には 実際のクラスへと処理を送るという動作を行う。

フィルタクラスのマッピング

フィルタクラスを作成したら、そのフィルタクラスを使用するために web.xml へ設定を行わなければならない。サーブレットにのマッピングと非常によく似ているため、理解しやすい。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.
  //DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <filter>
    <filter-name>consolefilter</filter-name>
    <filter-class>ConsoleFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>consolefilter</filter-name>
    <url-pattern>/sample</url-pattern>
  </filter-mapping>
</web-app>

filter-name:コンテナ上でのフィルタの別名
filter-class:フィルタの実際のクラス
filter-pattern:どのURLにフィルタを適用するか。ワイルドカード指定(*)も使用可能。

実行

実行結果 ※(括弧)内はプログラム以外の動作。

(サーブレットコンテナの起動)

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter初期化
Filter通過

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter通過

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter通過

(サーブレットコンテナの停止)
Filter破棄

Servlet と同じく、init() メソッドは一番初めのクラスロード時にのみ行われている。

Servlet – ライフサイクル

1月 1, 2003 · Posted in Java Servlet · Comment 

ライフサイクル

サーブレットのライフサイクルを、サーブレットコンテナの状態遷移と共に示す。

  1. サーブレットコンテナの起動
    基本的に、この時点ではサーブレットのインスタンスは生成されていない。
  2. サーブレットのロード
    クライアントからの最初の要求により、サーブレットをサーブレットコンテナにロードする。一度ロードされたサーブレットはメモリ上に駐在する。
  3. サーブレットの実行
    サーブレットが実行される。
  4. サーブレットのアンロード
    サーブレットコンテナの終了などにより、サーブレットのインスタンスがアンロードされる。

ライフサイクルメソッド

サーブレットにはライフサイクルに対応したメソッドが存在する。

ロード、アンロード時のメソッド

ロード時に init() メソッドが実行され、アンロード時に destroy() メソッドが実行される。

実行時のメソッド

HttpServlet には doXXX() という名前のメソッドが7種類定義されていて、リクエストの種類によって適切なメソッドが実行される。

参考:javax.servlet.http.HttpServlet(リンク先:Ja-Jakartaプロジェクト)

ライフサイクルメソッドサンプルコード

import javax.servlet.*;
import javax.servlet.http.*;

public class SampleServlet extends HttpServlet {
    // ロード時の処理
    public void init() throws ServletException {
        System.out.println("init");
    }

    //HTTP Get リクエストの処理
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException{
        System.out.println("doGet");
    }

    // アンロード時の処理
    public void destroy(){
        System.out.println("destroy");
    }
}

今回、このサーブレットをリクエスト get で呼び出すため、doGet() メソッドも実装した。そして、このサーブレットを http://localhost/Sample/sample/ という URL に対応付けた。では、実際にサーブレットを実行してみる。

実行結果※カッコ内はサーブレット以外の動作

(コンテナの起動)

(サーブレットを呼び出す)
init
doGet

(サーブレットを呼び出す)
doGet

(サーブレットを呼び出す)
doGet

(コンテナを終了)
destroy()

上記のライフサイクル通りの実行結果を得ることができた。

Servlet – HTMLファイルの出力

1月 1, 2003 · Posted in Java Servlet · Comment 

HTTPの仕組み

初めにWEBサーバからHTMLファイルを受信する手順を簡単に解説する。

  1. クライアント(ブラウザ)がサーバーにページを要求する(リクエスト)
  2. サーバーはリクエストに対する返答をクライアントに送る(レスポンス)。その際、Content-Type という項目に、送り返すデータがHTMLだということを示すための値、text/html を設定する。
  3. サーバからのレスポンスを受け取ったクライアントは Content-Type の値を参照し、処理を決定する。

HTMLの出力

クライアントに対してサーブレットからの応答を行う場合、javax.servlet.http.HttpServletResponse に対して編集を行えばよい。

HTMLファイルとして返す場合の処理を示す。

  1. HttpServletResponse の Content-Type に text/html を設定。
  2. HttpServletResponse から Writer を取得。
  3. 取得した Writer を使用して出力処理を行う。

サンプルコード

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

public class Servlet3 extends HttpServlet {
    //HTTP Get リクエストの処理
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>サンプル</title></head>");
        out.println("<body>");
        out.println("サーブレットが出力したHTMLファイル");
        out.println("</body></html>");
    }
}

response.setContentType() で text/html を設定しているため、この応答を受け取ったブラウザは、サーブレットが HTML を送り返してきていることを認識できる。よって、出力結果(out.println() の結果)を HTML として処理することになる。
実行結果

« 前ページへ次ページへ »