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

news2024/12/24 9:11:17

目录

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. 请求重定向与直接访问新地址效果一致;请求转发由服务器端完成,可能存在原外部资源不能访问。

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

 

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

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

相关文章

学生考勤信息管理系统

系列文章 任务36 学生考勤信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试操作页面bk.txt信息录入:加入新出勤的信息查…

chatgpt赋能Python-pythonget

PythonGet:一个优秀的Python包管理器 PythonGet是一个优秀的Python包管理器,它可以帮助Python工程师安装、管理和更新Python包。本文将在介绍PythonGet的基本用法的同时,探讨PythonGet在SEO优化中的应用。 PythonGet的简介 PythonGet是Pyt…

不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】

首先来一波感谢: 感谢laf提供赞助,目前可以免费使用Midjourney进行开发和测试。 感谢白夜、米开朗基杨sealos.io的耐心解答,让我对laf有了更多的使用与了解。 什么是laf?来了解下。 文末有【示例】 开始 废话不多说,…

基于Freertos的ESP-IDF开发——7.WS2812B彩色灯循环

基于Freertos的ESP-IDF开发——7.WS2812B彩色灯循环 0. 前言1. WS2812B简介2. 完整代码3. 演示效果4. 其他FreeRtos文章 0. 前言 本节使用WS2812B实现彩灯循环 开发环境:ESP-IDF 4.3 操作系统:Windows10 专业版 开发板:自制的ESP32-WROOM-3…

【软考中级】软件设计师选择题题集(一)

海明校验码是在n个数据位之外增设k个校验位,从而形成一个k+n位的新的码字, 使新的码字的码距比较均匀地拉大。n与k的关系是(1)。 (1)A.2k - 1≥n + k  B.2n - 1≤ n + k   C.n = k  D.n-1≤k 【答案】A 【解析】 【答案】B A 【解析】 在采用结构化方法进行系统分析时,…

MySQL高级篇——索引失效的11种情况

导航: 【黑马Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1. 索引优化思路 2. 索引失效的11种情况 2.0. 数据准备 2.1 要尽量满足全值匹配 2.2 要满足最佳左前缀法则 2.3 主键插…

详解Jetpack Compose中的Modifier修饰符

前言 本文将会介绍Jetpack Compose中的Modifier。在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序、不可变的集合,它可以往Jetpack Compose UI元素中添加修饰或者各种行为。例如,背景、填充和单击事件监听器装饰或添加行为到文…

依次对数组中的元素进行逻辑非和异或判断numpy.logical_not()numpy.logical_xor()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 依次对数组中的元素进行逻辑非和异或判断 numpy.logical_not() numpy.logical_xor() [太阳]选择题 下列代码中np.logical_xor(A, B)输出的结果是? import numpy as np A [True, …

苹果新增了28个以AI为重点的职位,希望利用这种AI技术改变iPhone和iPad

🚀 苹果新增了28个以AI为重点的职位,希望利用这种AI技术改变iPhone和iPad 苹果公司限制了使用ChatGPT等外部AI工具,正在开发自主的生成式AI技术。 苹果此前新增了28个以AI为重点的职位,希望利用这种AI技术改变iPhone和iPad。 此…

IntelliJ 导出和导入配置文件

导出: File->Manage IDE Setting->Export Settings…->选择导出目录,可以得到一个 settings.zip 的文件 导入方法: File->Manage IDE Setting->Import Settings…->选择需要导入的文件即可,导入之后重启IDE。

13-2-CSS3-渐变色、2D转换、3D转换

一、渐变色 CSS渐变色(Gradient)是指在元素背景中使用两种或多种不同的颜色进行过渡,超过两个颜色可以形成更为细腻的渐变效果。常见的CSS渐变色有线性渐变和径向渐变。 1. 线性渐变:Linear Gradients 向下/向上/向左/向右/对角…

CyberLink的屏幕录制软件Screen Recorder Deluxe 4.3版本在win10系统的下载与安装配置教程

目录 前言一、Screen Recorder Deluxe安装二、使用配置总结 前言 Screen Recorder Deluxe是由CyberLink公司开发的一款高效的屏幕录制工具,该软件提供了全面而易于使用的功能,可以满足广泛的屏幕录制需求。 Screen Recorder Deluxe的一些主要特点&…

代码随想录算法训练营 Day 46 | 139.单词拆分,关于多重背包,你该了解这些!,背包问题总结篇!

139.单词拆分 讲解链接:代码随想录-139.单词拆分 确定 dp 数组以及下标的含义:dp[i] : 字符串长度为 i 的话,dp[i]为 true,表示可以拆分为一个或多个在字典中出现的单词。 确定递推公式:如果确定 dp[j] 是 true&…

PyTorch-Dataset

Dataset类: 如何获取数据及标签。 Dataloader类:为之后的网络提供不同的数据形式。 1. 数据文件夹表示: from torch.utils.data import Dataset from PIL import Image import osclass MyData(Dataset):def __init__(self, root_dir, label_d…

三十七、雪崩问题、Sentinel、簇点链路、流控模式

1、初识Sentinel 1.1雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息&am…

Rust每日一练(Leetday0006) 三数之和、字母组合、四数之和

目录 16. 最接近的三数之和 3Sum Closest 🌟🌟 17. 电话号码的字母组合 Letter-combinations-of-a-phone-number 🌟🌟 18. 四数之和 4Sum 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust…

肝一肝设计模式【九】-- 享元模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…

java枚举类解读

目录 为什么需要枚举类 枚举类的使用 枚举类的实现 枚举类的属性 自定义枚举类 使用enum定义枚举类 常见enum的使用场景 switch 向枚举中添加新方法 覆盖枚举的方法 Enum类的主要方法 实现接口的枚举类 为什么需要枚举类 类的对象只有有限个,确定的。…

如何将map与对象进行转换

Spring Boot内置了一个强大的JSON转换器Jackson,可以实现将JSON字符串或Map类型的数据转换成Java对象。以下是将Map类型的数据转换成Java对象的示例代码: import com.fasterxml.jackson.databind.ObjectMapper;//定义Java对象 public class User {priva…

oracle客户端的安装教程

文章目录 一、安装前的准备工作 1.1、百度网盘安装包的连接 1.2、百度网盘oracle11g软件包 二、oracle数据库客户端的安装与数据的准备 安装步骤 前言 本文主要讲解oracle客户端的安装与简单使用过程 一、安装前的准备工作 1.1、百度网盘安装包的连接 客户端的软件包 …