springboot中Controller常用注解

408 阅读4分钟

1.@RequestParam

@RequestParam可以从 URL 中提取请求参数,并将它们绑定到方法的参数上。
一般多用于get请求,但是其它的请求格式也可以使用。

基本用法

假设有一个简单的 GET 请求,URL 如下:

http://localhost:8080/greet?name=John&age=25

在这个请求中,nameage 是查询参数。可以使用 @RequestParam 注解来提取这些参数并将其传递给控制器的方法。

@RestController
public class GreetingController {

    @GetMapping("/greet")
    public String greet(@RequestParam String name, @RequestParam int age) {
        return "Hello " + name + ", you are " + age + " years old.";
    }
}

给前端返回:

Hello John, you are 25 years old.

常用属性

  • required

    required 属性用来指定请求中是否必须包含这个参数,默认为 true。所以,写了@RequestParam注解,就说明这个参数前端必须要传,如果不传,spring会报错:

package com.akbar.controller;

import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RestController
@RequestMapping("/greet")
public class TestController {

    @GetMapping()
    public String greet(@RequestParam String name) {
        return "Hello " + name + "!";
    }
}

image.png

如果这个参数也可以不传,要这样写:

package com.akbar.controller;

import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RestController
@RequestMapping("/greet")
public class TestController {

    @GetMapping()
    public String greet(@RequestParam(required = false) String name) {
        return "Hello " + name + "!";
    }
}
  • defaultValue

    defaultValue 属性可以指定当请求中没有该参数时使用的默认值。这个属性在参数为 required = false 时非常有用。

@GetMapping("/greet")
public String greet(@RequestParam(defaultValue = "Guest") String name) {
    return "Hello " + name;
}
  • 处理多个参数
@GetMapping("/user")
public String user(@RequestParam String username, @RequestParam int age) {
    return "User: " + username + ", Age: " + age;
}

POST 请求中使用@RequestParam

在 POST 请求中,@RequestParam 可以用来处理 表单提交的数据。这种情况通常见于 HTML 表单通过 POST 请求发送数据时。

@PostMapping("/submitForm")
public String handleFormSubmission(@RequestParam String username, @RequestParam String password) {
    return "Received username: " + username + " and password: " + password;
}

比如,前端的表单是这样的:

<form action="/submitForm" method="post">
    <input type="text" name="username" placeholder="Enter username">
    <input type="password" name="password" placeholder="Enter password">
    <button type="submit">Submit</button>
</form>

其它请求格式

因为其它请求格式中用的很少,所以这里不演示,但是其它请求格式都可以用。

如果不写会怎么样

如果没有显式的注解,比如什么注解都没有,Spring 会自动查找请求中的参数(如 URL 查询参数或表单数据),并将它们绑定到方法的对应参数。 比如URL 查询参数:

package com.akbar.controller;

import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RestController
@RequestMapping("/greet")
public class TestController {

    @GetMapping()
    public String greet( String name,int age) {
        return "Hello " + name + ", you are "+age+" years old";
    }
}

image.png 比如表单数据:

package com.akbar.controller;

import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RestController
@RequestMapping("/greet")
public class TestController {

    @PostMapping
    public String greet( String name,int age) {
        return "Hello " + name + ", you are "+age+" years old";
    }
}

比如html表单是这样的:

<form action="/login" method="post">
    <input type="text" name="name" />
    <input type="password" name="password" />
    <button type="submit">Login</button>
</form>

image.png

但是前端要传递的是json对象,这个时候就不能什么都不写了:

package com.akbar.controller;

import com.akbar.pojo.User;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/greet")
public class TestController {

    @PostMapping
    public User greet(User user) {
        System.out.println(user.getUsername());
        System.out.println(user.getAge());
        return user;
    }
}

image.png image.png 很显然后端拿不到这个json数据。
如果我们用@RequestBody,后端就可以拿到:

package com.akbar.controller;

import com.akbar.pojo.User;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/greet")
public class TestController {

    @PostMapping
    public User greet(@RequestBody User user) {
        System.out.println(user.getUsername());
        System.out.println(user.getAge());
        return user;
    }
}

image.png

  • 虽然不使用 @RequestParam 也能工作,但为了让代码更加明确和易于维护,建议显式地使用 @RequestParam,特别是当有多个请求参数或需要做参数验证时。

  • 使用 @RequestParam 也可以为参数指定默认值、要求为必填项、进行类型转换等。

2.@RequestBody

@RequestBody 允许将请求体(一般是 JSON 格式的数据)自动转换为 Java 对象,极大地简化了数据的解析和绑定过程。

基本用法

假设我们有一个表示用户信息的 User 类,如下所示:

public class User {
    private String username;
    private String password;
    private int age;

    // Getters and setters
}

假设我们有一个前端发送 JSON 格式数据的 POST 请求,URL 为 /user,请求体内容如下:

{
    "username": "john_doe",
    "password": "password123",
    "age": 30
}

在 Spring Boot 中,我们可以通过 @RequestBody 来自动将 JSON 数据转换为 User 对象。

@RestController
public class UserController {

    @PostMapping("/user")
    public String createUser(@RequestBody User user) {
        // 使用自动绑定的 User 对象
        return "Created user: " + user.getUsername() + ", Age: " + user.getAge();
    }
}

3.@PathVariable

@PathVariable注解用于 提取 URL 路中的变量。它通常用于处理 RESTful 风格的 URL 中的路径参数。

基本用法

/users/{id}

假设我们有一个表示用户信息的 RESTful API,URL 格式如下: 假设我们要从 URL /users/{id} 提取 id 参数,并将其作为方法的参数:

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Integer id) {
        return "User ID: " + id;
    }
}