
首先 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分,如下图所示:

而 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称 SpringWeb MVC 来自其源模块的名称(Spring-webmvc),但它通常被称为 Spring MVC。
简单的说,Spring MVC 是对 MVC 思想的具体实现,它本质上是一个 Web 框架!
什么是
Servlet呢❓❓❓Servlet是一种实现动态页面的技术。准确来讲Servlet是一套JavaWeb开发的规范,或者说是一套JavaWeb开发的技术标准。只有规范并不能做任何事情,必须要有人去实现它.所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类、方法、属性等。Servlet规范是开放的,除了Sun公司,其它公司也可以实现Servlet规范,目前常见的实现了Servlet规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere等,它们都被称为 "Servlet容器",用来管理程序员编写的Servlet类。
此外要区分,Spring Boot 是开发平台。Spring Boot 把 Spring MVC 包进来了,让我们用起来更轻松、更快速、更少配置,相当于 Spring Boot 是一个 "装修公司",而 Spring MVC 只是其中用来做 "Web 层装修"的技术。
名称 | 本质 | 作用 |
|---|---|---|
Spring 核心(Spring Framework) | 🌱 IoC + AOP 的核心容器 | 管理 Bean、提供依赖注入、面向切面编程 |
Spring MVC | 🌐 基于 Servlet 的 Web 框架 | 实现 Web 请求处理(Controller + DispatcherServlet) |
Spring Boot | 🚀 快速开发脚手架 | 简化配置、自动装配、快速构建 Spring 应用 |
@RequestMapping@RequestMapping 既可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是 类路径 + 方法路径。
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/sayHi")
public String sayHi(){
return "hello,Spring MVC";
}
}访问地址:http://127.0.0.1:8080/user/sayHi
属性 | 作用 | 示例 |
|---|---|---|
value / path | 指定映射的 URL | /users |
method | 指定请求方法 | RequestMethod.GET |
params | 指定请求中必须包含某些参数值 | params="id" |
headers | 指定请求中必须包含某些报头字段 | headers="Content-Type=application/json" |
produces | 指定响应类型 | produces="application/json" |
consumes | 指定请求的提交内容类型 | consumes="application/json" |
💥注意事项:spring 对于 List、Map、自定义类型等返回值,默认返回给前端的都是 json 格式,如果需要返回其它格式的响应,则需要通过 @RequestMapping 中的 produces 属性来设定!
@RequestMapping("/login")
public String loginPage() {
return "login.html";
}@RequestMapping(value = "/user", method = RequestMethod.GET)
public User getUser() {
return new User();
}✅ 现代推荐:直接用更精简的注解,如 @GetMapping("/user")
用 {} 来包含多个 URL 和请求方法:
@RequestMapping(value = {"/login", "/signin"}, method = {RequestMethod.GET, RequestMethod.POST})
public String login() {
return "login";
}@RequestMapping(value = "/search", params = "q")
public String search(@RequestParam String q) {
return "搜索关键词:" + q;
}🔔 Spring 4.3 之后推荐使用这些简化版本,更清晰。
新注解 | 作用 | 等价于 |
|---|---|---|
@GetMapping | 处理 GET 请求 | @RequestMapping(method = RequestMethod.GET) |
@PostMapping | 处理 POST 请求 | 同上 |
@PutMapping | 处理 PUT 请求 | 同上 |
@DeleteMapping | 处理 DELETE 请求 | 同上 |
Postman 的使用在使用 postman 传参的时候,通常有几种格式,这里列举三种陌生的:
multipart/form-data)Content-Type: multipart/form-data。Content-Type: application/x-www-from-urlencoded。text、json、xml、html 等。访问不同的路径,就是发送不同的请求。在发送请求时,可能会带一些参数,所以学习 Spring 的请求,主要是学习如何传递参数到后端以及后端如何接收,这里主要是使用浏览器和 Postman 来模拟。
boolean 类型),否则会报 500 错误。400 错误。URL 路径而没有别的参数的话,则可以忽略属性 value,反之则必须加上!@RequestParam@RequestParam 应用于以下场景:x-www-form-urlencoded 方式提交/api/user?id=123&name=Tom2. 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端是使用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,就可以使用 @RequestParam 来重命名前后端的参数值,需要注意使用 @RequestParam 之后参数就默认变成了必传参数,要设置为非必传参数的话,要指定参数 required=false。
@RequestMapping("/d3")
public String d3(@RequestParam(value="time", required=false) String createtime) { // 将time重命名为createtime,只对后端有效
return createtime;
}3. 在传递集合参数的时候,需要使用 @RequestParam 来绑定参数关系,因为默认情况下请求中参数名相同的多个值是封装到数组的,而如果要封装到集合的话,则需要用 @RequestParam 指定!
@RequestMapping("/d5")
public String d5(@RequestParam List<String> list) {
return list.toString();
}json 对象数据Java 中常见的 JSON 库如下所示:
库名 | 速度 | 易用性 | Spring兼容 | 特点 |
|---|---|---|---|---|
Jackson | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 默认支持 | 强大、全面、Spring首选 |
Gson | ⭐⭐⭐ | ⭐⭐⭐⭐ | ❌ | 轻量、适合工具型项目 |
Fastjson2 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ❌ | 极速、国内常用、需注意版本安全 |
org.json | ⭐⭐ | ⭐⭐ | ❌ | 基础用法简单 |
其中 Spring Boot 内置了 Jackson,所以不需要引入依赖,只需要使用其核心类 ObjectMapper 来进行对象和 json 字符串的转化即可!
Jackson 原生接口这种操作一般不用,除非有特殊需求!
public void ObjectToJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper(); // 创建jackson的核心类
// writeValueAsString:将对象转化为JSON字符串
StudentInfo stu = new StudentInfo();
stu.setName("lirendada");
stu.setAge(18);
stu.setPasswd("123123");
String jsonstr = mapper.writeValueAsString(stu);
System.out.println("序列化结果:" + jsonstr);
// readValue:将JSON字符串转化为对象
StudentInfo new_stu = mapper.readValue(jsonstr, StudentInfo.class);
System.out.println("反序列化结果:" + new_stu);
}@RequestBody在 Spring 项目中,JSON 的序列化/反序列化工作几乎都由 Spring 自动完成,只需要使用 @RequestBody 即可,除非业务逻辑中需要特殊的 JSON 操作,否则一般无需手动操作 ObjectMapper。
@RequestMapping("/demo4")
@RestController
public class demo4 {
// 请求 JSON → Java 对象(反序列化)
@RequestMapping("/saveuser")
public String saveUser(@RequestBody StudentInfo stu) {
return "json对象保存成功:" + stu.toString();
}
// Java 对象 → JSON 响应(序列化)
@RequestMapping("/getuser")
public StudentInfo getUser() {
// spring会自动将StudentInfo转化为JSON响应给前端
return new StudentInfo("lirendada", 18, "123123");
}
}@RequestBody 通常处理以下场景:
Content-Type: application/json@PathVariable首先需要在 @RequestMapping 中使用 {} 匹配一下 URL 中的参数,然后在方法参数列表中用 @PathVariable 指定对应的参数!
注意这个参数顺序是无序的,并且如果方法参数要用别名,可以使用 @PathVariable 的 value 属性进行绑定!
@RequestMapping("/url/{id}/{name}")
public String pathvar(@PathVariable Integer id,
@PathVariable("name") String username) // 指定别名为username
{
return "解析参数id:" + id + ", name:" + username;
}
@RequestPart && MultipartFile MultipartFile 是 Spring 定义的一个接口,表示上传的一个文件对象,它封装了文件上传时的所有关键信息,比如文件名、内容、文件大小、MIME 类型等。@RequestPart 通常处理前端通过 multipart/form-data 提交的数据,既有文件也有 JSON。@PostMapping("/upload")
public String upload(@RequestPart("file") MultipartFile file,
@RequestPart("user") User user) throws IOException {
System.out.println(file.getOriginalFilename()); // 获取文件原名
System.out.println(file.getName()); // 获取请求时的键名
System.out.println(file.getContentType()); // 获取文件类型
// 将文件上传到指定路径
file.transferTo(new File("E:/杂物文档/" + file.getOriginalFilename()));
return "接收到的文件名为:" + file.getOriginalFilename();
}Cookie 和 Session 之间主要是通过 SessionID 关联起来的,SessionID 是 Cookie 和 Session 之间的桥梁,如下图所示:

Spring MVC 是基于 ServletAPI 构建的原始Web框架,是在 Servlet 的基础上实现的.
其中 HttpServletRequest、HttpServletResponse 是 Servlet 提供的两个类,同时也是 Spring MVC 方法的内置对象,需要时直接在方法中添加声明即可!
HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。HttpServletResponse 对象代表服务器的响应,HTTP 响应的信息都在这个对象中,比如向客户端发送的数据、响应头、状态码等,通过这个对象提供的方法,可以获得服务器响应的所有内容。获取 cookie 本质就是通过 HttpServletRequest 的接口来获得!
@RequestMapping("/d1")
public String getcookie1(HttpServletRequest req) {
// 获取请求中的所有cookie,使用数组的时候记得判断是否为空
Cookie[] cookies = req.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
return "返回cookies成功!";
}
@CookieValue注意如果没有在该注解中指定 cookie 的名称的话,则默认只能拿到一个 cookie!
@RequestMapping("/d2")
public String getcookie2(@CookieValue("liren") String liren,
@CookieValue("asd") String asd) {
return "liren: " + liren + "<br>asd: " + asd;
}
三种方式,分别用到 HttpServletRequest 类的 getSession()、参数列表中 HttpSession session 接收参数、注解 @SessionAttribute,如下所示:
/**
* 获取session对象,根据是否为空判断要不要创建新session
*/
@RequestMapping("/setsession")
public String setSession(HttpServletRequest req) {
// 先获取session对象,设置为false,则不存在session就返回null,用于判断是否过期
HttpSession session = req.getSession(false);
if(session == null) {
// 过期了,要创建新的session对象
System.out.println("超时了!");
session = req.getSession(true); // 这次获取session对象用true,则不存在会创建
session.setMaxInactiveInterval(5); // 设置会话过期时间,单位为秒
}
session.setAttribute("liren", "lirendada_love_yt");
return "session设置成功";
}
/**
* 方式一:使用 HttpServletRequest 类的 getSession()
*/
@RequestMapping("/g1")
public String getsession1(HttpServletRequest req, HttpServletResponse resp) {
HttpSession session = req.getSession(); // 默认为true,不存在会创建新session
if(session != null && session.getAttribute("liren") != null) {
return "liren: " + session.getAttribute("liren");
}
return "null";
}
/**
* 方式二:直接在参数列表中获取HttpSession对象
*/
@RequestMapping("/g2")
public String getsession2(HttpSession session) {
if(session != null && session.getAttribute("liren") != null) {
return "liren: " + session.getAttribute("liren");
}
return "null";
}
/**
* 方式三:使用注解 @SessionAttribute
*/
@RequestMapping("/g3")
public String getsession3(@SessionAttribute String liren) {
return "liren: " + liren;
}HttpSession 的实际内容时(比如读写属性、调用方法等)都会自动刷新它的失效倒计时,这个失效倒计时可以通过 setMaxInactiveInterval(int s) 进行设置,单位是秒。sessionid 在第一次创建 HttpSession 对象的时候生成,并且不需要手动在 HttpServletResponse 中设置,因为底层容器 Servlet 会自动设置!getSession(boolean iscreate) 中的 iscreate 参数可以灵活处理不同情况:HttpSession 对象的场景中,通常让 iscreate 为 true,表示对象不存在时候创建新对象。HttpSession 对象的时候,通常就让 iscreate 为 false,这样子就不会创建新对象。@RequestHeader/**
* 方式一:使用HttpServletRequest的getHeader()方法
*/
@RequestMapping("/g1")
public String getHeader1(HttpServletRequest req) {
return "User-Agent: " + req.getHeader("User-Agent");
}
/**
* 方式二:使用注解@RequestHeader
*/
@RequestMapping("/g2")
public String getHeader2(@RequestHeader("User-Agent") String agent) {
return "User-Agent: " + agent;
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。