图解 Spring:HTTP 央求的处理流程与机制【4】

4. HTTP 央求在 Spring 结构中的处理流程

在穿越了 Web 容器和Web 运用之后,HTTP 央求将被投送到 Spring 结构,咱们继续分析后续流程。Web 运用与 Spring MVC 的联接是经过装备文件 mvc-servlet.xml 完毕的,咱们经过这份装备文件界说构成 Spring MVC 的各种中心组件和初始化装备,这中心还包含:操控器 Controller、视图解析器 ViewResolver、视图 View 等等。不同组件别离承当不同的功用,在介绍 Spring 结构处理 HTTP 央求流程之前,咱们按例先了解一下这些中心组件

4.1 Spring 结构中心组件简介

咱们运用开发者在运用 Spring 时触摸最多的便是各种注解,包含:@Component、@Controller、@Service、@Repository 等,这些都是 Spring 的中心组件。除此之外,咱们还会运用 @RequestMapping、@RequestParam、@PathVariable、@RequestBody 等辅助性注解:

  • 模型 Model:封装了事务数据,首要以 POJO 办法存在。
  • 操控器 Controller:首要担任详细事务流程的调度操控,以及调用事务逻辑服务 Service。 操控器 Controller 处理完 HTTP 央求之后回来 ModelAndView 政策给前置分发器 DispatcherServlet,ModelAndView 中包含了模型 Model 政策和视图 View 称谓。
  • 视图 View:担任烘托出现模型 Model 数据,以及供给表单供用户录入各种事务数据。
  • 视图解析器 ViewResolver:担任依据已知的视图称谓获取一个特定视图 View 子类实例政策。
  • 处理器映射 HandlerMapping:首要担任操控器 Controller 的注册和查找,由运用上下文 ApplicationContext 持有。详细完毕上它具有 HashMap<String, Object> 类型的成员特征 handlerMap,其间 key 是 HTTP 央求的 URI 信息,value 可所以一个字符串或许处理央求的 HandlerExecutionChain。假定是 String,则视为 Spring Bean 称谓。
  • 服务 Service:首要担任完毕详细的事务逻辑。
  • 数据存储政策 Repository:也称为数据拜访政策 DAO(Data Access Object),不论选用什么开发结构,大部分运用都需求跟数据库交互,DAO 便是将拜访数据库操作做了封装,隔离了 SQL 相关复杂度。
    图解 Spring:HTTP 央求的处理流程与机制【4】
    抵达 Spring MVC 的悉数 HTTP 央求均由前置分发器 DispatcherServlet 一起分发,在将央求分发给特定的操控器 Controller 之前需求仰仗处理器映射 HandlerMapping 来定位,大约进程如下:

  • Web 容器监听主机特定端口,每逢有央求抵达时,Web 容器毕竟将调用 Servlet 的 service 办法处理 HTTP 央求。在 Spring Web 运用中,接纳 HTTP 央求的 Servlet 便是前置分发器 DispatcherServlet。
  • 在前置分发器 DispatcherServlet 的 service 办法中判别 HTTP 央求类型,包含:GET、POST、PUT、PATCH 等等,然后再挑选调用 doGet()、doPost()、doPut() 等办法。
  • 在 doGet()、doPost()、doPut() 等办法中实施 proce***equest() 办法,完毕央求上下文的的初始化。
  • 调用 doService() 办法,进一步实施 doDispatch() 办法。
  • 在 doDispatch() 办法中获取 HTTP 央求的 mappedHandler 和 HandlerAdapter,然后再建议对事务操控器 Controller 的调用以及后续流程,等候处理作用再构建照顾数据。

4.2 Spring 结构处理 HTTP 央求的流程

图解 Spring:HTTP 央求的处理流程与机制【4】

  • 前置分发器 DispatcherServlet 接纳到 HTTP 央求之后,将查找恰当的操控器 Controller 来处理央求,它经过解析 HTTP 央求的 URL 取得 URI,再依据该 URI 从处理器映射 HandlerMapping 傍边取得该央求对应的处理器 Handler 和处理器拦截器 HandlerInterceptor,毕竟以 HandlerExecutionChain 办法回来。
  • 前置分发器 DispatcherServlet 依据取得的处理器 Handler 挑选正真适合的适配器 HandlerAdapter。假定成功取得适配器 HandlerAdapter,在调用处理器 Handler 之前其拦截器的办法 preHandler() 优先实施。
  • 办法 preHandler() 提取 HTTP 央求中的数据填充到处理器 Handler 的入参傍边,然后开始调用处理器 Handler(即操控器 Controller)相关办法。
  • 操控器 Controller 实施完毕之后,向前置分发器 DispatcherServlet 回来一个模型与视图名政策 ModelAndView 。
  • 前置分发器 DispatchServlet 依据模型与视图名政策 ModelAndView 挑选比较适合的视图解析器 ViewResolver,条件该视图解析器有必要现已注册至 Spring IOC 容器傍边。
  • 视图解析器 ViewResolver 将依据 ModelAndView 里边指定的视图称谓取得特定的视图 View。
  • 前置分发器 DispatchServlet 将模型数据填充进视图傍边,然后将烘托作用回来给客户端。

在填充处理器 Handler 入参的进程中,Spring 还会依据装备做些预处理作业:

  • HttpMessageConveter:将央求音讯(JSONXML 等格局数据)转化成 Java 政策。
  • 数据转化:对 HTTP 央求中的数据做类型转化,例如:将 String 转化成 Integer、Double 等。
  • 数据格局化:对HTTP 央求中的特定数据做格局化,例如将字符串转化成格局化数字或格局化日期等。
  • 数据验证:验证数据的有效性(长度、格局等),验证作用存储到 BindingResult 或 Error 傍边。

4.3 不同运用架构下 HTTP 央求处理流程的差异

Spring Web 运用架构经历了多个阶段的打开,初步干流的前端视图技能便是 JSP,在此基础上又演化出了三剑客结构 SSH(StrutsSpringHibernate),但这时候前后端其实仍是耦合在一起的,不论是 JSP 仍是 SSH,在前面 Spring 结构处理 HTTP 央求的流程中,有必要要依托视图解析器 ViewResolver 和视图 View。

从 Spring 诞生到现在现已15年多了,它相关的后端技能演化其实没有前端那么快,根本原因便是前端需求越来越丰富多样,前端视图层的开发作业量和复杂度继续不断的添加。在这样的布景之下,逐步的变多的前端工程化解决方案出现,其间最有成效的便是前后端别离,从 AngularJSBackbone.js 到现在 ReactVue 等。在这种前后端别离架构下,前端就悉数由静态资源(HTMLJavascriptCSS)等构成,能够独立安顿在 Web 服务器傍边,这样 Spring 结构就不需求再处理视图相关的内容,操控器 Controller 不再回来 ModelAndView,只需求反应模型数据了。
图解 Spring:HTTP 央求的处理流程与机制【4】

本文首要价值是帮助咱们梳理出端到端的全流程结构,也便是咱们常说的大局视角或许天主视角。有了这个结构之后,咱们咱们咱们能够依据自己的需求按图索骥找相关节点的材料来研究学习,不至于堕入细节找不到方向。当然,考虑到咱们每个人的作业学习状况不同,平常遇到的问题也不同,本文内容无法掩盖悉数人遇到的问题,欢迎咱们留言发问,也欢迎重视我的博客或公号“IT老兵哥”沟通互动,我会极力赶快答复咱们提出的问题,谢谢!

本系列其他文章索引如下:

  • 图解 Spring:HTTP 央求的处理流程与机制【1】
  • 图解 Spring:HTTP 央求的处理流程与机制【2】
  • 图解 Spring:HTTP 央求的处理流程与机制【3】
  • 图解 Spring:HTTP 央求的处理流程与机制【5】