什么是Spring Web MVC
官方描述:Spring Web MVC :: Spring Framework
Spring WebMVCistheoriginalwebframeworkbuiltontheServletAPIandhasbeenincluded in the Spring Frameworkfromtheverybeginning.Theformalname,"SpringWebMVC",comes from thenameofitssourcemodule(spring-webmvc)
翻译中文:Spring Web MVC 是基于Servlet(开发规范) API 构建的原始Web 矿浆,一开始包含在Spring框架中
MVC定义
MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构的设计模式,它把软件系统分为模型、视图和控制器三个基本部分

**View(视图)**应用程序中专门用来与浏览器进行交互、展示数据的资源
**Model(模型)**应用程序的主题部分,用来处理程序中数据逻辑的部分
**Controller(控制器)**可以理解为一个分布器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型
Spring MVC
Spring MVC 是一个实现了 MVC(一种架构的设计模式)模式的Web框架

Spring Boot 只是实现 Spring MVC 的其中一种方式
Spring Boot 可以添加很多依赖,借助这些依赖实现不同的功能,Spring Boot 通过添加 Spring Web MVC 框架来实现Web功能

学习 Spring MVC
- 建立连接
- 请求
- 响应
准备项目

建立连接
在 Spring MVC 中使用 @RequestMapping 来实现URL路由映射,也就是浏览器连接程序的作用
java
@RestController
public class UserController {
// 路由器规则注册
@RequestMapping("/sayHi")
public String sayHi(){
return "hello,Spring MVC";
}
}
既可以修饰类,也可以修饰方式,当修饰类和方法时,访问的地址是类路径+方式路径
java
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/sayHi")
public String sayHi(){
return "hello,Spring MVC";
}
}
指定GET/POST方法类型

请求
对于参数可能为空的数据,建议使⽤包装类型
传递一个参数


参数不匹配

传递两个参数



传递对象



后端参数重命名
-
使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParm 一致,才能进行参数绑定和赋值.
-
使⽤ @RequestParam 声明的名称⼀ @RequestParam 进⾏参数重命名时,参数就变成了必传参数


required 的默认值为true,表⽰含义就是:该注解修饰的参数默认为必传 既然如此,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错


传递数组



传递集合
集合参数:和数组类似,同⼀个请求参数名有为多个,且需要使⽤ @RequestParam 绑定参数关系


传递JSON数据
JSON是一个字符串,格式类似于 JavaScript 对象字面量的格式
java
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": ["Radiation resistance", "Turning tiny", "Radiation
blast"]
}, {
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": ["Million tonne punch", "Damage resistance", "Superhuman
reflexes"]
}, {
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]
}]
}
也可以压缩表示
java
{"squadName":"Super hero squad","homeTown":"Metro
City","formed":2016,"secretBase":"Super tower","active":true,"members":
[{"name":"Molecule Man","age":29,"secretIdentity":"Dan Jukes","powers":
["Radiation resistance","Turning tiny","Radiation blast"]},{"name":"Madame
Uppercut","age":39,"secretIdentity":"Jane Wilson","powers":["Million tonne
punch","Damage resistance","Superhuman reflexes"]},{"name":"Eternal
Flame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat
Immunity","Inferno","Teleportation","Interdimensional travel"]}]}
JSON语法:
- 数据在键值对中
- 数据有逗号,分割
- 对象用 { }
- 数组用 [ ]
- 值可以为对象,也可以为数组,数组中可以包含多个对象
JSON两种结构
1.对象: { } 保存的对象是一个无序的键值对集合。每个键后面跟一个: 键值对使用,分割
2.数组:[ ] 保存的数组是值的有序集合,用,分割
JSON字符串和java对象互转
Spring MVC 框架集成了JSON的转换工具,可以直接使用




JSON优点
1.简单易懂
2.跨平台支持
3.轻量级
4.易于扩展
5.安全性
传递JSON对象
接收JSON对象需要使用 @RequestBody 注解
java
@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {
return person.toString();
}


获取url中的参数 @PayhVariable





上传文件 @RequestPart



获取Cookie/Session
回顾Cookie
HTTP协议本身是属于"无状态"协议(无状态的含义指:默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信没有直接联系)
但在实际开发中,很多时候是需要知道请求之间的关联关系

上述的令牌通常就存储在Cookie字段中
此时在服务器这边就需要记录令牌的信息,以及令牌对应的用户信息,这个就是Session机制所做的工作
理解Session
会话:对话的意思

在计算机领域,会话是一个客户于服务器之间不中断的请求响应,对客户的每个请求,服务器能够识别出请求来自同一个用户。当一个未知客户向Web应用程序发送第一个请求的时候开始一个会话。当客户明确结束会话或服务器在一个时限内没有接收到客户的任何请求,会话就结束了
服务器同一时刻收到的请求是很多的,服务器要清楚的区分每个请求属于哪个用户,也就是属于哪个会话,就需要再服务器这边记录每个会话以及与用户的信息的对应关系
Session是服务器为了保存用户信息创建的一个特殊对象

本质是一个哈希表



获取Cookie




更简介的方式,但只能取一个值


获取Session
HttpSession getSession(boolean create) : 参数如果为true,则当不存在会话时新建会话;参数如果 为false, 则当不存在会话时返回null
HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true
Session是服务器端的机制,需要先存储才能获取


可以看到,Http响应中,通过Set-Cookie告知客⼾端,把SessionID存储在Cookie中
获取

可以看到,Http请求时,把SessionId通过Cookie传递到了服务器






获取Header
传统获取也是从 HttpServletRequest 中获取




响应
返回静态页面



前面所使用的 @RestController 其实是返回的数据
@RestController = @Controller + @ResponseBody
返回数据 @ResponseBody


如果类上有 @RestController 注解时:表⽰所有的方法上添加了 @ResponseBody 注 解,也就是当前类下所有的方法返回值做为响应数据
如果⼀个类的方法里,既有返回数据的,⼜有返回页面的,就把 @ResponseBody 注解添加到对应的方法上即可
返回HTML代码片段






返回JSON

设置状态码



状态码不影响页面的展示
设置Header
@RequestMapping 的源码:Mapping Requests :: Spring Framework
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}



