【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是正常的。 


 

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

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

相关文章

unity调用c++dll时变量处理问题

在C中为了处理方便可以将有些局部变量变为全局变量。 以下面三个变量为例 如果还有新全局变量需要这其来赋值,就会有问题。 如下面的body1_ptr为了dll生成处理方便,变为全局变量后,这个指针变赋值就会有问题。 因为geometry_path这个只在调…

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境,其实步骤比较简单的,此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器,然后在容器内搭建Lua的环境,可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…

字节抖音小程序,使用 uniapp 调起内置支付

字节抖音小程序,使用 uniapp 调起内置支付 第一步:提交订单 后端通过抖音预下单接口,提交支付订单信息。 预下单接口_小程序_抖音开放平台预下单接口 提交支付订单信息。 ## 使用限制 无 ## 接口说明 预下单接口需要保证同一app_id下每笔订…

Linux6.15 Docker 私有仓库(harbor)

文章目录 计算机系统5G云计算第四章 LINUX Docker 私有仓库(harbor)一、搭建本地私有仓库二、Docker--harbor私有仓库部署与管理1.Harbor 简介1)什么是Harbor2)Harbor的特性3)Harbor的构成 2.Harbor 部署1)…

【深度学习-神经网络架构-通俗易懂的入门课程】

文章目录 深度学习与AI的关系机器学习的流程机器学习的核心以及问题深度学习要解决的问题模型如何搭建?特征如何提取?为什么要深度学习? 深度学习的应用深度学习的问题计算机视觉任务分类与检索如何实现分类 神经网络基础线性函数损失函数防止…

树状数组笔记

数组、前缀和、树状数组的区别: 数组:修改某点O(1),求区间O(n) 前缀和:修改某点O(n),求区间O(1) 树状数组:修改…

YOLOv5(v7.0)网络修改实践二:把单分支head改为YOLOX的双分支解耦合head(DecoupleHead)

前面研究了一下YOLOX的网络结构,在YOLOv5(tag7.0)集成了yolox的骨干网络,现在继续下一步集成YOLOX的head模块。YOLOX的head模块是双分支解耦合网络,把目标置信度的预测和目标的位置预测分成两条支路,并验证双分支解耦合头性能要优…

力扣 56. 合并区间

题目来源&#xff1a;https://leetcode.cn/problems/merge-intervals/description/ C题解&#xff1a;根据左区间排序&#xff0c;更新每一段的右区间最大值&#xff0c;直到间断。 class Solution { public:static bool cmp(vector<int> & a, vector<int> &a…

Linux实训笔记~操作系统概述

1、操作系统 操作系统作为接口的示意图: 没有安装操作系统的计算机, 通常被称为裸机。 2、不同应用利于的主流操作系统 桌面操作系统 服务器操作系统 嵌入式操作系统 移动设备操作系统

计算机网络——网络层

文章目录 **1 网络层的功能****1.1 异构网络互连****1.2 路由与转发****1.3 SDN的基本概念****1.4 拥塞控制** **2 路由算法****2.1 静态路由和动态路由****2.2 距离-向量路由算法&#xff08;动态&#xff09;****2.3 链路状态路由算法&#xff08;动态&#xff09;****2.4 层…

技术速览|Meta Llama 2 下一代开源大型语言模型

AI 使用大型语言模型&#xff08;LLM&#xff09;来理解和生成自然语言。LLM 可以从大量文本中学习并创建有关各种主题的文本&#xff0c;并可以完成比如编写代码、生成歌词、总结文章等任务。但有些 LLM 相关课程成本高昂且封闭&#xff0c;而现有的开放课程数量十分有限。这就…

Python爬虫+数据可视化:分析唯品会商品数据

目录 前言数据来源分析1. 明确需求2. 抓包分析&#xff1a;通过浏览器自带工具: 开发者工具 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据发送请求解析数据保存数据 数据可视化先读取数据泳衣商品性别占比商品品牌分布占比各大品牌商品售价平均价格各…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 &#xff08;一&#xff09;yum安装MYSQL &#xff08;二&#xff09;rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…

MATLAB与ROS联合仿真——ROS环境搭建及相关准备工作(下)

本篇文章主要介绍在安装完ROS后&#xff0c;在进行MATLAB与ROS联合仿真之前&#xff0c;需要进行的一些环境搭建以及准备工作&#xff0c;主要分为 创建ROS工作空间及功能包、必备功能包安装、安装Gazebo11、导入实验功能包至工作空间、安装Visual_Studio_Code(选做)、常用便捷…

Mysql错误日志、通用查询日志、二进制日志和慢日志的介绍和查看

一.日志 1.日志和备份的必要性 日志刷新 2.mysql的日志类型 &#xff08;1&#xff09;错误日志 查看当前错误日志和是否记录警告设置 &#xff08;2&#xff09;通用查询日志 查看通用查询日志的设置 &#xff08;3&#xff09;二进制日志 查看二进制文件的设置&…

最小二乘拟合椭圆

目录 1.拟合椭圆2.示例代码 爬虫网站自重。 1.拟合椭圆 二次曲线的一般方程为&#xff1a; A x 2 B x y C y 2 D x E y F 0 Ax^2BxyCy^2DxEyF0 Ax2BxyCy2DxEyF0 令&#xff1a; Δ B 2 − 4 A C Δ B^2-4AC ΔB2−4AC 那么&#xff0c;当 Δ > 0 Δ >0 Δ>0…

js基础-练习三

九九乘法表&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthsc, initial-scale1.0"><title>九九乘法表</title><style&g…

【uniapp学习之】uni-forms必填项校验

代码块 <uni-forms ref"baseForm" :modelValue"baseFormData" label-widthauto :rules"rules"><uni-forms-item label"企业名称" required name"principalName"><uni-easyinput v-model"baseFormData.…

springboot mybatis-plus 多数据源配置(HikariCP)

1.导入依赖jar <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgres…

【JVM】浅看JVM的运行流程和垃圾回收

1.JVM是什么 JVM&#xff08; Java Virtual Machine&#xff09;就是Java虚拟机。 Java的程序都运行在JVM中。 2.JVM的运行流程 JVM的执行流程&#xff1a; 程序在执行之前先要把java代码转换成字节码&#xff08;class文件&#xff09;&#xff0c;JVM 首先需要把字节码通过…