什么是 spring MVC
什么是 MVC
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
MVC 和 Spring MVC 的关系
Spring MVC 的三个步骤
Spring MVC 创建和连接
package com.example.springmvcdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody // 这个注解意思:返回的结果是数据而不是页面(前后端分离)
public class UserController {@RequestMapping("/say") // 默认支持所有类型的请求
// @RequestMapping(value = "/say", method = RequestMethod.POST) // 默认情况下是所有请求都可以接收,如果想只接收 post,就再设置一个 method 方法public String say() {return "hello, MVC";}@PostMapping("/sayPost") // 或者使用这个注解public String sayPost() {return "hello, MVC, sayPost";}@GetMapping("/satGet") // 这个注解只能接收 get 请求public String satGet() {return "hello, MVC, satGet";}
}
@RequestMapping 注解介绍
@RequestMapping 即可修饰类,也可以修饰⽅法。当修饰类的时候也修饰方法时,访问的地址是类 + 方法。
获取参数
单个参数
直接设置方法的形参来进行接收(key 要对应)
多个参数
1. 设置多个参数来进行接收
2. 构造一个对象来接收(前端传递一个表单 / 一个对象)
3. 传过来的是一个 json 数据,使用 @RequestBody
对所传参数进行改名
但是前端如果没有传递 name 的时候就会报错:
因此需要在 value 后面加上 required = false:
URL 中的参数
使用 @PathVariable:
上传文件
使用 @RequestPart:
获取Cookie / header / Session
获取Cookie,使用 @CookieValue
获取 header,使用 @RequestHeader
获取 Session,使用 @SessionAttribute
在获取 Session 之前,得现有 Session,这里我在代码里面先简单弄个 Session:
@RequestMapping("/setSession")public String setSession(HttpServletRequest request) {HttpSession session = request.getSession(); // 默认是 true,没有 session 的话就创建一个session.setAttribute("name", "姜维");return "session 存储成功";}
返回数据
返回静态页面(默认,没加 @ResponseBody )
返回静态页面(加上 @ResponseBody )
请求转发 / 请求重定向
请求转发 — forward(授人以鱼)
请求转发就像女朋友叫你买杯奶茶,然后你自己就去帮她买了。
请求重定向 — redirect(授人以渔)
请求转发就像女朋友叫你买杯奶茶,然后你把钱转给女朋友让她自己去买。
两者区别
1. 定义不同
请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端。
请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向。
2. 请求方不同
请求转发是服务器端的行为
请求重定向是客户端的行为
3. 数据共享不同
请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。
4. url 地址不同
5. 代码不同
小结
“字越少,事越大” 。就像上面的请求转发,如果今天女朋友突然不想加冰了不想吃珍珠想吃椰果了那不就得挨顿骂了嘛。如果是上面的请求重定向,然后女朋友就算突然改口味那也没事,因为不会买到自己不喜欢的。