SpringBoot-6

Spring Boot 中的 MVC 支持

Spring Boot 的 MVC 支持主要来最常用的几个注解,包括@RestController 用于声明控制器、@RequestMapping用于实现方法映射地址、@PathVariable 用于接受路径中的参数、@RequestParam 用于接受 request 请求中的参数以及@RequestBody 用于接受 application/json 类型的请求信息。主要掌握几个注解常用的使用方式和特点。

1、@RestController

@RestController 是 Spring Boot 新增的一个注解,等价于@Controller+@ResponseBody

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

可以看出@RestController 注解包含了原来的@Controller 和@ResponseBody 注解,使用过 Spring 的对@Controller 注解已经非常了解了,@ResponseBody 注解是将返回的数据结构转换为 Json 格式。所以@RestController可以看作是@Controller和@ResponseBody的结合体,为了编码方便建议使用@RestController后就不用再使用@Controller 了。@Controller 则返回的是逻辑地址名但是需要注意一个问题:如果是前后端分离,不用模板渲染的话,如 Thymeleaf,这种情况下是可以直接使用@RestController 将数据以 json 格式传给前端,前端拿到之后解析;但如果不是前后端分离,需要使用模板来渲染的话,一般 Controller 中都会返回到具体的页面,那么此时就不能使用@RestController

public String getUser() {
    return "user";
}

其实是需要返回到 user.html 页面的,如果使用@RestController 的话,会将 user 作为字符串返回的。如果使用@Controller 注解则表示返回一个逻辑地址名 user 字符串,需要依赖于 ViewResovler 组件将逻辑地址名称转换为物理地址。在 Spring Boot 集成 Thymeleaf 模板引擎中会使用。

spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

如果使用@Controller,方法的返回值是字符串 user,则前后缀自动生效,将逻辑地址名

user 转换为物理地址名/user.html,静态页面默认存储位置可以考虑使用resources/static 目录

2、@RequestMapping

@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;在方法的级别表示进一步指定到处理方法的映射关系。

@Controller
@RequestMapping("/test") //表示当前类中每个方法映射路径的统一前缀/test
public class TestController {
    @RequestMapping("/get") //针对方法的映射,加上类上的映射配置,则当前方法的请求地址为/test/get
    public String get(){
        return "user";
    }
}

该注解有 6 个属性,一般在项目中比较常用的有三个属性:value、method 和 produces。

  • value 属性:指定请求的实际地址,如果注解中只有一个 value 属性时,value=可以省略不写

  • method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET。如果没有对应请求方法的定义,则页面上报错 type=Method Not Allowed, status=405

  • produces 属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”

@RestController
@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {
    @RequestMapping(value = "/bbbb", method = RequestMethod.GET)
    public String testGet() {
        return "success";
    }
}

针对 GET、POST、DELETE 和 PUT 四种不同的请求方式是有相应注解的,例如@GetMapping、@PostMappging等,使用对应请求的注解后则不用每次在@RequestMapping 注解中加 method 属性来指定,上面的 GET 方式请求可以直接使用@GetMapping(“/bbbb”)注解,效果一样。相应地 PUT 方式、POST 方式和 DELETE 方式对

应注解分别为@PutMapping、@PostMapping 和 DeleteMapping。

3、@PathVariable

@PathVariable 注解主要是用来获取 url 参数,Spring Boot 支持 restfull 风格的 url,比如一个 GET 请求携带一个参数 id 过来 localhost:8080/user?id=123,可以将 id 作为参数接收,注解使用@RequestParam。如果使用路径参数则使用@PathVariable 注解。

@GetMapping(“/user/{id}”) 例如·http://localhost:8080/user/123 这里的{id}对应的就是 123 值。如果请求路径为 localhost:8080/user/abc 则由于将 abc 无法转换为 Integer 类型所以报错

public String testPathVariable(@PathVariable Integer id) { 
//将路径参数中的 123 赋值给方法参数 id
   System.out.println("获取到的 id 为:" + id);
    return "success";
}

这里需要注意一个问题,如果想要 url 中占位符中的{id}值直接赋值到参数 id 中,需要保证 url 中的参数和方法接收参数一致,否则就无法接收。如果不一致的话,其实也可以解决,需要用@PathVariable 中的 value 属性来指定对应关系。

@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) { 
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

对于访问的 url,占位符的位置可以在任何位置,不一定非要在最后,比如这样也行/xxx/{id}/user。另外 url也支持多个占位符,方法参数使用同样数量的参数来接收,原理和一个参数是一样的

@GetMapping("/user/{idd}/{name}") 
//对应的请求地址为 localhost:8080/user/123/abc,按照位置对应的 idd=123,name=abc
public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
    System.out.println("获取到的 id 为:" + id);
    System.out.println("获取到的 name 为:" + name);
    return "success";
}

运行项目在浏览器中请求 localhost:8080/test/user/2/zhangsan 可以看到控制台输出信息:

获取到的 id 为:2

获取到的 name 为:zhangsan

所以支持多个参数的接收。同样地,如果 url 中的参数和方法中的参数名称不同的话,也需要使用 value 属性来绑定两个参数。

4、@RequestParam

@RequestParam 也是获取请求参数的,@PathValiable 注解也是获取请求参数的,

@RequestParam 和@PathVariable 有什么不同呢?主要区别在于:@PathValiable 是从 url 模板中获取参数值,即这种风格的 url 为 http://localhost:8080/user/{id};而@RequestParam 是从 request 里面获取参数值,即这种风格的 url 为 http://localhost:8080/user?id=1。可以使用该 url 带上参数 id 来测试代码:

@GetMapping(“/user”) 例如请求路径为 localhost:8080/user?id=123,将数据 123 赋值给方法中的同名参数,如果参数不是 String 类型,则自动执行数据类型转换

public String testRequestParam(@RequestParam Integer id) {
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

可以正常从控制台打印出 id 信息。同样地 url 上面的参数和方法的参数需要一致,如果不一致,也需要使用 value属性来说明,比如 url 为 http://localhost:8080/user?idd=1

@RequestMapping(“/user”) 例如请求路径为 localhost:8080/user?idd=123,如果没有@RequestParam 注解则 id 为 null

public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
    System.out.println("获取到的 id 为:" + id);
    return "success";
}

除了 value 属性外,还有个两个属性比较常用:

required 属性:true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无,如果没有传递这个参数,则方法参数为 null。

defaultValue 属性:默认值,表示如果请求中没有同名参数时的默认值。

从 url 中可以看出,@RequestParam 注解用于 GET 请求上时,接收拼接在 url 中的参数【URL 重写】。除此之外,该注解还可以用于 POST 请求,接收前端表单提交的参数,假如前端通过表单提交 username 和 password两个参数,那可以使用@RequestParam 来接收

@PostMapping("/form1")
public String testForm(@RequestParam String username, @RequestParam String password) {
    System.out.println("获取到的 username 为:" + username);
    System.out.println("获取到的 password 为:" + password);
    return "success";
}

具体测试种可以使用 postman 来模拟一下表单提交,测试一下接口。但是如果表单数据很多,不可能在后台方法中写上很多参数,每个参数还要@RequestParam 注解。针对这种情况,需要封装一个实体类来接收这些参数,实体中的属性名和表单中的参数名一致即可。

public class User {
    private String username;
    private String password;
// set get
}

使用实体接收的话,不能在前面加@RequestParam 注解了,直接使用即可。

@PostMapping("/form2")
public String testForm(User user) {
    System.out.println("获取到的 username 为:" + user.getUsername());
    System.out.println("获取到的 password 为:" + user.getPassword());
    return "success";
}

如果写成 public String testForm(User user,String username)则提交的请求参数 username 的值会赋值两个地址,一个 user 中的 username 属性,另外一个是方法的参数 username

可以使用 postman 再次测试一下表单提交,观察一下返回值和控制台打印出的日志即可。在实际项目中,一般都是封装一个实体类来接收表单数据,因为实际项目中表单数据一般都很多。

5、@RequestBody

@RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 json 提交传来两个参数 username 和 password,此时需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用@RequestBody 接收会非常方便。
在这里插入图片描述

public class User {
    private String username;
    private String password;
    // set get
}

控制器中方法的定义

@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
    System.out.println("获取到的 username 为:" + user.getUsername());
    System.out.println("获取到的 password 为:" + user.getPassword());
    return "success";
}

可以使用 postman 工具来测试一下效果,打开 postman 然后输入请求地址和参数,参数用 json 来模拟,调用之后返回 success。

同时看一下后台控制台输出的日志:

获取到的 username 为:小灰灰

获取到的 password 为:123456

可以看出,@RequestBody 注解用于 POST 请求上,接收 json 实体参数。它和上面表单提交有点类似,只不过参数的格式不同,一个是 json 实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可。

6、 总结

这里我主要还是要掌握一下 Spring Boot 中对 MVC 的支持,重点掌握一下@RestController、@RequestMapping、@PathVariable、@RequestParam 和@RequestBody 四个注解的使用方式,由于@RestController 中集成了@ResponseBody 所以对返回 json 的注解。在看的好几篇有关Springboot的博客中以上四个注解是使用频率很高的注解,在所有的实际项目中基本都会遇到,必须熟练掌握。

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

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

相关文章

【机器学习】支持向量机SVM入门

优化目标 相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾…

使用html和css技巧提升网站加载速度

使用html和css技巧提升网站加载速度 加载时间每增加一秒(0-5 秒之间),网站转化率平均就会下降 4.42%。页面加载时间的前五秒对转化率的影响最大。 通过更改html和css文件可以提高网站的页面加载速度,本文现在就来介绍一下怎么实现。 延迟加载…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项: 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

解读维达国际2023半年度财报:后续发力“高端、高利润、高质量”

随着国内直播电商市场的迅速发展,对于希望在国内市场取得成功的品牌来说,直播电商已经成为所有大众消费品牌的竞争关键。 以生活用纸品牌维达为例,截至2023年7月25日,据抖音平台直播动态显示,维达官方旗舰店今年上半年…

免费商城搭建、免费小程序商城搭建、之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Linux-Shell

1.什么是Bash shell(壳) Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。 通过xshell连接,就是打开了一…

黑客自学笔记(网络安全)

一、黑客是什么 原是指热心于计算机技术,水平高超的电脑专家,尤其是程序设计人员。但后来,黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实,网络信息空间安全已经成为海陆空之…

Ajax 黑马学习

Ajax 资源 数据是服务器对外提供的资源,通过 请求 - 处理 - 响应方式获取 请求服务器数据, 用到 XMLHttpRequest 对象 XMLHttpRequest 是浏览器提供的js成员, 通过它可以请求服务器上的数据资源 let xmlHttpRequest new XMLHttpRequest(); 请求方式 : get向服务器获取数据…

RNN架构解析——认识RNN模型

目录 RNN模型作用分类按照输入和输出的结构进行分类按照RNN的内部构造进行分类 RNN模型 RNN单层网络结构 作用 分类 按照输入和输出的结构进行分类 按照RNN的内部构造进行分类

臻图信息以数字孪生赋能智慧文旅新发展

随着AI、元宇宙的热度持续攀升,以及中共中央办公厅、国务院办公厅此前印发了《“十四五”文化发展规划》、《关于推进实施国家文化数字化战略的意见》等重要文件,要求各地区各部门发挥好对产业的引导、扶持和监管作用。 数字孪生作为元宇宙建设的基石&am…

系统架构设计师-软件架构设计(4)

目录 一、软件架构评估 1、敏感点 2、权衡点 3、风险点 4、非风险点 5、架构评估方法 5.1 基于调查问卷或检查表的方式 5.2 基于度量的方式 5.3 基于场景的方式 6、基于场景的评估方法 6.1 软件架构分析法(SAAM) 6.2 架构权衡分析法(ATAM&am…

【CAS6.6源码解析】源码构建时-默认service配置不生效解决方案

CAS6的源码提供了默认的HTTPSandIMAPS-10000001.json配置用于授权所有的https和imaps服务,但是当添加JsonServiceRegistry模块启动后,会发现service是没有被注册的,是由于json路径引起的错误,可以把路径修改为绝对路径以解决此问题…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

vue3+ts+elementui-plus二次封装弹框

一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…

Go基础—反射,性能和灵活性的双刃剑

Go基础—反射&#xff0c;性能和灵活性的双刃剑 1 简介2 结构体成员赋值对比3 结构体成员搜索并赋值对比4 调用函数对比5 基准测试结果对比 1 简介 现在的一些流行设计思想需要建立在反射基础上&#xff0c;如控制反转&#xff08;Inversion Of Control&#xff0c;IOC&#x…

基于Spring包扫描工具和MybatisPlus逆向工程组件的数据表自动同步机制

公司产品产出的项目较多。同步数据库表结构工作很麻烦。一个alter语句要跑到N个客户机上执行脚本。超级费时麻烦。介于此&#xff0c;原有方案是把增量脚本放到一resource包下&#xff0c;项目启动时执行逐行执行一次。但由于模块开发人员较多&#xff0c;总有那么一两个机灵鬼…

【运维】DevOps全流程笔记(未完成)

运维笔记 DevOps基本流程Code阶段工具&#xff08;gitlab安装&#xff09;Build阶段工具&#xff08;Maven安装&#xff09;Integrate阶段工具JenkinsJenkins介绍Jenkins安装Jenkins入门配置 CI/CD操作集成Sonar Qube集成HarborJenkins流水线Kubernetes编排工具 DevOps全流程笔…

1400*C. Strong Password

Example input 5 88005553535123456 2 50 56 123412341234 3 111 444 1234 4 4321 4321 459 2 49 59 00010 2 10 11output YES NO YES NO YES解析&#xff1a; 题目要求有一种密码不在数据库中即可&#xff0c;所以枚举每一位的所有可能的数字&#xff0c;记录这一位数字在数…

C++-----list

本期我们来讲解list&#xff0c;有了string和vector的基础&#xff0c;我们学习起来会快很多 目录 list介绍 ​编辑 list常用接口 insert erase reverse sort merge unique remove splice 模拟实现 基础框架 构造函数 push_back 迭代器 常见问题 const迭代器 …

vue3 实现排序按钮

需求背景解决效果index.vue 需求背景 需要实现一个复用性&#xff0c;是提供表单顺倒排序的按钮 解决效果 index.vue <!--/*** author: liuk* date: 2023/7/25* describe: 排序按钮*/--> <template><div class"sort-fn"><span :class"[…