主要是靠实现 ModelAndViewResolver 然后最后返回ModelAndViewResolver.UNRESOLVED
Spring 的org.springframework.web.servlet.mvc.method.annotation.ModelAndViewResolverMethodReturnValueHandler#handleReturnValue处理判断
实现类:
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);
}
}
运行效果:
Json
POST请求json返回
Post请求 页面返回
Console效果:
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