スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVCとFilterを使ってみる

検証環境にSpring MVCを使って、Filterを実装してみる。

Filterの題材は、Springから提供されている「org.springframework.web.filter.CharacterEncodingFilter」を自作のエンコーディングフィルターに置き換えてみることにした。

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.3.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.EncodingFilter
動作確認用に、ログを埋め込んでいる。ロガーは「SLF4J+Logback」を使用している。
※「SLF4J+Logback」に関する過去の記事
Spring MVC SLF4JとLogbackを使ってpatternタグを検証する

package jp.co.sample.filter;

import java.io.IOException;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EncodingFilter implements Filter {

public static String INIT_PARAM_NAME_ENCODING = "encoding";
public static String DEFAULT_ENCODING = "UTF-8";

private String encoding;

private static Logger logger = LoggerFactory.getLogger(EncodingFilter.class);

public void init(FilterConfig config) throws ServletException {

logger.debug("EncodingFilter#init start");
encoding = config.getInitParameter(INIT_PARAM_NAME_ENCODING);
logger.debug("encoding: {}",encoding);
if (encoding == null) {
encoding = DEFAULT_ENCODING;
}
logger.debug("encoding: {}",encoding);
logger.debug("EncodingFilter#init end");
}

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

logger.debug("EncodingFilter#doFilter start");
logger.debug("request.characterEncoding: {}",req.getCharacterEncoding());
if (req.getCharacterEncoding() == null) {
req.setCharacterEncoding(encoding);
logger.debug("request.characterEncoding: {}",req.getCharacterEncoding());
}
chain.doFilter(req, res);
logger.debug("EncodingFilter#doFilter end");
}

public void destroy() {
logger.debug("EncodingFilter#destroy");
}
}

フィルターは「javax.servlet.Filterインターフェース」を実装することで利用できる。
Filterのメソッドとして以下の3つを実装する必要がある。
init・・・アプリケーション起動時にコールされる。パラメタの初期化など行う。
doFilter・・・chain.doFilter(req, res);の前後に挟み込みたい処理を記述する。
destroy・・・アプリケーション停止時にコールされる。インスタンスの破棄など行う。
initメソッドでは、後述するweb.xmlのinit-paramタグのparam-nameに「encoding」が定義されている場合、param-valueの値をそのまま使い、定義されていない場合は、本フィルタークラスにて「UTF-8」を設定している。
doFilterメソッドでは、requestパラメタのcharacterEncodingを取得し、設定されていない場合は、「encoding(=UTF-8)」を設定している。

2.Controllerクラス


@Controller
@RequestMapping("book")
public class BookController {

private static Logger logger = LoggerFactory.getLogger(BookController.class);

@Autowired
protected BookService bookService;

@RequestMapping(method = RequestMethod.GET)
public String index(BookForm form) {
logger.info("index start");
return "newBook";
}

@RequestMapping(value = "create", method = RequestMethod.POST)
public String create(@Valid BookForm form, BindingResult result, Model model) {
logger.info("create start");
if (result.hasErrors()) {
return "newBook";
}
//TODO bookServiceより返却されたBookオブジェクトをmodelに追加する
return "result";
}
}

BookControllerクラスでは、
・「http://localhost:8080/SpringWebSample/book」 ⇒ indexメソッドをコール
・「http://localhost:8080/SpringWebSample/book/create」 ⇒ createメソッドをコール
するようマッピングしている。

3.web.xml



characterEncodingFilter


jp.co.sample.filter.EncodingFilter




characterEncodingFilter
    
/book/create


Springが提供しているCharacterEncodingFilterクラスの代わりに自作したEncodingFilterクラスを設定している。
init-paramタグについては通常有効とするが、EncodingFilterクラスで「UTF-8」が設定されることを確認するため、コメントアウト(無効)にしている。
また、url-patternタグの値についても、すべてのURLに一致する「/*」をコメントアウトして、BookControllerクラスのcreateメソッドのみに対応することを確認するため、「/book/create」に変更している。
補足として、filter-nameタグの値は任意でよい。(フィルタークラス名と同じでなくてよい)

実際に動かしてみた。

4.Consoleログ
●アプリケーション起動時


--- 省略 ----
情報: Root WebApplicationContext: initialization completed in 422 ms
DEBUG EncodingFilter#init - EncodingFilter#init start
DEBUG EncodingFilter#init - encoding: null
DEBUG EncodingFilter#init - encoding: UTF-8
DEBUG EncodingFilter#init - EncodingFilter#init end

EncodingFilterクラスのinitメソッドが実行されている。
web.xmlのinit-paramタグを無効化しているため、「config.getInitParameter(INIT_PARAM_NAME_ENCODING)」で値を取得できず「null」となり、その後「UTF-8」が設定されていることが分かる。

●URL:http://localhost:8080/SpringWebSample/book


INFO BookController#index - index start

EncodingFilterクラスのdoFilterメソッドが実行されていないことが分かる。

●URL:http://localhost:8080/SpringWebSample/book/create


DEBUG EncodingFilter#doFilter - EncodingFilter#doFilter start
DEBUG EncodingFilter#doFilter - request.characterEncoding: null
DEBUG EncodingFilter#doFilter - request.characterEncoding: UTF-8
INFO BookController#create - create start
DEBUG EncodingFilter#doFilter - EncodingFilter#doFilter end

EncodingFilterクラスのdoFilterメソッドが実行されていることが分かる。
requestのcharacterEncodingに「UTF-8」が設定された後、createメソッドがコールされ、その後再びdoFilterメソッドに返ってきており、Filterが期待通りに動作していることが確認できた。(※「create end」は用意していない)

◎まとめ
今回の検証では、主にweb.xmlの設定とFilterクラスの対応関係を確認したが、SpringMVCとFilterはURLのマッピングが分かりやすく、非常に相性が良いと感じた。

■過去のSpring関連記事
Spring関連記事 Index

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。