问文心一言的,记录一下。
@PathVariable 路径变量注解
@PathVariable 是 Spring MVC 提供的一个注解,它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 @RequestMapping、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping 等注解的 URL 路径中定义占位符(例如 {variableName})时,你可以使用 @PathVariable 来提取这些占位符的值,并将它们传递给方法参数。
下面是一个简单的例子来说明 @PathVariable 的作用:
@RestController
@RequestMapping("/api/users")
public class UserController {
// ... 其他代码 ...
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// 假设有一个服务层来获取用户信息
User user = userService.findById(id);
return user;
}
// ... 其他代码 ...
}
在这个例子中,@GetMapping("/{id}") 定义了一个 URL 路径模板,其中 {id} 是一个路径变量。@PathVariable Long id 注解告诉 Spring MVC 从 URL 路径中提取 {id} 的值,并将其转换为 Long 类型,然后将其作为参数传递给 getUserById 方法。
当你访问 http://localhost:8080/api/users/123 时,Spring MVC 会将 123 提取出来,并将其作为 Long 类型的值传递给 getUserById 方法的 id 参数。然后,你可以在该方法中使用这个 id 值来获取相应的用户信息。
除了从 URL 路径中提取值之外,@PathVariable 还可以与请求方法的其他参数一起使用,例如查询参数(通过 @RequestParam 注解获取)或请求头(通过 @RequestHeader 注解获取)等。但是,@PathVariable 主要用于从 URL 路径中提取值。
当URL中有多个路径参数时,Spring MVC通过路径变量的顺序和@PathVariable注解来区分它们。每个路径变量在URL模板中都有一个唯一的位置,并且在Controller方法中使用@PathVariable注解的参数名必须与这些路径变量名相匹配。
以下是一个示例,展示了如何在URL中包含多个路径参数,并在Controller方法中区分它们:
@RestController
@RequestMapping("/api/users")
public class UserController {
// ... 其他代码 ...
@GetMapping("/{userId}/followers/{followerId}")
public String getFollowerInfo(@PathVariable Long userId, @PathVariable Long followerId) {
// 这里userId和followerId分别对应于URL中的{userId}和{followerId}
// 你可以使用这两个参数来执行一些业务逻辑
String info = "User " + userId + " has a follower with ID " + followerId;
return info;
}
// ... 其他代码 ...
}
在这个例子中,@GetMapping("/{userId}/followers/{followerId}")定义了一个URL模板,其中有两个路径变量:{userId}和{followerId}。在Controller方法getFollowerInfo中,我们使用了两个@PathVariable注解的参数:userId和followerId。Spring MVC会根据URL中路径变量的顺序和参数名来自动绑定值。
当你访问http://localhost:8080/api/users/1/followers/2时,Spring MVC会将1赋值给userId,将2赋值给followerId,然后调用getFollowerInfo方法。
注意,如果URL中的路径变量名和Controller方法中的参数名不匹配,你也可以在@PathVariable注解中显式指定路径变量的名称:
@GetMapping("/{user_id}/followers/{follower_id}")
public String getFollowerInfo(@PathVariable("user_id") Long userId, @PathVariable("follower_id") Long followerId) {
// ...
}
在这个例子中,尽管URL中的路径变量是{user_id}和{follower_id},但我们在@PathVariable注解中指定了参数名userId和followerId,所以Spring MVC仍然能够正确地将值绑定到参数上。
总结:
@PathVariable 注解允许从 URL 路径中提取参数值,并将它们绑定到 Controller 方法中的方法参数上。只需要确保 URL 路径中的占位符(如 {userId})与方法参数上的 @PathVariable 注解名称相匹配,Spring MVC 就会自动处理这些值的绑定。如果方法的形参名称与占位符不同,@PathVariable("路径参数名")

@RequestParam的作用:
@RequestParam 是 Spring MVC 中用于处理 HTTP 请求中查询参数(即 URL 中 ? 后面的参数)的注解。当你想从 HTTP GET 或 POST 请求的查询字符串中获取参数值,并将其绑定到 Controller 方法的参数上时,你可以使用 @RequestParam。
@RequestParam 注解提供了以下特性:
-
名称(Name):通过
value属性指定查询参数的名称。如果省略value属性,则默认使用方法参数名作为参数名称。 -
默认值(Default Value):通过
defaultValue属性为参数指定一个默认值。如果请求中没有提供该参数,则使用该默认值。 -
必需性(Required):虽然
@RequestParam本身没有直接的required属性(与@PathVariable不同),但你可以通过检查参数是否为null或使用其他验证机制来确保参数的存在。 -
数据类型(Data Type):你可以将查询参数绑定到任何可以接收字符串并可能执行类型转换的参数类型上,例如
String、基本类型(如int、long等,但应使用其包装类Integer、Long等,因为基本类型不能是null)或自定义类型(如果提供了相应的类型转换器或格式化程序)。
URL:http://localhost:8080/api/blog/of/user?&id=1¤t=1
Request Method:GET

//一开始写错了,我要记住正确用法
@GetMapping("/of/user")
public Result queryBlogPage(@RequestParm(value = "current",default = "1") Integer current
@RequestParm(value ="id") Long userId) {
//根据userId查blog
blogService.getBlogById(userId);
//根据用户查询blog
Page<Blog> page = blogService.query()
.eq("user_id",userId)
.page(new Page<>(current,MAX_SIZE_PAGE));
List<Blog> records = page.getRecords();
return Result.ok(records);
}
@RequestBody的作用
@RequestBody 是 Spring MVC 中用于处理 HTTP 请求体的注解,通常用于 POST 或 PUT 请求。它可以将请求体中的数据(如 JSON、XML 等)绑定到 Controller 方法的参数上,从而实现请求体的自动解析和绑定。
当使用 @RequestBody 时,Spring 会使用注册的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter 用于 JSON)来将请求体中的数据转换为相应的 Java 对象。这意味着你需要在 Controller 方法中定义一个与请求体数据结构相匹配的参数,并使用 @RequestBody 注解来标记它。
@RequestBody 的主要特性包括:
-
自动解析请求体:Spring 会自动将请求体中的数据解析为 Java 对象,并将其绑定到带有
@RequestBody注解的参数上。 -
支持多种数据格式:通过配置不同的
HttpMessageConverter,可以支持 JSON、XML、表单数据等多种请求体数据格式。 -
参数类型:由于请求体中的数据通常会被转换为 Java 对象,因此带有
@RequestBody注解的参数类型通常是与请求体数据结构相对应的 Java 类或接口。 -
@PostMapping("/users") public ResponseEntity<?> createUser(@RequestBody User user) { // 在这里,user 参数已经自动绑定了请求体中的 JSON 数据 // 执行创建用户的逻辑 // ... return ResponseEntity.created(URI.create("/users/" + user.getId())).build(); } // 假设 User 类如下: public class User { private Long id; private String name; private String email; // getters, setters, toString 等方法... }在这个示例中,当你发送一个包含 JSON 数据的 POST 请求到
/users路径时,Spring 会自动将请求体中的 JSON 数据解析为一个User对象,并将其绑定到createUser方法的user参数上。然后你就可以在方法内部使用这个User对象来执行创建用户的逻辑了。需要注意的是,
@RequestBody注解通常与@PostMapping、@PutMapping或@PatchMapping等处理 HTTP POST、PUT 或 PATCH 请求的注解一起使用。在处理 GET 请求时,由于 GET 请求通常不包含请求体,因此不会使用@RequestBody注解。










