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 参数中获取 nameagegender 的值。例如,访问 /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。

相关推荐
lihao lihao11 分钟前
模板进阶
java·数据结构·算法
山风wind17 分钟前
Spring中责任链模式的工业级应用简单剖析
java·spring·责任链模式
中年程序员一枚27 分钟前
Springboot使用maven编译报juh-3.2.1.jar缺失
spring boot·maven·jar
韩立学长29 分钟前
基于Springboot建筑物保护可视化系统rk6tni53(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Element_南笙30 分钟前
BUG:ModuleNotFoundError: No module named ‘milvus_lite‘
java·服务器·数据库
yyy(十一月限定版)37 分钟前
C++基础
java·开发语言·c++
Coder_Boy_37 分钟前
分布式系统设计经验总结:金融vs电商的核心差异与决策思路
java·运维·微服务·金融·电商
kkkkkkkkl2441 分钟前
从 ACK 到事务裁决:Spring Boot 中 RocketMQ 事务消息的完整工作机制解析
spring boot·rocketmq·java-rocketmq
To Be Clean Coder1 小时前
【Spring源码】getBean源码实战(一)
java·后端·spring
派大鑫wink1 小时前
【Day21】NIO入门:通道、缓冲区与非阻塞IO基础
java·开发语言