Spring MVC 的执行流程以及运行原理
一.什么是 MVC?
MVC
是
Model
、
View
和
Controller
的缩写,分别代表
Web
应用程序中的
3
种职责,
MVC
是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码,降低了视图与业
务逻辑之间的双向耦合。
Model(
模型
)
:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型
或
JavaBean
组件(包含数据和行为),不过现在一般都分离开来:
Value Object
(数据
Dao
)
和 服务层(行为
Service
)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,
包括数据和业务。
View(
视图
)
:负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(
控制器
)
:接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回
的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
最典型的
MVC
模式就是
JSP+Servlet+JavaBean
的模式。

二.什么是 Spring MVC?
Spring MVC
是一个基于
MVC
模式的
Web
框架,是
Spring
框架的一个模块。
它以
Spring IOC
容器为基础,并利用容器的特性来简化它的配置,所以
Spring MVC
和
Spring
可直接整合使用。
Spring MVC
对
MVC
流程进行了封装,屏蔽掉很多底层代码,让开发者可以更加轻松快捷 的完成基于 MVC
模式的
Web
开发。
总的来说:
Spring MVC
是
Spring Framework
的一部分,是基于
Java
实现
MVC
的轻量级
Web
框架。
Spring MVC
的特点:
是
Spring
框架的一部分,可以方便的利用
Spring
所提供的其他功能。
灵活性强,易于与其他框架集成。
提供了一个前端控制器
DispatcherServlet
,使开发人员无需额外开发控制器对象。
可自动绑定用户输入,并能正确的转换数据类型。
内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。
支持国际化。可以根据用户区域显示多国语言。
支持多种视图技术。它支持
JSP
、
Velocity
和
FreeMarker
等视图技术。
使用基于
XML
的配置文件,在编辑后,不需要重新编译应用程序。
三.SpringMVC 中的核心组件
1
)前端控制器(
DispactherServlet
):接收请求、响应结果,相当于转发器,它是
SpringMVC
框架最核心的组件,有了它就能减少其他组件之间的耦合度。(不需要程序员开发)
2
)处理器映射器(
HandlerMapping
):根据配置的映射规则(根据请求的
URL
),找到对
应的处理器。(不需要程序员开发)
3
)处理器适配器(
HandlerAdapter
):适配调用具体的处理器,并且执行处理器中处理请求
的方法,执行完毕之后返回一个
ModelAndView
对象。
4
)处理器(
Handler
):(需要程序员手动开发)。
5
)视图解析器(
ViewResolver
):会根据传递过来的
ModelAndView
对象进行视图解析,根
据视图解析名解析称真正的视图
View
。(不需要程序员开发)
6
)视图(
View
):
View
是一个接口,它的实现类支持不同类型的视图。比如:
JSP
、
freemarker
、 Thymeleaf 等等。
四.Spring MVC 的执行流程

(
1
)当用户通过浏览器发起一个
HTTP
请求,请求直接到前端控制器
DispatcherServlet
;
(
2
)前端控制器接收到请求以后调用处理器映射器
HandlerMapping
,处理器映射器根据请
求的
URL
找到具体的
Handler
,并将它返回给前端控制器;
(
3
)前端控制器调用处理器适配器
HandlerAdapter
去适配调用
Handler
;
(
4
)处理器适配器会根据
Handler
去调用真正的处理器去处理请求,并且处理对应的业务
逻辑;
(
5
)当处理器处理完业务之后,会返回一个
ModelAndView
对象给处理器适配器,
HandlerAdapter
再将该对象返回给前端控制器;这里的
Model
是返回的数据对象,
View
是
逻辑上的
View
。
(
6
)前端控制器
DispatcherServlet
将返回的
ModelAndView
对象传给视图解析器
ViewResolver
进行解析,解析完成之后就会返回一个具体的视图
View
给前端控制器。(
ViewResolver
根
据逻辑的
View
查找具体的
View
)
(
7
)前端控制器
DispatcherServlet
将具体的视图进行渲染,渲染完成之后响应给用户(浏
览器显示)。
五.关于 Spring MVC 常用部分注解解释
@SpringBootApplication
此 注 解 是 一 个 组 合 注 解 , 包 含 了 (
@Configuration
,
@EnableAutoConfiguration
和
@ComponentScan
)三个重要注解的功能。其主要作用在于简化
启动类的编写,使得开发者可以快速搭建起一个基于
Spring
的应用程序框架。
@Component
标注在类上,表示将该类作为一个组件交给
Spring
容器管理。
@Controller
声明
Controller
组件,通常作用在控制层(如
Spring MVC
的
Controller
),用于将控制层的类标识为 Spring
中的
Bean
,其功能与
@Component
相同。
@Service
声明
Service
组件
@Service(
“
myMovieLister
”
)
,通常作用在业务层(
Service
层),用于将业务层的类标识为 Spring
中的
Bean
,其功能与
@Component
相同。
@Repository
声明
Dao
组件,将数据访问层(
DAO
层)的类标识为
Spring
中的
Bean
,其
功能与
@Component
相同。
@Resource
用于注入,默认按名称装配,
@Resource(name=
“
beanName
”
)
@Autowired
用于注入,默认按类型装配
@Transactional:
事务管理
@RequestBody
:注解实现接收
http
请求的
json
数据,将
json
转换为
java
对象。
@ResponseBody
:注解实现将
conreoller
方法返回对象转化为
json
对象响应给客户。
@Scope: Spring IOC
容器中的一个作用域,在
Spring IOC
容器中,他用来配置
Bean
实例的
作用域对象。
@RequestMapping("/menu")
请求映射,用于映射
url
到控制器类或一个特定的处理程序方法。
可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@GetMapping
:它是
@RequestMapping(method =RequestMethod.GET)
的一个快捷方式,只
能处理
Get
类型请求。
@PostMapping
: 它是
@RequestMapping(method =RequestMethod.POST)
的一个快捷方式,
只能处理
Post
类型请求。
@RequestParam
:从请求中提取查询参数