SpringMVC 常用注解介绍

Spring MVC 常用注解介绍

文章目录

  • Spring MVC 常用注解介绍
    • 准备
    • 1. @RequestMapping
      • 1.1 介绍
      • 2.2 注解使用
    • 2. 请求参数
      • 2.1 传递单个参数
      • 2.2 传递多个参数
      • 2.3 传递对象
      • 2.4 传递数组
    • 3. @RequestParam
      • 3.1 注解使用
      • 3.2 传入集合
    • 4. @RequestBody
    • 5. @PathVariable
    • 6. @RequestPart
    • 7. @RestController
      • 7.1 介绍
      • 7.2 @ResposeBody

本文主要介绍在使用 Spring MVC 构建网络请求时常用到的注解以及其使用方式

准备

在正式讲解注解前,我们先准备一个测试案例:

  1. 构建一个Spring Boot项目(Spring MVC项目和Spring Boot项目的构建方式一致,这里使用的是IDEA专业版,自带Spring Initializr,其它版本需要自行安装插件)

在这里插入图片描述

  1. 引入Spring Web模块

    在这里插入图片描述

  2. 删除一些没必要文件

    在这里插入图片描述

  3. 按顺序创建Controller类代码并启动主程序BlogSpringMvcApplication

    在这里插入图片描述

    输入链接测试一下:http:127.0.0.1:8080/test1

    在这里插入图片描述

返回成功!

1. @RequestMapping

1.1 介绍

RequestMapping是Spring Web MVC应用程序中最常用的注解之一,用来注册接口的路由映射,表示服务器收到路径为/test1的请求后,就会调用Test1这个方法

路由映射:当用户访问某个URL时,将用户的请求对应到服务器中某个类的某个方法的过程就叫做路由映射

如代码所示:

@RestController 
public class TestController {

    @RequestMapping("/test1")
    public String Test1() {
        return "Hello MVC";
    }
}

注:上述代码中@RestController的作用:

一个项目中会有很多的类,Spring会扫描所有的类,并只有当这个类有被@RestController注解修饰时Spring才会进去这个类并查看有没有被@RequestMapping修饰的方法

2.2 注解使用

@RequestMapping可以修饰方法,也可以修饰类

  • 当@RequestMapping修饰方法时,访问该方法的路径就是当前修饰方法的@RequestMapping中的路径
  • 当@RequestMapping修饰类时,访问该方法的路径就是修饰类的@RequestMapping中的路径+ 当前修饰方法的@RequestMapping中的路径

如代码所示:

@RequestMapping("/total")
@RestController
public class TestController {

    @RequestMapping("/test1")
    public String Test1() {
        return "Hello MVC";
    }
}

启动Spring, 此时重新访问路径http:127.0.0.1:8080/test1就已经访问不到了

在这里插入图片描述

现在的访问路径为:类路径 + 方法路径http:127.0.0.1:8080/total/test1

在这里插入图片描述

注:

  • 路径前的“/”可以不加(“/total”),Spring启动后会进行判断,若没有加“/"Spring会自动帮你添加,但建议主动加上

  • @RequestMapping既支持GET请求,也支持POST请求,同时也支持其它请求,若需要指定请求,可将注解改为:

    @RequestMapping(value = "/test1", method = RequestMethod.POST)
    

    指定请求方式后,当前接口只能接收相应请求方式的请求,否则会报错(这里使用postman进行测试, 接口请求方式指定为POST请求, 并用GET请求进行访问):

    在这里插入图片描述

2. 请求参数

这里补充一下Spring MVC对接收参数的格式要求

2.1 传递单个参数

当我们只接收单个参数时,不需要加其它注解,Spring MVC直接用方法中的形参就可以了:

@RequestMapping("/name" )
public String Test2(String name) { // 传入参数形参名称需与接口参数形参名称一致
    return "hi " + name;
}

在这里插入图片描述

  1. 传入的形参名称要与接口形参的名称一致,否则返回参数默认为null

  2. 用基本类型(int)充当参数时, 参数必须传(boolean类型除外),否则会出现异常(500)

    @RequestMapping("/num")
     public int Test3(int n) {
         return n;
     }   
    
  3. 若传入参数类型与接口参数类型不匹配,则会出现异常(500)

    在这里插入图片描述

2.2 传递多个参数

当传入多个参数时,传入的参数名称要与接口中有的参数名称一致,传入顺序可以不一致

@RequestMapping("/test4")
    public String Test4(String name, int age) {
        return "name: " + name + " age: " + age;
    }

在这里插入图片描述

注:传入参数数量与接口参数中数量一致,否则会抛异常(500):

在这里插入图片描述

2.3 传递对象

有时候需要的传递参数比较多,为了方便我们可以把它封装成一个对象来进行传递,比如下面的Personal对象:

import lombok.Data;

@Data
public class Person {
    private int id;
    private String name;
    private String password;
    
}

在这里我们使用到了一个注解:@Data

它的作用就是帮我们封装好了属性的get方法和set方法,方便我们直接调用,不过这需要我们在pom.xml文件中引入依赖lombok:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

代码示例

@RequestMapping("/test5")
public String Test5(Person person) {
   return "name: " + person.getName()
          + " id: " + person.getId()
          + " password: " + person.getPassword();
}

在这里插入图片描述

:Spring会根据参数的名称自动绑定到对象的各个属性上,若对应属性传入的参数为空,则该属性内容为null(基本类型为默认初始值)

2.4 传递数组

Spring MVC可以自动绑定数组参数并赋值:

@RequestMapping("/test7")
public String Test7(String[] arr) {
    return Arrays.toString(arr);
}

在这里插入图片描述

3. @RequestParam

3.1 注解使用

在某些特殊情况下,前端传给我们的参数可能与我们接口上的参数名称不一样,这个时候我们通过使用@RequestParam注解来进行后端参数重命名,如下:

@RequestMapping("/test6")
public String Test6(@RequestParam("time") String createTime) {
    return createTime;
}

若此时给它传入参数createTime则会报错(400):

在这里插入图片描述

因为此时后端接口的参数已经被我们通过注解@RequestParam修改为了time,所以此时需要传入参数time才不会出现问题:

在这里插入图片描述

一旦加上该注解,则默认该参数是必传的,如果此时你想让这个参数修改为非必传,可以这样修改注解:

public String Test6(@RequestParam(value = "time", required = false) String createTime) {
    return createTime;
}

在这里插入图片描述

3.2 传入集合

默认情况下,请求中参数名相同的多个值,会被封装到数组

如果要封装到集合中,需要使用@RequestParam注解绑定参数关系:

@RequestMapping("/test8")
public String Test8(@RequestParam List<String> listParam) {
    return "size: " + listParam.size() + ", listParam: " + listParam;
}

在这里插入图片描述

若此时去掉注解@RequestParam,则会抛出异常(500):

在这里插入图片描述

在这里插入图片描述

4. @RequestBody

当我们想传入JSON格式的对象时,我们需要通过@RequestBody来修饰参数:

RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中

代码示例

@RequestMapping("/test9")
public String Test9(@RequestBody Person person) {
    return person.toString();
}

在这里插入图片描述

若此时去掉注解@RequestBody,则后端无法给Person对象赋值,自动填充默认参数:

在这里插入图片描述

5. @PathVariable

@PathVariable这个注解主要作用在URL路径上的数据绑定,默认将参数写到URL上,Spring MVC就能获取到:

@RequestMapping("/test10/{name}/{id}")
public String Test10(@PathVariable String name, @PathVariable("id") Integer userId) {
    return "name: " + name + " userId: " + userId;
}

在这里插入图片描述

注:如果传入的参数与接口参数名称不一致,则需要给@PathVariable的属性value赋值,将URL路径中对应的参数传给它

6. @RequestPart

当我们需要上传文件时,可以使用@RequestPart注解:

@RequestMapping("/test11")
public String Test11(@RequestPart MultipartFile file) throws IOException {
    // 获取文件名称
    String fileName = file.getName();
    // 将文件上传到指定路径
    file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
    return "接收到的文件名称为:" + fileName;
}

此时文件也成功传输到了指定路径:

在这里插入图片描述

7. @RestController

7.1 介绍

在最开始的代码中我们使用到了@RestController这个注解,其实这个注解是有由另外两个注解组合而成的,即

@RestController = @ResponseBody + @Controller

  • @Controller: 定义一个控制器,Spring框架启动时加载,把这个对象交给Spring管理
  • @ResponseBody:定义返回的数据格式为非视图,返回一个text/html信息

它的源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

如果只想要返回视图的话,只需要把@ResposeBody去掉剩下@Controller即可

7.2 @ResposeBody

@ResponseBody表示返回数据, 如果我们在接口上添加@ResponseBody的话,则即使返回的是html页面spring也会将它转化为单纯的文本数据返回:

@Controller
public class IndexController {

    @ResponseBody
    @RequestMapping("/index")
    public Object index() {
        return "/index.html";
    }
}

在这里插入图片描述

Spring MVC 也能返回html代码段:

@ResponseBody
@RequestMapping("/test12")
public String Test12() {
    return "<h1>Hello MVC</h1>";
}

在这里插入图片描述
以上就是本文对Spring MVC 常用注解的全部介绍与使用了,如果后续还有其它调整还会继续补充的!

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

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

相关文章

Since Maven 3.8.1 http repositories are blocked.

编译maven 项目时候报错提示下面信息&#xff1a; Since Maven 3.8.1 http repositories are blocked.Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://XXXXXX:…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…

设计循环队列(队列oj)

1.设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。…

如何在原生项目中集成flutter

两个前提条件&#xff1a; 从flutter v1.17版本开始&#xff0c;flutter module仅支持AndroidX的应用在release模式下flutter仅支持一下架构&#xff1a;x84_64、armeabi-v7a、arm6f4-v8a,不支持mips和x86;所以引入flutter前需要在app/build.gradle下配置flutter支持的架构 a…

Jmeter 压测-Jprofiler定位接口相应时间长

1、环境准备 执行压测脚本&#xff0c;分析该接口tps很低&#xff0c;响应时间很长 高频接口在100ms以内&#xff0c;普通接口在200ms以内 2、JProfiler分析响应时间长的方法 ①JProfiler录制数据 压测脚本&#xff0c;执行1-3分钟即可 ②分析接口相应时间长的方法 通过Me…

全国产化无风扇嵌入式车载电脑在车队管理嵌入式车载行业应用

车队管理嵌入式车载行业应用 车队管理方案能有效解决车辆繁多管理困难问题&#xff0c;配合调度系统让命令更加精确有效执行。实时监控车辆状况、行驶路线和位置&#xff0c;指导驾驶员安全有序行驶&#xff0c;有效降低保险成本、事故概率以及轮胎和零部件的磨损与损坏。 方…

vue3第二十节(新增编译宏defineModel)

为什么会需要使用defineModel() 注意&#xff1a;defineModel() 需要在3.4及以上版本才可使用&#xff1b; 组件之间通讯&#xff0c;通过 props 和 emits 进行通讯,是单向数据流&#xff0c;比如&#xff1a;props是自上而下的&#xff08;父组件数据修改导致子组件更新&…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重&#xff0c;在优化过程中我们会见到很多网站出现秒收的情况&#xff0c;发布的文章几分钟就可以收录&#xff0c;这个通过SITE语法都可以去查询&#xff0c;那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

《论文阅读》基于情感原因感知的共情对话生成模型 2023 AAAI

《论文阅读》基于情感原因感知的共情对话生成模型 2023 AAAI 前言简介模型构架情绪推理器回复生成器实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《The Empathic Dialogue Generation Model…

如何使用自定义Promptbooks优化您的安全工作流程

在当今的数字化时代&#xff0c;安全工作流程的优化变得前所未有的重要。安全团队需要快速、有效地响应安全事件&#xff0c;以保护组织的数据和资产。Microsoft Copilot for Security提供了一种强大的工具——自定义Promptbooks&#xff0c;它可以帮助安全专家通过自动化和定制…

type-cDP输入转双type-cDP输出,加type-c接口充电管理同时接两台显示器或者VR投屏,龙迅LT8712SX方案,龙迅桥接芯片方案

type-c的应用在各种设备上更加广泛&#xff0c;包括手机&#xff0c;电脑&#xff0c;游戏掌机&#xff0c; 因为type-c的功能非常强大&#xff0c;可以做到PD快充&#xff0c;DP信号输出&#xff0c;USB信号输出&#xff0c;所以很多设备为了做得更简洁都开始把其他的如HDMI接…

谈谈我的实习生活

距离实习已经过去快一年了&#xff0c;说真的&#xff0c;很多关于实习的事情我都已经忘记了。今天正好我有空&#xff0c;就想着写一些东西&#xff0c;思来想去&#xff0c;就想着要不把实习的生活给记录下来&#xff0c;就当给自己留一个回忆&#xff0c;毕竟这也是我人生中…

ARM作业day8

温湿度数据采集应用&#xff1a; 由上图可知&#xff1a; 控制温湿度采集模块的引脚是PF14&#xff08;串行时钟线&#xff09;和PF15&#xff08;串行数据线&#xff09;&#xff1a;控制温湿度采集模块的总线是AHB4&#xff0c;通过GPIOF串口和RCC使能完成初始化操作。 控制…

springboot2集成东方通tongweb嵌入式版

由于最近项目需要国产化信创改造&#xff0c;引入东方通tongweb 联系东方通厂家 &#xff0c;将依赖导入到maven仓库&#xff0c;并获取嵌入式版license文件修改pom.xml&#xff0c;引入依赖&#xff0c;注意springboot版本&#xff0c;这里以springboot2举例 首先移除springb…

C++设计模式|创建型 3.抽象工厂模式

在上一篇文章中介绍了工厂模式&#xff0c;每个具体工厂负责生产一个专门的产品&#xff0c;其代码扩展性很好&#xff0c;这篇文章将介绍抽象工厂模式。 1.为什么要使用抽象工厂模式&#xff1f; 既然已经有了“工厂模式”&#xff0c;那为什么还会有抽象工厂模式呢&#xf…

基于docker的Jenkin的服务平台搭建

项目拓扑图 项目环境: jenkins-2.440 sonarqube-9.9.4 apache-maven-3.9.6 gitlab-ce-12.4.2 java17 docker20 harbor.v2.6.0 centos7.9 项目目的: 模拟企业构建一个流行的持续集成和持续部署环境,可以更轻松地创建和管理构建环境&#xff0c;实现自动化构建和部署应用程序的…

Tomcat命令行窗口、IDEA中Tomcat控制台 中文乱码问题解决方案

Tomcat出现中文乱码问题 打开Tomcat文件夹下的conf/logging.properties文件&#xff0c;将下图位置中的编码由UTF-8全部替换成GBK 然后重启Tomcat服务器&#xff0c;问题解决 Intellij IDEA启动Tomcat服务器控制台出现中文乱码 解决方案非常简单&#xff0c;按照下图设置控制…

智能边缘计算采集网关助您远程调试SINAMICS S200伺服-天拓四方

您还在为每次调试都要去现场而烦恼吗&#xff1f;智能边缘计算采集网关助您远程调试SINAMICS S200伺服&#xff0c;让您足不出户&#xff0c;就能“运筹帷幄之中&#xff0c;决胜千里之外”。 新品介绍 SINAMICS S200 PN是西门子推出的新一代伺服驱动系统&#xff0c;采用Mot…

kafka安装配置及使用

kafka安装配置及使用 kafka概述 Kafka 是一个分布式流处理平台和消息队列系统&#xff0c;最初由 LinkedIn 公司开发并开源。它设计用于处理大规模的实时数据流&#xff0c;并具有高可扩展性、高吞吐量和持久性等特性。以下是 Kafka 的一些主要特点和用途&#xff1a; 分布式架…