ログの実現-スクリーンショット方式

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が対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.例:
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ファイルに傍受を配置する