Controller前後に実行される共通の処理を作る

というメモ。


HandlerInterceptorかWebRequestInterceptorの実装クラスを作り、
設定ファイルに書けば、Contorollerの前後に共通の処理を挟める
ようになる。

  • 実装クラス
public class HogeInterceptor implements HandlerInterceptor {
    private static final Log log = LogFactory.getLog(HogeInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler) throws Exception {
        log.info("preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
            Object handler, Exception ex) throws Exception {
        log.info("afterCompletion");
    }
}
    • HandlerInterceptorを実装しているが、全メソッドを実装する必要がない場合、HandlerInterceptorAdapterを継承した方がラク
    • afterCompletionは、Viewのレンダリングが終了したときに呼ばれる。その他のメソッドはControllerの前後。
    • WebRequestInterceptorの場合、引数がWebRequestクラスとなる。HttpServletRequest#getParameterを使ってもリクエストパラメータが取得できないが、WebRequestからだと取得できる・・・みたいだけどどうしてこんなんなってるかはまだ追い切れてない。
  • 設定ファイル
<mvc:interceptors>
    <bean class="jp.gr.java_conf.ykhr.sptest.HogeInterceptor" />
</mvc:interceptors>

特定のパスのみ実行したい場合の設定。
# マニュアルに書いてあっただけで試してない

<mvc:interceptors>
    <mvc:interceptor>
        <mapping path="/hoge/*"/>
        <bean class="jp.gr.java_conf.ykhr.sptest.HogeInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>


その昔、DispatcherServletを拡張するとか思ってたが
愚かな行為だったようだ・・・。