目录
一、@RequestParam:
单个参数:
多个参数:
多个值:
封装进对象
二、@RequestBody
三、@PathVariable
四、HttpServletRequest
SpringBoot中为我们提供了三个常用的获取请求参数的注解:
@RequestParam,@RequestBody,@PathVariable
将请求中携带的参数绑定到控制器方法的参数上。
例:
URL:http://localhost:8080/texts?id=1
@GetMapping
public void getById(@RequestParam int id){
System.out.println(id);
}
这样便可成功接收到参数。但是要注意,请求中的参数名和方法中的参数名一定要一致,不然就会400。
URL:http://localhost:8080/texts?id=1&name=zhangsan
@GetMapping
public void getById(@RequestParam int id , String name){
System.out.println(id);
System.out.println(name);
}
URL:http://localhost:8080/texts?id=1,2,3
@GetMapping
public void getById(@RequestParam int[] id){
for (int i : id) {
System.out.println(i);
}
}
@GetMapping
public void getById(@RequestParam List id){
for (Integer i : id) {
System.out.println(i);
}
}
当一个参数对应着多个值时,可以用数组或集合的形式来接收
在SpringBoot中,@RequestParam注解是可以省略的,请求中的参数会自动与方法参数匹配。但请求中的参数名和方法中的参数名必须一致。
当参数是一个实体类时,SpringBoot会根据这个实体类的属性名,将值封装进实体类对象的这个属性中。创建一个User实体类
public class User {
private int id;
private String userName;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
URL:http://localhost:8080/texts?id=1&name=zhangsan
@GetMapping
public void getById(User user){
System.out.println(user);
}
接收页面请求携带过来的json格式的数据,并封装为注解后面的对象
例:
在测试的过程中发现,在实体类中,必须某个属性的一个set或get方法,SpringBoot才会将JSON中的value封装进实体类对象中。
URL:http://localhost:8080/texts
JSON
@PostMapping
public void add(@RequestBody User user){
System.out.println(user);
}
结果:
还可以将JSON的数据封装进Map中。因为JSON是key value的形式,Map也是 key value的形式,可以通过 @RequestBody注解将JSON数据封装进Map
@PostMapping
public void add(@RequestBody Map map){
System.out.println(map.get("id"));
System.out.println(map.get("userName"));
System.out.println(map.get("password"));
}
SpringBoot会根据请求中携带的JSON数据中的key,对应实体类中的属性一一封装进去。若JSON中没有提供实体类中某个属性的value,那么这个属性的值为null。如果key与属性名不一致,那么也会被视作未找到,这个属性的值为null。
@RequestBody是不可省略的。
主要应用与Rest风格,通过配合占位符,将请求路径中的值拿出来。
例:
URL:http://localhost:8080/texts/123
@PostMapping("/{id}")
public void getById(@PathVariable("id") int id){
System.out.println(id);
}
Rest风格下,很多参数值是在请求路径里面的,所以在@PostMapping中要先把参数的这层前缀写出来,再用占位符 {xxx} 的形式替代动态的参数值。URL 中的{xxx}占位符可以通过@PathVariable("xxx") 绑定到注解后面的参数上。
这个注解必然是不可省略的,但是它对方法名的的要求并不严格。
在方法的参数上,添加一个HttpServletRequest(HttpServletResponse同理)类型的对象,就可以获取到本次请求的一些信息
@PostMapping("/{ids}")
public void getById(@PathVariable("ids") int id, HttpServletRequest request){
System.out.println(id);
System.out.println(request.getMethod());
System.out.println(request.getRequestURL());
}
可以通过这个参数,拿到session或者cookie