Spring MVC常用注解(绝对经典)

news2024/11/18 15:44:00

文章目录

  • 一、元注解
    • 1.1 @Target:
    • 1.2 @Retention:
  • 二、常见注解
    • 2.1 @Controller:
    • 2.2 @SpringBootApplication:
    • 2.3 @RequestMapping:
    • 2.4 @RequestParam:
    • 2.5 @PathVariable:
    • 2.6 @RequestPart:
    • 2.7 @RequestBody:
    • 2.8 @RequestHeader:
    • 2.9 @ResponseStatus:
    • 2.10 @ResponseBody:
  • 三、获取Cookie / Session
    • 3.1 获取 Cookie:
      • 3.1.1 传统的获取方式:
      • 3.1.2 通过注解获取(@CookieValue):
    • 3.2 获取 Session:
      • 3.2.1 传统的获取方式:
      • 3.2.2 通过注解获取(@SessionAttribute):

学习 Spring MVC,其实就是学习各种 Web 开发需要用到的注解。

下图是各个注解的作用简述,友友可以根据自己需要,查阅相应的注解用法。

image-20240928094156996

一、元注解

在 Spring 框架中,元注解指的是可以用来注解其他注解的注解。这个非常重要,学习了他们,通过观察一个注解的元注解,就能明白 spring 注解的部分重要属性。

1.1 @Target:

image-20240923200043332

@Target:表示注解使用的位置。

常见的 @Target 参数如下:

ElementType.TYPE:表示注解可以应用于类、接口(包括注解类型)或枚举类型的声明上。

ElementType.METHOD:表示注解可以使用在方法声明上。

ElementType.PARAMETER:表示注解可以使用在方法参数的声明上。

1.2 @Retention:

image-20240923200411005

@Retention:表示注的声明周期。

常见的 @Retention 参数如下:

RetentionPolicy.SOURCE:表示注解只在源代码级别保留,不会被编译到字节码文件中。

RetentionPolicy.CLASS:表示注解在编译后的字节码文件中保留,但在运行时由 JVM 加载类时会被丢弃。

RetentionPolicy.RUNTIME:表示注解在运行时仍然保留,可以通过反射机制进行访问。

二、常见注解

2.1 @Controller:

  • 作用:

只有被 @Controller 注解标识的类,才会被 Spring 程序调用到。

  • 使用位置:
@Target({ElementType.TYPE})

通过观察元注解可以得知,这是一个类注解。

  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)

作用生命周期,在程序未结束之前一直存在。

  • @Controller 和 @RestController 的关系:

@RestController 可以等价为 @Controller 和 @ResponseBody 配合使用。

下图为 @RestController 的部分源码。

image-20240923205116299

也就是说最开始返回的都是视图类数据,不过 spring 对其进行了封装,使其能够返回各类数据。

  • @Controller 和 @RestController 的区别:

被 @Controller 标识的方法的返回值通常是视图名称或 ModelAndView 对象,用于决定要渲染的视图页面。(如果方法返回值是一个对象,且该方法上没有添加 @ResponseBody 注解,Spring 会将其视为视图名称,并尝试查找对应的视图进行渲染。)

被 @RestController 标识的方法的返回值会被直接序列化为指定的格式(如 JSON | HTML 等)并写入 HTTP 响应体中。

可以简单理解为:

@Controller:用来返回视图数据之类的。

@RestController:用来返回除视图外的各类数据。

为了更加方便友友们理解,下面给出二者使用区别的效果图。

演示代码:

@Controller
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param1")
    @ResponseBody
    public String param1(){
        return "/index.html";
    }
    @RequestMapping("/param2")
    public String param2(){
        return "/index.html";
    }
}

效果:

image-20240924110356853

2.2 @SpringBootApplication:

  • 作用:

这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。

@SpringBootApplication 是一个组合注解,没有它 spring 程序就启动不了,被@SpringBootApplication修饰的类,我们一般称为启动类。

组合注解内容:

  1. @SpringBootConfiguration:表明这是一个 Spring Boot 的配置类,类似于传统 Spring 中的@Configuration注解,用于定义 Spring 容器的 Bean 配置信息。
  2. @EnableAutoConfiguration:启用自动配置功能。Spring Boot 会根据项目依赖自动配置 Spring 应用程序上下文,例如自动配置数据源、Web 服务器等组件,减少了手动配置的工作量。
  3. @ComponentScan:扫描当前包及其子包下被@Component@Service@Repository@Controller等注解标记的类,并将它们注册到 Spring 容器中。

@SpringBootApplication注解简化了 Spring Boot 应用程序的开发,使得开发者能够更加专注于业务逻辑的实现。

  • 使用位置:
@Target({ElementType.TYPE})

类注解。

  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)

2.3 @RequestMapping:

  • 作用:

@RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用。

  • 使用位置:
@Target({ElementType.TYPE, ElementType.METHOD})

既可修饰类,也可以修饰方法。

当修饰类和方法时,访问的地址是类路径+方法路径。

  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 支持的请求方法:

@RequestMapping 默认支持所有的请求。

如果想要指定接收 GET 或者其它请求。

我们可以显示的指定 @RequestMapping 来接收 POST 的情况,如下所示:

@Controller
@ResponseBody
@RequestMapping("/request")
public class RequestController {
    @RequestMapping(value = "/param1",method = RequestMethod.POST)
    public String param1(){
        return "我只支持 POST 请求";
    }
}
image-20240924160942741

上面的请求是通过 postman 构造的,关于 postman 如何安装使用,这里就不做介绍,有需要的友友网上查一下。

@RequestMapping 是使用的最多的注解之一,所以下面会对其源码的属性进行讲解。

  • @RequestMapping 注解属性分析:

下面为 @RequestMapping 注解的源码。

@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 {};
}
  • name:

用途:主要用于为映射指定一个有意义的名称。

  • value(或 path):

这两个注解头上都带有 @AliasFor 注解(起别名),且注解里面都带有对方的名字,说明这两个注解的作用是一样的。

用途:用于指定要映射的请求路径。

示例:@RequestMapping(value = "/users")@RequestMapping(path = "/users"),表示将该注解标注的方法映射到/users路径的请求上。

  • method:

用途:指定处理的 HTTP 方法类型,如 GET、POST、PUT、DELETE 等。

示例:@RequestMapping(value = "/users", method = RequestMethod.GET)表示只处理 GET 请求到/users路径的请求。

  • params:

用途:指定请求必须包含的参数或者特定的参数值。

示例:@RequestMapping(value = "/users", params = "id=123")表示只有当请求中包含参数id且值为123时才会匹配该映射。

  • headers:

用途:指定请求必须包含的特定 HTTP 头信息。

示例:@RequestMapping(value = "/users", headers = "Authorization=Bearer xxx")表示只有当请求头中包含指定的授权信息时才会匹配该映射。

  • consumes:

用途:指定处理请求的内容类型(Content-Type),用于限制请求的输入格式。

示例:@RequestMapping(value = "/users", consumes = "application/json")表示只处理内容类型为 JSON 的请求。

  • produces:

用途:指定响应的内容类型,用于告知客户端响应的格式。

示例:@RequestMapping(value = "/users", produces = "application/json")表示响应的内容类型为 JSON。

注意:注解参数没有写名称,默认传输给 value。例如,@RequestMapping("/users")等同于@RequestMapping(value = "/users")

2.4 @RequestParam:

  • 作用:

绑定请求参数到方法参数。

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端是使用createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。

  • 使用位置:

下面这张图的意思,在文章最上面的元注解,已经解释的很清楚了,这里就不再赘述。

@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param2")
    public String param2(@RequestParam("time") String createtime){
        return "接收到的参数为: " + createtime;
    }
}

image-20240924162433899

注意点:

  1. 使用 @RequestParam 进行参数重命名时,请求参数只能和 @RequestParam 声明的名称一致,才能进行参数绑定和赋值。原来方法的参数名称作废。
  2. 使用 @RequestParam 进行参数重命名时,参数就变成了必传参数(可以通过 required 属性进行修改)。

2.5 @PathVariable:

  • 作用:

获取 URL 中参数。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param3/{id}/{userName}")
    public String param3(@PathVariable("id") String id,@PathVariable("userName") String name){
        return "id: " + id + "    userName: " + name;
    }
}

image-20240924163736839

2.6 @RequestPart:

  • 作用:

一般用来接收文件。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param4")
    public String param4(@RequestPart("text") MultipartFile file) throws IOException {
        //获取文件名称
        String fileName = file.getOriginalFilename();
        //上传文件到指定路径
        file.transferTo(new File("D:/test/" + fileName));
        return "接收到的名称为: " + fileName;
    }
}

下图是使用 postman 来构造请求的。

image-20240924164804399

文件也成功传输到了指定位置,由于不好展示,所以就没有贴出来。

2.7 @RequestBody:

  • 作用:

该注解通常用于将 HTTP 请求的主体内容绑定到方法的参数上。它指示 Spring 将请求体中的数据转换为指定的 Java 对象,以便在控制器方法中进行处理。

简单来说:在方法参数上加上这个注解,才能获取到 JSON 对象。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/Json")
    public String getJson(@RequestBody UserInfo info){
        return "接收到的参数为: " + info;
    }
}

image-20240926130907490

2.8 @RequestHeader:

  • 作用:

用于获取 HTTP 请求头中的信息。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/header")
    public String getHeader(@RequestHeader("User-Agent") String userAgent){
        return "userAgent: " + userAgent;
    }
}

image-20240924205657414

2.9 @ResponseStatus:

  • 作用:

设置状态值。

  • 使用位置:
@Target({ElementType.TYPE, ElementType.METHOD})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/status")
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String setStatus(String status){
        return "我是400,但是我能正常访问";
    }
}
image-20240924211407024

2.10 @ResponseBody:

这个在上面 @Controller 已经有涉及到,这里再做些补充。

  • 作用:

主要用于将控制器方法的返回值直接作为 HTTP 响应体返回给客户端,而不是将其解析为视图名称进行页面渲染。

  • 使用位置:
@Target({ElementType.TYPE, ElementType.METHOD})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)

由于上面已经演示过关于 @ResponseBody 注解的区别,所以这里不再进行演示。

三、获取Cookie / Session

操作 Cookie 和 Session 的方式不一定要采取注解的方式,但是由于注解将原始的获取方式进行封装,所以将其添加到本文章中。

3.1 获取 Cookie:

3.1.1 传统的获取方式:

@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param5")
    public String param5(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(Cookie cookie:cookies){
                System.out.println(cookie.getName() + ": " + cookie.getValue());
            }
        }
        return "打印 Cookie 成功";
    }
}
image-20240924194710931

Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的。

HttpServletRequest,HttpServletResponse 是 Servlet 提供的两个类,是 Spring MVC 方法的内置对象。需要时直接在方法中添加声明即可。

HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

HttpServletResponse 对象代表服务器的响应。HTTP 响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等。通过这个对象提供的方法,可以获得服务器响应的所有内容。

Spring MVC 在这两个对象的基础上进行了封装,给我们提供更加简单的使用方法。

3.1.2 通过注解获取(@CookieValue):

  • 作用:

用于从 HTTP 请求的 Cookie 中获取特定的值并注入到方法参数中。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param6")
    public String param6(@CookieValue("gobeyye") String str){
        return "gobeyye: " + str;
    }
}

image-20240924195659340

不难看到其实使用传统的获取方式也能完成获取 Cookie 信息(指定信息可以通过循环查找一下),注解就是把上面传统公共部分进行封装,使代码看起来更简洁。至于实际开发用哪种,都可以。

3.2 获取 Session:

3.2.1 传统的获取方式:

@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param7")
    public String getSession(HttpSession session){
        session.setAttribute("gobeyye","88888");
        String str = (String)session.getAttribute("gobeyye");
        return str + "存储成功";
    }
}

HttpSession 和前面所学的 HttpServletRequest,HttpServletResponse 类似,都是可以直接在方法参数中添加。

image-20240924202012732

3.2.2 通过注解获取(@SessionAttribute):

  • 作用:

获取 Session 属性。

  • 使用位置:
@Target({ElementType.PARAMETER})
  • 生命周期:
@Retention(RetentionPolicy.RUNTIME)
  • 使用演示:
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/param8")
    public String getSession(@SessionAttribute("gobeyye") String value){
        return value;
    }
}

image-20240924204620002

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话,还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

在这里插入图片描述

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

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

相关文章

OpenCV 形态学相关函数详解及用法示例

OpenCV形态学相关的运算包含腐蚀(MORPH_ERODE),膨胀(MORPH_DILATE),开运算(MORPH_OPEN),闭运算(MORPH_CLOSE),梯度运算(MORPH_GRADIENT),顶帽运算(MORPH_TOPHAT),黑帽运算(MORPH_BLACKHAT),击中…

『网络游戏』GoLand服务器框架【01】

打开GoLand创建项目 编写Go程序:main.go package mainimport ("fmt""newgame/game/gate""os""os/signal""syscall""time" )var (SinChan make(chan os.Signal, 1)closeChan chan struct{} )func ma…

【JavaEE】——线程池大总结

阿华代码,不是逆风,就是我疯, 你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引入:问题引入 一:解决方案 1:方案一——协程/纤程 (1…

SwiftUI简明概念(3):Path.addArc的clockwise方向问题

一、画个下半圆 SwiftUI中绘制下半圆的一个方法是使用Path.addArc,示例代码如下: var body: some View {Path { path inpath.addArc(center: CGPoint(x: 200, y: 370), radius: 50, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 180.0), …

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明。 谷歌DeepMind发布了全新文生图模型Imagen 3,在文本语义还原、色彩搭配、文本嵌入、图像细节、光影效果等方面相比第二代大幅度提升…

2024新版IDEA创建JSP项目

1. 创建项目 依次点击file->new->Project 配置如下信息并点击create创建项目 2. 配置Web项目 点击file->Project Structure 在点击Project Settings->Module右键右边模块名称->ADD->Web 点击Create Artifact 出现如下界面就表示配置完毕,…

3.整数二分

模板 package base;public class Bsearch {public int binary_search1(int l, int r){while (l<r){int mid (lr1)>>1;if(check(mid)) lmid;else r mid-1;}return l;}public int binary_search2(int l, int r){while (l<r){int mid (lr)>>1;if (check(mid…

Python酷库之旅-第三方库Pandas(129)

目录 一、用法精讲 576、pandas.DataFrame.merge方法 576-1、语法 576-2、参数 576-3、功能 576-4、返回值 576-5、说明 576-6、用法 576-6-1、数据准备 576-6-2、代码示例 576-6-3、结果输出 577、pandas.DataFrame.update方法 577-1、语法 577-2、参数 577-3、…

实操了 AI 大模型项目落地, 程序员成功转变为 AI 大模型工程师

根据《2024 年全球人工智能行业报告》最新的数据显示&#xff0c;全球 AI 市场预计将以每年超过 40% 的速度增长&#xff0c;到 2030 年市值将达到数万亿美元&#xff0c;这也是预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。 在过去的一年多时间…

如何配置flutter(超详细的哦)

目录 首先先去官网下载zip包 下载下来之后就是解压 配置环境变量 winr查看是否配置成功 解决报错 [!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)X cmdline-tools component is missing Android license status unknown 首先先去官…

docker pull 超时的问题如何解决

docker不能使用&#xff0c;使用之前的阿里云镜像失败。。。 搜了各种解决方法&#xff0c;感谢B站UP主 <iframe src"//player.bilibili.com/player.html?isOutsidetrue&aid113173361331402&bvidBV1KstBeEEQR&cid25942297878&p1" scrolling"…

力扣 简单 111.二叉树的最小深度

文章目录 题目介绍题解 题目介绍 题解 最小深度&#xff1a;从根节点到最近叶子结点的最短路径上节点数量 class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}int left minDepth(root.left);int right minDepth(root.right);// 如果 node 没…

处理not in gzip format异常

1、为什么会触发这个异常&#xff1f; 当我们使用GZIPInputStream的read方法进行读取数据时&#xff0c;它会自动处理gzip格式的压缩数据&#xff0c;将它解析成原始的二进制数据。但是&#xff0c;如果你没有将原始数据进行gzip压缩后传入GZIPInputStream流&#xff0c;进行r…

JavaEE——多线程Thread 类及常见方法

目录 一、Thread(String name) 二、是否后台线程 isDeamon() 三、是否存活 isAlive() 四、run()方法和start()方法的区别 五、中断线程 法一&#xff1a; 法二&#xff1a; 六、线程等待join() 七、线程休眠sleep() 一、Thread(String name) 定义&#xff1a;这个东西…

免杀对抗—C++混淆算法shellcode上线回调编译执行

前言 上次讲了python混淆免杀&#xff0c;今天讲一下C混淆免杀。其实都大差不差的&#xff0c;也都是通过各种算法对shellcod进行混淆免杀&#xff0c;只不过是语言从python换成c了而已。 实验环境 测试环境依旧是360、火绒、WD还有VT。 shellcode上线 下面是最基本几个sh…

数据恢复篇:如何恢复几年前删除的照片

您是否曾经遇到过几年前删除了一张图片并觉得需要恢复旧照片的情况&#xff1f;虽然&#xff0c;没有确定的方法可以丢失或删除的照片。但是&#xff0c;借助奇客数据恢复等恢复工具&#xff0c;可以恢复多年前永久删除的照片、视频和音频文件。 注意 – 如果旧数据被覆盖&…

差速轮纯跟踪算法

fig.1 差速轮纯跟踪原理图 纯跟踪是基于几何关系的跟踪控制算法&#xff0c;不管是阿克曼模型&#xff0c;还是差速轮模型&#xff0c;都是控制机器驱动轮&#xff08;通常是后轮&#xff09;中心经过目标点 T。 基于机器驱动轮中心&#xff0c;车头朝向为 X 轴正方向&#xf…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

小徐影院:Spring Boot影院管理新体验

第三章 系统分析 整个系统的功能模块主要是对各个项目元素组合、分解和更换做出对应的单元&#xff0c;最后在根据各个系统模块来做出一个简单的原则&#xff0c;系统的整体设计是根据用户的需求来进行设计的。为了更好的服务于用户要从小徐影城管理系统的设计与实现方面上做出…

24年下重庆事业单位考试报名超详细流程

&#x1f388;提交报考申请 考生通过重庆市人力资源和社会保障局官网&#xff08;rlsbj.cq.gov.cn&#xff09;“热点服务”中“人事考试网上报名”栏进行报名。报名时间为2024年8月12日9:00—8月17日9:00。 &#x1f388;网上缴费 资格初审合格后&#xff0c;考生应在2024年8…