它是简化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、intercepterHandleMapping:处理器映射器,根据用请求找到相对应的handler即Controller,并将Controller与HandlerInterceptor(拦截器)封装到 HandlerExecutionChain (控制器执行链)对象中HandlerAdapter:处理器适配器,它可以调用controllerModelAndView:是spring mvc框架的一个底层对象,包括Model和viewViewResolver:视图解析器View:视图,springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。3.2 整体流程分析

执行步骤客户端发起请求到
DispatcherServletDispatcherServle请求HandlerMapping接口以及它的实现类查找Handle- 可以根据
xml配置、注解进行查找 - 这时候只是知道哪个控制器处理,但不会执行
Handler,需要处理器适配器HandlerAdapter
- 可以根据
HandlerMapping向DispatcherServlet返回HandlerExecutionChain对象,也叫执行链DispatcherServlet调用HandlerAdapter去执行ControllerHandlerAdapter将会根据适配的结果去执行Handler,因为需要判断Handler的类型,这一步关键靠HttpMessageConverter这个类对当前的请求和响应进行处理和设置Handler执行完成给HandlerAdapter返回ModelAndViewHandlerAdapter向DispatcherServlet返回ModelAndViewDispatcherServlet请求ViewResolver去进行视图解析- 根据逻辑视图名,判断你是哪种模板引擎
(jsp、freemark...),然后解析成真正的视图 - 通过这种策略很容易更换其他视图技术,只需要更改
ViewResolver即可
- 根据逻辑视图名,判断你是哪种模板引擎
ViewResolver向DispatcherServlet返回解析完成的ViewDispatcherServlet视图渲染将模型数据,在ModelAndView对象中填充到request域-
3.3 执行链
执行流程的第三步,HandlerMapping返回一个执行链,它是
HandlerExecutionChain对象- 包含一个
Handle处理器对象 - 多个
HandlerInterceptor拦截器对象
- 包含一个
- 所以第五步
HandlerAdapter需要判断Hanle类型,才只能执行Handle,执行流程如下图所示 - 通过这种策略模式,很容易添加新的映射策略
3.4 不需要视图的情况
在大环境前后端分离的开发情况下,后端只需要返回对应的数据,如果使用@ResponseBody注解之后不会再走试图处理器,而是直接将数据写入到流中,所以上诉流程走到底六步就终止了
