1. 概念:SpringMVC 是一种用于表现层的Web框架

  2. 需要的包

    1. javax.servlet-api
    2. spring-webmvc
  3. 使用流程

    1. 定义 SpringMVC配置类 类似于Spring配置类
    2. 定义 Servlet容器配置类,用于启动容器时加载springmvc配置,设置springmvc的处理路径
      1. 配置类需 继承 AbstractDispatcherServletInitializer
        1. 重写 加载springmvc配置的方法
          1. 返回 AnnotationConfigWebApplicationContext
        2. 重写 springmvc处理路径的方法
        3. 重写 spring的配置方法
  4. 启动服务器初始化过程

    1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器

    2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象

    3. 加载SpringMvcConfig执行@ComponentScan加载对应的bean

    4. 加载UserController,每个@RequestMapping的名称对应一个具体的方法

    5. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

  5. 单次请求流程

    1. 单次请求过程

      1. 发送请求localhost/save

      2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理

      3. 解析请求路径/save

      4. 由/save匹配执行对应的方法save()

      5. 执行save()

      6. 检测到有@ResponseBody直接将save()方法的返回值作为响应体返回

  6. 常用注解

    1. @EnableWebMvc
      1. 开启自动转换json数据支持,需要导入Jakson包
      2. 根据类型匹配对应的转换器
    2. @Controller
      1. 声明类为一个SpringMVC的控制器,同时也是一个Bean
    3. @RequestMapping
      1. 设置请求访问路径
      2. 可以写在类或者方法上
    4. @ResponseBody
      1. 设置响应内容为当前返回值,无需解析
    5. @RequestBody
      1. 接收请求体里的内容,一般用于接收json
    6. @RequestParam
      1. 映射请求参数和请求处理方法的参数,映射集合必加
      2. 用于接收url和表单的参数
    7. @DateTimeFormat
      1. 用于接收日期 例如2001/10/9
  7. 请求参数传递

    1. 请求参数自动转换映射是由Converter接口以及其实现类提供的
    2. 请求参数名与请求处理方法参数名相同时可自动映射
      1. 如果不同 可以使用@RequestParam 指定请求参数的名
    3. 请求参数名与POJO实体类的属性名相同时可自动映射
      1. 如果嵌套实体类,则请求参数名.xxx就映射到内嵌的实体中
    4. 请求参数名多个相同,请求处理方法可以用数组接收
      1. 如果用List等集合接收则需要加@RequestParam
    5. 如果接收请求体里的参数,则需要在请求处理方法中添加@RequestBody,一般用于json
    6. 如果接收日期类型,默认请求为2001/10/9直接使用Date类接收,如果请求为2001-10-9则需要使用@DateTimeFormat
  8. 响应

    1. 响应类型自动转换是由HttpMessageConverter接口实现的
    2. 默认返回页面名
    3. 如果返回其他数据,可以使用@ResponseBody
  9. REST风格

    1. REST (Representational State Transfer) ,表现形式状态转换
    2. 即将请求路径转换为请求参数的风格
    3. 优点
      1. 安全,隐藏资源的行为,无法通过地址得知何种操作
      2. 书写简化
    4. 行为动作
      1. Get 查询
      2. Post 新增
      3. Put 修改
      4. Delete 删除
    5. 常用注解
      1. @RestController
        1. 表示一个类是REST风格的控制器
        2. 包括了@Controller 和 @ResponseBody
      2. @GetMapping
        1. 只接受Get请求
      3. @PostMapping
        1. 只接受Post请求
      4. @PutMapping
        1. 只接受Put请求
      5. @DeleteMapping
        1. 只接受Delete请求
      6. @PathVariable
        1. 指明参数来自于路径
        2. /{id} 将请求路径变为请求参数,添加此注解
  10. WebMvcConfigurationSupport 类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /** 解决跨域问题 **/
    void addCorsMappings(CorsRegistry registry) ;

    /** 添加拦截器 **/
    void addInterceptors(InterceptorRegistry registry);

    /** 视图跳转控制器 **/
    void addViewControllers(ViewControllerRegistry registry);

    /** 这里配置视图解析器 **/
    void configureViewResolvers(ViewResolverRegistry registry);

    /** 配置内容裁决的一些选项 **/
    void configureContentNegotiation(ContentNegotiationConfigurer configurer);

    /** 视图跳转控制器 **/
    void addViewControllers(ViewControllerRegistry registry);

    /** 静态资源处理 避免静态资源被拦截**/
    void addResourceHandlers(ResourceHandlerRegistry registry);

    /** 默认静态资源处理器 **/
    void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
  11. 异常处理器

    1. 用于拦截表现层出现的所有异常,统一处理
    2. @ControllerAdcice
    3. @RestControllerAdcice 表示类
    4. @ExceptionHandler 表示处理方法,指定处理的异常类型
    5. 异常处理方案
      1. 项目异常分类
        1. 业务异常 BusinessException
          1. 规范用户行为异常
          2. 不规范用户行为异常
        2. 系统异常 SystemException
          1. 可预计无法避免的异常
        3. 其他异常 Exception
          1. 编程人员未预计到的异常
      2. 自定义异常,包装,抛出
  12. 拦截器

    1. (Interceptor )是一种动态拦截方法调用的机制
    2. 作用
      1. 在指定方法(控制器)调用前后执行预先定义好的代码
      2. 阻止原方法的执行
    3. 制作拦截器
      1. 实现HandlerIntercepter
      2. 重写 preHandler 控制器执行前
      3. 重写 postHandler 控制器执行后
      4. 重写 afterCompletion 请求完成后
    4. 配置拦截器
      1. 或 继承 WebMvcConfigurationSupport 类
      2. 或 实现 WebMvcConfigurer 接口
      3. 重写addInterceptors方法,注册拦截器,配置拦截路径
    5. 拦截器参数
      1. 基础参数
        1. request 请求对象
        2. response 响应对象
        3. handler 拦截的方法(反射)
      2. posthandler
        1. modelAndView 控制器返回的视图和模型
        2. exception 处理过程中的异常
    6. 拦截器链
      1. 配置多个拦截器时形成拦截器链
      2. 拦截器的配置顺序就是拦截器的运行顺序
        1. prehandler是顺序
        2. posthandler和afterCompletion 逆序
        3. prehandler返回false就会阻挡后面配置的拦截器