数据接收
简化数据接收是SpringMVC的一大核心,SpringMVC提供了丰富的注解,结合IOC,可以很方便地实现从请求中解析数据并实现注入,从而在handler中专注于业务的编写。
Parm参数接收
接收Url中的查询参数,或是类型为 application/x-www-form-urlencoded 的请求体(对POST请求)中的参数。
- 如果是 PUT 或 PATCH 请求的请求体,SpringMVC 不会解析请求体,可以使用 @RequestBody 注解将整个请求体注入给一个形参。
eg:
###
GET http://localhost:8080/mvc/param/data?name=Jack&age=10
###
POST http://localhost:8080/mvc/param/data
Content-Type: application/x-www-form-urlencoded
name=Jack&age=10形参接收:
直接接收(啥都不用干):
- handler 形参名必需和param参数名相同
- 参数非必须
@RequestMapping("data") @ResponseBody public String data(String name, String age){ System.out.println("ParamController.data"); return "name = " + name + ", age = " + age; }指定参数名接收,使用
@RequestParam注解@RequestMapping("data1") @ResponseBody public String data1(@RequestParam("name") String n, @RequestParam("age") String a){ System.out.println("ParamController.data1"); return "name = " + n + ", age = " + a; }@RequestParam注解高阶用法:- 指定接收的param参数名
- 指定参数是否必需(如果加上这个注解,则默认是必需的,此时请求如未提供这个参数,则返回
400 Bad Request)。 - 如果参数不是必需,还可以指定默认值
@RequestMapping("data3") @ResponseBody public String data3(@RequestParam(value = "name") String n, @RequestParam(value = "age", required = false, defaultValue = "18") String a){ System.out.println("ParamController.data3"); return "name = " + n + ", age = " + a; }
Pojo接收:
pojo类必需提供与param参数名对应的set方法,如果需要指定默认值,则直接在属性后指定即可(不推荐)。
public class User { private String name; private int age = 18; // 指定默认值(不推荐,对于一些公司有违规范,如阿里巴巴) // getter 和 setter 略 }
直接接收(啥都不干)
@RequestMapping("data4") @ResponseBody public String data7(User user){ System.out.println("ParamController.data7"); return user.toString(); }使用参数校验注解完成对值的约束,见 参数校验。
JSON请求体接收
SpringMVC支持解析JSON请求体获得客户端数据,并提供 @RequestBody 注解标识handler参数应从请求体中解析并注入。
由于原生web程序只支持解析param参数,对于json的支持需要依赖三方库,SpringMVC使用 jackson 依赖来完成json的解析。若想从json请求体中解析数据,还需要给 handlerAdapter 配置 json 转换器。如果没有配置json转换器,则报 415 不支持的媒体类型。
添加jackson依赖
<!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency>- !!!:项目创建后添加依赖,请检查Artifact(工件)是否真正地包含了这个依赖。如果Artifact没有包含这个依赖,则需要删除重建Artifact。(血泪教训)

image-20231206202359342 配置json转换器
在 SpringMVC组件配置类上 使用 @EnableWebMvc 注解,即可配置json转换器。@EnableWebMvc同时还会加入 handlerMapping、handlerAdapter,故配置类中,不用手动加入handlerMapping、handlerAdapter了。
@Configuration @EnableWebMvc @ComponentScan("com.guitar.mvc.*") public class SpringMvcConfig implements WebMvcConfigurer { // @Bean // public HandlerMapping getHandlerMapping(){ // return new RequestMappingHandlerMapping(); // } // @Bean // public HandlerAdapter getHandlerAdapter(){ // return new RequestMappingHandlerAdapter(); // } }- 如果没有配置json转换器,当解析json请求体时,会直接返回
415 不支持的媒体类型。 - 当按照如上配置仍然返回415时,请检查jackson依赖是否正确添加至Artifact(工件)。
- 如果没有配置json转换器,当解析json请求体时,会直接返回
编写pojo
在handler的形参处使用 @RequestBody 注解
源码解析:
@EnableWebMvc 会启用 <mvc:annotation-driven> 标签,加入MvcNamespaceHandler类。

最终会调用 AnnotationDrivenBeanDefinitionParser对象的 parse() 方法:

在 parse() 方法中,会加入 HandlerMapping、

HandlerAdapter、

json处理器。

路径参数接收
路径传递参数是一种在 URL 路径中传递参数的方式。在 RESTful 的 Web 应用程序中,经常使用路径传递参数来表示资源的唯一标识符或更复杂的表示方式。
Spring MVC 框架提供了 @PathVariable 注解来处理路径传递参数,@PathVariable 注解允许将 URL 中的占位符映射到控制器方法中的参数。
定义动态路径
/{动态标识}构成了一级动态路径,解析时等价于/*,SpringMVC会把实际请求路径名作为动态路径标识的值。
@GetMapping("/user/{id}/{name}")解析路径参数
使用 @PathVariable 注解从动态标识中解析并注入值。
@GetMapping("/user/{id}/{name}") @ResponseBody public String getUser(@PathVariable Long id, @PathVariable("name") String n) { System.out.println("id = " + id + ", name = " + n); return "user_detail"; }当形参名和动态标识相同时,可以不指定路径标识。如
@PathVariable Long id。@PathVariable 也可以指定动态标识是否必需,默认情况下(
required = true),动态路径必需有指定的动态标识,不然请求直接报500。@GetMapping("/user/{n}") @PathVariable("name",required = false) String name, // name始终为null @PathVariable("name",required = true) String name // 直接500
动态路径是具有一定功能的一级模糊路径,故对于客户端而言,请求路径必需携带此级,不然404。
Cookie 接收
SpringMVC 提供了 @CookieValue 注解,实现从Cookie中解析数据并注入handler形参。
@CookieValue String JSESSIONID,
@CookieValue("JSESSIONID") String value默认 required = true 表示请求必需提供这个cookie,不然400,可以设为 required = false 表示请求中cookie非必须。
- cookie 严格区分大小写。
设置Cookie可以通过原生API提供的response对象来完成cookie设置。
请求头接收
SpringMVC 提供了 @RequestHeader 注解,实现从请求头中解析数据并注入handler形参。
@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive同样,默认 required = true 表示请求必需提供这个header,不然400,可以设为 required = false 表示请求中header非必须。
- header 不区分大小写。
