简述springmvc的流程

4、SpringMVC的执行流程

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

  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:

a) 不存在

i. 再判断是否配置了mvc:default-servlet-handler

ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误

iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误

b) 存在则执行下面的流程

  1. 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。

  2. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。

  3. 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】

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

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

b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

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

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

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

  2. 此时将开始执行拦截器的postHandle(…)方法【逆向】。

  3. 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。

  4. 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。

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

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ey7KOniN-1685020606243)(C:\Users\李开恩\AppData\Roaming\Typora\typora-user-images\image-20230525205311919.png)](https://img-blog.csdnimg.cn/703c8826a92c4a4aa107cb3ac6e7af5b.png)

它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n2AHjhn-1685020606245)(C:\Users\李开恩\AppData\Roaming\Typora\typora-user-images\image-20230525205851267.png)]

判断是什么类型的请求

对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例

再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换

​ 经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上

另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法

它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法

判断是什么类型的请求

对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例

再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换

​ 经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上

另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值