springMVCソース分析--Handler Interceptorブロック(一)


SpringMVCに詳しい人はきっとHandler Interceptorブロックに接触したことがあります.Handler Interceptorインターフェースは私達に3つの方法を提供してくれました.
(1)preHandle:controller処理を実行する前に実行し、戻り値はbootlean、戻り値はtrueの時に引き続きpostHandleとafterCompletionを実行し、falseに戻ったら実行を中断します.
(2)postHandle:controllerの処理を実行した後、ModelAndView処理前に実行する
(3)afterComplection:DisplatServletがModelAndViewを実行した後に実行する
ソースは以下の通りです
public interface HandlerInterceptor {

	
	 /** 
     * preHandle            ,    ,     Controller        ,SpringMVC  Interceptor       ,       
     *   Interceptor,  SpringMVC                  ,     Interceptor  preHandle      
     * Controller        。SpringMVC   Interceptor             ,        preHandle   
     *    false, preHandle     false           。 
     */  
	boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
	    throws Exception;

	
	/** 
     *            Interceptor preHandle      true       。postHandle          ,                 
     *  ,    Controller         ,     DispatcherServlet           ,              ModelAndView    
     *  。                     ,        Interceptor            ,  Struts2              , 
     *   Struts2   intercept         ActionInvocation invoke  ,Struts2   ActionInvocation invoke         Interceptor 
     *      action,    Interceptor            invoke  ,  Interceptor            invoke    。 
     */
	void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception;

	
	/** 
     *             Interceptor preHandle       true     。             ,   DispatcherServlet       , 
     *                  ,              Interceptor preHandle       true     。 
     */ 
	void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception;

}
は簡単にブロックを実現して、ほとんど何も実現していません.以前書いたブログのspringMVCソース分析を見てもいいです.国際化の実現SessionとCookie(二)の中で
Language Interceptorの詳細な実現.
public class MyInterceptor implements HandlerInterceptor {
	/**
	 * @Title: preHandle
	 * @Description:    controller    
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception 
	 */ 
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		return true;
	}
	/**
	 * @Title: postHandle
	 * @Description:     controller  ,ModelAndView        
	 * @param request
	 * @param response
	 * @param handler
	 * @param modelAndView
	 * @throws Exception 
	 */ 
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
	        throws Exception {
	}
	/**
	 * @Title: afterCompletion
	 * @Description:              ,   DispatcherServlet        
	 * @param request
	 * @param response
	 * @param handler
	 * @param ex
	 * @throws Exception 
	 */ 
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
	        throws Exception {
	}
	
}
SpringMVCも提供しました.
HandlerInterceptorAdapterは抽象的なクラスであり、Handler Intercepterのサブクラスでもあります.Handler Intercepterの3つの関数を実現した後、もう一つの関数を追加しました.(1)preHandle:controller処理を実行する前に実行し、戻り値はbootlean、戻り値がtrueの場合はpostHandleとafterComppletionを実行し、falseに戻ったら実行を中断します.(2)postHandle:controllerの処理を実行した後、ModelAndView処理を実行します.afterContcurrent HandlingStared:この方法はController法の非同期実行時に実行されますが、InterceptorのpostHandle方法はControllerの非同期が実行されるまで待つ必要があります.これを受け継ぎ、その方法を実現すればいいです.
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
	/**
	 * This implementation always returns {@code true}.
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {
		return true;
	}
	/**
	 * This implementation is empty.
	 */
	@Override
	public void postHandle(
			HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
	}
	/**
	 * This implementation is empty.
	 */
	@Override
	public void afterCompletion(
			HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
	/**
	 * This implementation is empty.
	 */
	@Override
	public void afterConcurrentHandlingStarted(
			HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
	}

}
Arynchandler Interceptorも一つのインターフェースであり、after Concerenthandling Startdの方法定義を提供しています.
public interface AsyncHandlerInterceptor extends HandlerInterceptor {

	/**
	 * Called instead of {@code postHandle} and {@code afterCompletion}, when
	 * the a handler is being executed concurrently.
	 * 

Implementations may use the provided request and response but should * avoid modifying them in ways that would conflict with the concurrent * execution of the handler. A typical use of this method would be to * clean up thread-local variables. * * @param request the current request * @param response the current response * @param handler the handler (or {@link HandlerMethod}) that started async * execution, for type and/or instance examination * @throws Exception in case of errors */ void afterConcurrentHandlingStarted( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; }