mvc的常见注解

问文心一言的,记录一下。

@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注解的参数:userIdfollowerId。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注解中指定了参数名userIdfollowerId,所以Spring MVC仍然能够正确地将值绑定到参数上。

总结:

@PathVariable 注解允许从 URL 路径中提取参数值,并将它们绑定到 Controller 方法中的方法参数上。只需要确保 URL 路径中的占位符(如 {userId})与方法参数上的 @PathVariable 注解名称相匹配,Spring MVC 就会自动处理这些值的绑定。如果方法的形参名称与占位符不同,@PathVariable("路径参数名")

@RequestParam的作用:

@RequestParam 是 Spring MVC 中用于处理 HTTP 请求中查询参数(即 URL 中 ? 后面的参数)的注解。当你想从 HTTP GET 或 POST 请求的查询字符串中获取参数值,并将其绑定到 Controller 方法的参数上时,你可以使用 @RequestParam

@RequestParam 注解提供了以下特性:

  1. 名称(Name):通过 value 属性指定查询参数的名称。如果省略 value 属性,则默认使用方法参数名作为参数名称。

  2. 默认值(Default Value):通过 defaultValue 属性为参数指定一个默认值。如果请求中没有提供该参数,则使用该默认值。

  3. 必需性(Required):虽然 @RequestParam 本身没有直接的 required 属性(与 @PathVariable 不同),但你可以通过检查参数是否为 null 或使用其他验证机制来确保参数的存在。

  4. 数据类型(Data Type):你可以将查询参数绑定到任何可以接收字符串并可能执行类型转换的参数类型上,例如 String、基本类型(如 intlong 等,但应使用其包装类 IntegerLong 等,因为基本类型不能是 null)或自定义类型(如果提供了相应的类型转换器或格式化程序)。

URL:http://localhost:8080/api/blog/of/user?&id=1&current=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 的主要特性包括:

  1. 自动解析请求体:Spring 会自动将请求体中的数据解析为 Java 对象,并将其绑定到带有 @RequestBody 注解的参数上。

  2. 支持多种数据格式:通过配置不同的 HttpMessageConverter,可以支持 JSON、XML、表单数据等多种请求体数据格式。

  3. 参数类型:由于请求体中的数据通常会被转换为 Java 对象,因此带有 @RequestBody 注解的参数类型通常是与请求体数据结构相对应的 Java 类或接口。

  4. @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 注解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业档案管理系统软件都有哪些分类

企业档案管理系统软件可以根据其功能和特点进行分类。以下是一些常见的分类&#xff1a; 1. 全能类档案管理系统&#xff1a;提供文件存储和检索功能&#xff0c;并支持多种文件类型和格式的管理&#xff0c;如文本文件、图像文件、音频文件等。 2. 电子档案管理系统&#xff1…

嵌入式进阶——电位器案例(ADC)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 案例介绍万用表测量ADC概念代码实现IO初始化为高阻输入ADC配置逻辑数据读取与转换 反向得到电源输入电压 案例介绍 通过控制滑动变…

设计模式:命令模式(Command)

设计模式&#xff1a;命令模式&#xff08;Command&#xff09; 设计模式&#xff1a;命令模式&#xff08;Command&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例实例 1&#xff1a;餐厅…

探索移动云服务:构建高效移动互联网应用的最佳实践

一、移动云服务简介 官网&#xff1a;https://ecloud.10086.cn 移动云&#xff0c;或称为移动云计算&#xff0c;是通过无线网络向移动设备用户提供云计算服务的技术。它使用户能够通过智能手机、平板电脑和笔记本电脑等各类移动设备&#xff0c;在任何时间、任何地点便捷地访…

通过Function函数式方式创建React组件-8

在React中&#xff0c;V16版本之前有三种方式创建组件&#xff08;createClass() 被删除了)&#xff0c;之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同&#xff0c;但还是有一些区别&#xff0c;这两种方法在体如下&#xff1a; 本节先了解下用Function函数…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

【DAOS】daos client和dfuse 是什么?

目录 什么是daos client dfuse 是什么 dfuse 和 FUSE 之间的关系 什么是daos client &#xff08;参加&#xff1a;DAOS: A Scale-Out High Performance Storage Stack for Storage Class Memory | SpringerLink&#xff09; DAOS Client是一个与应用程序集成的库。 从堆栈…

堆(建堆算法,堆排序)

目录 一.什么是堆&#xff1f; 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明&#xff1a; 2.向上调整 3.向下调整 4.源码&#xff1a; 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆&#xff1f; 1.堆 堆就…

【docker】仓库harbor的部署

harbor介绍 Harbor 是一个用于存储和管理 Docker 镜像的开源仓库。它提供了一系列的功能&#xff0c;比如用户管理、访问控制、镜像管理、日志审计和安全扫描等。Harbor 可以作为私有仓库来使用&#xff0c;也可以与公有仓库&#xff08;如 Docker Hub&#xff09;集成使用。 …

03.tomcat环境搭建

上传软件包 JDK #man bash #PATH 存放命令的路径 ## ls #加入环境变量&#xff0c;注意&#xff1a;EOF的单引号的意思就是追加到文件中的内容带有变量的不做解析&#xff0c;否则会被解析 cat >>/etc/profile <<EOF export JAVA_HOME/application/jdk export PAT…

华为OD机试 - 寻找最富裕的小家庭(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Python 开心消消乐

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

M00238-固定翼无人机集群飞行仿真平台MATLAB完整代码含效果

一个小型无人机集群仿真演示平台&#xff0c;使用matlab和simulink搭建。 给出的例子是5架的&#xff0c;当然如果你愿意花时间&#xff0c;也可以把它扩展到10架&#xff0c;20架甚至更多。 输入&#xff1a;5架飞机的规划路径 输出&#xff1a;每架无人机每个时刻的13个状态量…

【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

【C++】从零开始构建红黑树

送给大家一句话&#xff1a; 日子没劲&#xff0c;就过得特别慢&#xff0c;但凡有那么一点劲&#xff0c;就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 &#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b; ⛰️⛰️…

指针(6)

1. sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 sizeof &#xff0c; sizeof 计算变量所占内存内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使⽤类型创建的变量所占内存空间的大小。 sizeof 只…

leetcode:计数质数

class Solution { public:// 如果 x 是质数&#xff0c;那么大于 x 的 x 的倍数 2x,3x… 一定不是质数int countPrimes(int n) {vector<int> isPrime(n, 1);int ans 0;for (int i 2; i < n; i) {if (isPrime[i]) {ans 1;if ((long long)i * i < n) {for (int j …

Linux内核重置root密码

Ubuntu 首先重新启动Ubuntu系统&#xff0c;然后快速按下shift键&#xff0c;以调出grub启动菜单在这里我们选择第二个&#xff08;Ubuntu高级选项&#xff09;&#xff0c;选中后按下Enter键 选择最高的Linux内核版本所对应的recovery mode模式&#xff0c;按e键编辑启动项 在…

C语言 | Leetcode C语言题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; int** ret; int retSize; int* retColSize;int* path; int pathSize;typedef struct {struct TreeNode* key;struct TreeNode* val;UT_hash_handle hh; } hashTable;hashTable* parent;void insertHashTable(struct TreeNode* x, struct Tr…

数据结构——链表——模板类实现双向链表——先完成再完美——持续更

链表&#xff1a;概念&#xff0c;实现&#xff0c;《数据结构》这里实现是基于模板的 C语言基础&#xff0c;指针&#xff0c;引用。模板。《CPrimer》有些进阶用法放在语言学习的目录 LeetCode应用&#xff0c;会更新在LeetCode150&#xff0c;目前这个系列先暂停&#xff0c…