它是简化web
应用程序的开发,取代Java EE
时代的servlet
开发
1. 搭建mvc的项目架构
1.1 导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
1.2 配置DispatcherServlet
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- �注意:上面的配置文件有顺序之分,不要随意更换位置
- DispatcherServlet:用于拦截http请求,并且根据请求的url调用与之对应的控制器方法,来处理请求
- url-pattern:定义拦截规则,”/“代表拦截所有的请求
- load-on-startup:延时几秒,在web应用启动的时候自动创建IOC容器,初始化DispatcherServlet
- 如果不配置”load-on-startup”那么,这个创建IOC和初始化实在什么时候进行呢?
- 如果没有配置,那么是在第一次请求的时候创建上面两个信息
init-param:指定核心配置文件的路径地址
- 为什么要配置”init-param”
- 因为配置了启动时加载,这里涉及了IOC容器的初始化,需要知道核心配置的路径
1.3 配置applicationContext的mvc标志�
```xml <?xml version=”1.0” encoding=”UTF-8”?>
1.4 开发Controller控制器
```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody;
/**
- 测试控制器 *
- @author YiHua
- @date 2022/4/30
*/
@Controller
public class DemoController {
@GetMapping(“/say”)
@ResponseBody
public String sayHello() {
} } ```return "this is yihua";
2. 拦截器
这里暂时不学习了,因为SpringBoot模块记录的笔记中有,并且SpringBoot的拦截器就是基于mvc的,知识mvc阶段使用xml配置可能不是太了解,面试也不会问如何配置,但是需要了解如何实现3. Spring MVC的执行流程
3.1 组件说明
DispatchServlet
:中央处理器,也称调度服务器,它是整个流程控制的中心,由它调用其它组件处理用户请求,并且极大的降低的组件的耦合性Handler
:处理器,它是后端控制器,可能是一个Controller、intercepter
HandleMapping
:处理器映射器,根据用请求找到相对应的handler即Controller,并将Controller与HandlerInterceptor(拦截器)封装到 HandlerExecutionChain (控制器执行链)对象中HandlerAdapter
:处理器适配器,它可以调用controllerModelAndView
:是spring mvc
框架的一个底层对象,包括Model
和view
ViewResolver
:视图解析器View
:视图,springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。3.2 整体流程分析
执行步骤客户端发起请求到
DispatcherServlet
DispatcherServle
请求HandlerMapping
接口以及它的实现类查找Handle
- 可以根据
xml
配置、注解进行查找 - 这时候只是知道哪个控制器处理,但不会执行
Handler
,需要处理器适配器HandlerAdapter
- 可以根据
HandlerMapping
向DispatcherServlet
返回HandlerExecutionChain
对象,也叫执行链DispatcherServlet
调用HandlerAdapter
去执行Controller
HandlerAdapter
将会根据适配的结果去执行Handler
,因为需要判断Handler
的类型,这一步关键靠HttpMessageConverter
这个类对当前的请求和响应进行处理和设置Handler
执行完成给HandlerAdapter
返回ModelAndView
HandlerAdapter
向DispatcherServlet
返回ModelAndView
DispatcherServlet
请求ViewResolver
去进行视图解析- 根据逻辑视图名,判断你是哪种模板引擎
(jsp、freemark...)
,然后解析成真正的视图 - 通过这种策略很容易更换其他视图技术,只需要更改
ViewResolver
即可
- 根据逻辑视图名,判断你是哪种模板引擎
ViewResolver
向DispatcherServlet
返回解析完成的View
DispatcherServlet
视图渲染将模型数据,在ModelAndView
对象中填充到request
域-
3.3 执行链
执行流程的第三步,HandlerMapping返回一个执行链,它是
HandlerExecutionChain
对象- 包含一个
Handle
处理器对象 - 多个
HandlerInterceptor
拦截器对象
- 包含一个
- 所以第五步
HandlerAdapter
需要判断Hanle
类型,才只能执行Handle
,执行流程如下图所示 - 通过这种策略模式,很容易添加新的映射策略
3.4 不需要视图的情况
在大环境前后端分离的开发情况下,后端只需要返回对应的数据,如果使用@ResponseBody
注解之后不会再走试图处理器,而是直接将数据写入到流中,所以上诉流程走到底六步就终止了