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

标蓝部分就是请求转发

最新文章

  1. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
  2. iTool拷贝app到电脑上
  3. Js拼Json对象
  4. ciancd开源
  5. encode和decode
  6. Java注解教程及自定义注解
  7. IDF实验室-python ByteCode writeup
  8. Esper
  9. SQL在declare声明变量
  10. JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this
  11. Asynchronous programming in javascript
  12. JavaSE基础知识(5)—面向对象(5.7 final关键字)
  13. ionic报错: Failed to load resource
  14. C++拷贝构造函数的调用时机
  15. mongodb集群故障转移实践
  16. redgate的mysql架构比较和数据比较工具
  17. WPF 自定义鼠标光标
  18. ElasticSearch查询 第一篇:搜索API
  19. springboot配置hibernate jpa多数据源
  20. 初识网络进程通信<Heart.X.Raid>

热门文章

  1. SVM资源
  2. JS--easyui通用验证
  3. 获取input type=radio属性的value值
  4. vultr安装kali
  5. 【代码审计】VAuditDemo 文件包含漏洞
  6. QGridLayout栅格布局函数参数设置
  7. 关于浮动&关于BFC规范&whyoverflow清除浮动
  8. BGP前缀过滤(正则表达式)
  9. Cisco Packet Tracer 7.2
  10. 【Python】【Django】用户注册功能