1. Spring MVC是什么?
搞清楚Spring MVC之前先搞清楚MVC是什么?MVC是一种架构设计模式,也就是一种思想,M是Model,V是View,C是Controller。他们之间的关系举一个例子来介绍。比如去饭店吃饭,一进去有服务员接待,这个服务员就是View,点菜之后,服务员把点的菜发给前厅,前厅就是Controller,前厅再根据菜的种类给不同的厨房下达做菜的命令,厨房就是Model。
Spring MVC还是一个web框架,所以Spring MVC可以看作是一个实现了MVC模式的web框架。
Spring MVC的全称是Spring Web MVC。
上篇文章介绍了创建一个Spring Boot项目可以使用idea创建或者使用网页来创建,而Spring MVC可以在创建Spring Boot项目时选择Spring Web框架,来实现web功能,此时就变成了一个Spring MVC项目。下图使用的是网页版创建Spring Boot项目,用Spring Boot项目创建Spring MVC只是其中一种创建Spring MVC的方式,其他创建方式比较复杂,在此不做介绍。https://start.aliyun.com/
Spring MVC是一个web框架,那么当用户输入url的时候Spring MVC项目需要能识别到用户的请求并给用户返回相应的响应。学习Spring MVC主要在学习如何通过浏览器和用户进行交互。
主要要学习的分为以下三个方面:
1. 建立连接:把用户(浏览器)与java程序连接起来,也就是访问一个地址时能调用到Spring程序
2.请求:用户在操作过程中会发起请求,请求过程中会携带一些参数,在程序中要想办法获取到这些参数,所以这一步主要是在获取参数。
3.响应:处理完用户的请求后把对应的响应返回给用户
2. 创建项目+建立连接
创建项目的方式在前面已做介绍,在此不再赘述。
把下载好的zip解压后用idea打开解压好的文件,此时就可以开始编写了。
创建了一个UserController类,接下来先介绍一下@RestController这个注解。一个项目中有很多类,Spring一直在扫描项目中的所有类,那Spring怎么知道哪个方法需要被执行呢?加上这个注解后Sping才去看类的内部有没有@RequestMapping这个注解,那@RequestMapping这个注解的作用又是什么呢?它的作用是路由映射:当输入一个网址时,把这个url请求对应到某个类的某个方法的过程。@RestController这个注解的作用还有很多后面再做介绍。
在这里使用回环地址127.0.0.1来练习。回环地址可以想象成是一条网线,发送端和接收端都是自己,所以访问这个url的时候其实就是把请求发给了自己,代码处理响应后把响应又发回给自己。此时输入url:127.0.0.1:8080/sayHi,看到页面上显示内容就是我们代码中写的内容(路由映射的地址和方法名不用必须相同)
@RequestMapping注解可以修饰类也可以修饰方法,访问路径是类路径加方法路径。@RequestMapping url的路径加不加 “/” 都可以,没加的话Spring程序启动时会自动补上
3. @RequestMapping支持Post请求和Get请求
浏览器发送的请求都是post请求,所以@RequestMapping一定支持Get请求。Post请求需要通过form表单构造请求,也就是需要编写前端代码,作为一个Java程序猿也就是后端程序猿我们的前端代码编写能力不高,后端只负责编写后端的业务逻辑。那这个时候引入了一个软件Postman
url:https://www.postman.com/downloads/
后端代码中指定使用Post请求
Postman选择请求方式为post,并输入url就得到了响应,由此看到@RequestMapping是支持Post请求的。
form-data主要是用来提交文件/图片,x-www-form-urlencoded form表单, 对应 Content-Type: application/x-www-from-urlencoded,raw支持图中这五种文本提交方式。binary是二进制类型,比如图片流
4. 传递单个参数
继续使用Post请求
此时传错了参数类型发现报了400错误
如果传入的参数为空,如果还是继续使用引用数据类型int那么就会500报错.
此时把int改为包装类型Integer发现获取到的参数是null,所以对于可能存在参数为空的场景时最好使用包装类型 。

5. 传递多个参数
由此可见传递传递多个参数的时候url中的参数传递顺序没有强制要求必须按顺序,前后端进行参数匹配的时候是按照参数名称进行匹配的。
6. 传递对象
有的时候需要提交很多次的数据,此时就可以构造出一个对象,变成直接传入对象传入参数
public class Person {
public String name;
public Integer id;
public Integer password;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
", password=" + password +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
}
7. 传递数组
传递一个数组:请求参数名与形参参数名相同并且请求参数为多个,后端定义数组类型形参就可以接收参数。
8. 传递JSON类型
JSON可以理解为JavaScript对象表示法,跟JavaScript没有关系,只是语法类似。
注意:@RequestBody是必须要加的
9. @PathVariable
使用这个注解来获取到url中输入的内容
10. @RequestPath
使用这个注解来上传文件
要输入key值:file,选择file选项
11. 获取Cookie和Session
11.1 Session和Cookie是什么?
先来介绍一下Cookie和Session。由于http协议是无状态的:单次客户端和服务器之间的数据交互跟下一次客户端和服务器之间的数据交互没有直接联系,但是我们想知道请求之间的关联关系。那该怎么办?
此时引入Cookie和Session。
图片中有个名词“令牌”(token),解释一下这个令牌的作用。
例子:比如去医院看病,先去医院挂号,挂号之后会给患者一个就诊卡,现在大多时候会给一个电子的二维码,去门诊看病时患者只需要出示这个二维码医生就能在电脑上看到患者的身份信息以及以前的就诊信息,这个二维码就是令牌。如果患者看完病想销户,那么此时令牌就被销毁了。患者可以在下次就诊的时候重新挂号得到新的令牌。
客户端与服务器建立连接的时候,服务器端会记录用户的身份信息存储在Session中,Session是服务器端为了记录用户身份创建出来的一个对象,Session存储的是键值对类型的数据(key:value)。服务器给客户端返回一个令牌,这个令牌就存储在Cookie中,后面客户端向服务器发起请求的时候就会携带这个令牌,服务器识别到令牌后就能知道客户端的身份信息。
11.2 Cookie和Session之间的关系
下面再来具体介绍一下这个Cookie和Session之间的关系。
1. 当客户端向服务器发起登录请求的时候,登录成功后服务器端会生成一个Sessionid,Session可以理解为一个哈希表,所以存储的就是键值对类型的数据(Sessionid:用户身份信息),Sessionid可以理解为服务器生成的唯一性字符串。令牌包含了Sessionid和一些签名,时间等。
2. 服务器端给客户端返回这个Sessionid(通过http响应中的Set-Cookie字段返回)
3. 客户端在向服务器发起请求的时候需要带上这个Sessionid,以便于服务器识别用户身份。
4. 服务器拿到Sessionid后去哈希表中找对应的用户信息。如果找不到会重新返回一个新的Sessionid给客户端。Session存储在服务器的内存当中,当服务器重启时所有Session会丢失。
11.3 Cookie和Session之间的区别
1. Cookie是客户端保存用户身份信息的一种机制,Session是服务器端保存用户身份信息的一种机制。
2. Cookie和Session之间通过Sessionid关联起来的,Sessionid是他俩之间的桥梁。
3. Cookie和Session通常会一起搭配使用,但不是必须搭配使用。
4. Cookie中存储的数据不一定非得是用户身份信息或者Sessionid,也可以是其他信息。
5.Seesionid不一定非得通过Set-Cookie来传递,也可以使用url来传递。
12. 获取Cookie
手动设置一个Cookie
由此可见Cookie是可以伪造的,所以后端都会对Cookie进行校验。