利用 Spring Boot 来制作 Web 应用,企业网站定制开发就必定会涉及到前端与企业网站定制开发后台之间互相传递参数。下面演示 Controller 企业网站定制开发如何接收以 GET 企业网站定制开发方式传递过来的参数。
一、直接在请求路径中
(1)、假设请求地址是如下这种 风格,Springboot 这个参数值直接放在路径里面
(2)、Controller 定义,如下:
- @RestController
- public class HelloController {
- @GetMapping("/hello/{name}")
- public String hello(@PathVariable("name") String name){
-
- return "你好," + name + " !";
- }
- }
二、参数跟在 ? 号后面
1,获取参数的基本方法
(1)假设请求地址是如下这种传统方式,参数跟在问号后面:
(2)Controller 定义如下所示:
- @RestController
- public class HelloController {
- @GetMapping("/hello")
- public String hello(@RequestParam("name") String name){
-
- return "你好," + name + " !";
- }
- }
- 可以把在注解 @RequestParam 添加 required = false 设置参数为非必输项
- 可以把在注解 @RequestParam 添加 defaultValue 参数 设置默认值。
2、使用 map 来接收参数
(1)Controller 还可以直接使用 map 来接收所有的请求参数:
-
- @RestController
- public class HelloController {
- @GetMapping("/hello")
- public String hello(@RequestParam Map<String, Object> map){
-
- return "图书: " + map.get("name") + " 的作者为: " + map.get("author");
- }
- }
(2)、结果如下所示:
4、接收一个集合
(1)、Controller 定义接收 数组或者List的方法,如下:
-
- @RestController
- public class HelloController {
-
- @GetMapping("/array")
- public String array(@RequestParam("name") String[] names){
-
- System.out.println("我是数组接收的参数:" + Arrays.toString(names));
-
- return "我是数组接收的参数:" + Arrays.toString(names);
- }
-
- @GetMapping("/list")
- public String list(@RequestParam("name")List<String> names){
- System.out.println("我是List接收的参数:" + names);
- return "我是List接收的参数:" + names.toString();
- }
-
- }
(2)、测试结果
5、通过对象接收参数
如果一个 get 请求的参数太多,我们构造一个对象来简化参数的接收方式。
(1)、定义一个基本对象Book 和 Controller
- public class Book {
-
- private String name;
-
- private String author;
-
- private Double price;
-
- // 省略 getter setter 方法
- }
- @RestController
- public class BookController {
- @GetMapping("/book")
- public Book book(Book book){
- System.out.println("接收到的参数为:" + book);
- return book;
- }
- }
(2)、基本用法:
(3)、构造多个对象来接收参数,代码如下所示:
- public class User {
-
- private String username;
-
- private String password;
-
- // 省略 getter setter 方法
- }
- @RestController
- public class BookController {
- @GetMapping("/book")
- public Book book(Book book, User user){
- System.out.println("接收到的参数为:" + book);
- System.out.println("接收到的参数为:" + user);
- return book;
- }
- }
访问:
输出结果:
(4)、指定前缀。
如果在多个对象参数的方法中,对象之间存在相同的 属性时 可以结合 @InitBinder 指定前缀的方式处理。如下所示,Book 对象和 Author 对象中都存在 name 属性。
除了在 Controller 里单独定义预处理方法外,我们还可以通过 @ControllerAdvice 结合 @InitBinder 来定义全局的参数预处理方法,方便各个 Controller 使用
- public class Book {
-
- private String name;
-
- private String author;
- }
-
-
- public class Author {
-
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String toString() {
- return "Author{" +
- "name='" + name + '\'' +
- '}';
- }
- }
-
- @RestController
- public class BookController {
- @GetMapping("/book")
- public Book book(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author){
- System.out.println("接收到的参数为:" + book);
- System.out.println("接收到的参数为:" + author);
- return book;
- }
-
- // 添加 InitBinder 指定 前缀 b
- @InitBinder("b")
- private void initBinderB(WebDataBinder binder) {
- binder.setFieldDefaultPrefix("b.");
- }
-
- // 添加 InitBinder 指定 前缀 a
- @InitBinder("a")
- private void initBinderA(WebDataBinder binder) {
- binder.setFieldDefaultPrefix("a.");
- }
-
- }
访问:
结果: