mvc的常见注解

news2024/11/18 23:46:14

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven默认src下的xml,properties文件不打包到classes文件夹下

一、第一种是建立src/main/resources文件夹&#xff0c;将xml&#xff0c;properties等资源文件放置到这个目录中。maven工具默认在编译的时候&#xff0c;会将resources文件夹中的资源文件一块打包进classes目录中。 这时候注意把resources设置成resource目录&#xff0c;已经…

操作系统 c语言模仿 动态分区存储管理方式的主存分配回收

1&#xff0e;实验目的 深入了解动态分区存储管理方式的主存分配回收的实现。 2&#xff0e;实验预备知识 存储管理中动态分区的管理方式。 3&#xff0e;实验内容 编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括&#xff1a;首先确定主存空间分配表&…

Android 布局中@NULL的使用和代码实现方式详解

文章目录 1、使用场景2、示例代码实现2.1、移除背景2.2 、移除文本2.3、移除布局宽度或高度2.4、移除提示文本2.5、移除图像资源 3、综合示例3.1、布局文件 activity_main.xml3.2、主活动文件 MainActivity.java3.4、资源文件3.5、运行结果 4、优点5、缺点6、综合分析6.1、适用…

地下城游戏(leetcode)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 图解分析&#xff1a; 代码 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

【云原生】Kubernetes基础命令合集

目录 引言 一、命令概述 &#xff08;一&#xff09;命令分类 &#xff08;二&#xff09;基本语法 二、查看基本信息 &#xff08;一&#xff09;环境指令 1.查看版本信息 2.查看资源对象简写 3.添加补全信息 4.查看日志 5.查看集群信息 &#xff08;二&#xff0…

5月26号总结

目录 刷题记录(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;前三题) 1.A. Bazoka and Mochas Array 2.B. 378QAQ and Mochas Array 3.C. Chamo and Mochas Array 刷题记录(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;前三题) 1.A. Bazok…

力扣 滑动窗口题目总结

Leetcode3.无重复字符的最长子串 思路&#xff1a; 这道题主要用到思路是&#xff1a;滑动窗口 什么是滑动窗口&#xff1f; 其实就是一个队列,比如例题中的 abcabcbb&#xff0c;进入这个队列&#xff08;窗口&#xff09;为 abc 满足题目要求&#xff0c;当再进入 a&#x…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

(2024,attention,可并行计算的 RNN,并行前缀扫描)将注意力当作 RNN

Attention as an RNN 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 注意力作为一种&#xff08;多对一的&#xff09;RNN 3.2 注意力作为&#xff08;多对多&…

9.4 Go语言入门(运算符)

Go语言入门&#xff08;运算符&#xff09; 目录三、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符7. 运算符优先级 目录 Go 语言&#xff08;Golang&#xff09;是一种静态类型、编译型语言&#xff0c;由 Google 开发&#xff0c;专注…

异步那些事01

首先我们肯定先说创建线程 1.继承Thread类 o定义一个类MyThread继承Thread类 o在MyThread类中重写run()方法 o创建MyThread类的对象 o启动线程 package Java.thread;public class first extends Thread{public void run(){for(int i0;i<50;i){System.out.println("我…

go ast语义分析实现指标计算器

什么是AST 首先我们要知道AST是什么&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;&#xff0c;简称为语法树&#xff0c;是go语言源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构。 …

英语四级翻译练习笔记①——大学英语四级考试2023年12月真题(第一套)——用ChatGPT修改训练四级翻译

目录 引言&#xff08;必看&#xff09; 翻译原文 我的翻译 得分&#xff08;1-3分&#xff09; 原文&#xff1a; 你的翻译&#xff1a; 修改后的翻译&#xff1a; 详细错误讲解&#xff1a; 引言&#xff08;必看&#xff09; 这是一篇英语四级翻译的练习的专栏&…

Java刷题总结(面试)

1、String类 String不可变 java 中String是 immutable的&#xff0c;也就是不可变&#xff0c;一旦初始化&#xff0c;其引用指向的内容是不可变的。 也就是说&#xff0c;String str “aa”&#xff1b;str“bb”&#xff1b;第二句不是改变“aa”所存储地址的内容&#xf…

计算机毕业设计 | SSM汽车租赁系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。用户生活水平的不断提高&#xff0c;日常生活中用户对汽车租赁系统方面的要求也在不断提高&#xff0c;需要汽车租赁系统查询的人数更是不断增加&#xff0c;使得汽车租赁系统的…

项目管理:敏捷实践框架

一、初识敏捷 什么是敏捷(Agile)?敏捷是思维方式。 传统开发模型 央企,国企50%-60%需求分析。整体是由文档控制的过程管理。 传统软件开发面临的问题: 交付周期长:3-6个月甚至更长沟通效果差:文档化沟通不及时按时发布低:技术债增多无法发版团队士气弱:死亡行军不关注…

数据库SQL语言实战(十)(最后一篇)

目录 前言 练习题 实验八 实验九 题目一 题目二 总结 前言 本篇练习题的重点有两个&#xff1a; 一、测试提交commit和回滚rollback的作用,了解锁等待、授权等知识。 二、学会复制表结构、学会插入数据&#xff0c;特别是学会如何避免重复插入&#xff0c;也就是如何避…

【云原生】K8s管理工具--Kubectl详解(一)

一、陈述式管理 1.1、陈述式资源管理方法 kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的 CLI 命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为apiserver 能识…

实时通信的方式——WebRTC

文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方&#xff1f; 不同的音视频编解码能力如何沟通&#xff1f;&#xff08;媒体协商SDP&#xff09;如何联系上对方&#xff1f;&#xff08;网络协商&#xff09; 常用的API音视频采集getUserMedia核心对象RTCPeerConne…

蓝桥杯物联网竞赛_STM32L071KBU6_关于size of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…