当前位置: 首页 > article >正文

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

完整版博客: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。


http://www.kler.cn/a/561869.html

相关文章:

  • Java 大视界 —— Java 大数据在智慧能源微电网能量管理中的关键技术(100)
  • AI赋能软件测试:效率与质量的革命性提升
  • React 源码揭秘 | hooks原理
  • [Web 安全] 反序列化漏洞 - 学习笔记
  • MAC 安装Tensorflow简单方法
  • 视频裂变加群推广分享引流源码
  • 解决IDEA使用Ctrl + / 注释不规范问题
  • 【python随手记】——读取文本文件内容转换为json格式
  • 选择排序:简单高效的选择
  • 安装 Milvus Java SDK
  • Docker 高级网络配置
  • 架构思维:架构的演进之路
  • 【nginx】:给nginx增加 password 配置通过简单的方式限制登陆。使用openssl 生成密码
  • 网页五子棋——项目部署
  • 什么是死锁?构成死锁的条件如何解决
  • Shell脚本高级技巧与错误处理
  • WebUI 部署 Ollama 可视化对话界面
  • Directx上传堆和默认堆注意事项
  • WPS中Word表格做好了,忘记写标题了怎么办?
  • 深入理解 Flink 中的 .name() 和 .uid() 方法