Spring Controller层记录日志配置

 
  
主要是靠实现 ModelAndViewResolver 然后最后返回ModelAndViewResolver.UNRESOLVED

Spring 的org.springframework.web.servlet.mvc.method.annotation.ModelAndViewResolverMethodReturnValueHandler#handleReturnValue处理判断

Spring Controller层记录日志配置_第1张图片

实现类:
 
  
package com.ruishenh.spring.test;

import org.springframework.ui.ExtendedModelMap;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created by Administrator on 2016/1/30.
 */
public class MyModelAndViewResolver implements ModelAndViewResolver {

    /**
     * 支持处理多种参数逻辑
     */
    public static final ThreadLocal params = new ThreadLocal() {
        @Override
        protected Param initialValue() {
            return new Param();
        }
    };

    public ModelAndView resolveModelAndView(Method handlerMethod, Class handlerType, Object returnValue, ExtendedModelMap implicitModel, NativeWebRequest webRequest) {
        Class declaringClass = handlerMethod.getDeclaringClass();
        String clsAndMethod = declaringClass.getSimpleName() + "." + handlerMethod.getName();
        HttpServletRequest request = ((ServletWebRequest) webRequest).getRequest();
        //获取请求ip
        Map parmMap = getParmMap(request);
        params.get().setP1(parmMap);
        String ip = request.getRemoteAddr();
        System.out.println(clsAndMethod + "\tparam:" + params.get() + "\treturn:" + returnValue + "\tip:" + ip);
        params.set(new Param());
        return ModelAndViewResolver.UNRESOLVED;
    }

    /**
     * extract a Map from HttpServletRequest
     *
     * @param request
     * @return
     */
    public static Map getParmMap(HttpServletRequest request) {
        HashMap map = new HashMap();
        @SuppressWarnings("unchecked")
        Map orimap = request.getParameterMap();
        Set keys = orimap.keySet();
        for (String key1 : keys) {
            String key = key1;
            String[] value = (String[]) orimap.get(key);
            if (value.length > 1) {
                map.put(key, value);
            } else {
                map.put(key, value[0]);
            }
        }
        return map;
    }

    /**
     * 封装一下参数对象,因为当json的时候是获取不到get,post的一些servlet参数的
     */
    public static class Param {
        Object p1;
        Object p2;

        public Param() {
        }

        public Object getP1() {
            return p1;
        }

        public void setP1(Object p1) {
            this.p1 = p1;
        }

        public Object getP2() {
            return p2;
        }

        public void setP2(Object p2) {
            this.p2 = p2;
        }

        @Override
        public String toString() {
            return "Param{" +
                    "p1=" + p1 +
                    ", p2=" + p2 +
                    '}';
        }
    }
}


 
  
 
  

支持json的发送接受

package com.ruishenh.spring.test;

import com.fasterxml.jackson.databind.JavaType;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * Created by Administrator on 2016/1/30.
 */
public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    @Override
    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        Object o = super.readInternal(clazz, inputMessage);
        MyModelAndViewResolver.params.get().setP2(o);//set到 自定义的Params中去
        return o;
    }

    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        super.writeInternal(object, outputMessage);
    }
}

Spring配置文件
 
  
 
  

    
        
            
            
        
    
    
        
            
        
    

运行效果:

Json


Spring Controller层记录日志配置_第2张图片

 
  
 
  

POST请求json返回

 
  

Post请求 页面返回

Spring Controller层记录日志配置_第3张图片

Console效果:

Spring Controller层记录日志配置_第4张图片
 
  
 
  
 
  
LogTestController.c	param:Param{p1={}, p2=Adata{name='小明', age=20}}	return:Adata{name='小明', age=20}	ip:0:0:0:0:0:0:0:1
LogTestController.a	param:Param{p1={age=123, name=宿舍}, p2=Adata{name='小明', age=20}}	return:Adata{name='宿舍2', age=20}	ip:0:0:0:0:0:0:0:1
LogTestController.b	param:Param{p1={param=宿舍xxx}, p2=Adata{name='小明', age=20}}	return:path	ip:0:0:0:0:0:0:0:1

 
  
 
  
 
  
 
  
 
  
 
  

曾参考过这儿的配置

http://blog.csdn.net/czmchen/article/details/42392985

发现当前我们项目已经是好多人开发的东西不可能每一个method都修改所以,感觉不太合适,不过可能其他的小伙伴可能会有用

如果配置上边不好使可能是配置:

<mvc:annotation-driven/> <mvc:default-servlet-handler/>

可以看下这个:http://blog.csdn.net/ruishenh/article/details/50629710

 
  

 
 

你可能感兴趣的:(spring,MVC-视图层)