|
| |
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 |