- 3. 常用参数注解使用(RequestParam、MatrixVariable、PathVariable、RequestAttribute、RequestHeader、RequestBody、ModelAttribute、CookieValue)
- 3.2 问题:RequestParam、MatrixVariable、PathVariable、RequestAttribute、RequestHeader、RequestBody、CookieValue各有什么作用?哪些必须赋值?哪些支持Map?
- 3.3 RequestParam,必须赋值
- 3.4 PathVariable,必须赋值
- 3.5 RequestAttribute(获取request域属性)
- 3.6 MatrixVariable 矩阵变量(去除分号内容设成false)
- 3.7 ModelAttribute(专门用来给自定义对象赋值)
- 2. Servlet API
- 3. 复杂参数解析
3. 常用参数注解使用(RequestParam、MatrixVariable、PathVariable、RequestAttribute、RequestHeader、RequestBody、ModelAttribute、CookieValue)
3.1 引入案例
view层
control层
@GetMapping("/car/{id}/owner/{username}")
public Map<String, Object> getCar(
@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String, String> pv,
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String, String> header, //Map前面有 注解进行限定
@RequestParam("age") Integer age,
@RequestParam("inters") List<String> inters,
@RequestParam Map<String, String> params,
@CookieValue("_ga") String _ga,
@CookieValue("_ga") Cookie cookie
) {
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("name", name);
map.put("pv", pv);
map.put("userAgent", userAgent);
map.put("headers", header);
map.put("age", age);
map.put("inters", inters);
map.put("params", params);
map.put("_ga", _ga);
System.out.println(cookie.getName() + "===>" + cookie.getValue());
System.err.println(map);
return map;
}
运行结果
3.2 问题:RequestParam、MatrixVariable、PathVariable、RequestAttribute、RequestHeader、RequestBody、CookieValue各有什么作用?哪些必须赋值?哪些支持Map?
RequestParam(获取请求参数、必须赋值)
MatrixVariable(矩阵变量、必须赋值)
PathVariable(路径变量、必须赋值)
RequestAttribute(获取request域属性、必须赋值)
RequestHeader(获取请求头、不必手动赋值)
RequestBody(获取请求体、不必手动赋值)
CookieValue(获取cookie值、不必手动赋值)
3.3 RequestParam,必须赋值
省略,请求链接必须给这个参数赋值。
MatrixVariable有点复杂,放到最后讲了
3.4 PathVariable,必须赋值
路径变量,拿到请求链接里路径的值
PathVariable拿到是路径里的值。可以封装成一个Map
3.5 RequestAttribute(获取request域属性)
这个注解可以拿到request域里面的属性。
如果是@RequestAttribute(“msg”),表示只拿request里的msg属性值。
RequestHeader,可以用Map来承接
RequestHeader:获取请求头内容
PathVariable:路径变量
理论:
实践:
RequestHeader拿到是请求头的内容,可以单独拿里面一个属性的值,也可以封装成一个Map
3.6 MatrixVariable 矩阵变量(去除分号内容设成false)
3.3.1 简单介绍
作用:跟RequestParam很像,就是把参数使用分号隔开(而不是&)
和RequestParam变量差不多,只不过格式变成了分号 只需要想办法 把去除分号及其后内容 这一属性改成false就行了
使用场景
比如cookie被禁用了。就可以用url重写,即用矩阵变量携带jsessionId
3.3.2 怎么使用:
重写WebMvcConfigurer,改变setRemoveSemicolonContent为true直接使用矩阵变量 -> 运行失败
代码:controller层用@MatrixVariable接受变量。然后输入连接请求,失败。
localhost:8080/car/sell;price=34;brand=byd,yd,fll
运行结果
失败原因
3.3.4 解决办法:解决办法就是改变springboot的默认配置,即自定义,自定义有三种办法。
采用第一种。@Configuration+@WebMVCConfigurer
WebMvcConfiguration是什么?他的一个实现类是WebMvcAutoConfigurationAdapter
这个类里的configurePathMatch()里的UrlPathHelper又把removeSemicolonContent默认设成true。
所以我们不用这个实现类。而是我们自己实现这个类。
实现WebMvcConfigurer。也有两种办法:
1.实现
2.@ Bean添加组件
1.实现:java8里,这个类有了默认实现方法,所以我们也不用每个方法都重写,只写我们需要的就行了2.@Bean添加组件
3.3.5 测试
代码
@GetMapping("car/{path}") //矩阵变量测试1
@ResponseBody
public Map<String, Object> car(@MatrixVariable("price") Integer price,
@MatrixVariable("brand") List<String> brand,
@PathVariable("path") String path) {
Map<String, Object> map = new HashMap<>();
map.put("price", price);
map.put("brand", brand);
map.put("path",path);
return map;
}
运行结果
3.3.6 一个错误示范
3.3.7 测试2:配合pathVar,实现特殊功能
3.7 ModelAttribute(专门用来给自定义对象赋值)
3.7.1 用到参数上
他的用法有很多,比较重点的就看:结合Form表单一起用,传输对象数据。
有两种方法:
1.不显式声明
<form action="/saveUser" method="post" style="margin-top: 30px">
姓名: <input name="userName" value="lizhen"/> <br/>
年龄: <input name="age" value="20"/> <br/>
生日: <input name="birth" value="2000/12/17"/> <br/>
宠物姓名:<input name="pet.name" value="大黄"/><br/>
宠物年龄:<input name="pet.age" value="4"/>
<input type="submit" value="提交">
</form>
2.显式声明
<form action="/saveUser2" method="post" style="margin-top: 50px">
姓名: <input name="userName" value="lizhen"/> <br/>
年龄: <input name="age" value="20"/> <br/>
生日: <input name="birth" value="2000/12/17"/> <br/>
宠物姓名:<input name="pet.name" value="旺财"/><br/>
宠物年龄:<input name="pet.age" value="3"/>
<input type="submit" value="提交">
</form>
这个注解的属性值(比如@ModelAttribute(“b”)里的数据b),这个数据对绑定对象来说,没什么用。
其实这里的数据可以和@InitBinder配合使用,实现绑定
3.7.2 用到方法上。
ModelAttribute还可以注释到controller的方法,这里不展开,具体见https://blog.csdn.net/dxyzhbb/article/details/105251006
和ReqeustMapping混用
和@ControllerAdvice混用
2. Servlet API
3. 复杂参数解析
Map、Errors/bingding