SpringMVC的执行流程以及工作机制

303 阅读3分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

前言

  • 关于作者:励志不秃头的一个CURD的Java农民工
  • 关于文章:本篇文章简单说说SpringMVC的执行流程以及工作机制

SpringMVC的作用

Spring Web MVC框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的Web应用程序。

MVC模式有助于分离应用程序的不同方面,如输入逻辑和业务逻辑;同时在这些元素之间提供松散耦合。

SpringMVC和Struts2的区别

  1. SpringMVC是基于方法的拦截,即一个方法映射一个URL,是单例模式;而Struts2是基于类的拦截,每次请求就会创建一个Action,是多例模式
  2. SpringMVC的入口是Servlet,即: DispatcherServlet,而Struts2的入口是Filter,即:StrutsPrepareAndExecuteFilter。
  3. SpringMVC(Spring3.0)可以做到0配置文件,而Struts2则不行。
  4. SpringMVC开发效率、性能、安全性都要远高于Struts2。

SpringMVC的执行流程

  1. 用户向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获
  2. DispatcherServlet 根据 servlet.xml 中的配置对请求的url解析,得到请求资源标识符(URI)。然后根据该URI调用HandlerMapping 获取 该Hander配置的所有相关对象(包括Handler对象 以及 Handler对象对应的拦截器),最后以HandlerExceutitionChain对象返回
  3. DispatcherServlet控制器根据获得的Handler对象获取处理起适配器HandlerAdapter,(如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler() 方法)执行一系列的操作,如:参数封装
  4. 提取Request 中的模型数据,填充Handler入参,开始执行Handler (Controller)。在填充Handler的入参过程中,根据配置,Spring将帮我们做一些额外的工作:
    • HttpMessageConveter:将请求消息(如:Json、xml等数据)转换成一个对象,将对象转成为指定的响应信息
    • 数据转换:对请求消息进行数据转换。如 String 转换成 Integer
    • 数据格式化:对请求消息进行数据格式化,如:将字符串数据根式化数据或日期
    • 数据校验:验证数据的有效性(长度、格式等等),验证结果存储到 BindingResult 或 Error 中
  5. Handler执行完成,返回 ModelAndView 给DispatcherServlet
  6. 根据返回的 ModelAndView ,选择一个适合的 ViewResoler (必须是已经注册到Spring容器中的ViewResoler),返回给 DispatcherServle
  7. ViewReslover解析后返回具体View
  8. DispatcherServlet对View进行渲染视图
  9. Http响应,结果显示到客户端

如果不想经过视图解析器,那么返回的数据就是 Json 了,使用 @ResponseBody注解就可以了。

HandlerAdapter

HandlerAdapter是SpringMVC中的处理器适配器,它是一个接口 微信图片_20220221142532.png SpringMVC提供了一系列HandlerAdapter实现 20220221142623.png

当HandlerMapping获取到执行请求的控制器类(Controller)后,DispatcherServlet再根据 Controller的类型来调用对应的HandlerAdapter类进行处理。 HandlerAdapter的作用就是负责找到控制器类( Controller)对应的处理方法。

SpringMVC的工作机制

SpringMVC框架都是围绕 DispatcherServlet 来工作的

工作机制流程:

  1. springMVC的容器初始化的时候,会建立所有url和controller的对应关系
  2. 根据url去找Controller
  3. 执行Controller
  4. 返回一个视图(JSP, JSON)

一个是工作机制,一个是执行流程;要注意下它们并不是同一个东西。好了,我是新生代农民工L_Denny,我们下篇文章见。