目录
什么是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 地址发生了改变。