当前位置: 首页 > news >正文

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录

1. MVC简介

2. SpringMVC简介

3. 路由映射注解

3.1 @RequestMapping

3.2 @GetMapping与@PostMapping

4. 接收前端传递参数

 4.1 接收单/多个参数

4.2 接收对象 

4.3 接收JSON对象

4.4 后端参数重命名/映射

4.5 设置参数必传/非必传

4.6 获取URL中的参数

4.7 获取文件

4.8 获取Cookie

4.9 获取Session

4.10 获取请求Header中的信息

5. 返回参数给前端

5.1 返回静态资源

5.2 返回text/html

5.3 返回JSON对象

6. 请求转发和请求重定向


1. MVC简介

MVC模型指的是 Model、View和Controller。

  1. 其中Model模型层用于处理应用程序中数据逻辑,作为实体类与数据库进行交互同时也是数据的载体;
  2. View视图层主要负责数据向用户的展示;
  3. Controller控制器层主要用来处理和用户的交互过程,通常负责从View层读取数据并控制Model层的数据逻辑处理。MVC模型的简介图如下:

2. SpringMVC简介

类似于Spring的控制反转容器IOC和依赖注入DI的关系一样,如果说MVC是一种思想,那SpringMVC就是MVC思想的一种具体实现。总的来说,SpringMVC是一个实现了MVC模式的框架结构,并继承了Servlet-api框架,当用户发送请求后,我们的SpringMVC就可以感受到用户的请求。同时,SpringMVC也可以被当作是Spring框架的核心,下面我们主要基于SpringBoot来构建SpringWeb框架。关于SpringBoot项目的创建步骤,可以参照之前的这篇文章:SpringBoot及其配置文件

3. 路由映射注解

3.1 @RequestMapping

这是SpringWeb项目中最容易遇到的注解一个,它的功能与我们之前学习的Servlet中的@WebServlet的功能类似,用户通过其中配置的url信息即可将请求发送到对应的类的方法上。

  • @RequestMapping可以修饰类也可以修饰方法,当只修饰方法时,我们可以通过指定一级路由直接访问到该方法;当修饰类和方法时,我们需要使用二级路由才能正确映射。

@RequestMapping的使用图解


 @RequestMapping注解的标注的方法可以接收Get请求也可以接收Post请求,以及其他类型的请求:

3.2 @GetMapping与@PostMapping

这两个注解的功能与@RequestMapping的功能类似,都用来指定后端的路由映射。不过,这两个注解相对于@RequestMapping有以下区别:

  1. 使用@GetMapping配置的路由信息对应的方法只支持Get请求
  2. 同理,使用@PstMapping配置的路由对应的方法只支持Post请求

4. 接收前端传递参数

 4.1 接收单/多个参数

在SpringMVC中,我们可以直接通过在方法的参数上添加参数来接收前端传递过来的参数,不过,在方法上添加参数时有以下注意事项:

  1. 添加的参数名称要和前端发送请求时指定的参数名称一致
  2. 添加参数的类型使用引用数据类型
  3. 当有多个参数时,后端方法参数的顺序不影响参数值的接收

我们来看看这些注意事项如没有被重视会导致什么后果:

4.2 接收对象 

接收对象只是在后端将参数的值集合进行了封装,在前端仍然是按照自己该有的方式传递参数,不过值得注意的是:

  1. 前端传递的参数的名称要和后端编写的类的属性名称一致;
  2. 后端类提供了属性的getter和setter方法才能成功获取到参数的值。

下面我们以后端接收User类为例,来学习下后端接收对象的过程:

4.3 接收JSON对象

当我们还是用普通接收对象的方法来接收前端传递过来的json格式的字符串描述的对象时,会发现根本接收不到或者说转换对象不成功。这个时候我们就需要使用@RequestBody来告诉我们的程序前端传递过来的是一个json格式的数据,我们的程序才能够成功将其转化为对应的JSON对象。如下:

 

4.4 后端参数重命名/映射

 我们的接口不是已经和前端约定好了吗?为什么还要有接收参数的重命名呢?

其实这种修改后端参数名称的场景还是存在的,比如项目已经发布了,但是突然发现前后端接口参数不一致,项目功能不能正常运转了!!而前端过年放假回家没有带电脑,这个时候测试又向你提了这个bug,那我们就需要有能力站在后端舞台上解决这个问题。而后端的业务代码又用我自己的变量名称编写了一大堆。那好的解决办法就是先接收前端的参数值,然后再对这个方法参数进行重命名。所以,参数重命名还是有必要的,有备无患嘛!


后端参数重命名通过在对应方法的对应参数的前面加上@RequestParam注解并指定重命名参数的名称即可实现:

4.5 设置参数必传/非必传

对于上面 4.4后端参数重命名/映射 中,如果我们再对参数重命名后,默认情况下这个参数是必传的,如果没有传递就会导致程序出错。我们可以通过设置RequestParam注解中的required属性为false指定当前参数为非必传即可解决上述问题,如下图:

4.6 获取URL中的参数

这里的参数值得不是获取查询字符串中的参数,而是指类似下面这种格式的URL中携带的参数的获取:


要实现上面的参数的获取方式,我们需要

  1. 修改我们后端程序中的映射URL的格式
  2. 使用注解@PathVariable

如下图所示:

4.7 获取文件

在Spring中,我们又该怎样获取前端上传的文件信息呢?获取步骤共分为以下两步:

  1. 使用@RequestPart注解标注参数代表这是一个文件变量
  2. 指定@RequestPart中的name属性
  3. 文件变量使用MultipartFile类创建

话不多说,我们现在在前端发送一个文件并通过后端程序接收将文件持久化到本地硬盘上,直接上图:

4.8 获取Cookie

 如果要获取所有的Cookie,我们仍然需要使用Servlet的写法;而如果只获取一个Cookie的值,可以直接使用框架为我们提供好的注解@CookieValue。


我来先来使用Servlet获取所有的Cookie信息,以及使用@CookieValue注解获取单个Cookie信息

4.9 获取Session

 要想获取到Session,必须先有session的存储,而对于session的存储,我们只能使用原生servlet来实现,其实想想也好理解,session是和我们后端系统相关的参数,我们也不指望这个参数是从前端传递过来的,因此SpringMVC也没有为我们提供更好的存储session的方法。下面我们先使用原生servlet将session对象存储起来。

存储session


除了可以用原生Serlvet来获取外,SpringMVC也为我们提供了一种简便的获取Session中具体属性的方法:使用@SessionAttribute注解

 获取Session对象(Servlet +框架两种获取方法)


关于session的使用特性

我们都知道,由于session是存储在内存上的,按理来说,当我们的程序重启后,内存中存放的session信息应该就不存在了,但是我在将程序重启后,发现session信息依然存在,这是怎么肥事呢?如下:

 

4.10 获取请求Header中的信息

 同样,在SpringMVC中,我们依然可以使用传统的获取方式来获取,SpringMVC也为我们提供了一种更为简便的获取请求Header中信息的方式:使用@RequestHeader注解


使用传统方式和@RequestHeader注解获取Header中信息

 

 

5. 返回参数给前端

5.1 返回静态资源

SpringMVC默认情况下返回的就是静态页面,我们只需要:

  1. 不标注@ResponseBody注解,方法的返回值类型为Object/String都可以
  2. 将返回的信息修改为静态页面路径信息即可

如下:

 

5.2 返回text/html

默认情况下,标注了返回类型为数据的@ResponseBody注解后返回的字符串即为text/html格式:

 

5.3 返回JSON对象

我们只需要返回一个对象或者一个字典类型的对象如HashMap,并使用注解@ResponseBody指定返回类型为数据格式即可。

  1. 如果返回的是普通对象:SpringMVC会将对象转换为JSON格式的字符串并以JSON的格式返回给前端。其中JSON对象的key值为对象的属性名称,value值为对象的属性的值。
  2. 如果返回的是字典类型的对象,SpringMVC也会将其转换为JSON格式的字符串并以JSON格式返回给前端。其中JSON对象的key值为字典类型的key值,JSON对象的value值为字典类型的value值。

如下:

 

6. 请求转发和请求重定向

再SpringMVC中,方法返回的不仅可以是一个页面或数据,还可以返回一个字符串来实现跳转。实现跳转的方式有以下两种:

  1. 转发 ——在方法的返回值中返回字符串: "forward:/资源名"
  2. 重定向 ——在方法的返回值中返回字符串: "redirect:/资源名"

我们来练习下请求转发和请求重定向以及发现一个细节

 


请求转发和请求重定向的具体区别:

  1. 请求重定向将重新定位到资源,相当于一次全新的访问。请求转发由服务器转发。
  2. 请求转发请求的地址不发生变化,请求重定向请求的地址发生变化。
  3. 请求重定向与直接访问新地址效果一致;请求转发由服务器端完成,可能存在原外部资源不能访问。

请求转发如果资源和转发的页面不在同一目录下,将会导致转发的页面的外部资源不可访问。

 

相关文章:

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录 1. MVC简介 2. SpringMVC简介 3. 路由映射注解 3.1 RequestMapping 3.2 GetMapping与PostMapping 4. 接收前端传递参数 4.1 接收单/多个参数 4.2 接收对象 4.3 接收JSON对象 4.4 后端参数重命名/映射 4.5 设置参数必传/非必传 4.6 获取URL中的参数 4.7 获取文…...

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…...

软件设计师 计算机网络

名字带IP AP的都是网络层 所有带T的除了TFTP其他都是TCP,所有不带T的除了POP3其他都是UDP​ **物理层的互联设备有中继器和集线器,集线器是一种特殊的多路多端口中继器 网络层:路由器 物理层:中继器 数据链路层:网桥…...

Gradle ——Gradle安装与配置

目录 一、简介 二、功能和特点 三、安装 参考: Gradle_百度百科 Gradle 学习 ----Gradle 入门_你若不离不弃,我必生死相依的博客-CSDN博客 还有硬石科技的开源wifiAPP程序,没找到他们的码仓 一、简介 Gradle是一个基于Apache Ant和Apache Maven概念…...

网络安全这条路到底该怎么走?

我之前就写过一篇文章专门解答了这个问题。但是还是有很多小伙伴并不清楚这条路该怎么走下去! 不同于Java、C/C等后端开发岗位有非常明晰的学习路线,网路安全更多是靠自己摸索,要学的东西又杂又多,难成体系。 网络安全虽然是计算…...

【C++】位图(海量数据处理)

文章目录 抛出问题:引入位图位图解决 位图的概念位图的实现结构构造函数设置位清空位判断这个数是否存在反转位size与count打印函数 位图的应用 抛出问题:引入位图 问题:给40亿个不重复的无符号整数,没排序,给一个无符号整数,如何…...

外包干了五年,废了...

先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近5年的测试点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的点工…...

请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国

目录 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 为什么很多人说崖山海战以后无中国 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 以下是我对《unravel - TK from 凛冽时雨》这首歌词的理解&#xff1…...

从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你

直到如今,我才敢把这段经历分享出来,毕竟一个多月前,我是经历了面试八连挂的人。作为一只骄傲的软件测试工程师,恨不得找一块豆腐撞死。但是在闭关修炼了一个多月之后,重新出来面试,面试了五家公司&#xf…...

计算机操作系统(慕课版)第二章课后题答案

一、简答题 (1)什么是前趋图?试画出下面四条语句的前趋图. S1:axy; S2:bz1; S3:ca-b; S4:wc1; 答:前趋图(Precedence Graph)是一个有向无循环图,…...

【离散数学】置换群和伯恩赛德定理编程题

1:置换的轮换表示 给出一个置换,写出该置换的轮换表示。比如 (1 2 3 4 5 6 7 8 9) (3 1 6 2 9 7 8 4 5) 表示为(1 3 6 7 8 4 2)(5 9) 输入: 置换后的序列 输出: 不相杂的轮换乘积,每行表示一个轮换(轮换的起…...

【自然语言处理】 - 作业2: seq2seq模型机器翻译

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…...

随身WIFI折腾日记(四)---拓展USB接口读取U盘内容

五、USB行为控制 随身WIFI对外交互的接口只有WIFI和USB接口。如果要想接入其他硬件设备,拓展USB接口至关重要,对于USB接口的控制,参考如下链接: openstick项目官方教程:控制usb行为 HandsomeMod/gc: A Simple Tool To Control Usb Gadget …...

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…...

代驾公司如何管理司机

在这个几乎人人都能学车,人人都能开车的时代,代驾职业也越来越专业化和正规化。因此,想要成为一名优秀的代驾司机,一定得有过人之处,对于代驾公司来说,如何管理司机也是尤为的重要。 对于代驾公司来说&…...

面了一个5年经验的测试工程师,自动化都不会也敢喊了16k,我也是醉了····

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…...

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动…...

LeetCode_DFS_困难_1377.T 秒后青蛙的位置

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个未访问过的顶点(如果它…...

第四十九天学习记录:C语言进阶:结构体

结构体 结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问:C的new和C语言的结构体有什么异同? ChatAI答: C中的new是一个运算符&#xff…...

LeeCode [N字形变换]算法解析

关键字:数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R …...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...