springMVCソース分析--Handler Interceptorブロック(一)
5402 ワード
SpringMVCに詳しい人はきっとHandler Interceptorブロックに接触したことがあります.Handler Interceptorインターフェースは私達に3つの方法を提供してくれました.
(1)preHandle:controller処理を実行する前に実行し、戻り値はbootlean、戻り値はtrueの時に引き続きpostHandleとafterCompletionを実行し、falseに戻ったら実行を中断します.
(2)postHandle:controllerの処理を実行した後、ModelAndView処理前に実行する
(3)afterComplection:DisplatServletがModelAndViewを実行した後に実行する
ソースは以下の通りです
Language Interceptorの詳細な実現.
HandlerInterceptorAdapterは抽象的なクラスであり、Handler Intercepterのサブクラスでもあります.Handler Intercepterの3つの関数を実現した後、もう一つの関数を追加しました.(1)preHandle:controller処理を実行する前に実行し、戻り値はbootlean、戻り値がtrueの場合はpostHandleとafterComppletionを実行し、falseに戻ったら実行を中断します.(2)postHandle:controllerの処理を実行した後、ModelAndView処理を実行します.afterContcurrent HandlingStared:この方法はController法の非同期実行時に実行されますが、InterceptorのpostHandle方法はControllerの非同期が実行されるまで待つ必要があります.これを受け継ぎ、その方法を実現すればいいです.
(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;
}