SpringMVC注解
2021/5/8 周六
学习内容:@RequestMapping,@GetMapping,@PostMapping,@PathVariable,@ResponseBody,@RestController,@RequestBody等。
如有错误,欢迎在评论区指出,非常感谢!
一、@RequestMapping
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。
- 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;
- 用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法。
最常用是标注在方法上,表明哪个具体的方法来接受处理某次请求。
1. 分类
@GetMapping
@GetMapping用于将HTTP的GET请求映射到特定处理程序方法的注释。
具体来说,@GetMapping是一个作为快捷方式的组合注释,相当于@RequestMapping(method = RequestMethod.GET)。
@PostMapping
@PostMapping用于将HTTP的POST请求映射到特定处理程序方法的注释。
@PostMapping也是一个作为快捷方式的组合注释,相当于@RequestMapping(method = RequestMethod.POST)。
2. 具体用法
@RequestMapping("/system/user")
public class UserController extends BaseController{
...
@PostMapping("/list")
public TableDataInfo list(User user){...}
...
}
浏览器请求的url为:http://localhost:80/system/user/list 时就会用这个list()方法来处理.
@RequestMapping的value值前后是否有“/”对请求的路径没有影响,即value=“list” 、"/list"、"/list/"其效果是一样的。
2. 属性
@RequestMapping注解有六个属性,下面分成三类进行说明:
- (1) value & method
value:指定请求的实际url地址,指定的地址可以是URI Template 模式;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
- (2) consumes & produces
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
- (3) params & headers
params: 指定request中必须包含某些参数值时,才让该方法处理。
例:
@RequestMapping(params="action=del")
表示请求参数需包含“action=del”,如:http://localhost:8080/book?action=del 时才处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
例:
@RequestMapping(value="/header/id", headers = "Accept=application/json")
表示请求的URL必须为“/header/id”,且请求头中必须有“Accept =application/json”参数即可匹配。
二、@PathVariable
@PathVariable用于方法参数绑定(绑定URI模板变量值),即将请求URL中的模板变量映射到功能处理方法的参数上。
用在方法的参数列表上。
如:
@GetMapping("/edit/{userId}")
public String edit(@PathVariable("userId") Long userId, ModelMap mmap){
List<Role> roles = roleService.selectRolesByUserId(userId);
mmap.put("user", userService.selectUserById(userId));
mmap.put("roles", User.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
mmap.put("posts", postService.selectPostsByUserId(userId));
return prefix + "/edit";
}
其实就是取出URI模板中的变量userId作为方法的参数使用。
(URI 模板就是在URI中给定一个变量,然后在映射的时候动态的给该变量赋值。)
三、@ResponseBody
当 Controller 返回的不是html标签的页面,而是其他某种格式的数据时(如json、xml等),使用 @ResponseBody 注解,表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。
一般是在异步获取json数据时使用,用在方法上,通常是在使用 @RequestMapping 后。
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(User user){
...
}
使用 @RequestMapping时,返回值通常解析为跳转路径,如果加上 @Responsebody,则返回结果不会被解析为跳转路径,而是通过适当的HttpMessageConverter转换为指定格式后,直接写入Response对象的body数据区。
还有一种常见的情况,就是整个Controller例都没有控制页面跳转的逻辑,只负责传递数据,则可直接在整个Controller前加上 @RestController ,相当于:@RestController = @ResponseBody + @Controller
四、@RequestBody
@RequestBody也是用于方法参数绑定(绑定固定格式的数据xml或json)。
可以以String、简单对象、复杂对象,接收前端传递给后端的json字符串中的数据(即请求体中的数据)。
用在方法的参数列表上。
过程:读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析(数据编码格式由header部分的Content-Type指定),然后把相应的数据绑定到要返回的对象上;再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
需要注意:
- 因为GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
- @RequestBody是通过 无参构造器 new的对象,然后通过set方法设置,如果在实体类中添加了有参构造器,没加无参构造器,接收参数时会出现异常。
主要参考文章:
1.https://blog.csdn.net/dingzfeng/article/details/47394441
2.https://www.cnblogs.com/cjeandailynotes/p/10469377.html