Spring Boot中的MVC支持--@PathVariable @RequestBody @RequestParam

                Spring Boot中的MVC支持,@RestController、@RequestMapping(前两次內容见 @RequestController 以及@RequestMapping)@PathVariable、 @RequestParam 和@RequestBody 四个注解的使用方式,由于@RestController 中集成了@ResponseBody所以对返回 json 的注解。这些內容对于Spring Boot来说非常重要。

一、@PathVariable

        1、简介

        @PathVariable是Spring MVC中的注释之一,用于从请求URL中提取变量值。它允许您将URL模板变量映射到控制器方法参数中,并在处理请求时使用它们。例如,在处理RESTful Web服务时,可以使用@PathVariable注释来提取URL路径中的ID值,并将其传递给控制器方法进行处理。

        @PathVariable注释主要用于将数据从请求映射到控制器方法的参数上。

        2、与@GetMapping和@RequestMapping

  • @PathVariable

         @PathVariable 注解主要是用来获取 url 参数,Spring Boot 支持 restfull 风格的 url,比如一个 GET 请求携带一 个参数 id 过来 localhost:8080/user?id=123,可以将 id 作为参数接收,注解使用@RequestParam。

        如果使用 路径参数则使用@PathVariable 注解。

  • @GetMapping

        @GetMapping("/user/{id}")

        例如 http://localhost:8080/user/123 这里的{id}对应的就是 123 值。如果请求路 径为 localhost:8080/user/abc 则由于将 abc 无法转换为 Integer 类型所以报错。

public String testPathVariable(@PathVariable Integer id) { 将路径参数中的 123 赋值给方法参数 id
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

        这里需要注意一个问题,如果想要 url 中占位符中的{id}值直接赋值到参数 id 中,需要保证 url 中的参数和方 法接收参数一致,否则就无法接收。如果不一致的话,其实也可以解决,需要用@PathVariable 中的 value 属 性来指定对应关系。

        例如:对应的请求地址为 localhost:8080/user/123/abc,按照位置对应 的 idd=123,name=abc。

public String testPathVariable(@PathVariable(value = "idd") Integer id,                 @PathVariable String name) {
    System.out.println("获取到的 id 为:" + id);
    System.out.println("获取到的 name 为:" + name);
    return "success";
}

        获取到的 id 为:2

        获取到的 name 为:zhangsan

        所以支持多个参数的接收。同样地,如果 url 中的参数和方法中的参数名称不同的话,也需要使用 value 属性 来绑定两个参数。

  • @RequestMapping("/user/{idd}")

public String testPathVariable(@PathVariable(value = "idd") Integer id) {
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

        对于访问的 url,占位符的位置可以在任何位置,不一定非要在最后,比如这样也行/xxx/{id}/user。另外 url 也支持多个占位符,方法参数使用同样数量的参数来接收,原理和一个参数是一样的。

二、@RequestParam

 1.简介

                @RequestParam注解在Spring Boot中用于将Web请求参数绑定到方法参数。当向Spring Boot Web应用程序发出请求时,@RequestParam注解可用于从请求URL查询字符串或请求体参数中提取值并将它们作为参数传递给方法。

 2、@RequestParam 和@PathVariable 有什么不同呢?

                主要区别在于:@PathValiable 是从 url 模板中获取参数值, 即这种风格的 url 为 http://localhost:8080/user/{id};而@RequestParam 是从 request 里面获取参数值,即这 种风格的 url 为 http://localhost:8080/user?id=1。

 3、与@GetMapping和@RequestMapping

  • @GetMapping("/user")

        例如请求路径为 localhost:8080/user?id=123,将数据 123 赋值给方法中的同名参数, 如果参数不是 String 类型,则自动执行数据类型转换

public String testRequestParam(@RequestParam Integer id) {
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

         可以正常从控制台打印出 id 信息。同样地 url 上面的参数和方法的参数需要一致,如果不一致,也需要使用 value 属性来说明,比如 url 为http://localhost:8080/user?idd=1。

  • @RequestMapping

        例如请求路径为 localhost:8080/user?idd=123,如果没有@RequestParam 注解 则 id为null。

public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

        除了 value 属性外,还有个两个属性比较常用:

         required 属性:true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无,如果没有传递这 个参数,则方法参数为 null。

        defaultValue 属性:默认值,表示如果请求中没有同名参数时的默认值 。

  • @RequestParam

        从 url 中可以看出,@RequestParam 注解用于 GET 请求上时,接收拼接在 url 中的参数【URL 重写】。

        除此之 外,该注解还可以用于 POST 请求,接收前端表单提交的参数,假如前端通过表单提交 username 和 password 两个参数,那可以使用@RequestParam 来接收。

@PostMapping("/form1")
public String testForm(@RequestParam String username, @RequestParam String password) {
    System.out.println("获取到的 username 为:" + username);
    System.out.println("获取到的 password 为:" + password);
    return "success";
}

        具体测试种可以使用 postman 来模拟一下表单提交,测试一下接口。但是如果表单数据很多,不可能在后台 方法中写上很多参数,每个参数还要@RequestParam 注解。针对这种情况,需要封装一个实体类来接收这些 参数,实体中的属性名和表单中的参数名一致即可。

public class User {
    private String username;
    private String password;
    // set get
}

使用实体接收的话,不能在前面加@RequestParam 注解了,直接使用即可。

@PostMapping("/form2")
    public String testForm(User user) {
        System.out.println("获取到的 username 为:" + user.getUsername());
        System.out.println("获取到的 password 为:" + user.getPassword());
        return "success";
}

       如果写成 public String testForm(User user,String username)则提交的请求参数 username 的值会赋值两个 地址,一个 user 中的 username 属性,另外一个是方法的参数 username 可以使用 postman 再次测试一下表单提交,观察一下返回值和控制台打印出的日志即可。在实际项目中,一 般都是封装一个实体类来接收表单数据,因为实际项目中表单数据一般都很多。

三、@RequestBody

1、简介

        @RequestParam注解用于将HTTP请求体绑定到方法参数。当客户端向Spring Boot Web应用程序发出请求时,@RequestBody注解可用于将请求体中的值(例如JSON或XML)绑定到Java对象上。

        

使用@RequestBody时,需要记住以下几点:

  1. 请求的Content-Type必须设置为与请求体的格式一致,例如application/json或application/xml。

  2. User类必须有默认的构造函数,否则反序列化将失败。

  3. 如果请求体的格式与要绑定的Java类不匹配,Spring Boot将抛出HttpMediaTypeNotSupportedException异常。

         @RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 json 提交传来两个参数 username 和 password,此时需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便

public class User {
    private String username;
    private String password;
    // set get
}
控制器中方法的定义
@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
    System.out.println("获取到的 username 为:" + user.getUsername());
    System.out.println("获取到的 password 为:" + user.getPassword());
    return "success";
}

        可以使用 postman 工具来测试一下效果,打开 postman 然后输入请求地址和参数,参数用 json 来模拟,调用 之后返回 success。

         同时看一下后台控制台输出的日志:

                获取到的username为:小白

                获取到的password为:1234

        可以看出,@RequestBody 注解用于 POST 请求上,接收 json 实体参数。它和上面表单提交有点类似,只不过 参数的格式不同,一个是 json 实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值