完整版博客:Spring Web MVC 注解和参数传递
在学习 Spring Web MVC 时,我们常用不同的注解来处理 HTTP 请求和响应。Spring MVC 提供了一系列的注解,简化了我们的开发工作,让我们能够通过更简洁和可读的方式来处理请求。以下将详细讲解这些注解的使用方式,结合代码示例以及常见的应用场景,帮助大家深入理解 Spring MVC 中的请求处理。
1. @RestController
和 @RequestMapping
@RestController
是 Spring 4 引入的注解,它本质上是 @Controller
和 @ResponseBody
注解的结合,意味着类中的每个方法都会直接返回响应体的内容而非视图名称。以下是一个简单的例子:
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/v1", method = RequestMethod.GET)
public String print1() {
return "hello print";
}
@RequestMapping(value = "/v2", method = RequestMethod.POST)
public String print2() {
return "hello print";
}
@RequestMapping("/v3")
public String print3() {
return "hello print";
}
}
@RestController
:表示该类的所有方法都将直接返回内容,而不是视图。@RequestMapping("/user")
:映射所有方法到/user
路径。
在上面的代码中,我们定义了不同的 HTTP 请求方法,分别是 GET 和 POST 请求。
2. 请求方式限定:@RequestMapping
vs @GetMapping
和 @PostMapping
@RequestMapping(value = "/v1", method = RequestMethod.GET)
:表示此方法只响应 GET 请求。如果请求为 GET,它将返回"hello print"
字符串。@GetMapping("/v1")
:@GetMapping
是@RequestMapping(method = RequestMethod.GET)
的快捷方式,功能完全相同。@RequestMapping(value = "/v3", method = RequestMethod.POST)
:表示此方法只响应 POST 请求。返回"hello print"
字符串。@PostMapping("/v4")
:@PostMapping
是@RequestMapping(method = RequestMethod.POST)
的快捷方式,功能也完全相同。
3. 传递参数:请求参数处理
3.1 简单参数传递
@RequestMapping("/p5")
public String p5(String name, int age, String gender) {
return "接收到参数, age:" + age + ", gender:" + gender + ", name:" + name;
}
在这个方法中,我们直接从请求的 URL 参数中获取 name
、age
和 gender
的值。例如,访问 /user/p5?name=John&age=25&gender=male
时,会输出接收到的参数。
3.2 通过 HttpServletRequest
获取参数
@RequestMapping("/p51")
public String p51(HttpServletRequest request) {
String name = request.getParameter("name");
Integer age = Integer.valueOf(request.getParameter("age"));
String gender = request.getParameter("gender");
return name + ", age:" + age + ", gender:" + gender;
}
在这个例子中,我们使用 HttpServletRequest
对象手动从请求中提取参数。这种方式较为灵活,但需要更多的代码。
3.3 传递对象
@RequestMapping("/p6")
public String p6(User user) {
return "user:" + user;
}
在这个方法中,@RequestMapping
支持将请求中的参数绑定到对象属性中。Spring MVC 会自动根据请求的参数给 User
对象的字段赋值。
3.4 给参数重新命名
@RequestMapping("/p7")
public String p7(@RequestParam("userName") String name) {
return "接收到参数, user:" + name;
}
@RequestParam
用于从请求中获取参数,并允许重命名传入参数的名称。例如,尽管请求中传递的是 userName
参数,方法中的参数名仍然是 name
。
3.5 传递数组和集合
传递数组
@RequestMapping("/p8")
public String p8(String[] array) {
return "array:" + List.of(array);
}
此方法接收一个数组,如果请求中有多个相同名称的参数,Spring 会将其收集成数组。例如,访问 /user/p8?array=1&array=2&array=3
时,数组将包含 [1, 2, 3]
。
传递 List 集合
@RequestMapping("/p9")
public String p9(@RequestParam List<String> list) {
return "list:" + List.of(list);
}
与数组相似,Spring MVC 会将多个相同名称的请求参数绑定到一个 List 集合中。
3.6 传递 JSON 请求体
@RequestMapping("p10")
public String p10(@RequestBody User user) {
return "user:" + user;
}
通过 @RequestBody
注解,Spring 会将请求体中的 JSON 数据自动映射到对象。
3.7 @PathVariable
路径参数
@RequestMapping("/article/{articleId}")
public String p11(@PathVariable String articleId) {
return "article:" + articleId;
}
@PathVariable
用于处理 URI 中的动态路径参数。访问 /user/article/123
时,articleId
将接收到 123
。
4. 文件上传:MultipartFile(比如说上传JSON格式)
@RequestMapping("/p13")
public String p13(MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "文件名称:" + file.getOriginalFilename();
}
该方法使用 MultipartFile
来处理文件上传。上传的文件会被自动绑定到 file
参数上。
5. 完整的代码展示
package com.example.springwebdemo2;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/v1", method = RequestMethod.GET)
public String print1() {
return "hello print";
}
@GetMapping("/v2")
public String print2() {
return "hello print";
}
@RequestMapping(value = "/v3", method = RequestMethod.POST)
public String print3() {
return "hello print";
}
@PostMapping("/v4")
public String v4() {
return "hello v4";
}
@RequestMapping("/p5")
public String p5(String name, int age, String gender) {
return "接收到参数, age:" + age + ", gender:" + gender + ", name:" + name;
}
@RequestMapping("/p51")
public String p51(HttpServletRequest request) {
String name = request.getParameter("name");
Integer age = Integer.valueOf(request.getParameter("age"));
String gender = request.getParameter("gender");
return name + ", age:" + age + ", gender:" + gender;
}
@RequestMapping("/p6")
public String p6(User user) {
return "user:" + user;
}
@RequestMapping("/p7")
public String p7(@RequestParam("userName") String name) {
return "接收到参数, user:" + name;
}
@RequestMapping("/p8")
public String p8(String[] array) {
return "array:" + List.of(array);
}
@RequestMapping("/p9")
public String p9(@RequestParam List<String> list) {
return "list:" + List.of(list);
}
@RequestMapping("p10")
public String p10(@RequestBody User user) {
return "user:" + user;
}
@RequestMapping("/article/{articleId}")
public String p11(@PathVariable String articleId) {
return "article:" + articleId;
}
@RequestMapping("/p13")
public String p13(MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "文件名称:" + file.getOriginalFilename();
}
}
6. 总结表格
注解 | 描述 | 示例 |
---|---|---|
@RestController |
标记一个类为RESTful控制器,返回响应体而不是视图 | @RestController @RequestMapping("/user") |
@RequestMapping |
映射 HTTP 请求到指定的方法 | @RequestMapping("/v1") |
@GetMapping |
用于映射 HTTP GET 请求,@RequestMapping(method = RequestMethod.GET) 的简化 |
@GetMapping("/v1") |
@PostMapping |
用于映射 HTTP POST 请求,@RequestMapping(method = RequestMethod.POST) 的简化 |
@PostMapping("/v4") |
@RequestParam |
从请求中获取参数,可以重命名参数 | @RequestParam("userName") String name |
@RequestBody |
从请求体中获取 JSON 数据并映射到对象 | @RequestBody User user |
@PathVariable |
用于处理路径中动态部分的参数 | @PathVariable String articleId |
MultipartFile |
用于处理文件上传 | public String p13(MultipartFile file) |
以上是 Spring Web MVC 中常用注解及其功能的详细讲解。通过这些注解和方法,我们可以轻松地处理 HTTP 请求,传递参数,处理文件上传,甚至处理 JSON 请求体等操作。希望这些示例和表格能帮助大家更好地理解和使用 Spring MVC。