【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思想,现在已经不太用了。)

 当前的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、SpringBoot、SpringWeb的关系?

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

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

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

2、请求:接收参数

3、响应:返回结果


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

主要学习5个注解。

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

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

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

返回一个静态页面:

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

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

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

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

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

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

 

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

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


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

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

简单总结:

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方式

 方式2:方法中直接拿

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

🌷2、接收多个参数

方式1:Servlet方式

方式2:方法中直接拿

 注意:
情况1::我们在方法中先输入age,再输入name;url先输入name,再输入age。发现不影响结果。

 结论1:

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

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

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

 结论:

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

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

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

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

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

🌷3、接收非常多的参数

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

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

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

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

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

form表单形式:

 

 也可以这种写法:

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

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

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

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

🌷5、接收Json格式@RequestBody

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

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

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

 Fidder抓包显示结果也正确

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

@RequestBody不支持对象。

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

注意:

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

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

 postman测试情况1:

postman测试情况2:

 postman测试情况3:

🌷 7、接收文件@RequestPart

Postman测试:

 抓包工具Fidder

🌷 8、获取Cookie

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

 此时url再次访问:成功。 

 情况2:设置required=false

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

(3)cookie重命名

🌷 9、获取和设置Session

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

 

 (2)设置session:   session.setAttribute

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

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

🌷 10、获取Header

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

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

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

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

 简单总结:

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对象

 Fidder抓包:

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

牵扯到页面的转换

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

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

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

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

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

(1)注意观察url的区别 

 (2)请求转发的问题

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

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


 

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

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

相关文章

【C++】开源:Redis数据库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Redis数据库配置与使用。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xff0c…

智能驾驶中的数据标注

目前,各大自动驾驶汽车制造商都在通过获取高质量的训练数据最大化其数据资产的投入产出比。在海量的智能驾驶数据面前,如何让每个数据都有存在意义?从《数字商业时代》对澳鹏Appen(中国)高级产品总监张童皓的采访中,你或许能找到一…

MySQL数据库远程访问权限设置

MySQL数据库远程访问权限设置 对于初学者小伙伴来说,我们安装mysql到本地服务,再用一些图形化工具链接。一般情况下我们都能链接成功;但是、在模拟真实的环境中我们的数据库不可能直接安装在本地机器上,大多数是在云服务器上&…

头戴式玩具外贸出口EN71检测报告需要什么资料?

EN71是欧盟市场玩具类产品的规范标准。儿童是全社会最关心和爱护的群体,儿童普遍喜爱的玩具市场发展迅猛,同时各类玩具由于各方面质量问题给儿童带来的伤害也时有发生,因此世界各国对本国市场上的玩具的要求正日益变得严格。许多国家都就这些…

Docker Compose容器的快速编排

Docker Compose容器的快速编排 一、Docker Compose简介1、Docker Compose是什么2、Docker Compose三大概念 二、Docker Compose 安装与操作1、环境安装2、YAML文件格式及编写注意事项3、Docker Compose配置常用字段4、Docker Compose常用命令5、Docker Compose文件结构6、删除创…

Java带符号右移(>>)、不带符号右移(>>>)

Java的右移涉及带符号右移(>>)、不带符号右移(>>>)。 对于正数,因为符号位是0,带符号右移和不带符号右移左侧都用0填充,所以结果相同。 对于负数,因为符号位是1&…

四,Eureka 第四章

2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…

C++笔记之memset分析

C笔记之memset分析 code review! 文章目录 C\笔记之memset分析1.介绍2.误区总结3.代码一&#xff0c;char数组和uint8_t使用memset4.代码三&#xff0c;int数组使用memset 1.介绍 2.误区总结 参考文章&#xff1a;Cmemset踩坑 3.代码一&#xff0c;char数组和uint8_t使用mem…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

C# WPF项目创建(基于VS 2019介绍)

1.打开VS&#xff0c;选择《创建新项目》 2.选择《WPF应用》&#xff0c;这里设计两个有.NET Framework框架和.NET core 框架&#xff0c;如图所示&#xff1a; 区别&#xff1a; .NET Framework 框架只能在windows下使用 .NET core 框架支持linux 下运行 3. 项目名称根据需…

qsort的使用及模拟实现

qsort函数是C语言库中提供的一种快速排序&#xff0c;头文件是stdlib.h qsort的使用 qsort函数需要四个参数&#xff1a; 1.排序的起始位置的地址&#xff08;数组名&#xff09;: arr 2.排序元素的个数&#xff1a; sizeof&#xff08;arr)/sizeof(arr[0]) 3.排序元素…

Windows如何安装Django及如何创建项目

目录 1、Windows安装Django--pip命令行 2、创建项目 2.1、终端创建项目 2.2、在Pycharm中创建项目 2.3、二者创建的项目有何不同 2.4、项目目录说明 1、Windows安装Django--pip命令行 安装Django有两种方式&#xff1a; pip命令行【推荐--简单】手动安装【稍微复杂一丢丢…

Yunfly 一款高效、性能优异的node.js企业级web框架

介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…

063、故障处理之快速恢复数据

数据丢失快速恢复的重要性 目的&#xff1a;尽快修复数据&#xff0c;恢复业务 快速恢复相关技术对比 常用备份恢复技术 数据快速恢复原理 MVCC 是TiDB数据库原生的一项功能&#xff0c;默认使用无需配置&#xff0c;它使用多个历史快照的方式来维护数据在某个时间点对并…

uniapp 微信小程序 navigationBarBackgroundColor 标题栏颜色渐变

大体思路&#xff1a; 第一步&#xff1a;“navigationStyle”:“custom” 第二步&#xff1a; template内 重点&#xff1a;给view添加ref“top” 第三步&#xff1a;添加渐变色样式 1、pages.json {"path" : "pages/user/user","style" : …

java中线程池、Lambda表达式、file类、递归

线程池&#xff1a; 在多线程的使用过程中&#xff0c;会存在一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都执行一个时间很短的任务就结束&#xff0c;这样频繁的创建线程就会大大降低系统的效率&#xff0c;因为线程的创建和销毁都需要时间。 线程…

集睿致远推出CS5466多功能拓展坞方案:支持DP1.4、HDMI2.1视频8K输出

ASL新推出的 CS5466是一款Type-C/DP1.4转HDMI2.1的显示协议转换芯片,&#xff0c;它通过类型C/显示端口链路接收视频和音 频流&#xff0c;并转换为支持TMDS或FRL输出信令。DP接收器支持81.Gbp s链路速率。HDMI输出端口可以作为TMDS或FRL发射机工作。FRL发射机符合HDMI 2.1规范…

mac 移动硬盘未正常退出,再次链接无法读取(显示)

&#xff08;1&#xff09;首先插入自己的硬盘&#xff0c;然后找到mac的磁盘工具 &#xff08;2&#xff09;打开磁盘工具&#xff0c;发现自己的磁盘分区在卸载状态&#xff1b;点击无法成功装载。 &#xff08;3&#xff09;打开终端&#xff0c;输入 diskutil list查看自…

vue 3.0 下载本地pdf文件

使用a标签,把pdf文件放到public文件夹下面 <el-form label-width"160px"> <el-form-item label"使用手册"> <div class"form-item-static"> <a href"/使用手册.pdf" target"_blank" class"link&q…

AC695-按键处理-带UI

AC695-按键修改 消息发出 对应界面处理