问文心一言的,记录一下。
@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
注解。