目录
[1.spring wed MVC概念](#1.spring wed MVC概念)
[3.springboot、mvc 与springMvc的关系](#3.springboot、mvc 与springMvc的关系)
3>:当querystring的key-value只有key没有value时
一.了解
1.spring wed MVC概念
Spring Web MVC 是基于 Servlet(动态wed开发核心组件) API 构建的原始 Web 框架,又称spring MVC
2.MVC
MVC 是 Model View Controller 的缩写,是软件⼯程中的⼀种软件架构设计模式 ,它把软件系统分为模型、视图和控制器三个基本部分,并且每个部分各司其职
• View(视图) : 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
• Model(模型) : 是应⽤程序的主体部分 ,⽤来处理程序中数据逻辑
• Controller(控制器): 可以理解为⼀个分发器,⽤来连接视图和模型,用于决定对于视图发来的请求⽤哪个模型来处理,以及处理完后需要返回到哪⼀个视图

3.springboot、mvc 与springMvc的关系
a. MVC 是设计模式
b.springmvc是对mvc的实现,且做出优化,比如:让前后端分隔开,让代码变得简洁、更准确;
官方话就是:分层解耦更彻底、Web 开发流程更规范

核心区别与总结
- 传统 MVC 中,View、Controller、Model 多在同一应用内交互;
- 前后端分离模式下,View(前端页面)和 Controller/Model(后端服务)通过网络交互,实现了前后端的解耦,更适合大型分布式应用的开发。
- 前后端分离后,前端不再依赖后端生成的 "视图模板",而是通过 HTTP 请求和后端纯数据交互,自己负责界面渲染
c . Spring Boot 是快速开发脚手架 / 工具集 ,本身无法处理 Web 请求 ,因此在创建 Web 项目引入 Web 依赖 时,会自动引入 Spring MVC(因为 Spring Boot 的 Web 能力完全依赖 Spring MVC 实现)
二.springmvc的使用
前言:**springmvc主要学习建立连接(HTTP 借助 TCP 来建立和管理连接)、请求与响应,**其实我们已经会了一部分,在maven配置中我们通过http请求来获取响应
整体流程给大家回顾:

1.常用注解了解
1>:@RestController
让类成为能处理 HTTP 请求的控制器 + 直接返回数据(而非页面)
其中@RestController是**@Controller与@ResponseBody**组合注解
· @Controller 标识该类是 Spring 中的控制器组件,用于处理 HTTP 请求
· @ResponseBody 使控制器方法的返回值直接以 JSON、XML 等格式写入 HTTP 响应体(浏览器),而非进行视图渲染
常见的使用/问题:
1.注释
@RestController,没有其他替代注解(如@Controller),会怎么样?答: 此时该类 仅仅是非常普通的类 ,不是spring的控制组件 ,不会处理http请求,换而言是尝试用HTTP请求会报错 404
2.注释@RestController,但手动添加@Controller注解,怎么样?答: 此时会处理http请求,但不会将值返回到浏览器 ,而是将值 作为视图名称 ",Spring 会去查找名为
hello的视图页面 (比如hello.jsp、hello.html),找不到就会报错404 或者 5XX
2>:@RequestMapping
需求映射/资源路径映射,括号跟某个方法或类的资源路径,一般与类/方法名字相同
**·**当修饰类,描述该类的唯一资源路径
**·**当修饰方法,描述该方法唯一资源路径
· 只要保证访问的路径是唯一 的,修改类/方法资源路径都是可以的
·当只修饰方法时 ,描述该方法唯一资源路径 ,可以通过 协议 + ip + 对应的方法路径访问返回值

·当修饰类和方法 ,描述该类中某个方法的唯一资源路径 ,可以通过 协议 + ip + 类路径 + 对应的方法路径访问返回值

· 只要保证访问的路径是唯一 的,修改类/方法资源路径都是可以的,
**比如:**当两个类路径重复,且方法路径重复了
第一种修改: 为了保证资源路径唯一,只能让其方法路径保持唯一
第二种修改: 修改类路径,保证资源路径是唯一
2.@RequestMapping的详解
前面学习了简单使用,但在http中需要请求格式(post、get、delete等),那在RequestMapping中的请求格式是??
1>:下载postman或apifox
apifox的更优秀,但使用门栏太高了,所以在这用postman

2>:构造不同的请求
目的: 构造不同的请求查看响应,并找到RequestMapping支持那种请求格式

可以看到当前RequestMapping支持全部的格式,那么如何让他支持指定的格式呢??
a.设置单格式

b.设计多格式

3.@其他方法注解

4.传递参数
当我们构造的http请求包括queryString,参数怎么传递?

1>:传递本质:
queryString传递的规则:
将整个字符串传递,对应的Web 开发框架 会自动解析,按照key赋值并强制类型转换

2>:方法没有参数但有queryString

注:只要方法的参数个数 < querystring的key-value个数,响应依然可以获取
3>:当querystring的key-value只有key没有value时

4>:当参数类型不匹配
这个直接进行强制类型转换,转化失败就报错

5>:传递对象
先实现一个简单的person类
java
public class Person {
String name;
int age;
Person (String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
开始传递参数

5>:后端参数重命名(后端参数映射)

注意:
- 使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀致, 才能进⾏参数绑定和赋值.
- 使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数.
6>:⾮必传参数设置
在实际开发时我们发现有些参数可以没必要传递时,就可以尝试设置默认值

7>:传递数组

8>:传递集合

9>:传递json数据
前言:JSON 是一种完全独立于编程 的轻量的文本格式 ,专门用来传数据、存数据,比如前后端交互、写配置文件,所有编程语言基本都能处理它
(1).认识json
先看代码
json有两种格式:正常格式、压缩格式
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" ] } ] }
压缩格式
(2).了解语法与结构

建议大家结合(1)的代码观察
(3).特点
a. JSON 是⼀个字符串,其格式⾮常类似于 JavaScript 对象字⾯量的格式
b.语法简单,被多种语言跨平台支持,数据传输更加轻量,语法灵活易于扩展
c. json不包含可执行程序,不会执行恶意代码,所以更安全
(4).json传输转化工具
Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转

自己尝试转换工具,第一步:编写json,为了更好地演示效果及,用Person接受
java
@SpringBootTest
class SpringBootDemo2ApplicationTests {
private ObjectMapper objectMapper = new ObjectMapper();
@Test void contextLoads() throws JsonProcessingException {
// 设置参数属性
Person person = new Person();
person.setName("我是赵六");
person.setAge(10086);
person.setEmail("654321@163.com");
// 转化为字符串
String strP = objectMapper.writeValueAsString(person);
System.out.println("字符串json数据>:"+strP);
// 转化为对象
Person personJ = objectMapper.readValue(strP, Person.class);
System.out.println("对象为>:"+personJ);
}
}
第二步:启动运行

(5).json传输
因为json 一般在请求正文处构造 ,所以在接受参数加上标签**@RequestBody(从body接受参数)**

10>:获取URL中参数@PathVariable
path variable : 路径变量,和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的某个数据

11>:上传⽂件@RequestPart
在html中的表单form的提交方式中有文件传输,此时后端就要接受对应的文件进行操作
html
<form action="demo2.html" method="get" type="file"> <!--以文件的形式提交-->
需要两个方法:
getOriginalFilename()方法:获取客户端上传的 "原始文件名
getName()方法:a. 在文件上传 场景中**,它获取的是前端表单中
<input type="file"name="xxx"/>的name属性值** (比如示例中前端key是image,所以返回"image");b. 如果是普通文件 操作,它获取的是服务器端文件的 "名称 + 扩展名"


12>:获取Cookie/Session
(1).回顾
先回顾一下http中的cookie:
当我们访问一个web网站,比如登录淘宝+加入购物车,当我们退出web后,因为http中是没有状态的,再次访问就是初始页面
为此,对应的服务器把用户的web操作信息 放到客户端cookie 并保存到本地 ,等再次访问会带着cookie一起,从而加载上一次退出前的操作
延伸: 因为cookie是明文传输,容易被篡改不安全,此时就会通过基于ssl(加密传输)传输把cookie传输过去,从而加加载对应的操作
Session(会话):
每一次与服务器建立连接,都会创建一个专属的唯一会话 ,供客户端与服务器进行交互 ,与此同时,服务器会把该会话的SessionID 通过临时cookie/set-cookie 发送到客户端的本地cookie, 会话的数据则存储在服务器上
再次访问时,不但可以通过cookie加载之前的操作信息 ,也可以通过SeeionID加载上一次会话(若没有加载出来,则默认重新创建会话)
区别:
1.Cookie 是客⼾端保存⽤⼾信息的⼀种机制. SessionID 是服务器端保存⽤⼾信息的⼀种机制.
**2.**Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的 桥梁
**3.**cookie里不一定要有SessionID ,而SessionID 也可以通过其他存储机制表示
(2).cookie获取
a.传统获取cookie

java
@RestController
@RequestMapping("HelloWord")
public class HelloWord {
@RequestMapping("hello")
public String helloWord(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
StringBuffer stringBuffer = new StringBuffer();
if(cookies != null){
for(Cookie ck : cookies){
stringBuffer.append("名字>:"+ck.getName()+" 值>:"+ck.getValue()+"\n");
}
}
return stringBuffer.toString().replaceAll("\n"," ");
}
}

cookie可以伪造 ,但只能用于自己的服务器与客户端 ,因为程序每次访问都会带着对应的cookie访问网站
b.简洁获取Cookie
java
@SpringBootApplication
public class SpringBootDemo2Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo2Application.class, args);
}
}

(3).session获取
首先,session属于服务器保存的内容,要想获取先设置session
java
@RequestMapping("setSession")
public String getSession(HttpServletRequest request){
// 这里有个方法 request.getSession(boolean b)
// 当 b = true,存在session会获得并返回,否则创建一个并返回
// 当 b = false,存在session会获得并返回,否则返回 null
// 此时的 getSession()方法相当于 b = true时的情况
HttpSession httpSession = request.getSession();
// 开始设置值
httpSession.setAttribute("name","电冰箱");
httpSession.setAttribute("age",10086);
httpSession.setAttribute("对象",new Person("我是session",20));
return "set会话成功";
}

a.传统的获取方式
java
@RequestMapping("getSession_one")
public Object getSession_one(HttpServletRequest request){
HttpSession httpSession = request.getSession();
return httpSession.getAttribute("对象");
}

b.简洁获取Cookie(一)
java
@RequestMapping("getSession_two")
public Object getSession_two(@SessionAttribute("对象")Person person){
return "对象>:"+person;
}

c.简洁获取Cookie(二)
java
@RequestMapping("getSession_three")
public Object getSession_three(HttpSession session){
return "对象>:"+session.getAttribute("对象");
}

13>:获取Header
a.传统获取 header
java
@RequestMapping("getHeader")
public String getHeader(HttpServletRequest request,HttpServletResponse response){
String userAgent = request.getHeader("User-Agent");
return "请求电脑的数据>:"+userAgent;
}

b.简单获取
java
@RequestMapping("getHeader")
public String getHeader(@RequestHeader("User-Agent")String userAgent){
return "请求电脑的数据>:"+userAgent;
}

三.有关响应的方法
1.返回静态页面
1>:了解
当访问地址不添加资源路径,也可以访问页面,此时该页面是静态页面
比如:访问京东

当删除后面的资源路径就可以看到京东的静态页面

2>:使用
注意:
a. 在编写代码时,不希望返回"值",应该返回页面,所以注解 应该为**@RestController**(详细看上面的常用注解了解)
b. 浏览器会加载静态文件,常见的静态首页文件:index.html、index.htm、index.jsp等 ,没有该文件就会报错
java
// 重新创建一个类
@Controller
@RequestMapping("Header")
public class Response {
// 此时就会寻找index.html页面
@RequestMapping("/index")
public Object index(){
return "/index.html";
}
}

2.返回数据
用到**@ResponseBody**注解:
**a.**加载类上表示该类的所有方法放回数据
**b.**加载方法上表示该方法返回数据
至于其他的细节上面常用注解提到过
3.返回HTML代码⽚段
之前的设置数据都是返回数据,那如果返回html格式会怎么样??
java
@RequestMapping("address")
public Object address(){
return "<h1>我是h1</h1></br><h2>我是h2</h2>";
}

尝试返回其他格式,如:js、css等
java
@RequestMapping("returnJs")
public Map<String,String> returnJs(){
Map<String,String> hash = new HashMap<>(){
{
put("key1","key1 value");
put("key2","key2 value");
put("key3","key3 value");
}
};
return hash;
}

注:如果返回是test.html、test.plain格式(具体使用时查看)等,前段需要将数据转化为对象使用;若是applaction.js,则直接使用
4.设置状态码
虽然springMvc可以根据接口响应情况 自动设置状态码,但在实际项目会出现技术成功但业务失败的情况
比如:
"用户登录" 接口,技术上请求已处理(参数格式正确、服务器没报错),但业务上可能是 "账号密码错误""账号已冻结",此时默认的
200 OK会让前端误解 "请求成功 ",必须手动设置更精准的状态码 + 语义
此时设置状态码可以方便进行前端页面展示与后端数据判断 处理,减少业务失败的可能性

5.设置Header
1>:了解@RequestMapping
Http请求与响应报头也会向客⼾端传递⼀些附加信息, ⽐如服务程序的名称,请求的资源已移动到新地址等,这些信息通过 @RequestMapping 注解的属性来实现

2>:设置content-type
java
// 正常情况下的响应格式
@RequestMapping(value = "setHeaderType")
public String setHeaderType(){
return "{\"OK\"}";
}
// 设置返回响应的类型为js
@RequestMapping(value = "setHeaderTypeJs",produces = "application/json")
public String setHeaderTypeJs(){
return "{\"OK\"}";
}

3>:设置其他Header
比如:在header里面增加一个键值对
java
@RequestMapping("setHeader")
public String setHeader(HttpServletResponse response){
response.setHeader("MyAddHeader","MyHeader");
return "setHeader成功";
}

这里没什么总结的,因为每一个知识点都很重要
在下一个博客我会列举这些实际应用
如果对你有帮助,点个赞吧!!
