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

完整版博客:Spring Web MVC 注解和参数传递

在学习 Spring Web MVC 时,我们常用不同的注解来处理 HTTP 请求和响应。Spring MVC 提供了一系列的注解,简化了我们的开发工作,让我们能够通过更简洁和可读的方式来处理请求。以下将详细讲解这些注解的使用方式,结合代码示例以及常见的应用场景,帮助大家深入理解 Spring MVC 中的请求处理。


1. @RestController 和 @RequestMapping

@RestController 是 Spring 4 引入的注解,它本质上是 @Controller 和 @ResponseBody 注解的结合,意味着类中的每个方法都会直接返回响应体的内容而非视图名称。以下是一个简单的例子:

java 复制代码
@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 简单参数传递
java 复制代码
@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 获取参数
java 复制代码
@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 传递对象
java 复制代码
@RequestMapping("/p6")
public String p6(User user) {
    return "user:" + user;
}

在这个方法中,@RequestMapping 支持将请求中的参数绑定到对象属性中。Spring MVC 会自动根据请求的参数给 User 对象的字段赋值。

3.4 给参数重新命名
java 复制代码
@RequestMapping("/p7")
public String p7(@RequestParam("userName") String name) {
    return "接收到参数, user:" + name;
}

@RequestParam 用于从请求中获取参数,并允许重命名传入参数的名称。例如,尽管请求中传递的是 userName 参数,方法中的参数名仍然是 name。

3.5 传递数组和集合
传递数组
java 复制代码
@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 集合
java 复制代码
@RequestMapping("/p9")
public String p9(@RequestParam List<String> list) {
    return "list:" + List.of(list);
}

与数组相似,Spring MVC 会将多个相同名称的请求参数绑定到一个 List 集合中。

3.6 传递 JSON 请求体
java 复制代码
@RequestMapping("p10")
public String p10(@RequestBody User user) {
    return "user:" + user;
}

通过 @RequestBody 注解,Spring 会将请求体中的 JSON 数据自动映射到对象。

3.7 @PathVariable 路径参数
java 复制代码
@RequestMapping("/article/{articleId}")
public String p11(@PathVariable String articleId) {
    return "article:" + articleId;
}

@PathVariable 用于处理 URI 中的动态路径参数。访问 /user/article/123 时,articleId 将接收到 123。

4. 文件上传:MultipartFile(比如说上传JSON格式)

java 复制代码
@RequestMapping("/p13")
public String p13(MultipartFile file) {
    System.out.println(file.getOriginalFilename());
    return "文件名称:" + file.getOriginalFilename();
}

该方法使用 MultipartFile 来处理文件上传。上传的文件会被自动绑定到 file 参数上。

5. 完整的代码展示

java 复制代码
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。

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程