Servlet
フィルタとは。
フィルタを後から追加する場合でも、すでにあるリソースやフィルタに変更を加えることなく追加することができる。
フィルタ実現の手順
- フィルタクラスを作成する。
- web.xml ファイルにフィルタを設定する。
フィルタクラスの作成
各メソッドの役割も 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() を使用しているが、これは他のフィルタが存在する場合、そのフィルタに処理を送り、他のフィルタが存在しない場合には 実際のクラスへと処理を送るという動作を行う。
フィルタクラスのマッピング
<?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 – ライフサイクル
ライフサイクル
- サーブレットコンテナの起動
基本的に、この時点ではサーブレットのインスタンスは生成されていない。 - サーブレットのロード
クライアントからの最初の要求により、サーブレットをサーブレットコンテナにロードする。一度ロードされたサーブレットはメモリ上に駐在する。 - サーブレットの実行
サーブレットが実行される。 - サーブレットのアンロード
サーブレットコンテナの終了などにより、サーブレットのインスタンスがアンロードされる。
ライフサイクルメソッド
ロード、アンロード時のメソッド
ロード時に 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ファイルの出力
HTTPの仕組み
- クライアント(ブラウザ)がサーバーにページを要求する(リクエスト)
- サーバーはリクエストに対する返答をクライアントに送る(レスポンス)。その際、Content-Type という項目に、送り返すデータがHTMLだということを示すための値、text/html を設定する。
- サーバからのレスポンスを受け取ったクライアントは Content-Type の値を参照し、処理を決定する。
HTMLの出力
HTMLファイルとして返す場合の処理を示す。
- HttpServletResponse の Content-Type に text/html を設定。
- HttpServletResponse から Writer を取得。
- 取得した 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 として処理することになる。
実行結果

