当前位置: 首页 > news >正文

SpringMVC 的工作原理/执行流程?

简单来说:客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler -> HandlerAdapter 会根据 Handler 来调用真正的处理器来处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象 -> 前端控制器 DispatcherServlet 渲染数据(Model)-> 将得到视图对象返回给用户.

img

上图用于辅助理解,面试时可用下列 8 步描述 SpringMVC 运行流程:

  1. 用户向服务器发送请求,请求被 Spring 前端控制Servelt DispatcherServlet 捕获;

  2. DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI).然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回

  3. DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter 后,此时将开始执行拦截器的 preHandler(…)方法)

  4. 提取 Request 中的模型数据,填充 Handler 入参,开始执行Handler(Controller).在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:

(1)HttpMessageConveter:将请求消息(如:Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息;

(2)数据转换:对请求消息进行数据转换.如:String 转换成 Integer、Double 等;

(3)数据格式化:对请求消息进行数据格式化.如:将字符串转换成格式化数字或格式化日期等;

(4)数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中;

  1. Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象

  2. 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给DispatcherServlet;

  3. ViewResolver 结合 Model 和 View,来渲染视图

  4. 将渲染结果返回给客户端.

相关文章:

  • 进程详解(1)——可能是最深入浅出的进程学习笔记
  • SpringMVC 的核心组件有哪些?
  • Iaas-cloudstack概念
  • SpringMVC 常用的注解有哪些?
  • Thrift开发示例
  • @RequestMapping 的作用是什么?
  • 小奇的糖果(candy)
  • 如何解决 POST 请求中文乱码问题,GET 的又如何处理呢?
  • 修饰符与关键字
  • bootstrap 入门
  • SpringMVC 和 Struts2 的区别有哪些?
  • 递归经典问题详解
  • 讲下Spring框架
  • 视图间坐标转换
  • Spring与SpringMVC的区别
  • const let
  • css布局,左右固定中间自适应实现
  • ES10 特性的完整指南
  • ES学习笔记(12)--Symbol
  • iOS 系统授权开发
  • Java 内存分配及垃圾回收机制初探
  • Javascript编码规范
  • Linux中的硬链接与软链接
  • Object.assign方法不能实现深复制
  • SAP云平台里Global Account和Sub Account的关系
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue-cli在webpack的配置文件探究
  • zookeeper系列(七)实战分布式命名服务
  • 对象管理器(defineProperty)学习笔记
  • 构造函数(constructor)与原型链(prototype)关系
  • 规范化安全开发 KOA 手脚架
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端存储 - localStorage
  • 学习笔记:对象,原型和继承(1)
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​configparser --- 配置文件解析器​
  • ​queue --- 一个同步的队列类​
  • ​Spring Boot 分片上传文件
  • ​批处理文件中的errorlevel用法
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (3)(3.5) 遥测无线电区域条例
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C)一些题4
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (windows2012共享文件夹和防火墙设置
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (补)B+树一些思想
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (理论篇)httpmoudle和httphandler一览
  • (原)Matlab的svmtrain和svmclassify
  • (转)fock函数详解
  • (转)ORM
  • (转)setTimeout 和 setInterval 的区别