博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
源码 springmvc 请求加载过程
阅读量:5070 次
发布时间:2019-06-12

本文共 2844 字,大约阅读时间需要 9 分钟。

入口dispatchservlet
adapter分为三种 HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter(注解)
在web.xml声明的 annotation...handler annotation...handleradapter
对应的是是handler 按照适配器模式 应该是handler对应handleradapter 安卓上也用到了适配器模式
listview上面的要把数据修饰成adapter 然后才能付给listview处理。
//dispatchservlet 根据具体的handler找到匹配的handleradapter(适配器模式)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//调用handle方法 吧handler传入
HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
if (interceptors != null) {
for (int i = 0; i < interceptors.length; i++) {
//执行拦截器pre
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
return;
}
interceptorIndex = i;
}
}
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//handle方法中 吧Handler转化为controller
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
 
return ((Controller) handler).handleRequest(request, response);
}
//拦截器执行完controller的时候 在执行post拦截器。逆序
if (interceptors != null) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);
}
}
 
//渲染
render(mv, processedRequest, response);
//handleRequest中根据request的url 匹配到methodname 然后利用反射 调用方法。 返回modelandview(map封装了数据)或者string通过convetor(fastjsonconvetor)封装成json数据
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
try {
String methodName = this.methodNameResolver.getHandlerMethodName(request);
return invokeNamedMethod(methodName, request, response);
}
catch (NoSuchRequestHandlingMethodException ex) {
return handleNoSuchRequestHandlingMethod(ex, request, response);
}
}
//把requestmapping上的url和对应的方法装入到map中
private void registerHandlerMethods(Object delegate) {
this.handlerMethodMap.clear();
this.lastModifiedMethodMap.clear();
this.exceptionHandlerMap.clear();
 
// Look at all methods in the subclass, trying to find
// methods that are validators according to our criteria
Method[] methods = delegate.getClass().getMethods();
for (Method method : methods) {
// We're looking for methods with given parameters.
if (isExceptionHandlerMethod(method)) {
registerExceptionHandlerMethod(method);
}
else if (isHandlerMethod(method)) {
registerHandlerMethod(method);
registerLastModifiedMethodIfExists(delegate, method);
}
}
}
 
拦截器
继承Interceptorhandler
prehandle
posthandle
aftercompletion
resetcontroller
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
ResponseBody 是吧返回的字符串或者类(转化为json) 直接放到response的响应体

转载于:https://www.cnblogs.com/tecnologycc/p/10155863.html

你可能感兴趣的文章
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
iOS开发——缩放图片
查看>>
HTTP之URL的快捷方式
查看>>
满世界都是图论
查看>>
配置链路聚合中极小错误——失之毫厘谬以千里
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
数据结构3——浅谈zkw线段树
查看>>