springMvc的工作流程简介

背景

最近在开发一个中台的项目,发现里面的思想基本都是用的springMvc思想和前端视图freeMark,所以特别抽空总结了这篇文章,把springMvc的流程理透彻

springMvc是什么?

百度百科的解释:
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。

流程分析

整体流程

在这里插入图片描述
步骤

  • 首先用户发送请求到前端控制器(DispatcherServlet),DispatcherServlet根据请求信息(url)来决定选择哪一个页面控制器进行处理并把请求委托给它。就是图中的1,2步骤。
  • 页面控制器收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在SpringWebMvc中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名),图中
    3,4,5步骤。
  • 前端控制器收回控制权,然后根据根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中6,7步骤。
  • 前端控制器再次收回控制权,将响应返回给用户,图中步骤8

核心流程

在这里插入图片描述
具体的步骤:

  • 第一步:发起请求到前端控制器(DispatcherServlet)
  • 第二步:前端控制器请求HandlerMapper查找Handler(可以根据xml配置、注解进行查找)
  • 第三步:处理器映射器HandlerMapper向前端控制器返回Handler,HandlerMapper会把请求映射为HandlerExcecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HanlderInterceptor拦截器对象),通过这中策略模式,很容易添加新的映射策略。
  • 第四步:前端控制器调用处理器适配器去执行Handler
  • 第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
  • 第六步:Handler执行完成给适配器返回ModelAndView
  • 第七步:处理器适配器向前端控制器返回MoldelAndView(ModelAndView是springmvc框架的一个底层对象,包括Model和view)一般现在都是前后端分离,有用@ResponseBody注解的话就直接到此结束
  • 第八步:前端控制器请求视图解析器进行视图解析(根据逻辑视图名解析成真正的视图jsp),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
  • 第九步:视图解析器向前端控制器返回View
  • 第十步:前端控制器进行视图渲染(视图渲染将模型数据(在ModelAndView对象中)填充到request域)
  • 第十一步:前端控制器向用户相应结果。

组件介绍

  • 前端控制器DispatcherServlet(不需要程序员开发)
    作用:接受请求,响应结果,相当于转化器,中央处理器。有了DispatcherServlet减少了其他组件之间的耦合度。
  • 处理器映射器HandlerMapping(不需要程序员开发)
    作用:根据请求的url查找Handler
  • 处理器适配器HandlerAdapter(程序员开发)
    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
  • 处理器Handler(需要开发)
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  • 视图解析器ViewResolver
    作用:进行视图解析,根据逻辑视图名解析成真正的视图(View)
  • 视图view
    注意:View是一个接口,实现类支持不同的View类型(jsp,freemark,pdf…)

SpringMvc的一些理解

为什么要使用springMvc?

SpringMvc是一种基于Java,实现了Web Mvc设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMvc也是要简化日常web开发。(处理业务数据的对象和显示业务数据的视图之间存在紧密耦合)

什么是MVC设计模式?

M: Mode
V:View
C: Controller
将应用按照Model(模型)、View(视图)、Controller(控制)这样的方式分离。

视图(View):代表用户交互界面,对于Web应用来说,可以是Html,也可能是jsp,xml和Applet等。一个应用可能有很多不同的视图,Mvc设计模式对于的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交于模型(Model)处理。

模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终得处理结果。业务模型的设计是Mvc最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能离得太近。MVC没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提供重用性。

控制(Controller):可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清除的告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的请求。控制层并不做任何的数据处理。

SpringMvc的优点

  • 能非常简单的设计出干净的web层和薄薄的web层
  • 进行更简洁的Web层的开发
  • 天生与spring框架继承(Ioc、aop等)
  • 提供强大的约定大于配置的契约式编程支持
  • 非常灵活的数据验证、格式化和数据绑定机制
  • 支持Restful风格

springMvc的常用注解及其作用

@Controller :标识这个类是一个控制器
@RequestMapping :给控制器方法绑定一个uri
@ResponseBody:将java对象转换成json,并且发送给客户端
@RequestBody:将客户端请求过来的json转成java对象
@RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射
@PathVarible: 用于获取uri中的参数,比如user/1中1的值
Restful风格的新api
@RestController相当于@[email protected]
@[email protected]@[email protected] 其他注解 @SessionAttribute:声明将什么模型数据存入session @cookieValue: 获取cookie值 @ModelAttribute:将方法返回值传入model中 @HeaderValue:获取请求头中的值