「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
前言
- 关于作者:励志不秃头的一个CURD的Java农民工
- 关于文章:本篇文章简单说说SpringMVC的执行流程以及工作机制
SpringMVC的作用
Spring Web MVC框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的Web应用程序。
MVC模式有助于分离应用程序的不同方面,如输入逻辑和业务逻辑;同时在这些元素之间提供松散耦合。
SpringMVC和Struts2的区别
- SpringMVC是基于方法的拦截,即一个方法映射一个URL,是
单例模式;而Struts2是基于类的拦截,每次请求就会创建一个Action,是多例模式。 - SpringMVC的入口是Servlet,即: DispatcherServlet,而Struts2的入口是Filter,即:StrutsPrepareAndExecuteFilter。
- SpringMVC(Spring3.0)可以做到0配置文件,而Struts2则不行。
- SpringMVC开发效率、性能、安全性都要远高于Struts2。
SpringMVC的执行流程
- 用户向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获
- DispatcherServlet 根据 servlet.xml 中的配置对请求的url解析,得到请求资源标识符(URI)。然后根据该URI调用HandlerMapping 获取 该Hander配置的所有相关对象(包括Handler对象 以及 Handler对象对应的拦截器),最后以HandlerExceutitionChain对象返回
- DispatcherServlet控制器根据获得的Handler对象获取处理起适配器HandlerAdapter,(如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler() 方法)执行一系列的操作,如:参数封装
- 提取Request 中的模型数据,填充Handler入参,开始执行Handler (Controller)。在填充Handler的入参过程中,根据配置,Spring将帮我们做一些额外的工作:
- HttpMessageConveter:将请求消息(如:Json、xml等数据)转换成一个对象,将对象转成为指定的响应信息
- 数据转换:对请求消息进行数据转换。如 String 转换成 Integer
- 数据格式化:对请求消息进行数据格式化,如:将字符串数据根式化数据或日期
- 数据校验:验证数据的有效性(长度、格式等等),验证结果存储到 BindingResult 或 Error 中
- Handler执行完成,返回 ModelAndView 给DispatcherServlet
- 根据返回的 ModelAndView ,选择一个适合的 ViewResoler (必须是已经注册到Spring容器中的ViewResoler),返回给 DispatcherServle
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图
- Http响应,结果显示到客户端
如果不想经过视图解析器,那么返回的数据就是 Json 了,使用 @ResponseBody注解就可以了。
HandlerAdapter
HandlerAdapter是SpringMVC中的处理器适配器,它是一个接口
SpringMVC提供了一系列HandlerAdapter实现
当HandlerMapping获取到执行请求的控制器类(Controller)后,DispatcherServlet再根据 Controller的类型来调用对应的HandlerAdapter类进行处理。 HandlerAdapter的作用就是负责找到控制器类( Controller)对应的处理方法。
SpringMVC的工作机制
SpringMVC框架都是围绕 DispatcherServlet 来工作的
工作机制流程:
- springMVC的容器初始化的时候,会建立所有url和controller的对应关系
- 根据url去找Controller
- 执行Controller
- 返回一个视图(JSP, JSON)
一个是工作机制,一个是执行流程;要注意下它们并不是同一个东西。好了,我是新生代农民工L_Denny,我们下篇文章见。