@RequestParam、@RequestBody、@RequestAttribute、@RequestPart和@PathVariable详解和具体示例

目录

1. @RequestParam

常规用法

@PathVariable注解

可选参数

2. @RequestBody

常规用法

JSON格式数据

3. @RequestAttribute

4. @RequestPart

常规用法

上传多个文件

总结:


在使用Spring Web框架开发Web应用时,我们通常需要获取请求的参数、请求体、请求属性等信息。为了方便地提取这些信息,Spring Web提供了多个注解,包括@RequestParam@RequestBody@RequestAttribute@RequestPart等。

在本篇博客中,我们将介绍这些注解的用法,并提供具体示例。

1. @RequestParam

@RequestParam注解用于获取HTTP请求参数的值。

可以通过name、value、required、defaultValue等属性来指定参数名、是否必须、默认值等信息。如果请求参数名和方法参数名不一致,可以通过设置@RequestParam的value属性来解决。

示例代码如下:

常规用法

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/info")
    public String userInfo(@RequestParam("user_id") int userId) {
        //处理业务逻辑
        return "user_info";
    }
}

上述代码中,@RequestParam注解获取了前端页面提交的参数名为user_id的值,并赋值给方法参数userId。

@PathVariable注解

如果请求参数和方法参数名称相同,可以省略value属性。

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id, @RequestParam String name) {
    return userService.getUserByIdAndName(id, name);
}

在这个示例中,我们使用@PathVariable注解将URL路径参数id映射到方法参数id上,并使用@RequestParam注解将请求参数name映射到方法参数name上。

可选参数

有时候,请求参数可能不是必须的。为了避免抛出异常,我们可以设置required属性为false

@GetMapping("/users")
public List<User> getUsers(@RequestParam(required = false) String name) {
    if (name == null) {
        return userService.getAllUsers();
    } else {
        return userService.getUsersByName(name);
    }
}

在这个示例中,我们使用@RequestParam注解将请求参数name映射到方法参数name上,并设置了required属性为false。如果请求参数不存在,则返回所有用户;否则返回指定名称的用户列表。

2. @RequestBody

@RequestBody注解用于获取HTTP请求的请求体中的内容,常用于处理POST请求。

使用该注解后,Spring会自动将请求体中的JSON/XML等数据封装成Java对象,方便进行操作。

示例代码如下:

常规用法

@Controller
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public String addUser(@RequestBody User user) {
        //处理业务逻辑
        return "add_success";
    }
}

上述代码中,@RequestBody注解将请求体中的JSON/XML数据封装成了User对象,方便后续操作。

JSON格式数据

如果请求体是JSON格式的数据,我们可以使用@RestController注解和@PostMapping注解来自动转换为Java对象。

@RestController
public class UserController {
    @PostMapping("/users")
    public User createUser(@RequestBody CreateUserRequest request) {
        User user = new User(request.getName(), request.getAge());
        return userService.createUser(user);
    }
}

public class CreateUserRequest {
    private String name;
    private int age;
    // getters and setters
}

在这个示例中,我们使用@RestController注解和@PostMapping注解来处理POST请求,并使用CreateUserRequest类来自动转换请求体为Java对象。

3. @RequestAttribute

@RequestAttribute注解用于获取HTTP请求中的属性值,通常由过滤器或拦截器在请求处理之前设置。

可以通过name属性来指定属性名。 示例代码如下:

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/info")
    public String userInfo(@RequestAttribute("user_name") String userName) {
        //处理业务逻辑
        return "user_info";
    }
}

上述代码中,@RequestAttribute注解获取了请求中名为user_name的属性值,并赋值给方法参数userName。

4. @RequestPart

@RequestPart注解用于处理文件上传请求,可以直接将文件封装成Java对象。

在处理文件上传时,需要使用multipart/form-data编码方式,并且表单中的name值需要和@RequestPart注解中的value值一致。 示例代码如下:

常规用法

@Controller
@RequestMapping("/user")
public class UserController {
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<String> uploadFile(@RequestPart MultipartFile file, @RequestParam String description) {
    // 处理文件和参数
}
}

在这个示例中,我们使用@RequestPart注解将上传的文件映射到方法参数file上,使用@RequestParam注解将请求参数description映射到方法参数description上。这样,我们就可以上传文件并附带描述信息了。

上传多个文件

如果要上传多个文件,可以使用MultipartFile[]类型的参数。

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> uploadFiles(@RequestPart("fileList") MultipartFile[] fileList, @RequestParam String description) {
    // 处理文件和参数
}

在这个示例中,我们使用@RequestPart注解将多个上传的文件映射到方法参数fileList上。这样,我们就可以上传多个文件并附带描述信息了。

注意:使用@RequestPart注解时,必须同时指定Content-Typemultipart/form-data,否则会抛出异常。

总结:

以上就是@RequestParam、@RequestBody、@RequestAttribute、@RequestPart注解的详细解释和具体示例。它们可以极大地简化HTTP请求参数的获取和文件上传的操作。

猜你喜欢

转载自blog.csdn.net/qq_63029994/article/details/130401888