SpringMVC(二)【请求与响应】(1)https://developer.aliyun.com/article/1534204
2.5、JSON 传参
我们实际开发用到 JSON 的情况会很多很多,所以这里需要重点学习 JSON 的传参方法。
首先我们需要导入 json 转换格式的依赖,方便之后把不同的数据类型转为 json:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
还需要注意的是,使用 Postman 发送 json 格式的数据需要使用:
2.5.1、json 数组
1、给SpringMVC配置类添加注解 @EnablewebMvc
我们需要把 json 转为对象,必须给控制器类添加这个注解:
@Configuration @ComponentScan("com.lyh.controller") // 扫描 @EnableWebMvc // 开启 json 转对象的功能(这只是这个注解的功能之一) public class SpringMvcConfig { }
名称 | 类型 | 位置 | 作用 |
@EnableWebMvc | 配置类注解 | SpringMVC配置类上方 | 开启SpringMVC多项辅助功能(比如这里的json格式自动转换) |
2、给服务端方法形参前添加注解 @RequestBody
区别于之前我们同查询参数给 List 集合传递元素使用的注解 @RequestParam:
- @RequestBody 主要用于处理请求体中的数据,比如这里传递 json 数据用的就是 http 请求体中的 raw 来传递的。
- @RequestParam 主要用于处理查询参数中的数据。
什么是查询参数?
查询参数(Query Parameters)是在HTTP请求的URL中用于传递附加信息的键值对。它们通常出现在URL的“?”之后,并以“&”符号分隔多个参数。
名称 | 类型 | 位置 | 作用 |
@RequestBody | 形参注解 | SpringMVC控制器方法形参定义前面 | 将请求体中的数据参数传递给控制器方法形参 |
@RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ System.out.println("json数据传递"+likes.toString()); return "{'module':'list common for json param'}"; }
发送测试:
运行结果:
2.5.2、json 对象
@RequestMapping("/pojoParamForJson") @ResponseBody public String pojoParamForJson(@RequestBody User user){ System.out.println("json对象传递"+user.toString()); return "{'module':'pojo for json param'}"; }
2.5.3、json 对象数组
这里同样需要对形参添加一个注解 @RequestBody 来把
@RequestMapping("/listPojoParamForJson") @ResponseBody public String listPojoParamForJson(@RequestBody List<User> users){ System.out.println("json对象数组传递"); for (User user : users) System.out.println(user.toString()); return "{'module':'list pojo for json param'}"; }
对于 json 对象数组数据的发送,Postman 会自动帮我们设置 Content-type 格式为 application/json:
测试结果:
2.6、日期类型参数传递
常见的日类型格式:
- 2024-04-14
- 2024/04/14(这种格式 SpringMVC 可以直接处理)
- 04/14/2024
对于另外两种类型的日期格式,SpringMVC 要求通过 @DateTimeFormat 注解的 pattern 属性来指定日期的格式:
@RequestMapping("/dateParam") @ResponseBody public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date){ System.out.println("日期类型参数传递" + date.toString()); return "{'module':'date param'}"; }
测试:
运行结果:
2.7、类型转换器
上面的日期格式转换其实也是依赖于上面我们在 SpringMVC 配置类上开启的注解:@EnableWebMvc 。
而这些所有的格式转换全部依赖于底层的 Converter 接口:
这个接口提供了大量的数据格式转换,其中一部分数据转换是默认开启的,但是大部分是不默认开启的,所以一定要记得通过注解 @EnableWebMvc 来开启类型转换!
3、响应
3.1、响应界面
在 webapp 下创建一个文件 index.jsp
在控制器类中设置响应方法并返回响应页面的路径:
@Controller public class BookController { @RequestMapping("/index") public String jumpToIndex(){ return "index.jsp"; } }
注意:这里我把 BookController 上面的路径前缀(/book)注解 @RequestMapping 给去掉了,不然到时候会尝试访问 /book/index.jsp 而不是 /index.jsp,会报错。
3.2、响应文本
响应文本的时候为了避免 SpringMVC 把我们的响应文本解读为资源路径需要加一个注解:@ResponseBody
@RequestMapping("/text") @ResponseBody public String reposeText(){ return "Hello Spring"; }
运行结果:
其实响应文本的本质还是返回一个页面:
@RequestMapping("/text") @ResponseBody public String reposeText(){ return "<h1>Hello Spring</h1>"; }
测试结果:
3.3、响应 json 对象
响应 json 对象很简单,直接返回一个对象即可,我们之前导入的依赖 jackson 会自动帮我们把 Java 对象转为 json:
@RequestMapping("/jsonPojo") @ResponseBody public User reposeJsonPojo(){ return new User("谢永强",25); }
测试结果:
3.4、响应 json 对象集合
同样很简单,和响应对象一样,只不过是把对象放进了集合。同样,一定要导入 Jackson 依赖。
@RequestMapping("/jsonList") @ResponseBody public List<User> reposeJsonList(){ List<User> list = new ArrayList<User>(); list.add(new User("谢永强", 25)); list.add(new User("王小蒙", 25)); return list; }
测试结果:
名称 | 类型 | 位置 | 作用 |
@ResponseBody | 方法注解 | 控制器方法上方 | 将当前控制器方法返回值违响应体 |
如果该控制器方法返回值是 String 类型的文本,@ResponseBody 会把它转为响应体而不是把该文本当做资源路径;如果是对象类型,则把它转为我们浏览器可识别的数据类型,比如把 Java 对象转为 json。
3.5、类型转换器 HttpMessageConverter
这里的转换用的是并不是我们前面说的 Converter 接口,而是 HttpMessageConverter 接口,这个接口有一个实现类叫做 MappingJackson2HttpMessageConverter ,所以只要我们导入了 Jackson 包,它就可以帮我们把对象转为 json 格式。
这也是我之前疑惑的地方:为什么不用 alibaba 的 fastjson 呢,原来是因为人家 SpringMVC 底层用的是 Jackson。