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

SpringBoot中常用的注解及其用法

1. 常用类注解

@RestController和@Controller是Spring中用于定义控制器的两个类注解.

1.1 @RestController

@RestController是一个组合类注解,是@Controller@ResponseBody两个注解的组合,在使

用 @RestController 注解标记的类中,每个方法的返回值都会以 JSON 或 XML等 的形式直接写入 HTTP 响应体中,相当于在每个方法上都添加了 @ResponseBody注解.

代码演示(访问127.0.0.1:8080/hello/hello1):

@RequestMapping("/hello")
@RestController
public class HelloController {@RequestMapping("/hello1")public String hello() {return "hello spring mvc1";}}

返回的结果如下:

我们可以使用fiddler进行抓包:

可以看到返回的类型是text/html,可以把它看成是一个text或者是html.

1.2 @Controller

@Controller是一个类注解,其主要作用是标记类表示返回的是一个视图(view).这是用于传统的SpringMVC架构中的类注解.

代码演示:

@RequestMapping("/response")
@Controller
public class ResponseController {@RequestMapping("/index")public String index(){return "/index.html";}}
//index.html
<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>登录人: <span id="loginUser"></span><script src="/jquery.min.js"></script><script></script>
</body></html>

这样就返回了一个html页面(视图).

总之,@RestController和@Controller的区别就在于要返回一个视图(页面)还是要返回数据.

1.3 @RequestMapping

@RequestMapping表示路由映射,即通过@RequestMapping注解可以达到设置url的目的.在访问时只有加入@RequestMapping映射的部分,才能成功找到这个路径.\

代码演示:

@RequestMapping("/hello")
@RestController
public class HelloController {@RequestMapping("/hello1")public String hello() {return "hello spring mvc1";}
}

我们只有启动服务器,再访问127.0.0.1:8080/hello/hello1才能成功接收到后端返回的"hello spring mvc1"这个数据.

 2. 常用方法注解

2.1 @RequestMapping

我们刚才介绍了@RequestMapping是一个类注解,它其实还是一个方法注解,我们在使用方法时需要在方法上也添加上这个注解.同样表示的是路由映射,影响我们访问的url.我们再来看一下,其中的属性:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}
public enum RequestMethod {GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;
}

其中我们主要介绍method这个属性,method取值于RequestMethod这个枚举类型,我们使用的最多的就是GET和POST:

    @GetMapping("/hello3")public String hello3() {return "hello spring mvc3";}@PostMapping("/hello4")public String hello4() {return "hello spring mvc4";}

报错信息:Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' is not supported]

POST表示只有使用post请求时才允许进行正确的响应,GET表示get请求时才允许进行正确的响应.如果这个参数不写,就表示post和get请求都允许.

2.2 @PostMapping

与 @RequestMapping(value = "/hello2",method = RequestMethod.POST)的效果类似,只允许post请求.

2.3 @GetMapping

与 @RequestMapping(value = "/hello2",method = RequestMethod.GET)的效果类似,只允许get请求.

2.4 @RequestParam

这个参数主要有两个作用.

在前端给后端传递参数时,需要规定好参数的名称,使其保持一致否则将无法成功传参.例如前端传给我们的用户名称叫做userName,但是后端接收这个参数的名称叫做name,就无法成功接收.但是我们可以使用@RequestParam这个注解进行参数的绑定,将userName绑定到name上,这样后端就可以使用name进行操作了.还可以在其中required属性中设置true/false,表示这个参数是否是必须的.

代码演示:

    @RequestMapping("/param6")public String param6(@RequestParam(value = "userName",required = false)String name,String password){System.out.println("receive userName:"+name+" password:"+ password);return "receive name: "+name+" password:"+ password;}

另外一个主要作用是用来传递集合.对于一个简单的数组来说,我们直接传递不会出现任何问题,但是如果我们直接传递一个集合,就会发现传过来的集合是空的.这时,就需要@RequestParam这个注解来将数组绑定到这个集合上,给集合赋值.'

代码演示:

    @RequestMapping("/param8")public String param8(@RequestParam("listParam") List<String> listParam){System.out.println("receive listParam: "+listParam);return "receive listParam: "+listParam;}

2.5 @RequestBody

@RequestBody这个注解主要用来接收对象(传递JSON类型的参数),比如我们需要给后端传递一个UserInfo对象:

public class UserInfo {public String userName;public String password;public int age;@Overridepublic String toString() {return "UserInfo{" +"userName='" + userName + '\'' +", password='" + password + '\'' +", age=" + age +'}';}
}

我们就需要给出userName,password和age三个参数的值,在传递过程中会将这三个参数转变成JSON格式的数据,只有我们加上@RequestBody这个注解才能成功接收到这个JSON数据,并把它转换成对象.

代码演示:

    @RequestMapping("/param9")public String param9(@RequestBody UserInfo userInfo){System.out.println("receive userInfo: "+userInfo);return "receive userInfo: "+userInfo;}

2.6 @PathVariable

@PathVariable这个注解用来从url中获取到参数.比如下述例子,我们要从url中获取到articlName,我们就可以使用这个注解加上一定的格式进行获取:

    @RequestMapping("/param10/{articlName}")public String param10(@PathVariable("articlName") Integer articlName){System.out.println("receive articlName: "+articlName);return "receive articlName: "+articlName;}

2.7 @RequestPart

@PathVariable这个注解用来进行文件的接收.代码演示如下:

@RequestMapping("/param12")public String param12(@RequestPart MultipartFile file) throws IOException {System.out.println(file.getName());System.out.println(file.getOriginalFilename());System.out.println(file.getContentType());file.transferTo(new File("D:/temp/"+file1.getOriginalFilename()));return file1.getOriginalFilename();}

2.8 @CookieValue

@CookieValue这个注解用来根据cookie中的键获取对应的值.代码演示如下:

    @RequestMapping("/getCookie2")public String getCookie2(@CookieValue("lzq") String value) {System.out.println(value);System.out.println("get cookies successfully");return "get cookies successfully";}

2.9 @SessionAttribute

@SessionAttribute这个注解用来根据session中的键获取对应的值.代码演示如下:

    @RequestMapping("/getSession3")public String getSession3(@SessionAttribute(value = "name",required = false) String name) {System.out.println("name "+name);System.out.println("get session successfully");return "get session successfully";}

2.10 @RequestHeader

@RequestHeader这个注解用来根据header中的键获取对应的值.代码演示如下:

    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {System.out.println(userAgent);System.out.println("get userAgent successfully");return "get userAgent successfully";}

2.11 @ResponseBody

@ResponseBody是@RestController的一部分,通常用在当@Controller修饰类控制器,而其中某些方法需要返回数据而不是视图时,代码演示如下:

    @ResponseBody@RequestMapping("/returnData")public String returnData() {System.out.println("returnData");return "returnData";}

相关文章:

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…...

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…...

CSS常用的样式

字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本&#xff08;左对齐、右对齐、居中、两端对齐&#xff09;。 line-height: 设置行间距。 text-decoration: 控制文本装饰线&#xff08;如下划线、…...

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…...

如何在电脑上演示手机上APP,远程排查移动端app问题

0序&#xff1a; 对接客户&#xff0c;给领导演示移动端产品&#xff0c;或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏&#xff0c;但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频&#xff0c;十分繁琐…...

SQL Server 创建用户并授权

创建用户前需要有一个数据库&#xff0c;创建数据库命令如下&#xff1a; CREATE DATABASE [数据库名称]; CREATE DATABASE database1; 一、创建登录用户 方式1&#xff1a;SQL命令 命令格式&#xff1a;CREATE LOGIN [用户名] WITH PASSWORD 密码; 例如&#xff0c;创建…...

网关设备BL122实现Modbus RTU/TCP转Profinet协议

Modbus与Profinet是两种广泛应用于工业自动化领域的通信协议&#xff1a;Modbus因其简单性和兼容性&#xff0c;在许多工业设备中得到广泛应用&#xff1b;而Profinet提供了高速、高精度的通信能力&#xff0c;适合于复杂控制系统和实时应用&#xff0c;但两者之间的差异导致了…...

采购管理软件:改善初创企业的采购流程

说到初创企业&#xff0c;人们往往会联想到一个宽松的工作环境&#xff0c;缺乏严格的流程规范&#xff0c;以及公司收入的迅猛增长。这种快速增长可能会被认为会导致工作流程的无序和缺乏结构&#xff0c;使得员工在决策上具有较大的自由度&#xff0c;例如在采购方面。 在这…...

Python 是一种用途广泛的编程语言,应用于各个领域

1. 网络和互联网开发: Python 拥有丰富的框架和库&#xff0c;使其成为 Web 开发的理想选择。 框架: Django 和 Pyramid 用于构建复杂的 Web 应用。Flask 和 Bottle 则适合轻量级应用和 API。 库: Python 标准库支持处理 HTML、XML、JSON 和电子邮件。此外&#xff0c;还有强大…...

【VUE】9、VUE项目中使用VUEX完成状态管理

Vuex 是一个专为 Vue.js 应用程序设计的状态管理模式&#xff0c;它帮助开发者更有效地管理组件间共享的状态。在 Vue 项目中使用 Vuex&#xff0c;可以解决复杂应用中状态管理的困扰&#xff0c;确保状态变更的可追踪性和一致性。 1、Vuex 核心概念 State&#xff08;状态&a…...

【eNSP模拟实验】单臂路由实现VLAN间通信

实验需求 如下图所示&#xff0c;辅导员办公室需要访问处在不同vlan的学生管理服务器的文件&#xff0c;那么如何实现两台终端相互通信呢&#xff1f;我们可以使用单臂路由的方式来实现。 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置…...

哪些点权衡素材优秀与否

投放信息流素材的过程当中&#xff0c;我们究竟看哪几点来权衡这个素材是优秀的还是不优秀的&#xff1f;我们主要是以三个维度来看。 第一个就是 3 秒和 5 秒的完播率。很多优秀的素材它可能在前三秒和前五秒很平淡的一个过程&#xff0c;但是因为现在是一个非常快节奏的过程&…...

服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例

服务器存储数据恢复环境&#xff1a; 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列&#xff0c;其中包括2块热备盘。 服务器存储故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;热备盘只有一块成功激活&#xff0c;raid瘫痪&#xff0c;上层LUN…...

Excel 学习手册 - 精进版(包括各类复杂函数及其嵌套使用)

作为程序员从未想过要去精进一下 Excel 办公软件的使用方法&#xff0c;以前用到某功能都是直接百度&#xff0c;最近这两天跟着哔哩哔哩上的戴戴戴师兄把 Excel 由里到外学了一遍&#xff0c;收获良多。程序员要想掌握这些内容可以说是手拿把掐&#xff0c;对后续 Excel 的运用…...

【CUDA】thrust进行前缀和的操作

接上篇文章&#xff0c;可以发现使用CUDA提供的API进行前缀和扫描时&#xff0c;第一次运行的时间不如共享内存访问&#xff0c;猜测是使用到了全局内存。 首先看调用逻辑&#xff1a; thrust::inclusive_scan(thrust::device, d_x, d_x N, d_x);第一个参数指定了设备&#x…...

Qt-QPainter的使用总结

一、QPainter介绍 QPainter是Qt框架中的一个类,主要用于在各种设备上进行2D图形绘制,如窗口、位图、打印设备等。它提供了一系列绘图函数,可以实现绘制点、线、曲线、形状、文本、图像以及复杂的绘画操作。 QPainter 与 QPaintDevice 和 QPaintEngine 类一起构成了Qt绘制系…...

轻松搞定GIS场景编辑,这款免费工具你一定要试试

如果你正苦恼于如何搞定GIS场景编辑&#xff0c;不妨来试试这款免费可视化工具——山海鲸可视化。经过本人测试&#xff0c;这款软件在GIS场景编辑上完全可以做到“零代码”操作&#xff0c;即使没有任何编程技能也可以在三维GIS世界中如鱼得水。现在&#xff0c;让我们一起来看…...

【笔记】一起齿轮箱的故障和相应的数学模拟实验

1.齿轮箱故障一例 出处&#xff1a;设备的故障识别 GearBox的频谱图&#xff0c;原作者不知道是从哪里拷贝来的&#xff0c;待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率&#xff1a; ★齿轮啮合频率两边有边频&#xff0c;间距为1X&#xff08;这是由冲击响应…...

官宣:百数低代码平台已顺利通过国家信息安全等级保护三级认证

在数字化转型浪潮中&#xff0c;企业对于数据安全与隐私保护的需求日益增强&#xff0c;尤其是在选择低代码开发平台时&#xff0c;信息安全等级保护&#xff08;简称“等保”&#xff09;成为众多客户关注的焦点。 近日&#xff0c;我们非常荣幸地向社会各界及广大用户宣布&a…...

Spring源码注解篇二:手写@Component注解

Component注解的功能 在Spring框架中&#xff0c;Component 注解是一个核心特性&#xff0c;用于自动检测类并将其注册为Spring应用上下文中的Bean。这大大简化了Bean的配置过程&#xff0c;使得开发者能够通过注解的方式快速地将类标记为组件&#xff0c;并由Spring容器进行管…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...