【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数

这篇具有很好参考价值的文章主要介绍了【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:认识Spring MVC

🌷1、什么是MVC?

一、建立连接(5个注解)

🌷1、@RequestMapping注解:注册接⼝的路由映射(默认返回页面)

🌷2、@ResponseBody注解:表示返回的是数据

🌷 3、组合注解@RestController = @ResponseBody + @Controller

🌷4、支持Get请求的2种写法@GetMapping + @RequestMapping

🌷 5、只支持Post请求的两种方法

二、请求:从前端接收参数(重点!!!)

🌷1、接收单个参数

🌷2、接收多个参数

🌷3、接收非常多的参数

🌷4、后端对从前端接收到的参数重命名@RequestParam

🌷5、接收Json格式@RequestBody

🌷6、接收URL中的参数@PathVariable并重命名

🌷 7、接收文件@RequestPart

🌷 8、获取Cookie

🌷 9、获取和设置Session

🌷 10、获取Header

三、响应:返回数据

🌷1、返回Json对象

🌷2、区分请求转发与请求重定向(重要)


前言:认识Spring MVC

官方定义:Spring Web MVC是基于Servlet API构建的原始Spring框架,从一开始就包含在Spring框架中,一般我们说Spring MVC,Spring Web,Spring Web MVC都是同一个意思。

🌷1、什么是MVC?

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
模型、视图和控制器三个基本部分。(早期MVC思想,现在已经不太用了。)

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 当前的MVC:更适合称为Spring Web,因为现在很多项目都使用了前后端分离的思想。MVC是一种思想,Spring MVC是对MVC思想的具体体现。

(1)MVC是一个Spring框架;

(2)MVC是一个Web项目。继承了 Servlet API 的 Web 框架(当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求)。

我们之前在创建SpringBoot项目的时候,引入了Spring Web,因此已经包含了Spring MVC。所以我们的之前的项目也可以称为SpringMVC项目或者Spring Web项目。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

Spring、SpringBoot、SpringWeb的关系?

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

SpringMVC也就是这个高铁可以被外界使用。一个项目可以是SpringBoot项目,也可以是SpringWeb项目,但是SpringWeb不一定是SpringBoot项目,SpringBoot项目也不一定是SpringWeb项目。在没有SpringWeb之前,也是由SpringWeb项目的,是基于SpringCore项目创建的。

所以因为SpringMVC是一个Web项目,用户通过url就可以访问,所以我们主要学习下面三部分:

1、建立连接:不一定是浏览器

2、请求:接收参数

3、响应:返回结果


一、建立连接(5个注解)

主要学习5个注解。

🌷1、@RequestMapping注解:注册接⼝的路由映射(默认返回页面)

这个相当于Servlet阶段的@WebServlet。

路由映射:当用户访问一个url的时候,将用户的请求对应到程序的某个类的某个方法的过程。

返回一个静态页面:
【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

(1)@RequestMapping既是类注解,也是方法注解。访问的url等于类注解+方法注解。

(2)虽然不写类注解也可以访问,但是实际中我们默认是两个RequestMapping都写得。因为只写方法注解可能会地址相同,但是每个类都是不同的,所以在一定程度上可以避免地址相同的现象。

(3)类注解@RequestMapping要搭配五大注解使用,一般使用@Controller,其他的五大注解使用不稳定,有时候成功,有时候不成功,我们就使用@Controller。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷2、@ResponseBody注解:表示返回的是数据

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

@ResponseBody注解是一个类注解,写在类上就表示该类下所有的方法都是数据,而不是页面。因此一个类里的方法既要返回页面,又要返回数据,就不适合用这个方法了。

🌷 3、组合注解@RestController = @ResponseBody + @Controller

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷4、支持Get请求的2种写法@GetMapping + @RequestMapping

Postman测试,发现@RequestMapping已经支持Get,Post等其他请求。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习
【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

其他2种只支持get的写法:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷 5、只支持Post请求的两种方法

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

简单总结:

1、@ResquestMapping实现url的映射,搭配@Controller使用;默认返回的是页面;支持Post和get灯请求;

2、@ResponseBody返回数据

3、@RestController=@ResponseBody+@Controller;

4、只支持post方法:@PostMapping或者@RequestMapping(value = "/A",method= RequestMethod.POST)

5、只支持get方法:@GetMapping或者@RequestMapping(value = "/B",method = RequestMethod.GET)


二、请求:从前端接收参数(重点!!!)

🌷1、接收单个参数

方式1:Servle方式

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 方式2:方法中直接拿

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 注意:url的name和方法中的String name名字要对应上。

🌷2、接收多个参数

方式1:Servlet方式

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

方式2:方法中直接拿

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 注意:
情况1::我们在方法中先输入age,再输入name;url先输入name,再输入age。发现不影响结果。【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 结论1:

(1)参数的顺序和url传参的顺序无关;

(2)并且帮我们进行了数据类型的转化。

情况2:方法中有两个参数,但是url中只传递name,age显示为null;

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 结论:

(1)age为Integer类型,不传参会显示null;

(2)传一个String类型参数,会显示400异常; 400表示客户端发生错误。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

对于 Spring MVC 框架而言,它将请求参数转换成值对象类中各属性对应的数据类型。

情况3:方法中有两个参数(将age类型由Integer改为Int),url只传递name,不传递age,此时显示500异常。500表示服务器端错误。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 传递参数类型错误,会显示400异常。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷3、接收非常多的参数

可以一个一个写,但是存在问题:(1)非常麻烦(2)代码的耦合度太高。

方式1:将参数封装成一个对象

Student类:如果要加别的参数,直接在类中加属性就好,不会影响到其他的代码。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

方式2:表单传递(这是前端传参方式,与接收参数的方式无关)

通过ajax,form表单,浏览器传参等方式都可以。

form表单形式:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 也可以这种写法:【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 🌷4、后端对从前端接收到的参数重命名@RequestParam

比如前端在传递name的时候,简写为了n,但是我后端写的时候,不想用n这个字母,就想换成name,这个时候就要用后端参数的重命名方法了,在接收参数的时候直接修改名称。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 注意:如果不传递n值,显示400错误。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 说n是一个必传参数,这个时候我们要对n进行一个设置:required = false。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷5、接收Json格式@RequestBody

情况1:加RequestBody,postman使用Json格式传递数据,显示正确。

@RequestBody表示从前端接收一个json字符串,Spring帮我们将这个Json字符串转为对象。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 postman测试:模拟从前端发送Json格式的数据

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 Fidder抓包显示结果也正确

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 情况2:加了@RequestBody,postman使用form表单形式提交数据,发现显示415错误。

@RequestBody不支持对象。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 🌷6、接收URL中的参数@PathVariable并重命名

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

注意:

(1)字段的名称之间要对应。

(2)情况3中重命名这种方式,参数默认是必传的,如果不想要传参数,要设置required=false。

 postman测试情况1:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

postman测试情况2:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习 postman测试情况3:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷 7、接收文件@RequestPart

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

Postman测试:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 抓包工具Fidder

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷 8、获取Cookie

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

情况1:@CookieVaule默认是要传参的(如果不要传参,设置required=false)否则不设置false,但是url中还不传参就会报错,所以我们自己设置一下cookie信息。F12打开如下界面,自己手动设置cookie信息。(说明cookie是可以人工设置的,造假的。)

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 此时url再次访问:成功。 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 情况2:设置required=false

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 此时url再访问,不报错了。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

(3)cookie重命名

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷 9、获取和设置Session

1)获取session:@SessionAttrible也是默认要传参

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 (2)设置session:   session.setAttribute

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

设置完成之后,cookie中就多了一个sessionId。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 此时再获取session,就可以访问到了。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

🌷 10、获取Header

比如Fidder中的这些都是Header信息。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 但是可以观察到,上面的格式都是以-来分隔的,一般我们要将它重命名。比如我们现在要获取User-Agent这个信息,先重命名为userAgent后再获取。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 Fidder中的这个信息与我们url中获取到的结果一致。说明成功获取了。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 同样的,@RequestHeader默认要传参,设置非必传参数:required = false。

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 简单总结:

1、获取单个多个参数:直接从方法名中拿;

2、获取非常多参数:将参数封装侧好难过一个对象,也是直接方法中拿;

3、后端参数重命名:@RequestParam(name=“前端拿到的A名称” String B是新名称);

4、很多注解都是默认要传参的,设置非必传参数用required = false;

5、方法参数中写@RequestBody 接收JSON对象;

6、@PathVariable Integer shopId接收Url中的参数;@RequestMapping中的url映射更新为“/映射/{shopId}”

7、@RequestPart("file1")  MultipartFile file上传文件,上传的文件都保存到服务器上file.transferTo(new file("路径名“));

8、@CookieValue获取cookie;

9、@sessiongetAttribute获取session,session.getAttribute设置session;

10、@RequestHeader(“A-B”) String AB获取Header并重命名。


三、响应:返回数据

已经知道的:@RequestMapping默认返回静态页面, @ResponseBody返回数据。

🌷1、返回Json对象

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 Fidder抓包:

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 🌷2、区分请求转发与请求重定向(重要)

牵扯到页面的转换

(1)forward请求转发:服务器进行转发,服务器内部处理,对内;

        redirect请求重定向:请求资源重定向,对外。

(3)请求重定向url会发生变化。

(3)请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;但是请求转发,服务器端转发可能会造成原外部资源不能访问。

        举例:我在网上商城A品牌买了手机,现在出了点问题,我去找客服,如果客服说我们只负责销售,维修的话要自行去线下品牌店维修,这就是请求重定向;如果客服说,好的,他们来负责,然后客服联系了他们自己的维修厂家帮我修好或者采取其他方式帮我修好,我不关心方式,是他们自己内部处理好,属于请求转发。

(1)注意观察url的区别 

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 (2)请求转发的问题

        请求转发forward如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问。重定向 redirect则可以正常访问。

比如 index.html中引入了hello.js,forward会报错,redirect是正常的。 

【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习


【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数,Spring学习,spring,mvc,学习

 文章来源地址https://www.toymoban.com/news/detail-600649.html

到了这里,关于【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring MVC参数接收、参数传递

    Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据 编写controller  

    2024年01月16日
    浏览(59)
  • Spring MVC 参数接收

    Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据 编写controller 在

    2024年01月23日
    浏览(45)
  • 【Spring】Spring MVC请求响应

    访问不同的路径, 就是发送不同的请求。在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收。 传递参数,我们通过postman测试。 正常传递: 可以看到, 后端程序正确拿到了name参数的值。 Spring MVC 会根据⽅法的参数名, 找

    2024年02月08日
    浏览(46)
  • spring mvc 请求与响应

    我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知识库链接: 请求与响应 · 语雀 1. 请求映射路径 get请求是路径传参,而post请求是body传参

    2024年01月25日
    浏览(56)
  • Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 💡 1. 接受客户端(client)请求参数[讲解]2. 调用业务对象3. 页面跳转 所谓简单变量:指的就是8种基本类型+String这些类型的变量。把这些类型的变量,作为控制器方法的形参,用于接受

    2024年02月05日
    浏览(54)
  • Spring MVC 请求参数绑定

    Spring MVC 是一个用于构建 Web 应用程序的框架,它提供了一种方便的方式来处理 HTTP 请求和响应。在 Spring MVC 中,请求参数绑定是将 HTTP 请求中的参数映射到控制器方法的参数上的过程。Spring MVC 提供了多种方式来实现请求参数绑定。 请求参数绑定:说⽩了SpringMVC如何接收请求

    2024年02月07日
    浏览(42)
  • Spring MVC: 请求参数的获取

    在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调用相应的处理器 Controller 。那么,处理器 Controller 具体是如何实现获取请求参数的呢?

    2024年02月10日
    浏览(45)
  • Spring Mvc请求处理过程分析 --- 参数解析

    调试示例基于注解@RequestBody,请求的入参是json格式的请求,本文主要分析spring解析请求参数的过程。 InvocableHandlerMethod的getMethodArgumentValues方法,会解析请求参数。 在上面的代码中:args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);完成对参数的解析

    2024年02月02日
    浏览(47)
  • 在 Spring MVC 中,用于接收前端传递的参数的注解常用的有以下几种

    目录 1、对于json请求体参数, 2、对于路径传参 3、对于query传参 4、对于form-data参数, 总结:   1、对于json请求体参数, 请求头的Content-Type应为application/json。在前端,可以使用 data格式 传参。在后端,可以使用 @RequestBody 注解来接收参数。   2、对于路径传参 (例如:test/

    2024年01月23日
    浏览(43)
  • Spring MVC入门必读:注解、参数传递、返回值和页面跳转的关键步骤

    目录 引言 一、常用注解 1.1.@RequestMapping 1.2.@RequestParam 1.3.@RequestBody 1.4.@RequestHeader 1.5.@PathVariable 二、参数传递 2.1.基础类型+String 2.2.复杂类型 2.3.@RequestParam 2.4.@PathVariable 2.5.@RequestBody 2.6.@RequestHeader 三、返回值 3.1.void 3.2.String 3.3.String+Model 3.4.ModelAndView 四、页面跳转 4.1.转发forw

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包