JavaEE进阶(1) Spring Web MVC 注解和参数传递

发布于:2025-02-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

完整版博客: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 参数中获取 nameagegender 的值。例如,访问 /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。