它是简化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>

  1. �注意:上面的配置文件有顺序之分,不要随意更换位置
  2. DispatcherServlet:用于拦截http请求,并且根据请求的url调用与之对应的控制器方法,来处理请求
  3. url-pattern:定义拦截规则,”/“代表拦截所有的请求
  4. load-on-startup:延时几秒,在web应用启动的时候自动创建IOC容器,初始化DispatcherServlet
    1. 如果不配置”load-on-startup”那么,这个创建IOC和初始化实在什么时候进行呢?
    2. 如果没有配置,那么是在第一次请求的时候创建上面两个信息
  5. init-param:指定核心配置文件的路径地址

    1. 为什么要配置”init-param”
    2. 因为配置了启动时加载,这里涉及了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() {
    1. return "this is yihua";
    } } ```

    2. 拦截器

    这里暂时不学习了,因为SpringBoot模块记录的笔记中有,并且SpringBoot的拦截器就是基于mvc的,知识mvc阶段使用xml配置可能不是太了解,面试也不会问如何配置,但是需要了解如何实现

    3. Spring MVC的执行流程

    3.1 组件说明

  1. DispatchServlet:中央处理器,也称调度服务器,它是整个流程控制的中心,由它调用其它组件处理用户请求,并且极大的降低的组件的耦合性
  2. Handler:处理器,它是后端控制器,可能是一个Controller、intercepter
  3. HandleMapping:处理器映射器,根据用请求找到相对应的handler即Controller,并将Controller与HandlerInterceptor(拦截器)封装到 HandlerExecutionChain (控制器执行链)对象中
  4. HandlerAdapter:处理器适配器,它可以调用controller
  5. ModelAndView:是spring mvc框架的一个底层对象,包括 Modelview
  6. ViewResolver:视图解析器
  7. View:视图,springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

    3.2 整体流程分析

    Spring MVC - 图1
    执行步骤

  8. 客户端发起请求到DispatcherServlet

  9. DispatcherServle请求HandlerMapping接口以及它的实现类查找 Handle
    1. 可以根据xml配置、注解进行查找
    2. 这时候只是知道哪个控制器处理,但不会执行Handler,需要处理器适配器HandlerAdapter
  10. HandlerMappingDispatcherServlet返回HandlerExecutionChain对象,也叫执行链
  11. DispatcherServlet调用HandlerAdapter去执行Controller
  12. HandlerAdapter将会根据适配的结果去执行Handler,因为需要判断Handler的类型,这一步关键靠HttpMessageConverter这个类对当前的请求和响应进行处理和设置
  13. Handler执行完成给HandlerAdapter返回ModelAndView
  14. HandlerAdapterDispatcherServlet返回ModelAndView
  15. DispatcherServlet请求ViewResolver去进行视图解析
    1. 根据逻辑视图名,判断你是哪种模板引擎(jsp、freemark...),然后解析成真正的视图
    2. 通过这种策略很容易更换其他视图技术,只需要更改ViewResolver即可
  16. ViewResolverDispatcherServlet返回解析完成的View
  17. DispatcherServlet视图渲染将模型数据,在ModelAndView对象中填充到request
  18. DispatcherServlet向用户响应结果

    3.3 执行链

  19. 执行流程的第三步,HandlerMapping返回一个执行链,它是HandlerExecutionChain对象

    1. 包含一个Handle处理器对象
    2. 多个HandlerInterceptor拦截器对象
  20. 所以第五步HandlerAdapter需要判断Hanle类型,才只能执行Handle,执行流程如下图所示
  21. 通过这种策略模式,很容易添加新的映射策略

image.png

3.4 不需要视图的情况

在大环境前后端分离的开发情况下,后端只需要返回对应的数据,如果使用@ResponseBody注解之后不会再走试图处理器,而是直接将数据写入到流中,所以上诉流程走到底六步就终止了

面试题

Spring MVC常用注解(笔试注意)

  1. @RequestMapping
  2. @ResponseBody
  3. @RequestParam
  4. @CookicValue
  5. @ModelAttribute
  6. @SessionAttribute

    拦截器的作用(重点)

  7. 作用:SpringMVC的拦截器作用于控制器方法进行前置,后置处理

  8. 实现技术:拦截底层实现技术是AOP,它必须实现HandlerInterceptor接口
  9. 常见用途:权限控制,登陆拦截,字符集的管理,国际化等等
  10. 拦截器是通过JDK动态代理来实现的,拦截器是对调用方法的拦截