SpringMVC

SpringMVC简介

SpringMVC概述

  • SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
  • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
  • 优点
    • 使用简单,开发便捷(相比于Servlet)
    • 灵活性强

SpringMVC入门案例

  1. 使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.12</version>
    </dependency>
    
  2. 创建SpringMVC控制器类(等同于Servlet功能)

    //定义controller
    //使用@Controller定义@Bean
    @Controller
    public class UserController {
        //设置当前操作的访问路径
        @RequestMapping("/save")
        //设置当前操作的返回值
        @ResponseBody
        public String save(){
            System.out.println("user save...");
            return "{'module':'springmvc'}";
        }
    }
    
  3. 初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

    //创建springmvc的配置文件,加载controller对应的bean
    @Configuration
    @ComponentScan("com.xhj.controller")
    public class SpringMvcConfig {
    }
    
  4. 初始化Servlet,加载SpringMVC环境,并设置SpringMVC技术处理的请求

    //定义一个servlet容器启动的配置,在里面加载spring的配置
    public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
        //加载springMVC容器配置
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext =
                    new AnnotationConfigWebApplicationContext();
            annotationConfigWebApplicationContext.register(SpringMvcConfig.class);
            return annotationConfigWebApplicationContext;
        }
        //设置哪些请求归属springMVC处理
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
        //加载spring容器配置
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
    

使用的注解

  • 名称:@Controller

  • 类型:类注解

  • 位置:SpringMVC控制器定义上方

  • 作用:设定 SpringMVC的核心控制器bean

  • 范例:

    @Controller
    public class UserControll
    }
    

  • 名称:@RequestMapping

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器请求访问路径

  • 范例:

    //设置当前操作的访问路径
    @RequestMapping("/save")
    //设置当前操作的返回值
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'springmvc'}";
    }
    
  • 相关属性

    • value(默认):亲求访问路径

  • 名称:@ResponseBody

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析

  • 范例:

    //设置当前操作的访问路径
    @RequestMapping("/save")
    //设置当前操作的返回值
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'springmvc'}";
    }
    
  • SpringMVC入门开发总结(1+N)

    • 一次性工作
      • 创建工程,设置服务器,加载工程
      • 导入坐标
      • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
      • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
    • 多次工作
      • 定义处请求的控制器类
      • 定义处理请求的控制器方法,并配置映射路径(@RequestMappping)与返回json数据(@ResponseBody)
  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化web3.0容器的抽象类

  • AbstractDispatcherServletInitializer提供三个接口方法提供用户实现

    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入webApplicationContext对象范围中,而webApplicationContext的作用范围为ServletContext范围,即整个web容器范围

    • getServletMapping()方法,设定对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理

    • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()

入门案例工作流程分析

  • 启动服务器初始化过程

    1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
    2. 执行createServletApplicationContext方法,创建了webApplicationContext对象
    3. 加载SpringMvcConfig
    4. 执行@ComponentScan加载对应的bean
    5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法
    6. 执行getServiceMapping,定义所有的请求都通过SpringMVC

  • 单次请求过程

    1. 发送请求loaclhost:8080/save
    2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
    3. 解析请求路径/save
    4. 由/save匹配执行对应的方法save()
    5. 执行save()
    6. 检测到由@ResponseBody直接将save()方法的返回值作为响应体返回给请求方

Controller加载控制与业务bean加载控制

  • SpringMVC相关bean(表现层bean)
  • Spring控制的bean
    • 业务bean(Service)
    • 功能bean(DataSource等)
  • SpringMVC相关bean加载控制
    • SpringMVC加载的bean对应的包均在com.xhj.controller包内
  • Spring相关bean加载控制
    • 方式一:Spring加载的bean设定扫描范围为com.xhj,排除掉controller包内的bean
    • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
    • 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

请求与响应

请求映射路径

  • 名称:@RequestMapping

  • 类型:方法注解,类注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

  • 范例:

    @Controller
    public class BookController {
        @RequestMapping("/save")
        @ResponseBody
        public String save(){
            System.out.println("book save...");
            return "{'module':'book save'}";
        }
        @RequestMapping("/delete")
        @ResponseBody
        public String delete(){
            System.out.println("book delete...");
            return "{'module':'book delete'}";
        }
    }
    
  • 属性:

    • value(默认):请求访问路径或访问路径前缀

请求方式

  • Get请求
  • Post请求

Post请求中文乱码处理

  • 为web容器添加过滤器并指定字符集,Spring——web包中提供了专用的字符过滤器

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
    

请求参数

  • 参数种类
    • 普通参数
    • POJO类型参数
    • 嵌套POJO类型参数
    • 数组类型参数
    • 集合类型参数

请求与响应

  1. 添加json数据转换相关坐标

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.3</version>
    </dependency>
    
  2. 设置发送json数据

  3. 开启自动转换json数据支持

  1. 设置接收json数据

@RequestBody与@RequestParam区别

  • 区别
    • @RequestParam用于url地址传参,表单传参【application/x-www-form-urlencoded】
    • @RequestBody用于接收json数据【application/json】
  • 应用
    • 后期开发中,发送json格式数据为主,@RequestBody应用较广
    • 如果发送数据非json格式数据,选用@RequestParam接收请求参数