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

@RequestParam和@PathVariable的解释与区别

在 Spring 框架中,@RequestParam@PathVariable都是用于从 HTTP 请求中获取参数的注解,但它们的使用场景和获取参数的方式有所不同。

1. @RequestParam

  • 解释@RequestParam主要用于从 HTTP 请求的查询参数(也就是 URL 中?后面的键值对)中获取参数值。可以把它想象成是在一堆放在 “明面上” 的参数里,按名字找到你需要的那个参数。
  • 举例:假设我们有一个需求,要根据用户输入的用户名来查询用户信息。前端发送的请求 URL 可能是这样的:http://localhost:8080/user?username=tom

后端对应的控制器代码可以这样写:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String getUserByUsername(@RequestParam String username) {
        // 这里根据用户名查询用户信息,简单返回一段提示信息
        return "查询到用户:" + username;
    }
}

在这个例子中,@RequestParam注解告诉 Spring 框架,从请求的查询参数中找到名为username的参数,并将其值传递给getUserByUsername方法的username参数。

@RequestParam还有一些其他的用法,比如可以指定参数是否为必填项,以及设置默认值:

@GetMapping("/user")
public String getUserByUsername(@RequestParam(required = false, defaultValue = "anonymous") String username) {
    return "查询到用户:" + username;
}

这里required = false表示username参数不是必填的,defaultValue = "anonymous"表示如果请求中没有提供username参数,那么username的值将被设置为anonymous

-如果请求参数是用 ? 拼接在 URL 后面,并且在控制器(Controller)中使用实体类来接收这些参数,通常不需要添加 @RequestParam 注解

例如,假设你有一个如下的请求:

http://localhost:8080/user?name=John&age=25

并且你有一个实体类 User 如下:

public class User {
    private String name;
    private int age;

    // getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

你可以在控制器中这样接收:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping
    public String getUser(User user) {
        // 这里可以使用 user 对象进行操作
        return "User name: " + user.getName() + ", Age: " + user.getAge();
    }
}

在这个例子中,Spring 会自动将 name 和 age 参数的值分别绑定到 User 类的 name 和 age 属性上,因为它们的名称是匹配的。

-不需要 @RequestParam 的原因

  • 基于约定的自动映射:Spring 框架使用 JavaBean 的属性名称约定,将请求参数名称与实体类的属性名称进行匹配,并自动将请求参数的值设置到相应的属性中。只要请求参数名称和实体类的属性名称完全一致,Spring 就能自动完成映射,无需额外的注解。

-注意事项

  • 参数名称匹配:确保请求参数的名称和实体类的属性名称完全一致,包括大小写。例如,如果请求参数是 firstName,实体类中应该有 private String firstName; 及其相应的 getter 和 setter 方法。
  • 复杂对象:对于嵌套的实体类,Spring 也可以自动进行嵌套绑定。例如,如果 User 类中有一个 Address 类作为属性,请求中可以使用 address.city 这样的参数名称来设置 Address 对象的 city 属性。
  • 日期和特殊类型:对于日期和一些特殊类型,可能需要额外的配置,例如添加日期格式化注解或使用自定义的属性编辑器,以确保 Spring 能正确地将字符串形式的请求参数转换为相应的对象类型。

-如果请求参数的名称和实体类的属性名称不一致怎么办

①. 使用 @RequestParam 注解

  • 解决思路

    • 对于简单的参数,可以直接使用 @RequestParam 注解,将请求参数的名称指定为注解的 value 属性,然后将其赋值给实体类的属性。
  • 示例代码

   @RestController
   public class UserController {

       @GetMapping("/user")
       public ResponseEntity<?> getUser(
           @RequestParam("user_name") String userName,
           @RequestParam("user_age") int age) {
           
           User user = new User();
           user.setUserName(userName);
           user.setAge(age);
           
           return ResponseEntity.ok(user);
       }
   }
   
②使用@ModelAttribute和@RequestParam结合:
   @RestController
   public class UserController {

       @GetMapping("/user")
       public ResponseEntity<?> getUser(@ModelAttribute UserRequest userRequest) {
           
           User user = new User();
           user.setUserName(userRequest.getUserName());
           user.setAge(userRequest.getAge());
           
           return ResponseEntity.ok(user);
       }
   }

   public class UserRequest {
       @RequestParam("user_name")
       private String userName;
       
       @RequestParam("user_age")
       private int age;
       
       // getters and setters
   }
   

2. @PathVariable

  • 解释@PathVariable用于从 URL 的路径变量中获取参数值。可以把它理解为参数是 URL 路径的一部分,就像是在一条有特定标识的路径上,按标识的位置去提取你想要的参数。
  • 举例:假设我们要根据用户的 ID 来获取用户的详细信息,请求 URL 可能是这样的:http://localhost:8080/user/123,其中123就是用户的 ID。

后端对应的控制器代码可以这样写:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable Long id) {
        // 这里根据用户ID查询用户信息,简单返回一段提示信息
        return "查询到ID为:" + id + " 的用户信息";
    }
}

在这个例子中,@PathVariable注解告诉 Spring 框架,从 URL 路径中提取名为id的路径变量,并将其值传递给getUserById方法的id参数。这里{id}就是在 URL 路径中定义的路径变量,它的名字可以自定义,只要和@PathVariable注解引用的名字一致就行。

3. 两者的区别总结

  • 参数位置@RequestParam获取的参数在 URL 的查询字符串中,以key=value的形式存在;@PathVariable获取的参数是 URL 路径的一部分。
  • 使用场景:如果参数是可选的、用于过滤或搜索等操作,通常使用@RequestParam;如果参数是用于定位特定资源,作为资源标识的一部分,通常使用@PathVariable。例如,获取某个用户的详细信息,用户 ID 是唯一标识这个用户资源的,适合用@PathVariable;而如果是要筛选出某个年龄段的用户,年龄参数可以作为查询参数,适合用@RequestParam

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

相关文章:

  • JS 异步 ( 一、异步概念、Web worker 基本使用 )
  • WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件
  • [代码随想录23回溯]回溯的组合问题+分割子串
  • Java线程池面试题
  • spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。
  • 微信小程序 不同角色进入不同页面、呈现不同底部导航栏
  • 从自动驾驶到具身智能漫谈
  • 正则表达式(三剑客之sed)
  • HarmonyOS NEXT 实战之元服务:静态案例效果---每日玩机技巧
  • 跨境电商培训:云手机的新舞台
  • 某车之家appso层签名逆向
  • 2024楚慧杯WP
  • CultureLLM 与 CulturePark:增强大语言模型对多元文化的理解
  • 力扣-数据结构-3【算法学习day.74】
  • 存储块的获取与释放
  • Windows下ESP32-IDF开发环境搭建
  • 智源研究院与安谋科技达成战略合作,共建开源AI“芯”生态
  • 冰狐智能辅助使用插件化开发集成三方ocr
  • Linux中的lseek 函数与fcntl函数
  • CMS(Concurrent Mark Sweep)垃圾回收器的具体流程
  • 使用Python读写文本文件
  • 【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT
  • 网络层协议--ip协议
  • uni-app 中使用微信小程序第三方 SDK 及资源汇总
  • 常用的Django模板语言
  • 437 路径总和III