目录
简单参数携带在请求的URL中,例如:
http://localhost:8080/test?page=1&pageSize=10
简单参数放在请求路径的后面,以?连接,以&分隔。
通过HttpServletRequest对象获取
例如:
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(HttpServletRequest request) {
Integer page = request.getParameter("page");
Integer pageSize = request.getParameter("pageSize");
return "page=" + page + "\n" +"pageSize=" + pageSize;
}
}
测试结果:
当然我们在接收简单参数的时候不会这么做,是比较繁琐的。
我们使用获取方式二来接收简单参数,推荐做法。
例如:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(Integer page, Integer pageSize) {
return "page=" + page + "\n" +"pageSize=" + pageSize;
}
}
测试结果:
可以看到测试结果是一样的,但是方便了很多。
@RequestParam
作用:参数名映射和判断参数是否必须
属性:name的值代表映射的参数名,required的值代表参数是否必须(默认必须,缺少会报错)
用法:用在接收参数上
例如:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(Integer page, @RequestParam(name = "pageSize", required = false) Integer size) {
return "page=" + page + "\n" +"pageSize=" + size;
}
}
?测试结果:
@RequestParam注解不经常用,因为传递的参数名和接收的参数名一般都是要保持一致的,如果有特殊需求的话再使用。
实体参数可以看作是对简单参数的补充:
那如果简单参数有很多怎么办呢?一个一个地接收吗?
可以一个一个地接收,但是有更优雅的做法。
例如以下请求:
http://localhost:8080/test?gender=1&age=18&page=1&pageSize=10
直接接收参数的代码:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(Integer gender, Integer age, Integer page, Integer pageSize) {
return "gender=" + gender + "\n" +
"age=" + age + "\n" +
"page=" + page + "\n" +
"pageSize=" + pageSize;
}
}
测试结果:
推荐做法是将所有的参数封装成对象,用封装的对象去接收。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@Data
@NoArgsConstructor
public class PageBean {
private Integer gender;
private Integer age;
private Integer page;
private Integer pageSize;
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(PageBean pageSize) {
return pageSize.toString();
}
}
测试结果:
需要注意的是这里并没有用到@RequestBody注解,该注解是在接收json格式的数据时,用在实体参数上解析数据用的。
和简单参数一样,数组集合参数携带在请求路径的后面。但是数组集合参数的名称都是一样的,通过定义数组或者集合参数来接收。例如:
http://localhost:8080/test?id=1&id=2&id=3
@RequestParam
用法:用在集合参数上,数组参数不需要。
定义数组参数来接收,注意参数名保持一致。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(Integer[] id) {
return Arrays.toString(id);
}
}
测试结果:
定义集合参数来接收,注意参数名保持一致。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(@RequestParam List<Integer> id) {
return id.toString();
}
}
测试结果:
通常是使用集合来接收,因为集合操作起来更方便。?
通过请求路径传递,例如:
http://localhost:8080/test?time=2023-12-16 09:30:45
@DateTimeFormat
作用:完成日期格式转换
属性:pattern的值用来指定日期格式
用法:用在LocalDateTime类型的参数上
用LocalDateTime类型的参数来接收
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class DemoController {
@GetMapping("/test")
public String demo(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time) {
return time.toString();
}
}
测试结果:
携带在请求体中
json格式的数据:
{
"username":"艾伦",
"password":"123abc"
}
@RequestBody
作用:解析json格式的数据
用法:用在实体参数上
先封装实体类,用于接收参数。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@Data
@NoArgsConstructor
public class UserLogin {
private String username;
private String password;
}
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@PostMapping("/test")
public String demo(@RequestBody UserLogin userLogin) {
return userLogin.toString();
}
}
测试结果:?
通过请求路径传递,例如:
http://localhost:8080/test/1
和直接携带在请求路径上不同,路径参数是作为请求路径的一部分。
@PathVariable
作用:获取路径参数
用法:用在接收参数上
注意接收请求路径的写法,路径参数必须写在请求路径中,用{...}表示并标明参数名。例如:
@GetMapping("/test/{id}")
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/test/{id}")
public String demo(@PathVariable Integer id) {
return "id=" + id;
}
}
测试结果:
路径参数可以同时传递多个,以逗号分隔,用集合接收。例如:
http://localhost:8080/test/1,2,3
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DemoController {
@GetMapping("/test/{ids}")
public String demo(@PathVariable List<Integer> ids) {
return ids.toString();
}
}
测试结果: