springMVC的执行请求过程
springMVC的运行流程:
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回给DispatcherServlet
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果(ModelAndView)返回给DispatchServlet
8、DispatchServlet将ModelAndView传给ViewResolver视图解析器(如果加上@responsebody注解,则返回值不通过viewResolver,而是直接返回object)
9、ViewResolver解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11、DispatcherServlet响应用户
从以上过程可以看出,DispatcherServlet有接受请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。
简要过程如下:
下面我们从源码来详细分析请求的执行过程:
我们从页面发送的请求,进入DispatcherServlet类Service方法(位于DispatcherServlet类继承的——FrameworkServlet类中)捕获该请求:
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
if (HttpMethod.PATCH == httpMethod || httpMethod == null) {
processRequest(request, response);
}
else {
super.service(request, response);
}
}
获取到对应方法之后会调用对应(此处为doGet)方法:
@Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response);
} @Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response);
} //还有方法不列举......
进入processRequest方法——执行其doService方法:
而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):
然后执行其中的doDispatch方法:
进入该方法可知该方法处理了适配器以及GET请求:
然后执行Handler方法并构建视图processDispatchResult:
我们进入processDispatchResult方法查看构建,其中可看到
如果出现请求出现异常将会构建一个异常视图(如404页面等)
而在这之前我们需要的视图构建在render里创建:
我们沿着这一条线索往下走找到其实现的AbstractView中的render:
其中的renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);用于将请求和数据进行处理
继续往下走找到其实现的InternalResourceView中的renderMergedOutputModel
其中的红线标注的就是处理的Dispatch
标蓝部分就是请求转发
最新文章
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- iTool拷贝app到电脑上
- Js拼Json对象
- ciancd开源
- encode和decode
- Java注解教程及自定义注解
- IDF实验室-python ByteCode writeup
- Esper
- SQL在declare声明变量
- JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this
- Asynchronous programming in javascript
- JavaSE基础知识(5)—面向对象(5.7 final关键字)
- ionic报错: Failed to load resource
- C++拷贝构造函数的调用时机
- mongodb集群故障转移实践
- redgate的mysql架构比较和数据比较工具
- WPF 自定义鼠标光标
- ElasticSearch查询 第一篇:搜索API
- springboot配置hibernate jpa多数据源
- 初识网络进程通信<;Heart.X.Raid>;