在SpringBoot2.x中,controller层有哪些注解获取前端传过来的值,有什么情况不需要注解也能获取到值?
在 Spring Boot 2.x 中,Controller 层可以使用的注解用于获取前端传递过来的值有以下几种:
1. @PathVariable
:用于获取 URL 路径中的参数。例如:
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
// ...
}
2. @RequestParam
:用于获取请求参数(通常是查询参数)。例如:
@GetMapping("/users")
public List<User> getUsers(@RequestParam(value = "name", required = false) String name) {
// ...
}
当你将 required
属性设置为 false
时,表示这个参数是可选的,即使请求中没有包含这个参数,也不会抛出异常。在这种情况下,如果请求中没有包含这个参数,对应的方法参数将会被赋予一个默认值,通常是 null
。这个属性在 @RequestParam
、@RequestHeader
和 @CookieValue
可用
2.1 在某些情况下,不需要使用@RequestParam
注解也可以获取前端传过来的值。
例如,当方法参数名与请求参数名(即 URL 上带的参数)相同时,Spring 会自动将请求参数绑定到方法参数上。以下例子展示了如何不使用 @RequestParam
注解获取请求参数:
@GetMapping("/users")
public List<User> getUsers(String name) {
// ...
}
但是,建议在实际开发中明确使用注解,这样可以提高代码的可读性和可维护性。
2.2 当方法参数名(自定义类)与请求参数名相同时可省略@RequestParam吗
当方法参数是自定义类时,不能省略 @RequestParam
注解来直接将请求参数绑定到方法参数上。在这种情况下,你应该使用 @ModelAttribute
注解,或者不使用任何注解。Spring 会自动将请求参数绑定到方法参数的相应属性上,前提是请求参数的名称和方法参数的属性名称相同。
例如,假设你有一个名为 User
的自定义类,它有两个属性:name
和 age
。你可以使用以下方法将请求参数绑定到 User
类的实例上:
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {
// ...
}
或者,你可以省略 @ModelAttribute
注解,Spring 仍然会自动将请求参数绑定到方法参数上:
@PostMapping("/users")
public String createUser(User user) {
// ...
}
需要注意的是,当方法参数是自定义类时,请求中的参数通常应该是表单参数(即 application/x-www-form-urlencoded
类型的数据),而不是 URL 上的查询参数或请求体中的 JSON 数据。如果请求参数是 JSON 数据,你应该使用 @RequestBody
注解来处理这种情况。
2.3@RequestParam
还能设置默认值
可以使用 @RequestParam
注解的 defaultValue
属性为请求参数设置默认值。当客户端没有提供该参数时,方法参数将使用设置的默认值。以下是一个示例:
@GetMapping("/greet")
public String greet(@RequestParam(value = "name", defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
在此示例中,name
参数的默认值为 "World"
。当客户端发送不包含 name
参数的请求时,该方法将使用默认值。例如:
- 请求 URL:
/greet?name=John
,响应:Hello, John!
- 请求 URL:
/greet
(未提供name
参数),响应:Hello, World!
通过为请求参数设置默认值,你可以确保方法在缺少某些参数时仍能正常工作。请注意,defaultValue
属性的值必须是一个字符串,即使方法参数的类型不是字符串。在运行时,Spring 会尝试将字符串值转换为方法参数的实际类型,因此请确保默认值与参数类型兼容。如果转换失败,将抛出一个类型转换异常。
以下是一个将
defaultValue
转换为整数的示例:
@GetMapping("/square")
public String square(@RequestParam(value = "number", defaultValue = "2") int number) {
int result = number * number;
return "The square of " + number + " is " + result;
}
在这个示例中,
number
参数的默认值是字符串"2"
。当客户端没有提供number
参数时,Spring 会将其转换为整数2
。类似地,你可以将defaultValue
的值转换为其他类型,例如浮点数。只需确保>默认值与参数类型兼容,否则会抛出类型转换异常。
3. @RequestBody
:用于获取请求体中的数据,通常用于处理 JSON 格式的数据。例如:
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// ...
}
3.1 当请求体不是 JSON 格式时,你可以根据请求体的实际内容类型来处理请求数据。以下是一些常见的请求内容类型和相应的处理方法:
- 表单数据(
application/x-www-form-urlencoded
):表单数据是 Web 表单提交的默认数据格式。在 Spring MVC 中,你可以使用@ModelAttribute
注解将请求参数绑定到方法参数(通常是自定义类的实例)上。
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {
// ...
}
- 多部分文件上传(
multipart/form-data
):当请求中包含文件上传时,您可以使用@RequestParam
注解与MultipartFile
类来处理上传的文件。
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
// ...
}
- 纯文本(
text/plain
):如果请求体包含纯文本数据,你可以使用@RequestBody
注解将请求体绑定到一个String
类型的方法参数上。
@PostMapping(value = "/text", consumes = "text/plain")
public String handleTextData(@RequestBody String text) {
// ...
}
- 其他自定义格式:如果请求体是其他自定义格式,你可以使用
@RequestBody
注解将请求体绑定到一个String
类型的方法参数上,然后根据需要手动解析请求数据。
@PostMapping(value = "/custom", consumes = "application/vnd.your-custom-format")
public String handleCustomData(@RequestBody String data) {
// 解析 data
// ...
}
在处理非 JSON 请求体时,请确保正确设置请求中的 Content-Type
头,以便 Spring MVC 能够正确地处理请求数据。同时,在方法上使用 consumes
属性来指定处理特定 Content-Type
的请求。
4. @RequestHeader
:用于获取请求头中的数据。例如:
@GetMapping("/users")
public List<User> getUsers(@RequestHeader("Authorization") String token) {
// ...
}
5. @CookieValue
:用于获取 Cookie 中的数据。例如:
@GetMapping("/users")
public List<User> getUsers(@CookieValue("sessionId") String sessionId) {
// ...
}
6.@DateTimeFormat
获取请求参数中的日期或时间类型数据
在 Spring 中,如果需要获取请求参数中的日期或时间类型数据,可以使用 @DateTimeFormat
注解。@DateTimeFormat
注解可以与 @RequestParam
注解一起使用,以自定义日期和时间类型参数的解析格式。
例如,获取一个日期参数:
@GetMapping("/events")
public List<Event> getEvents(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
// ...
}
在这个例子中,URL 上的请求参数名为 “date”,方法参数名也为 “date”。@DateTimeFormat
注解指定了日期格式为 “yyyy-MM-dd”,因此,Spring 将根据这个格式来解析请求参数 “date” 的值,并将其绑定到方法参数 “date” 上。
这些注解的组合可以方便地处理日期和时间类型的请求参数。