JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > サーブレット(フィルタ)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/10/25  田中宏和
Last Update 2002/12/19
サーブレット(フィルタ)編
◆サーブレットとは?
 サーブレットはサーバーで動くJavaのプログラムです。クライアントのWEBブラウザから要求があると、サーブレットのプログラムがHTMLを動的に生成して結果をWEBブラウザに返します。
◆フィルタとは?
Java Servlet API2.3から導入された新機能で、クライアントからの要求になんらかの処理をしてサーブレット、JSPまたはその他のリソースにその要求を渡す機能のことです。
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01
Tomcat 4.0.6
◆Javaの実行環境の構築
アプリケーション編を参考にJ2SE SDKをインストールしてJavaの実行環境を構築します。
◆サーブレットでHello Worldプログラムの作成
Servlet編を参考にしてHello Worldプログラムの作成してください。
◆javahelloという自分のWEBアプリケーションを作成
Servlet編を参考にして自分のWEBアプリケーションを作成して、Servlet編で作成したHelloWorldServlet.classを[Tomcatのフォルダ]\webapps\javahello\WEB-INF\classes にコピーしてください。
◆フィルタクラスの作成
ここではログに呼び出されたことを確認するメッセージを表示する何の処理もしないフィルタを作りたいと思います。[Tomcatのフォルダ]\webapps\javahello\WEB-INF\classes\HelloWorldFilter.javaファイルを作成します。
<フィルタクラスの作り方>
1. javax.servlet.Filterインターフェースを実装(implements)する。
2. doFilter()、init()、destroy()メソッドの3つを実装する。
3. doFilter()メソッドに処理を記述する。
HelloWorldFilter.java(ここからダウンロード)
import java.io.*;
import javax.servlet.*;

public class HelloWorldFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException {

    /** ここに処理を記述 **/



    // ログに出力します。
    System.out.println("Hello World Filter");
    // 次のフィルタまたは元々要求されていたリソースを呼び出します。
    // (今回の場合はサーブレット)
    chain.doFilter(req, res);
  }
  public void init(FilterConfig config) throws ServletException {
  }
  public void destroy() {
  }
}
 
◆コンパイル
コマンドプロンプト
C:\>cd C:\Program Files\Apache Tomcat 4.0\webapps\javahello\WEB-INF\classes

C:\Program Files\Apache Tomcat 4.0\webapps\javahello\WEB-INF\classes>javac HelloWorldFilter.java

C:\Program Files\Apache Tomcat 4.0\webapps\javahello\WEB-INF\classes>

◆web.xmlファイルにフィルタの設定を記述
次にweb.xmlファイルにフィルタの設定を記述します。ここではHelloWorldServletにリクエストがあった場合にHelloWorldFilterをフィルタとして使用するという設定を記述します。
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!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>helloFilter</filter-name>
    <filter-class>HelloWorldFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>helloFilter</filter-name>
    <url-pattern>/servlet/HelloWorldServlet</url-pattern>
  </filter-mapping>
</web-app>
 
■説明
<filter>・・・フィルタクラスを定義します。
<filter-mapping>・・・あるURLにリクエストがあったときにどのフィルタを使用するか定義します。ここでは/servlet/HelloWorldServletにリクエストがあったときに上で定義したhelloFilterを使うように記述しています。/servlet/* のようにワイルドカードも使用できます。
 
◆Tomcatを起動とサーブレットの呼び出し
[Tomcatのフォルダ]\bin\startup.batを実行してTomcatを起動しましょう。起動したら以下のURLをブラウザで開いてみてください。
http://localhost:8080/javahello/servlet/HelloWorldServlet
正常に動作しましたね。
次にTomcatを起動しているコマンドプロンプトを見てみましょう。
おおおお!ログが表示されていますね!
 
◆フィルタの使用例
■サーブレットの実行時間を測定するフィルタ
このようにするとサーブレットの処理時間を測定することができます。このフィルタを使用することによって処理が遅いサーブレットを調べることができます。
HelloWorldTimeFilter.java(ここからダウンロード)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorldTimeFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException {
    // 開始時間取得
    long startTime = System.currentTimeMillis();
    // 元々要求されていたリソースを呼び出します
    chain.doFilter(req, res);
    // 終了時間取得
    long stopTime = System.currentTimeMillis();

    // リクエストのURIを取得
    String name = "";
    if (req instanceof HttpServletRequest) {
      name = ((HttpServletRequest)req).getRequestURI();
    }
    // 表示
    System.out.println(name + ": " + (stopTime - startTime) + "ミリ秒");
  }
  public void init(FilterConfig config) throws ServletException {
  }
  public void destroy() {
  }
}
 
■文字エンコーディングを指定するフィルタ
フィルタでリクエストの文字エンコーディングを指定します。このフィルタを使用するサーブレットではパラメーターの文字エンコーディングを変更しなくて済みます。
HelloWorldEncodingFilter.java(ここからダウンロード)
import java.io.*;
import javax.servlet.*;

public class HelloWorldEncodingFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException {
    // エンコーディング指定
    req.setCharacterEncoding("Shift_JIS");
    // 元々要求されていたリソースを呼び出します
    chain.doFilter(req, res);
  }
  public void init(FilterConfig config) throws ServletException {
  }
  public void destroy() {
  }
}
 
■アクセス制限を行うフィルタ
クライアントのアドレスを判別してアクセス制限を行うこともできます。
HelloWorldAccessFilter.java(ここからダウンロード)
import java.io.*;
import javax.servlet.*;

public class HelloWorldAccessFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException {
    // リモートアドレス取得
    String remoteAddr = req.getRemoteAddr();
    System.out.println(remoteAddr + "からアクセスがありました");

    // アドレスが192.168.1で始まる場合
    if (remoteAddr.startsWith("192.168.1")) {
      System.out.println("アクセスOK");
      // 元々要求されていたリソースを呼び出します
      chain.doFilter(req, res);
    } else { // それ以外の場合
      System.out.println("アクセス拒否");
      // エラーメッセージ用JSPに転送します
      RequestDispatcher rd = req.getRequestDispatcher("/error.jsp");
      rd.forward(req, res);
    }
  }
  public void init(FilterConfig config) throws ServletException {
  }
  public void destroy() {
  }
}
 
 

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME