SpringMVC-01版本有哪些新特性?

2026-04-28 16:372阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计6447个文字,预计阅读时间需要26分钟。

SpringMVC-01版本有哪些新特性?

1. 概述1.1 概念SpringMVC是一种基于Java实现的MVC模型轻量级Web框架。它具有使用简单、开发便捷、灵活性强的优点,相较于Servlet,更加灵活,项目请求响应架构演进:软件三层+软件三层+Web层中的M

1. 概述 1.1 概念

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  • 优点
    • 使用简单,开发便捷(相比于Servlet
    • 灵活性强

项目请求响应架构演进:

  1. 软件三层
  2. 软件三层 + Web层中的MVC(JSP)
  3. 异步调用 + 软件三层 + Web层中的MVC(HTML) + Json
  4. 前后端分离
  5. 前端组件化,后台微服务化
1.2 快速入门 1.2.1 步骤
  1. 导入依赖
  2. 配置
  3. 少量编码测试
1.2.2 代码实现 1. 创建web工程(Maven结构) 2. 设置tomcat服务器,加载web工程(tomcat插件)

<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build> 3. 导入坐标(SpringMVC+Servlet

<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- 导入spring-webmvc坐标自动依赖导入spring相关坐标 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies> 4. 定义处理请求的功能类(UserController

//定义表现层控制器bean @Controller public class UserController { //设置映射路径为/save,即外部访问路径 @RequestMapping("/save") //设置当前操作返回结果为指定json数据(本质上是一个字符串信息) @ResponseBody public String save(){ // 处理器 handler,一个控制器中可以包含N个处理器 System.out.println("user save ..."); return "{'info':'springmvc'}"; } }

注意事项:

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。

如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

5. 编写SpringMVC配置类,加载处理请求的Bean。

//springmvc配置类,本质上还是一个spring配置类 @Configuration @ComponentScan("com.cy.controller") // 只扫描web层组件所在的包 public class SpringMvcConfig { } 6. 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { //初始化WebApplicationContext对象 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //加载指定配置类 ctx.register(SpringMvcConfig.class); return ctx; } //设置由springmvc控制器处理的请求映射路径,SpringMVC处理拦截哪些请求 protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring配置类,创建Spring容器对象 protected WebApplicationContext createRootApplicationContext() { return null; } } 1.3 启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContextSpringMVC)容器对象那个
  3. 加载SpringMVC的配置类SpringMvcConfig
  4. 执行组件扫描@ComponentScan加载对应的bean
  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC
1.4 单次请求过程
  1. 发送请求localhost/save
  2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
  3. 解析请求路径/save
  4. 得知:/save匹配执行对应的方法为UserController.save()
  5. 执行save()
  6. 检测到有@ResponseBody直接将save()方法的返回值直接写入响应体
1.5 组件扫描

SpringMVC容器加载Bean到自己容器中的方式与Spring一致。

  • SpringMVCSpring中的Bean有什么区别?
  • SpringMVC应该扫描哪些包?
1.5.1 分析:
  • SpringMVCbean(表现层bean)
  • Spring中的bean(非表现层的Bean)
    1. 业务beanService
    2. 功能beanDataSource等)
    3. ….
  • SpringMVC加载扫描哪些Bean存放路径:
    1. SpringMVC加载的bean对应的包均在com.cy.web包内
  • Spring如何实现只扫描自己的bean
    1. 方式一:Spring加载的bean设定扫描范围为com.cy,排除掉controller包内的bean
    2. 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
    3. 方式三:不区分SpringSpringMVC的环境,加载到同一个环境中
1.5.2 方式一代码实现

通过@ComponentScan注解的excludeFilters属性,配出所有标记有@Controller注解的所有方法。

@Configuration @ComponentScan(value = "com.itheima", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) public class SpringConfig { }

  • 属性
    1. excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
    2. includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
1.5.3 方式二代码实现

通过字符串数组的形式,精确指定每个包;

@Configuration @ComponentScan(value = {"com.itheima.service","com.itheima.dao"}) public class SpringConfig { } 1.6 创建SpringMvc容器对象的方式 1.6.1 格式1:

//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { //初始化WebApplicationContext对象 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //加载指定配置类 ctx.register(SpringMvcConfig.class); return ctx; } //设置由springmvc控制器处理的请求映射路径,SpringMVC处理拦截哪些请求 protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring配置类,创建Spring容器对象 protected WebApplicationContext createRootApplicationContext() { return null; } } 1.6.2 简化格式

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class} // 直接返回对应的配置类的Class对象数组 }; protected String[] getServletMappings() { return new String[]{"/"}; // // 直接返回要处理的请求url匹配方式 } protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; // 直接返回对应的配置类的Class对象数组 } } 2. 请求 2.1 发送get/post请求 2.1.1 GET请求传递普通参数

  • 普通参数:url地址传参;
  • Handler形参变量名和URL中参数名相同,SpringMVC就会自动帮我们封装赋值

//普通参数:请求参数与形参名称对应即可完成参数传递 @RequestMapping("/commonParam") @ResponseBody public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}"; }

  • 问题:参数如果是中文,接收到的参数出现了中文乱码。
  • 原因:tomcat 8.5版本之后GET请求就不再出现中文乱码问题,但是我们使用的是tomcat7插件,所以会出现GET请求中文乱码问题。
  • 解决:在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。

<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port><!--tomcat端口号--> <path>/</path> <!--虚拟目录--> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build> 2.1.2 POST请求传递普通参数

  • 普通参数:form表单post请求传参,

  • Handler形参变量名和表单中表单项name属性值,SpringMVC就会自动帮我们封装赋值

//普通参数:请求参数与形参名称对应即可完成参数传递 @RequestMapping("/commonParam") @ResponseBody public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}"; }

问题:我们发现,POST请求传递的参数如果包含中文那么就会出现中文乱码问题,说明我们之前配置的tomcat插件uri路径编解码字符集无法解决POST请求中文乱码问题。那么如何解决呢?

2.1.3 POST请求中文乱码处理

在加载SpringMVC配置的配置类中指定字符过滤器。

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[0]; } protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } // Post请求乱码问题,使用CharacterEncodingFilter处理全局请求乱码 // 模板代码 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } } 2.2 常见类型参数类型封装

常见的数据类型,我们只要按照SpringMVC要求,保证名称一致,SpringMVC就会自动帮我们解析封装赋值。

2.2.1 五种常见类型参数
  • 普通参数(基本类型 + String
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数
2.2.2 普通参数
  • 普通参数:

    • 保证请求参数名与形参名一致,SpringMVC便会自动封装

    • 当请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

      @RequestParam中配置的值要和请求参数名一致

  • Handler代码

    //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系 @RequestMapping("/commonParamDifferentName") @ResponseBody public String commonParamDifferentName(@RequestParam("name") String userName , int age){ System.out.println("普通参数传递 userName ==> "+userName); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param different name'}"; }

  • 注解说明

    • 名称:@RequestParam
    • 类型:形参注解
    • 位置:SpringMVC控制器方法形参定义前面
    • 作用:绑定请求参数与处理器方法形参间的关系
    • 参数:
      • required:是否为必传参数
      • defaultValue:参数默认值
2.2.3 POJO类型参数
  • POJO参数:

    请求参数名与形参中实体对象属性名相同,SpringMVC便会自动帮我们封装请求参数到实体对象中

  • Handler代码

    public class User { private String name; private int age; //同学们自己添加getter/setter/toString()方法 }

    //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递 @RequestMapping("/pojoParam") @ResponseBody public String pojoParam(User user){ System.out.println("pojo参数传递 user ==> "+user); return "{'module':'pojo param'}"; }

    注意:

    请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

2.2.4 嵌套POJO类型参数
  • POJO对象中包含POJO对象

public class User { private String name; private int age; private Address address; //同学们自己添加getter/setter/toString()方法 } public class Address { private String province; private String city; private Address address; }

  • 嵌套POJO参数:

    请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

  • Handler代码

    //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递 @RequestMapping("/pojoContainPojoParam") @ResponseBody public String pojoContainPojoParam(User user){ System.out.println("pojo嵌套pojo参数传递 user ==> "+user); return "{'module':'pojo contain pojo param'}"; }

    注意:

    请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

2.2.5 数组类型参数
  • 数组参数:

    多个相同请求参数名与形参中数组变量名一致,SpringMVC就会自动把多个相同参数名的值封装到形参位置的数组中。

  • Handler代码

    //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中 @RequestMapping("/arrayParam") @ResponseBody public String arrayParam(String[] likes){ System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes)); return "{'module':'array param'}"; }

2.2.6 集合类型参数
  • 集合保存普通参数:

    请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系

  • Handler代码

    //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据 @RequestMapping("/listParam") @ResponseBody public String listParam(@RequestParam List<String> likes){ System.out.println("集合参数传递 likes ==> "+ likes); return "{'module':'list param'}"; }

2.3 Json数据参数封装 2.3.1 json数据参数介绍
  • json普通数组(["","","",...])
  • json对象({key:value,key:value,...}
  • json对象数组([{key:value,...},{key:value,...}]
2.3.2 准备工作
  • 设置请求头

    低版本PostMan发送Json数据,需要设置一个请求头

    Content-Type: application/json

  • 数据封装提交

    JSON数据需要在请求体中,切勾选Raw,将JSON数据写在下方的文本域中。

2.3.3 传递json普通数组 2.3.3.1 代码演示
  1. 添加json数据转换相关坐标

    <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>

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

    @Configuration @ComponentScan("com.itheima.controller") //开启json数据类型自动转换 @EnableWebMvc public class SpringMvcConfig { }

    注意事项:

    @EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换

  3. 设置发送json数据(请求body中添加json数据)

  4. Controller中编写方法接收json参数

    SpringMVC-01版本有哪些新特性?

    //集合参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据 //3. Handler形参的参数名任意,因为Json数据没有对应的key @RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ // 参数名任意 System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}"; }

2.3.3.2 @EnableWebMvc
  • 名称:@EnableWebMvc
  • 类型:配置类注解
  • 位置:SpringMVC配置类定义上方
  • 作用:开启SpringMVC多项辅助功能,包括Json序列化反序列化
  • 范例:

@Configuration @ComponentScan("com.itheima.controller") @EnableWebMvc public class SpringMvcConfig { } 2.3.3.3 @RequestBody

  • 名称:@RequestBody
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器Handler方法只能使用一次
  • 范例:

@RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}"; } 2.3.4 传递json对象

  • POJO参数:

    json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

  • Handler代码

    //POJO参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应 @RequestMapping("/pojoParamForJson") @ResponseBody public String pojoParamForJson(@RequestBody User user){ System.out.println("pojo(json)参数传递 user ==> "+user); return "{'module':'pojo for json param'}"; }

2.3.5 传递json对象数组
  • POJO集合参数:

    json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

  • Handler代码

    //集合参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应 @RequestMapping("/listPojoParamForJson") @ResponseBody public String listPojoParamForJson(@RequestBody List<User> list){ System.out.println("list pojo(json)参数传递 list ==> "+list); return "{'module':'list pojo for json param'}"; }

2.3.6 @RequestBody与@RequestParam区别
  • 区别
    @RequestParam用于接收url地址传参,表单传参

    @RequestBody用于接收json数据

  • 应用

    后期开发中,发送json格式数据为主,@RequestBody应用较广

    如果发送非json格式数据,选用@RequestParam接收请求参数

3. 日期类型参数传递 3.1 代码演示
  • 格式不同

    日期类型数据基于系统不同格式也不尽相同
    2088-08-18
    2088/08/18
    08/18/2088

    2022年5月31日

  • 如何解析

    当请求的日期的格式不同时,在后台Handler参数上添加注解@DateTimeFormat并通过pattern属性指定格式,就可以完成解析并自动封装。

  • Handler代码

    需要配合@EnableWebMvc,才能生效。

    //日期参数 localhost:80/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08 //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd @RequestMapping("/dataParam") @ResponseBody public String dataParam(Date date, @DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){ System.out.println("参数传递 date ==> "+date); System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1); System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2); return "{'module':'data param'}"; }

3.2 @DateTimeFormat注解介绍
  • 名称:@DateTimeFormat
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参前面
  • 作用:设定日期时间型数据格式
  • 属性:pattern:指定日期时间格式字符串
3.3 工作原理
  • 其内部依赖Converter接口

public interface Converter<S, T> { @Nullable T convert(S var1); }

  • 请求参数年龄数据(String→Integer)
  • json数据转对象(json → POJO)
  • 日期格式转换(String → Date)
3.4 注意事项

@EnableWebMvc注解功能二:

  • 根据类型匹配对应的类型转换器。
4. 响应数据 4.1响应页面

@Controller public class UserController { //响应页面/跳转页面 //返回值为String类型,设置返回值为页面名称,即可实现页面跳转 @RequestMapping("/toJumpPage") public String toJumpPage(){ System.out.println("跳转页面"); return "page.jsp"; } }

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>Hello Spring MVC!</h2> </body> </html> 4.2 文本数据

//响应文本数据 //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解 // @RequestMapping("/toText") @RequestMapping(value = "/toText",produces = "application/json;charset=utf-8") //解决响应乱码问题 @ResponseBody public String toText(){ System.out.println("返回纯文本数据"); return "response tex你好!!"; } 4.3 json数据

//响应POJO对象 //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 @RequestMapping("/toJsonPOJO") @ResponseBody public User toJsonPOJO(){ System.out.println("返回json对象数据"); User user = new User(); user.setName("itcast"); user.setAge(15); return user; }

//响应POJO集合对象 //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 @RequestMapping("/toJsonList") @ResponseBody public List<User> toJsonList(){ System.out.println("返回json集合数据"); User user1 = new User(); user1.setName("传智播客"); user1.setAge(15); User user2 = new User(); user2.setName("黑马程序员"); user2.setAge(12); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList; }

注意:需要添加jackson-databind依赖以及在SpringMvcConfig配置类上添加@EnableWebMvc注解

4.4 @ResponseBody@RequestBody 区别 类目 @ResponseBody @RequestBody 标注位置 类 | 方法 方法形参 作用 把返回的(POJO等)数据写入响应体 从请求体中获取请求json数据 数据格式 把POJO对象(使用jackson)转成Json格式字符串,
写入响应体 前端请求的Json格式字符串,
读取并封装成POJO对象 相关注解(多看) @Controller
  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的控制器
  • 范例

@Controller public class UserController { } @RequestMapping

  • 名称:@RequestMapping
  • 类型:方法、类注解
  • 位置:SpringMVC控制器(方法)定义上方
  • 作用:
    • 建立请求的URL处理该请求的处理器(方法)之间的映射关系
    • 限定请求方式、参数、头等内容
  • 范例

@RequestMapping("/user") public class UserController{ //控制器 @RequestMapping("/save") public void save(){ // 处理器handler System.out.println("user save ..."); } }

注意:其实@RequestMapping注解还可以写到类上面

@ResponseBody
  • 名称:@ResponseBody

  • 类型:方法注解

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

  • 作用:

    • Controller类中方法(控制器中)的返回值直接写入响应体,而非把返回值作为要跳转的页面名称。

      一般配合前台的异步请求,局部刷新数据到页面上。

  • 范例

@RequestMapping("/save") @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } @RequestParam

  • 名称:@RequestParam

  • 类型:形参注解

  • 位置:SpringMVC控制器方法形参定义前面

  • 作用:绑定请求参数与处理器方法形参间的关系

    可以解决:

    1. 请求参数名和Handler形参对应名称不一样
    2. 请求参数中多个同名参数,Handler形参为集合类型
  • 参数:

    • required:是否为必传参数
    • defaultValue:参数默认值
相关接口API(理解) bstractDispatcherServletInitializer
  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

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

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

    //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; }

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

    //设置由springmvc控制器处理的请求映射路径 protected String[] getServletMappings() { return new String[]{"/"}; }

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

    //加载spring配置类 protected WebApplicationContext createRootApplicationContext() { return null; }

入门程序开发总结(1+N)
  • 一次性工作
    • 创建工程,设置服务器,加载工程
    • 导入坐标
    • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
    • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean
  • 多次工作
    • 定义处理请求的控制器类
    • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody

本文共计6447个文字,预计阅读时间需要26分钟。

SpringMVC-01版本有哪些新特性?

1. 概述1.1 概念SpringMVC是一种基于Java实现的MVC模型轻量级Web框架。它具有使用简单、开发便捷、灵活性强的优点,相较于Servlet,更加灵活,项目请求响应架构演进:软件三层+软件三层+Web层中的M

1. 概述 1.1 概念

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  • 优点
    • 使用简单,开发便捷(相比于Servlet
    • 灵活性强

项目请求响应架构演进:

  1. 软件三层
  2. 软件三层 + Web层中的MVC(JSP)
  3. 异步调用 + 软件三层 + Web层中的MVC(HTML) + Json
  4. 前后端分离
  5. 前端组件化,后台微服务化
1.2 快速入门 1.2.1 步骤
  1. 导入依赖
  2. 配置
  3. 少量编码测试
1.2.2 代码实现 1. 创建web工程(Maven结构) 2. 设置tomcat服务器,加载web工程(tomcat插件)

<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build> 3. 导入坐标(SpringMVC+Servlet

<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- 导入spring-webmvc坐标自动依赖导入spring相关坐标 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies> 4. 定义处理请求的功能类(UserController

//定义表现层控制器bean @Controller public class UserController { //设置映射路径为/save,即外部访问路径 @RequestMapping("/save") //设置当前操作返回结果为指定json数据(本质上是一个字符串信息) @ResponseBody public String save(){ // 处理器 handler,一个控制器中可以包含N个处理器 System.out.println("user save ..."); return "{'info':'springmvc'}"; } }

注意事项:

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。

如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

5. 编写SpringMVC配置类,加载处理请求的Bean。

//springmvc配置类,本质上还是一个spring配置类 @Configuration @ComponentScan("com.cy.controller") // 只扫描web层组件所在的包 public class SpringMvcConfig { } 6. 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { //初始化WebApplicationContext对象 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //加载指定配置类 ctx.register(SpringMvcConfig.class); return ctx; } //设置由springmvc控制器处理的请求映射路径,SpringMVC处理拦截哪些请求 protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring配置类,创建Spring容器对象 protected WebApplicationContext createRootApplicationContext() { return null; } } 1.3 启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContextSpringMVC)容器对象那个
  3. 加载SpringMVC的配置类SpringMvcConfig
  4. 执行组件扫描@ComponentScan加载对应的bean
  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC
1.4 单次请求过程
  1. 发送请求localhost/save
  2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
  3. 解析请求路径/save
  4. 得知:/save匹配执行对应的方法为UserController.save()
  5. 执行save()
  6. 检测到有@ResponseBody直接将save()方法的返回值直接写入响应体
1.5 组件扫描

SpringMVC容器加载Bean到自己容器中的方式与Spring一致。

  • SpringMVCSpring中的Bean有什么区别?
  • SpringMVC应该扫描哪些包?
1.5.1 分析:
  • SpringMVCbean(表现层bean)
  • Spring中的bean(非表现层的Bean)
    1. 业务beanService
    2. 功能beanDataSource等)
    3. ….
  • SpringMVC加载扫描哪些Bean存放路径:
    1. SpringMVC加载的bean对应的包均在com.cy.web包内
  • Spring如何实现只扫描自己的bean
    1. 方式一:Spring加载的bean设定扫描范围为com.cy,排除掉controller包内的bean
    2. 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
    3. 方式三:不区分SpringSpringMVC的环境,加载到同一个环境中
1.5.2 方式一代码实现

通过@ComponentScan注解的excludeFilters属性,配出所有标记有@Controller注解的所有方法。

@Configuration @ComponentScan(value = "com.itheima", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) public class SpringConfig { }

  • 属性
    1. excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
    2. includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
1.5.3 方式二代码实现

通过字符串数组的形式,精确指定每个包;

@Configuration @ComponentScan(value = {"com.itheima.service","com.itheima.dao"}) public class SpringConfig { } 1.6 创建SpringMvc容器对象的方式 1.6.1 格式1:

//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { //初始化WebApplicationContext对象 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //加载指定配置类 ctx.register(SpringMvcConfig.class); return ctx; } //设置由springmvc控制器处理的请求映射路径,SpringMVC处理拦截哪些请求 protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring配置类,创建Spring容器对象 protected WebApplicationContext createRootApplicationContext() { return null; } } 1.6.2 简化格式

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class} // 直接返回对应的配置类的Class对象数组 }; protected String[] getServletMappings() { return new String[]{"/"}; // // 直接返回要处理的请求url匹配方式 } protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; // 直接返回对应的配置类的Class对象数组 } } 2. 请求 2.1 发送get/post请求 2.1.1 GET请求传递普通参数

  • 普通参数:url地址传参;
  • Handler形参变量名和URL中参数名相同,SpringMVC就会自动帮我们封装赋值

//普通参数:请求参数与形参名称对应即可完成参数传递 @RequestMapping("/commonParam") @ResponseBody public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}"; }

  • 问题:参数如果是中文,接收到的参数出现了中文乱码。
  • 原因:tomcat 8.5版本之后GET请求就不再出现中文乱码问题,但是我们使用的是tomcat7插件,所以会出现GET请求中文乱码问题。
  • 解决:在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。

<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port><!--tomcat端口号--> <path>/</path> <!--虚拟目录--> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build> 2.1.2 POST请求传递普通参数

  • 普通参数:form表单post请求传参,

  • Handler形参变量名和表单中表单项name属性值,SpringMVC就会自动帮我们封装赋值

//普通参数:请求参数与形参名称对应即可完成参数传递 @RequestMapping("/commonParam") @ResponseBody public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}"; }

问题:我们发现,POST请求传递的参数如果包含中文那么就会出现中文乱码问题,说明我们之前配置的tomcat插件uri路径编解码字符集无法解决POST请求中文乱码问题。那么如何解决呢?

2.1.3 POST请求中文乱码处理

在加载SpringMVC配置的配置类中指定字符过滤器。

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[0]; } protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } // Post请求乱码问题,使用CharacterEncodingFilter处理全局请求乱码 // 模板代码 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } } 2.2 常见类型参数类型封装

常见的数据类型,我们只要按照SpringMVC要求,保证名称一致,SpringMVC就会自动帮我们解析封装赋值。

2.2.1 五种常见类型参数
  • 普通参数(基本类型 + String
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数
2.2.2 普通参数
  • 普通参数:

    • 保证请求参数名与形参名一致,SpringMVC便会自动封装

    • 当请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

      @RequestParam中配置的值要和请求参数名一致

  • Handler代码

    //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系 @RequestMapping("/commonParamDifferentName") @ResponseBody public String commonParamDifferentName(@RequestParam("name") String userName , int age){ System.out.println("普通参数传递 userName ==> "+userName); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param different name'}"; }

  • 注解说明

    • 名称:@RequestParam
    • 类型:形参注解
    • 位置:SpringMVC控制器方法形参定义前面
    • 作用:绑定请求参数与处理器方法形参间的关系
    • 参数:
      • required:是否为必传参数
      • defaultValue:参数默认值
2.2.3 POJO类型参数
  • POJO参数:

    请求参数名与形参中实体对象属性名相同,SpringMVC便会自动帮我们封装请求参数到实体对象中

  • Handler代码

    public class User { private String name; private int age; //同学们自己添加getter/setter/toString()方法 }

    //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递 @RequestMapping("/pojoParam") @ResponseBody public String pojoParam(User user){ System.out.println("pojo参数传递 user ==> "+user); return "{'module':'pojo param'}"; }

    注意:

    请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

2.2.4 嵌套POJO类型参数
  • POJO对象中包含POJO对象

public class User { private String name; private int age; private Address address; //同学们自己添加getter/setter/toString()方法 } public class Address { private String province; private String city; private Address address; }

  • 嵌套POJO参数:

    请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

  • Handler代码

    //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递 @RequestMapping("/pojoContainPojoParam") @ResponseBody public String pojoContainPojoParam(User user){ System.out.println("pojo嵌套pojo参数传递 user ==> "+user); return "{'module':'pojo contain pojo param'}"; }

    注意:

    请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

2.2.5 数组类型参数
  • 数组参数:

    多个相同请求参数名与形参中数组变量名一致,SpringMVC就会自动把多个相同参数名的值封装到形参位置的数组中。

  • Handler代码

    //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中 @RequestMapping("/arrayParam") @ResponseBody public String arrayParam(String[] likes){ System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes)); return "{'module':'array param'}"; }

2.2.6 集合类型参数
  • 集合保存普通参数:

    请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系

  • Handler代码

    //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据 @RequestMapping("/listParam") @ResponseBody public String listParam(@RequestParam List<String> likes){ System.out.println("集合参数传递 likes ==> "+ likes); return "{'module':'list param'}"; }

2.3 Json数据参数封装 2.3.1 json数据参数介绍
  • json普通数组(["","","",...])
  • json对象({key:value,key:value,...}
  • json对象数组([{key:value,...},{key:value,...}]
2.3.2 准备工作
  • 设置请求头

    低版本PostMan发送Json数据,需要设置一个请求头

    Content-Type: application/json

  • 数据封装提交

    JSON数据需要在请求体中,切勾选Raw,将JSON数据写在下方的文本域中。

2.3.3 传递json普通数组 2.3.3.1 代码演示
  1. 添加json数据转换相关坐标

    <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>

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

    @Configuration @ComponentScan("com.itheima.controller") //开启json数据类型自动转换 @EnableWebMvc public class SpringMvcConfig { }

    注意事项:

    @EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换

  3. 设置发送json数据(请求body中添加json数据)

  4. Controller中编写方法接收json参数

    SpringMVC-01版本有哪些新特性?

    //集合参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据 //3. Handler形参的参数名任意,因为Json数据没有对应的key @RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ // 参数名任意 System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}"; }

2.3.3.2 @EnableWebMvc
  • 名称:@EnableWebMvc
  • 类型:配置类注解
  • 位置:SpringMVC配置类定义上方
  • 作用:开启SpringMVC多项辅助功能,包括Json序列化反序列化
  • 范例:

@Configuration @ComponentScan("com.itheima.controller") @EnableWebMvc public class SpringMvcConfig { } 2.3.3.3 @RequestBody

  • 名称:@RequestBody
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器Handler方法只能使用一次
  • 范例:

@RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}"; } 2.3.4 传递json对象

  • POJO参数:

    json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

  • Handler代码

    //POJO参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应 @RequestMapping("/pojoParamForJson") @ResponseBody public String pojoParamForJson(@RequestBody User user){ System.out.println("pojo(json)参数传递 user ==> "+user); return "{'module':'pojo for json param'}"; }

2.3.5 传递json对象数组
  • POJO集合参数:

    json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

  • Handler代码

    //集合参数:json格式 //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应 @RequestMapping("/listPojoParamForJson") @ResponseBody public String listPojoParamForJson(@RequestBody List<User> list){ System.out.println("list pojo(json)参数传递 list ==> "+list); return "{'module':'list pojo for json param'}"; }

2.3.6 @RequestBody与@RequestParam区别
  • 区别
    @RequestParam用于接收url地址传参,表单传参

    @RequestBody用于接收json数据

  • 应用

    后期开发中,发送json格式数据为主,@RequestBody应用较广

    如果发送非json格式数据,选用@RequestParam接收请求参数

3. 日期类型参数传递 3.1 代码演示
  • 格式不同

    日期类型数据基于系统不同格式也不尽相同
    2088-08-18
    2088/08/18
    08/18/2088

    2022年5月31日

  • 如何解析

    当请求的日期的格式不同时,在后台Handler参数上添加注解@DateTimeFormat并通过pattern属性指定格式,就可以完成解析并自动封装。

  • Handler代码

    需要配合@EnableWebMvc,才能生效。

    //日期参数 localhost:80/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08 //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd @RequestMapping("/dataParam") @ResponseBody public String dataParam(Date date, @DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){ System.out.println("参数传递 date ==> "+date); System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1); System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2); return "{'module':'data param'}"; }

3.2 @DateTimeFormat注解介绍
  • 名称:@DateTimeFormat
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参前面
  • 作用:设定日期时间型数据格式
  • 属性:pattern:指定日期时间格式字符串
3.3 工作原理
  • 其内部依赖Converter接口

public interface Converter<S, T> { @Nullable T convert(S var1); }

  • 请求参数年龄数据(String→Integer)
  • json数据转对象(json → POJO)
  • 日期格式转换(String → Date)
3.4 注意事项

@EnableWebMvc注解功能二:

  • 根据类型匹配对应的类型转换器。
4. 响应数据 4.1响应页面

@Controller public class UserController { //响应页面/跳转页面 //返回值为String类型,设置返回值为页面名称,即可实现页面跳转 @RequestMapping("/toJumpPage") public String toJumpPage(){ System.out.println("跳转页面"); return "page.jsp"; } }

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>Hello Spring MVC!</h2> </body> </html> 4.2 文本数据

//响应文本数据 //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解 // @RequestMapping("/toText") @RequestMapping(value = "/toText",produces = "application/json;charset=utf-8") //解决响应乱码问题 @ResponseBody public String toText(){ System.out.println("返回纯文本数据"); return "response tex你好!!"; } 4.3 json数据

//响应POJO对象 //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 @RequestMapping("/toJsonPOJO") @ResponseBody public User toJsonPOJO(){ System.out.println("返回json对象数据"); User user = new User(); user.setName("itcast"); user.setAge(15); return user; }

//响应POJO集合对象 //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 @RequestMapping("/toJsonList") @ResponseBody public List<User> toJsonList(){ System.out.println("返回json集合数据"); User user1 = new User(); user1.setName("传智播客"); user1.setAge(15); User user2 = new User(); user2.setName("黑马程序员"); user2.setAge(12); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList; }

注意:需要添加jackson-databind依赖以及在SpringMvcConfig配置类上添加@EnableWebMvc注解

4.4 @ResponseBody@RequestBody 区别 类目 @ResponseBody @RequestBody 标注位置 类 | 方法 方法形参 作用 把返回的(POJO等)数据写入响应体 从请求体中获取请求json数据 数据格式 把POJO对象(使用jackson)转成Json格式字符串,
写入响应体 前端请求的Json格式字符串,
读取并封装成POJO对象 相关注解(多看) @Controller
  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的控制器
  • 范例

@Controller public class UserController { } @RequestMapping

  • 名称:@RequestMapping
  • 类型:方法、类注解
  • 位置:SpringMVC控制器(方法)定义上方
  • 作用:
    • 建立请求的URL处理该请求的处理器(方法)之间的映射关系
    • 限定请求方式、参数、头等内容
  • 范例

@RequestMapping("/user") public class UserController{ //控制器 @RequestMapping("/save") public void save(){ // 处理器handler System.out.println("user save ..."); } }

注意:其实@RequestMapping注解还可以写到类上面

@ResponseBody
  • 名称:@ResponseBody

  • 类型:方法注解

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

  • 作用:

    • Controller类中方法(控制器中)的返回值直接写入响应体,而非把返回值作为要跳转的页面名称。

      一般配合前台的异步请求,局部刷新数据到页面上。

  • 范例

@RequestMapping("/save") @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } @RequestParam

  • 名称:@RequestParam

  • 类型:形参注解

  • 位置:SpringMVC控制器方法形参定义前面

  • 作用:绑定请求参数与处理器方法形参间的关系

    可以解决:

    1. 请求参数名和Handler形参对应名称不一样
    2. 请求参数中多个同名参数,Handler形参为集合类型
  • 参数:

    • required:是否为必传参数
    • defaultValue:参数默认值
相关接口API(理解) bstractDispatcherServletInitializer
  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

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

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

    //加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; }

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

    //设置由springmvc控制器处理的请求映射路径 protected String[] getServletMappings() { return new String[]{"/"}; }

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

    //加载spring配置类 protected WebApplicationContext createRootApplicationContext() { return null; }

入门程序开发总结(1+N)
  • 一次性工作
    • 创建工程,设置服务器,加载工程
    • 导入坐标
    • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
    • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean
  • 多次工作
    • 定义处理请求的控制器类
    • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody