目录
简单参数
传递方式
获取方式一
获取方式二
相关注解
实体参数
数组集合参数
传递方式
相关注解
获取方式一
获取方式二
日期参数
传递方式
相关注解
获取方式
json参数
传递方式
相关注解
获取方式
路径参数
传递方式
相关注解
获取方式
传递多个
简单参数
传递方式
简单参数携带在请求的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参数
传递方式
携带在请求体中
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();}
}
测试结果: