3. 常用参数注解使用(RequestParam、MatrixVariable、PathVariable、RequestAttribute、RequestHeader、RequestBody、ModelAttribute、CookieValue)

3.1 引入案例

view层

image.pngimage.png

control层

  1. @GetMapping("/car/{id}/owner/{username}")
  2. public Map<String, Object> getCar(
  3. @PathVariable("id") Integer id,
  4. @PathVariable("username") String name,
  5. @PathVariable Map<String, String> pv,
  6. @RequestHeader("User-Agent") String userAgent,
  7. @RequestHeader Map<String, String> header, //Map前面有 注解进行限定
  8. @RequestParam("age") Integer age,
  9. @RequestParam("inters") List<String> inters,
  10. @RequestParam Map<String, String> params,
  11. @CookieValue("_ga") String _ga,
  12. @CookieValue("_ga") Cookie cookie
  13. ) {
  14. Map<String, Object> map = new HashMap<>();
  15. map.put("id", id);
  16. map.put("name", name);
  17. map.put("pv", pv);
  18. map.put("userAgent", userAgent);
  19. map.put("headers", header);
  20. map.put("age", age);
  21. map.put("inters", inters);
  22. map.put("params", params);
  23. map.put("_ga", _ga);
  24. System.out.println(cookie.getName() + "===>" + cookie.getValue());
  25. System.err.println(map);
  26. return map;
  27. }

运行结果

参数注解 - 图4

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
image.pngimage.png
image.pngimage.png

3.5 RequestAttribute(获取request域属性)

这个注解可以拿到request域里面的属性。
如果是@RequestAttribute(“msg”),表示只拿request里的msg属性值。
参数注解 - 图9参数注解 - 图10

RequestHeader,可以用Map来承接

RequestHeader:获取请求头内容
PathVariable:路径变量

理论:

参数注解 - 图11参数注解 - 图12

实践:

RequestHeader拿到是请求头的内容,可以单独拿里面一个属性的值,也可以封装成一个Map
image.pngimage.pngimage.png

3.6 MatrixVariable 矩阵变量(去除分号内容设成false)

3.3.1 简单介绍

作用:跟RequestParam很像,就是把参数使用分号隔开(而不是&)

image.png
和RequestParam变量差不多,只不过格式变成了分号 只需要想办法 把去除分号及其后内容 这一属性改成false就行了

使用场景

比如cookie被禁用了。就可以用url重写,即用矩阵变量携带jsessionId
image.png

3.3.2 怎么使用:

重写WebMvcConfigurer,改变setRemoveSemicolonContent为true直接使用矩阵变量 -> 运行失败

代码:controller层用@MatrixVariable接受变量。然后输入连接请求,失败。

参数注解 - 图18
localhost:8080/car/sell;price=34;brand=byd,yd,fll

运行结果

image.png
image.png

失败原因

参数注解 - 图21参数注解 - 图22参数注解 - 图23

3.3.4 解决办法:解决办法就是改变springboot的默认配置,即自定义,自定义有三种办法。

采用第一种。@Configuration+@WebMVCConfigurer

参数注解 - 图24WebMvcConfiguration是什么?他的一个实现类是WebMvcAutoConfigurationAdapter
这个类里的configurePathMatch()里的UrlPathHelper又把removeSemicolonContent默认设成true。
所以我们不用这个实现类。而是我们自己实现这个类。参数注解 - 图25参数注解 - 图26参数注解 - 图27

实现WebMvcConfigurer。也有两种办法:

1.实现

2.@ Bean添加组件

1.实现:java8里,这个类有了默认实现方法,所以我们也不用每个方法都重写,只写我们需要的就行了参数注解 - 图282.@Bean添加组件参数注解 - 图29

3.3.5 测试

代码

  1. @GetMapping("car/{path}") //矩阵变量测试1
  2. @ResponseBody
  3. public Map<String, Object> car(@MatrixVariable("price") Integer price,
  4. @MatrixVariable("brand") List<String> brand,
  5. @PathVariable("path") String path) {
  6. Map<String, Object> map = new HashMap<>();
  7. map.put("price", price);
  8. map.put("brand", brand);
  9. map.put("path",path);
  10. return map;
  11. }

image.png

运行结果

参数注解 - 图31

3.3.6 一个错误示范

参数注解 - 图32参数注解 - 图33参数注解 - 图34

3.3.7 测试2:配合pathVar,实现特殊功能

参数注解 - 图35参数注解 - 图36

image.png

3.7 ModelAttribute(专门用来给自定义对象赋值)

3.7.1 用到参数上

他的用法有很多,比较重点的就看:结合Form表单一起用,传输对象数据。
有两种方法:

1.不显式声明

image.png

  1. <form action="/saveUser" method="post" style="margin-top: 30px">
  2. 姓名: <input name="userName" value="lizhen"/> <br/>
  3. 年龄: <input name="age" value="20"/> <br/>
  4. 生日: <input name="birth" value="2000/12/17"/> <br/>
  5. 宠物姓名:<input name="pet.name" value="大黄"/><br/>
  6. 宠物年龄:<input name="pet.age" value="4"/>
  7. <input type="submit" value="提交">
  8. </form>

image.png

2.显式声明

image.png

<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混用

image.png
image.png

和@ControllerAdvice混用

image.pngimage.png

2. Servlet API

3. 复杂参数解析

Map、Errors/bingding
image.png