ログの実現-スクリーンショット方式
3908 ワード
springログには、AOPを通じて、もう一つはブロックインターフェースを通じて、前の記事でaopがログを実現するという2つの方法があります.次はブロックインターフェースを通じてログを実現します.一、Interceptor実現類SprigMVCのInterceptorブロック要求はHandlerInterceptorによって実現されます.SprigMVCでInterceptorを定義するには、2つの方法があります.
第一の方法は定義されるInterceptor類がSpringのHandler Intercepterインターフェースを実現するか、またはこの種類の継承がHandlerInterceptorインターフェースを実現したクラス、例えばSpringがすでに提供したHandlerIntercepterインターフェースを実現した抽象的なHandlerInterceptorAdapter;
第二の方法はSpringのWebRequest Interceptrインターフェースを実現するか、またはWebRequest Interceptorのクラスを継承して実現することである. 私たちは第一の方式を採用しています.抽象的なタイプを実現します.
Handler InterceptorAdapter 抽象的なクラスでは、3つの方法が定義されています.私たちはこの3つの方法でユーザーの要求をブロック処理します.
(1)preHandle(HttpServletRequest request、HttpServletResonse、Object handle)方法は、要求処理の前に呼び出す. SprigMVCのInterceptorはチェーン式の呼び出しであり、一つのアプリケーションまたは一つの要求に複数のInterceptorが同時に存在することができる.各Interceptorの呼び出しは、その声明の順序に従って順次実行され、最初に実行されるのは、IntercepterにおけるpreHandle方法であるので、この方法では前置初期化操作や、現在要求されている一つの前処理を行っても良いし、この方法では、要求が継続するかどうかを判断しても良い.この方法の戻り値は、ブール値Booleanタイプであり、falseに戻ると、要求が終了し、後続のInterceptorとControllerは再実行されないことを示す.戻り値がtrueの場合は、次のIntercepterのpreHandleメソッドを呼び出し続けます.最後のInterceptorの場合は、現在の要求を呼び出すController方法です. (2)postHandle(HttpServletRequest request、HttpServRespnse reponse、Object handle、ModelAndView modelAndView)方法は、preHandle方法の解釈によって、後述するafterComplection方法が含まれていることが分かります. PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、DisparterServletがビューを行ってレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作することができます.postHandleメソッドが呼び出される方向はpreHandleとは逆で、つまり先に声明したInterceptorのpostHandle方法は逆に後に実行されます. (3)afterComppletion(HttpServletRequest request、HttpServletResonse reponse、Object handle、Exception ex)方法は、現在対応するInterceptorのprehandle方法の戻り値がtrueの時に実行されます. この方法は、要求全体が終了した後、すなわちDispactch Servletが対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.例:
第一の方法は定義されるInterceptor類がSpringのHandler Intercepterインターフェースを実現するか、またはこの種類の継承がHandlerInterceptorインターフェースを実現したクラス、例えばSpringがすでに提供したHandlerIntercepterインターフェースを実現した抽象的なHandlerInterceptorAdapter;
第二の方法はSpringのWebRequest Interceptrインターフェースを実現するか、またはWebRequest Interceptorのクラスを継承して実現することである. 私たちは第一の方式を採用しています.抽象的なタイプを実現します.
Handler InterceptorAdapter 抽象的なクラスでは、3つの方法が定義されています.私たちはこの3つの方法でユーザーの要求をブロック処理します.
(1)preHandle(HttpServletRequest request、HttpServletResonse、Object handle)方法は、要求処理の前に呼び出す. SprigMVCのInterceptorはチェーン式の呼び出しであり、一つのアプリケーションまたは一つの要求に複数のInterceptorが同時に存在することができる.各Interceptorの呼び出しは、その声明の順序に従って順次実行され、最初に実行されるのは、IntercepterにおけるpreHandle方法であるので、この方法では前置初期化操作や、現在要求されている一つの前処理を行っても良いし、この方法では、要求が継続するかどうかを判断しても良い.この方法の戻り値は、ブール値Booleanタイプであり、falseに戻ると、要求が終了し、後続のInterceptorとControllerは再実行されないことを示す.戻り値がtrueの場合は、次のIntercepterのpreHandleメソッドを呼び出し続けます.最後のInterceptorの場合は、現在の要求を呼び出すController方法です. (2)postHandle(HttpServletRequest request、HttpServRespnse reponse、Object handle、ModelAndView modelAndView)方法は、preHandle方法の解釈によって、後述するafterComplection方法が含まれていることが分かります. PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、DisparterServletがビューを行ってレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作することができます.postHandleメソッドが呼び出される方向はpreHandleとは逆で、つまり先に声明したInterceptorのpostHandle方法は逆に後に実行されます. (3)afterComppletion(HttpServletRequest request、HttpServletResonse reponse、Object handle、Exception ex)方法は、現在対応するInterceptorのprehandle方法の戻り値がtrueの時に実行されます. この方法は、要求全体が終了した後、すなわちDispactch Servletが対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.例:
package com.prh.log;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class SystemLogAspect extends HandlerInterceptorAdapter{
private static Logger log = Logger.getLogger(SystemLogAspect.class);
private NamedThreadLocal startTimeThreadLocal = new NamedThreadLocal("StopWatch-StartTime");
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
long beginTime = System.currentTimeMillis();
startTimeThreadLocal.set(beginTime);
log.info("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("postHandle");
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("hander = "+handler);
if (!(handler instanceof HandlerMethod)) {
return;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
log.info("afterCompletion");
}
}
三、spring-mvc.xmlファイルに傍受を配置する