Spring MVC

目录

什么是Spring MVC

MVC定义

MVC和Spring MVC的关系

怎么学Spring MVC

创建Spring MVC项目

0.使用Spring Boot来创建Spring MVC项目

1.实现连接

2.获取参数

获取单个参数

 获取多个参数

获取对象

后端参数重命名

获取JSON对象

从基础的URL中获取参数

上传文件@RequestPart

获取Cookie

获取header

获取Session

返回数据

返回静态页面

 请求转发和请求重定向


什么是Spring MVC

Spring Web MVC是基于Servlet API构建的原始的Web框架,从一开始就包含在Spring 框架之中.它的正式名称是Spring Web MVC,但是也通常被称为是Spring MVC.

由上述我们可知:

1.Spring MVC是一个Web框架

2.Spring MVC是基于Servlet API构建的.


MVC定义

MVC是Model View Controller的缩写,它是一种软件的架构模式,把软件系统分为模型,视图和控制器三个部分.

Model:是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据.

View:是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller:是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据, 控制⽤户输⼊,并向模型发送数据.

上述的这种模式已经被淘汰,原因就是上述的模式前后端还是在一起的,而现在的项目大多都是前后端分离的,我们只需要了解这种设计模式即可.


MVC和Spring MVC的关系

MVC是一种思想,Spring MVC是对MVC思想的具体实现.类比于IoC和DI的关系.

总结来说,就是Spring MVC是一个实现了MVC模式,并继承了Servlet API的Web 框架.

Web框架就表明我们在浏览器中输入url后,Spring MVC项目就能感知到用户的请求.


怎么学Spring MVC

Spring MVC是所有java项目的基础,我们创建的Spring和Spring Boot项目都是基于Spring MVC的.

学习Spring MVC要掌握三个功能:

1.连接的功能:将浏览器和Java程序连接起来,也就是说访问一个地址能够调用到我们的Spring程序.

2.获取参数的功能:用户访问的时候所带的参数,我们要能在程序中获取到.

3.输出数据的功能:执行完业务的逻辑之后,我们要能把程序的执行结果返回给用户.


创建Spring MVC项目

创建Spring MVC项目有两种方式:

1.2018年之前,使用maven项目添加Spring MVC框架的方式来创建,此种创建方式太过麻烦,复杂,还容易造成版本号不匹配的情况.

2.现在,我们都是使用Spring Boot来创建Spring MVC项目.


0.使用Spring Boot来创建Spring MVC项目

在创建Spring Boot的过程中添加Spring Web的依赖就完成了Spring MVC项目的创建.此时我们的项目就有了Web能力.


1.实现连接

3种实现连接的方式:@RequestMapping,@PostMapping,@GetMapping.


@RequestMapping注解是支持GET和POST请求的.

可以通过设置其method来限制接收的请求类型.

我们可以通过PostMan来模拟发送一个post请求,看其能否正常相应.

可以看到其返回了正确的结果.说明我们的属性设置生效了.


 


2.获取参数

获取单个参数

如果对应不起来或者是不传参数,那么返回的结果都是String的默认值null

那么把Sting改为Integer或者是int呢,会返回null还是报错呢?

所以,我们在进行参数传递的时候尽量都使用基本数据类型的包装类.


由于我们的Spring MVC是基于Servlet API构建的,所以我们依然可以使用servlet的方式来获取参数.

所以,我们可以使用Servlet的方式来获取请求中的IP等内容. 


 获取多个参数


获取对象

首先创建一个对象的实体类

创建连接

传递参数

那么前端的参数怎么就变成了后端的对象了呢?

 框架会实现自动的参数映射(将前端传递的参数映射到对象的属性),只要保证前端传递的key和实体类里的属性一致即可.


后端参数重命名

也叫做后端参数映射,说的是在某些情况下,前端传递的参数key和我们后端的key可以不一致,比如前端传递了一个time给后端,而后端又是用createtime来接收的,这样就会出现参数接收不到的情况,那么我们就可以使用@RequestParam来重命名前后端的参数值.

设置了@RequestParam,那么前端就必须要传递time这个参数,如果不传递就会报错.

 

查看@RequestParam源码:

 设置成false后,那么前端不传递这个参数也不会报错了.


获取JSON对象

当我们前端传递JSON对象时,后端在使用接收普通对象的方式是接收不了的.

我们使用postman来发送一个JSON对象:

可以看到返回值都是null. 

要想接收JSON对象,要使用注解@RequestBody来标注一下.

 

返回的都是正确的结果. 


从基础的URL中获取参数

直接在URL的路径中传参有两个优点:

  • 1.搜索引擎抓取关键字的权重更高
  • 2.URL更加简洁

从基础的URL中获取参数要使用注解@PathVariable


上传文件@RequestPart

上传文件我们要使用注解@RequestPart

我们将上传的文件保存在D盘的work目录下,在此电脑中看一下是否已经写入了.

注意:这里要特别注意的是,当上传的文件大于1MB的时候,就会报错.这是因为SpringBoot默认的单次上传的文件大小最大是1MB,单次请求的最大大小是10MB.针对这个问题,我们可以在配置文件中重新设定最大值.

查找Spring官网的系统配置项,我们就可以看到相关的说明.


使用上述的方式上传文件,只是文件上传的一个最基础的操作.使用这个方式 上传文件是不适合生产的,因为使用这个方式后面上传的文件会覆盖前面上传的文件,图片的保存位置就是写死的那一个路径.

要解决上面的问题,就要解决文件名不能重复的问题.在这里文件名不重复,我们使用的是UUID.

UUID叫做通用唯一标识,它是由当前电脑网卡的mac+时间戳+随机数组成的,使用UUID可以保证我们的文件名字不会重复.

多次进行上传操作:


获取Cookie

获取cookie有两种方式,传统的方式获取(得到request对象,用getCookies()方法),简洁的方式获取,直接使用@CookieValue注解.

伪造一个cookie发送

都能够正确返回cookie.


获取header

获取header也有两种方式,传统的得到request对象调用getHeader()方法,简洁的方式可以使用@RequestHeader注解.


获取Session

获取session之前要先存储session


返回数据

返回静态页面

 

 

 默认请求下无论是Spring MVC或者是Spring Boot返回的是视图(xxx.html).而现在都是前后端分离的,后端只需要返回给前端数据即可,这个时候我们就需要使用@ResponseBody注解,返回的就是数据,此注解我们之前已经用过多次.


 请求转发和请求重定向

return不但可以返回视图,还可以实现跳转,跳转的方式有两种:forward请求转发和redirect请求重定向.

二者有很大的区别:

1.定义不同

请求转发:发生在服务器端程序内部,当服务器收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端.

请求重定向:请求重定向指的是服务器收到客户端的请求之后,会给客户端返回一个临时响应头,临时响应头中记录了客户端需要再次发送请求的URL地址,客户端收到地址之后,会将请求发送到新的地址上.

2.请求方不用

请求转发是服务器的行为,请求重定向是客户端的行为.

 

3.数据共享不同

 请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。

4.最终URL地址不同

请求转发是服务器端代为请求,再将结果返回给客户端的,所以整个请求的过程中 URL 地址是不变的;而请求重定向是服务器端告诉客户端,“你去另一个地访问去”,所以浏览器会重新再发送一次请求,因此客户端最终显示的 URL 也为最终跳转的地址,而非刚开始请求的地址,所以 URL 地址发生了改变。


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

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

相关文章

1688获取商品api接口

作为一名技术爱好者,我们总会遇到各种各样的技术问题,需要寻找合适的技术解决方案。而在互联网时代,我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而,在不同的技术分享中,我们常常会遇到质量参差不齐的文…

linux中查看某个文件夹下文件的个数和大小

一、统计某个目录的文件和子目录的大小 1、stat指令 stat命令 主要用于显示文件或文件系统的详细信息,该命令的语法格式如下: -f  不显示文件本身的信息,显示文件所在文件系统的信息-L  显示符号链接-t  简洁模式,只显示…

如何压缩pdf文件大小?四种方法随意选择

如何压缩pdf文件大小?PDF文件格式由于其跨平台性,易于浏览、打印和传输等特点,在现代社会中广泛应用于各个领域。然而,随着PDF文件越来越大,传输及存储所需的时间也会变得越来越长,从而降低了工作效率。在这…

如何用ChatGPT协助搭建品牌视觉体系(VI)?

该场景对应的关键词库(18个): VI体系、品牌、目标市场、品牌DNA、人群特征、设计理念、标志设计、配色方案、字体选择、图形元素、价值观、形象、客户经理、需求、品牌定位、目标受众、主色调、辅助色 提问模板(2个)&…

进阶自定义类型——结构体,枚举,联合

本章重点: 1.结构体 1.1 结构体类型的声明 1.2 结构的自引用 1.3 结构体变量的定义和初始化 1.4 结构体内存对齐 1.5 结构体传参 1.6 结构体实现位段(位段的填充&可移植性) 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 2.3 枚举的使用 3.联合 3.1 联合类…

【TCP 协议】连接管理之 “三次握手,四次挥手”

哈喽,大家好~我是你们的老朋友:保护小周ღ 本期为大家带来的是网络编程中的 TCP 传输控制协议保证数据可靠性传输的机制之一的——连接管理,通信双方采用 “三次握手” 来建立连接,采用 “四次挥手” 会断开连接,如何…

React + ts学习笔记

前提准备: 环境配置 安装node.js 官网安装:当前使用版本18.15.0 安装新的react应用: 运行命令新建react-app npx create-react-app study-ts-app当前版本: “react”: “^18.2.0”,“react-dom”: “^18.2.0”, 如果出现如…

CompletableFuture使用教学

CompletableFuture使用教学 一、开始一个线程异步执行不需要返回值 通过runAsync方式 //1.不加线程池方式 CompletableFuture<Void> completableFuture CompletableFuture.runAsync(() -> {System.out.println(Thread.currentThread().getName());//停顿几秒try {…

对象应用:C++字符串和vector,对象的new与delete重构

对象应用 C字符串和vector字符串创建方式字符串拼接字符串追加 字符串截断autovector创建方式vector操作 new与delete重构new与delete的工作步骤new与delete重构应用只能生成栈对象只能生成堆对象 C字符串和vector C的字符串是一个对象&#xff0c;存在于std标准库中&#xff0…

[echarts] legend icon 自定义的几种方式

echarts 官方配置项 地址 一、默认 图例项的 icon circle, rect, roundRect, triangle, diamond, pin, arrow, none legend: {top: 5%,left: center,itemWidth: 20,itemHeight: 20,data: [{icon: circle, name: 搜索引擎},{icon: rect, name: 直接访问},{icon: roundRect, n…

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C

什么是FPGA&#xff1f;关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器…

二叉排序树查找成功和不成功的平均查找长度

理解二叉树的特性: 1)结点:包含一个数据元素及若干指向子树分支的信息。 2)结点的度:一个结点拥有子树的数据成为结点的度。 3)叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。 4)分支结点:也称为非终端结点,度不为零的结点成为非终端结点。 5)结点…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀&#xff1a;适应性预期5 货币政策规则&#xff1a;泰勒方程6 动态总供给-总需求方程&#xff08;DAS-DAD&#xff09;7 总供给冲击模拟 1 产品服务:需求方…

Elasticsearch:NLP 和 Elastic:入门

自然语言处理 (Natural Language Processing - NLP) 是人工智能 (AI) 的一个分支&#xff0c;专注于尽可能接近人类解释的理解人类语言&#xff0c;将计算语言学与统计、机器学习和深度学习模型相结合。 AI - Artificial Inteligence 人工智能ML - Machine Learning 机器学习DL…

永远不该忘记!科技才是硬道理,手中没有剑,跟有剑不用,是两回事

今天是全国防灾减灾日&#xff0c;距离2008年汶川大地震也已经过去15年了。但时至今日&#xff0c;看到那些图像视频资料&#xff0c;那种触及灵魂的疼痛仍是存在的&#xff0c;2008年的大地震在每个中国人身上都留下了无法抚平的伤疤。 2008年是所有中国人都无法忘记的一年&am…

Ims跟2/3G会议电话(Conference call)流程差异介绍

2/3G Conference call 合并(Merged)通话前,两路电话只能一路保持(Hold),一路通话(Active)。 主叫Merged操作,Hold的一路会变成Active,进入会议通话。 例如终端A跟C通话,再跟B通话,此时B就是Active状态,C从Active变成Hold状态。Merged进入会议通话后,C又从Hold变…

docker安装elasticsearch

前言 安装es么&#xff0c;也没什么难的&#xff0c;主要网上搜一搜&#xff0c;看看文档&#xff0c;但是走过的坑还是需要记录一下的 主要参考这三份文档&#xff1a; Running the Elastic Stack on Docker docker简易搭建ElasticSearch集群 Running Kibana on Docker …

Python-exe调用-控制台命令行执行-PyCharm刷新文件夹

文章目录 1.控制台命令行执行1.1.subprocess.Popen1.2.os.system()1.3.subprocess.getstatusoutput()1.4.os.popen() 2.PyCharm刷新文件夹3.作者答疑 1.控制台命令行执行 主要四种方式实现。 1.1.subprocess.Popen import os import subprocess cmd "project1.exe&qu…

只下载rpm包而不安装(用于内网虚拟机使用)

这里写目录标题 问题&#xff1a;解决&#xff1a;1. 安装yum-utils2. 下载rpm包3. 将rpm包拷贝到离线的虚拟机并安装 遇到的问题&#xff1a;1. error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file2. wrong ELF class: ELFCLA…