文章目录
- [一、Spring MVC基础:从MVC到框架本质](#一、Spring MVC基础:从MVC到框架本质)
-
- [1.1 什么是MVC设计模式?](#1.1 什么是MVC设计模式?)
- [1.2 Spring MVC:MVC思想的Web实现](#1.2 Spring MVC:MVC思想的Web实现)
- [1.3 Spring Boot与Spring MVC的关系](#1.3 Spring Boot与Spring MVC的关系)
- [二、Spring MVC核心:请求与响应全流程](#二、Spring MVC核心:请求与响应全流程)
-
- [2.1 建立连接:让浏览器找到程序](#2.1 建立连接:让浏览器找到程序)
-
- [2.1.1 基础用法:绑定URL与方法](#2.1.1 基础用法:绑定URL与方法)
- [2.1.2 进阶用法:类+方法的路径组合](#2.1.2 进阶用法:类+方法的路径组合)
- [2.1.3 指定请求方式(GET/POST)](#2.1.3 指定请求方式(GET/POST))
- [2.2 获取请求参数:解析浏览器传递的数据](#2.2 获取请求参数:解析浏览器传递的数据)
-
- [2.2.1 单个/多个普通参数](#2.2.1 单个/多个普通参数)
- [2.2.2 传递对象参数](#2.2.2 传递对象参数)
- [2.2.3 接受数组参数](#2.2.3 接受数组参数)
- [2.2.4 传递集合参数](#2.2.4 传递集合参数)
- [2.2.5 后端参数重命名(@RequestParam)](#2.2.5 后端参数重命名(@RequestParam))
- [2.2.6 接收JSON参数(@RequestBody)](#2.2.6 接收JSON参数(@RequestBody))
- [2.2.7 接收URL路径参数(@PathVariable)](#2.2.7 接收URL路径参数(@PathVariable))
- [2.2.8 接收文件参数(@RequestPart)](#2.2.8 接收文件参数(@RequestPart))
- [2.2.9 接收 Cookie / Session](#2.2.9 接收 Cookie / Session)
-
- Cookie
-
- Cookie的工作流程
- Cookie的核心属性
- [Spring MVC中操作Cookie](#Spring MVC中操作Cookie)
- Session
-
- Session的工作流程
- Session的核心特性
- [Spring MVC中操作Session](#Spring MVC中操作Session)
- Cookie与Session的对比
- [2.2.10 header请求头作为参数](#2.2.10 header请求头作为参数)
- [2.3 返回响应结果:给浏览器返回数据或页面](#2.3 返回响应结果:给浏览器返回数据或页面)
-
- [2.3.1 返回数据 vs 返回页面:@RestController与@Controller的区别](#2.3.1 返回数据 vs 返回页面:@RestController与@Controller的区别)
- [2.3.2 返回JSON数据](#2.3.2 返回JSON数据)
- [2.3.3 返回HTML片段](#2.3.3 返回HTML片段)
- [2.3.4 手动设置响应状态码](#2.3.4 手动设置响应状态码)
在Web开发领域,Spring Web MVC(简称Spring MVC)是Java开发者绕不开的核心框架。它基于Servlet API构建,自Spring框架诞生之初就已存在,是实现前后端交互的关键工具。
一、Spring MVC基础:从MVC到框架本质
要学好Spring MVC,首先得理清它的"思想源头"------MVC设计模式,再明确Spring MVC自身的定位与核心关系。
1.1 什么是MVC设计模式?
MVC是Model-View-Controller的缩写,是软件工程中一种经典的分层架构模式,核心是将软件系统拆分为三个职责明确的部分,实现"关注点分离"。
- Model(模型):应用程序的"大脑",负责处理业务逻辑和数据管理。比如电商系统中计算订单金额、从数据库查询用户信息的逻辑,都属于Model层。
- View(视图):应用程序的"脸面",负责与用户交互、展示数据。浏览器中的页面、App的界面都属于View层,它只关注"如何显示",不关心"数据从哪来、怎么处理"。
- Controller(控制器) :应用程序的"调度员",负责接收用户请求,协调Model和View工作。比如用户点击"提交订单"按钮后,Controller会调用Model层处理订单逻辑,再指定View层展示订单提交结果。

1.2 Spring MVC:MVC思想的Web实现
MVC是一种"思想",而Spring MVC是这种思想在Web开发中的"具体实现",同时它还是一个功能完备的Web框架。它的核心关注点有两个:
- 遵循MVC模式:但在前后端分离的主流开发模式下,View层的职责被弱化------后端不再返回完整页面,而是返回JSON、文本等数据,让前端自行渲染页面。
- Web框架能力:能够接收浏览器的HTTP请求、解析请求参数、处理业务逻辑,最终返回响应结果,实现"浏览器-后端程序"的交互。

1.3 Spring Boot与Spring MVC的关系
Spring Boot和Spring MVC是"容器与工具"的关系:
- Spring Boot是一个"快速开发脚手架",它能简化项目配置(比如自动配置Tomcat服务器),但本身不直接提供Web功能;
- Spring MVC是实现Web功能的"核心工具",Spring Boot通过引入
spring-web依赖(本质就是Spring MVC),让项目拥有处理HTTP请求的能力。
类比理解:Spring Boot像"厨房",提供了做饭的基础环境;Spring MVC像"燃气灶+锅铲",是实现"做饭(Web功能)"的核心工具------没有燃气灶,厨房只能用来收纳,无法做饭;没有厨房,燃气灶也难以稳定工作。
二、Spring MVC核心:请求与响应全流程
Spring MVC的核心能力是处理"请求-响应"流程,具体可拆解为建立连接 、获取请求参数 、返回响应结果三个关键环节,每个环节都有对应的注解和实现方式。
2.1 建立连接:让浏览器找到程序
建立连接的核心是"URL路由映射"------当用户访问某个URL时,Spring MVC能将请求转发到对应的Java方法上。实现这一功能的核心注解是 @RequestMapping。
2.1.1 基础用法:绑定URL与方法
通过@RequestMapping注解,可以指定一个URL路径,让该路径的请求触发对应的方法。同时,需要用@RestController注解标记类,告诉Spring"这个类是控制器,需要扫描其中的路由方法"。
示例代码:
java
// 标记类为控制器,且所有方法返回数据(非页面)
@RestController
public class UserController {
// 绑定URL:http://127.0.0.1:8080/hello
@RequestMapping("/hello")
public String hello() {
return "Hello, Spring MVC!";
}
}
访问http://127.0.0.1:8080/hello,浏览器会显示Hello, Spring MVC!,表示连接建立成功。
2.1.2 进阶用法:类+方法的路径组合
@RequestMapping既可以修饰类,也可以修饰方法,最终的资源路径是 "类路径+方法路径",适合按模块划分URL(比如用户模块、订单模块)。
示例代码:
java
@RestController
// 类路径:所有方法的URL都以"/user"开头
@RequestMapping("/user")
public class UserController {
// 方法路径:完整URL为"/user/hello"
@RequestMapping("/hello")
public String hello() {
return "Hello, User Module!";
}
}
访问http://127.0.0.1:8080/user/hello,即可触发该方法。
这种方式可以避免重复的RequestMapping发生错误,也可以增加可读性
2.1.3 指定请求方式(GET/POST)
@RequestMapping默认支持GET、POST等所有请求方式,若需限制请求方式,可通过method属性指定。如果只给定字符串,默认赋值给value。
- 只允许POST请求:
java
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser() {
return "User added successfully!";
}
//另一种方式:
@PostMapping( "/addUser")
public String addUser() {
return "User added successfully!";
}
此时用GET方式访问/addUser会报错,只有POST请求才能正常触发。
- 限制多个方式:
java
@RequestMapping(value = "/addUser", method = {RequestMethod.POST,RequestMethod.GET})
public String addUser() {
return "User added successfully!";
}
2.2 获取请求参数:解析浏览器传递的数据
用户发送请求时,往往会携带参数(登录时的用户名、密码),Spring MVC提供了多种方式获取这些参数,覆盖不同的参数传递场景。
2.2.1 单个/多个普通参数
直接在方法中定义与参数名一致的形参,Spring MVC会自动将请求参数赋值给形参。
java
@RestController
@RequestMapping("/param")
public class RequestController{
// 单个参数:URL: http://127.0.0.1:8080/param/m1?name=zhangsan
@RequestMapping("/m1")
public String method1(String name) {
return "接收的参数name:" + name;
}
// 多个参数:URL: http://127.0.0.1:8080/param/m2?name=zhangsan&password=123456
@RequestMapping("/m2")
public String method2(String name, String password) {
return "接收的参数:name=" + name + ", password=" + password;
}
}
注意 :参数顺序不影响赋值,Spring MVC通过"参数名"匹配;若参数是int等基本类型,必须传递参数(否则报错),建议用Integer等包装类型(不传参数时为null)。
2.2.2 传递对象参数
当参数较多时(比如用户注册:用户名、密码、年龄、邮箱),可以将参数封装为Java对象,Spring MVC会自动根据"参数名"匹配对象的属性并赋值。
- 定义User类(封装参数):
java
public class User {
private String name;
private String password;
private Integer age;
// getter、setter、构造方法
}
- 控制器方法:
java
@RequestMapping("/m3")
public String method3(User user) {
return "接收的用户信息:" + user.getName() + ", " + user.getAge();
}
访问URLhttp://127.0.0.1:8080/param/m3?name=zhangsan&password=123456&age=20,Spring MVC会自动创建User对象并赋值。
注意: 对于int 类型参数,必须传参;对象中的int字段作为参数,可以不传参,默认是0
2.2.3 接受数组参数
当客户端传递多个参数名的数值时,后端会组装成数组。
java
@RequestMapping("/r5")
public String r5(String[] arr){
return "arr:"+ Arrays.toString(arr);
}
2.2.4 传递集合参数
传递集合时要加上参数绑定注解@RequestParam,明确告诉 Spring 从请求参数中获取数据并封装到 list 中
java
@RequestMapping("/r6")
public String r6(@RequestParam ArrayList<Integer> list){
return "list:"+ list.toString();
}
2.2.5 后端参数重命名(@RequestParam)
当前端传递的参数名与后端方法的形参名不一致时(比如前端传p,后端用password接收),可以用 @RequestParam 注解重命名参数。
java
@RequestMapping("/m4")
public String method4(@RequestParam("p") String password) {
return "接收的创建时间:" + password;
}
关键属性:
value:指定前端传递的参数名;required:默认true(参数必传),若参数非必传,可设置为false(@RequestParam(value = "p", required = false))。
2.2.6 接收JSON参数(@RequestBody)
JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但采用了独立于编程语言的文本格式,几乎所有编程语言都有相应的库来处理JSON,因此成为跨平台数据交换的常用格式。
基本结构
JSON数据由两种基本结构组成:
-
键值对集合 :类似对象(Object),用大括号
{}包裹,内部是一系列key: value键值对,键和值之间用冒号分隔,多个键值对用逗号分隔。- 键(key)必须是字符串,用双引号
""包裹。 - 值(value)可以是以下类型:字符串(双引号包裹)、数字、布尔值(
true/false)、null、对象(嵌套)、数组。
- 键(key)必须是字符串,用双引号
-
有序值列表 :类似数组(Array),用方括号
[]包裹,内部是有序的值,多个值用逗号分隔,值的类型同上。
代码使用
Spring boot 提供了JSON与对象之间转换方法:
java
public class JSONTest {
@Test
void Object2Json() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//创建对象
UserInfo userInfo = new UserInfo();
userInfo.setName("daisy");
userInfo.setAge(18);
userInfo.setGender(1);
//对象转json
String s = mapper.writeValueAsString(userInfo);
System.out.println(s);
}
@Test
public void Json2Object() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String s = "{\"name\":\"daisy\",\"age\":18,\"gender\":1}";
UserInfo userInfo = mapper.readValue(s,UserInfo.class);
System.out.println(userInfo);
}
}
JSON 的特点
- 简洁性:相比 XML,语法更简单,冗余更少。
- 可读性:结构清晰,易于人类理解。
- 跨语言:几乎所有编程语言都支持 JSON 的解析和生成。
- 轻量性:适合网络传输,减少数据体积。(PB更加轻量,性能高,但是是二进制编码,可读性差)
接收JSON参数
在前后端分离项目中,前端常以JSON格式传递复杂参数(嵌套对象),此时需要用@RequestBody注解标记方法参数,告诉Spring MVC"从请求体中解析JSON数据"。
示例:
- 控制器方法:
java
@RequestMapping("/r7")
public String r7(@RequestBody UserInfo userInfo){
return userInfo.toString();
}
- 前端传递的JSON数据(通过Apifox发送请求):
json
{
"name": "daisy",
"gender": 1,
"age": 18
}
注意:
@RequestBody只能解析请求体中的JSON数据,无法解析URL中的参数;并且请求的Content-Type需设置为application/json。- 对于Jackson 解析框架:使用无参构造方法 + setter 方法 来创建对象;如果对象只定义了有参构造方法(未显式定义无参构造),且没有
setter方法,默认情况下会解析失败
2.2.7 接收URL路径参数(@PathVariable)
有时参数会直接包含在URL路径中(比如/article/1000表示查询ID为1的文章),此时需要用@PathVariable注解获取路径中的参数。
java
// URL:http://127.0.0.1:8080/request/article/1100/blog
@RequestMapping("/article/{articleId}/{type}")
public String r8(@PathVariable Integer articleId,@PathVariable String type){
return "articleId:"+articleId+" type:"+type;
}
注意:
- 参数是必传参数
- 若方法形参名与URL中的变量名一致(
type),@PathVariable可省略属性; - 若不一致(如URL中是
type,方法中是articleType),需通过value指定URL变量名(@PathVariable("type"))。
2.2.8 接收文件参数(@RequestPart)
java
@RequestMapping("/r9")
public String r9(MultipartFile file) throws IOException {
file.transferTo(new File("D:\\temp\\"+file.getOriginalFilename()));
return "文件上传成功";
}
可以通过@RequesrPart对文件进行重命名:@RequestPart(file)
2.2.9 接收 Cookie / Session
HTTP协议的"无状态 "是指:服务器对每一次请求的处理都是独立的,不会保留上一次请求的任何信息。
为了在无状态的HTTP协议上实现"状态保持",Cookie和Session应运而生:
- Cookie:将状态数据存储在客户端(浏览器),每次请求时自动携带;
- Session:将状态数据存储在服务器,客户端仅保存一个标识(通常是SessionID)。
二者本质是"客户端存储"与"服务器存储"的分工,共同解决Web应用的状态管理问题。
Cookie
Cookie是服务器发送给浏览器的小型文本数据,浏览器会将其保存(通常在本地文件中),并在后续向该服务器发送请求时,自动携带这些数据。
Cookie的工作流程
Cookie的交互过程可分为3步,类似"图书馆借书"的场景:
- 首次请求:用户第一次访问服务器(如登录页面),此时浏览器没有相关Cookie,请求中不携带任何状态信息;
- 服务器生成Cookie :服务器处理请求后,在响应中附加Cookie(如包含用户标识的信息),并通过
Set-Cookie响应头发送给浏览器;- 类比:图书馆给用户一张"会员卡"(Cookie),卡上记录用户ID;
- 后续请求 :浏览器收到Cookie后保存,此后每次访问该服务器时,都会在请求头
Cookie中携带这些数据;- 类比:用户再次借书时,自动出示会员卡,图书馆通过卡号识别用户。
Cookie的核心属性
每个Cookie都包含一系列属性,这些属性决定了Cookie的作用范围、有效期等关键特性:
- name:Cookie的名称(唯一标识,不可重复);
- value:Cookie的值(通常是经过加密的字符串,避免明文泄露信息);
- domain :Cookie的生效域名(如
example.com,仅向该域名的请求才会携带); - path :Cookie的生效路径(如
/user,仅访问该路径下的资源时携带); - maxAge :有效期(单位:秒):
- 正数:表示Cookie在指定秒数后过期;
- 0:立即删除Cookie;
- 负数(默认):Cookie仅在当前浏览器会话中有效,关闭浏览器后删除;
- secure :若为
true,仅在HTTPS加密连接中才会携带该Cookie; - httpOnly :若为
true,禁止JavaScript访问该Cookie(防止XSS攻击窃取Cookie)。
Spring MVC中操作Cookie
Spring MVC提供了便捷的API操作Cookie,包括创建Cookie、读取Cookie和删除Cookie。
创建并发送Cookie
通过HttpServletResponse的addCookie()方法添加Cookie,服务器会自动通过Set-Cookie响应头发送给浏览器。
读取请求中的Cookie
通过@CookieValue注解直接获取指定名称的Cookie值,或通过HttpServletRequest的getCookies()方法遍历所有Cookie。
- 遍历所有Cookie(适合不确定Cookie名称的场景)
java
@GetMapping("/r10")
public String r10(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
sb.append(cookie.getName()).append(":").append(cookie.getValue());
}
} else {
sb.append("请求中没有携带Cookie");
}
return sb.toString();
}
- 用
@CookieValue获取指定Cookie
java
@GetMapping("/r11")
public String r11(@CookieValue(value = "userId") String userId) {
return "当前登录用户ID:" + userId;
}
删除Cookie
Cookie本身无法直接删除,需通过"覆盖旧Cookie"的方式实现:创建一个名称相同、maxAge=0的Cookie,发送给浏览器,浏览器会自动删除原Cookie。
退出登录时删除用户Cookie:
java
@GetMapping("/logout")
public String logout(HttpServletResponse response) {
// 创建名称相同的Cookie
Cookie userCookie = new Cookie("userId", "");
// 设置maxAge=0,立即删除
userCookie.setMaxAge(0);
// 路径必须与创建时一致,否则无法覆盖
userCookie.setPath("/user");
response.addCookie(userCookie);
return "退出登录成功,已删除Cookie";
}
Session
Session(会话)是服务器为每个用户创建的内存存储空间,用于保存用户的状态信息(如登录状态、购物车数据)。服务器会为每个Session分配一个唯一标识(SessionID),并通过Cookie将SessionID发送给客户端------客户端只需保存SessionID,实际数据存储在服务器。
Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计)。
Session的工作流程
Session的交互过程比Cookie多一步服务器端存储,类似"超市储物柜":
- 首次请求 :用户第一次访问服务器,服务器创建一个Session(生成唯一SessionID),并将SessionID通过Cookie发送给浏览器;
- 类比:超市给用户一个带编号的储物柜钥匙(SessionID),柜子(Session)由超市保管;
- 存储数据 :服务器将用户状态(如登录信息)存入该Session;
- 类比:用户将物品(状态数据)放入对应编号的柜子;
- 后续请求 :浏览器携带SessionID(通过Cookie)访问服务器,服务器根据SessionID找到对应的Session,获取存储的状态数据;
- 类比:用户用钥匙(SessionID)打开对应的柜子,取出物品。

Session的核心特性
- 服务器存储:数据保存在服务器(内存、数据库等),客户端仅保存SessionID,安全性高于Cookie;
- 会话隔离:每个用户的Session独立,数据互不干扰;
- 有效期:默认有效期为30分钟(可配置),超时未活动会自动销毁;
- 依赖Cookie:默认通过Cookie传递SessionID(若浏览器禁用Cookie,需通过URL重写传递,现已很少使用)。
注意: Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失
Spring MVC中操作Session
Spring MVC提供了多种操作Session的方式,最常用的是HttpSession对象和@SessionAttribute注解。
存储与获取Session数据
通过HttpSession的setAttribute()和getAttribute()方法操作数据。
Session存储:
java
@RequestMapping("/r12")
public String setSession(HttpServletRequest request){
//从cookie中获取sessionId,再根据sessionId获取session对象
HttpSession session = request.getSession();
//默认存在内存中
session.setAttribute("userName","daisy");
session.setAttribute("password","1234");
return "设置session成功";
}
点开getSession我们会发现有两个方法:

无参的方法,var1值默认为true。
true:没有获取到Session时,返回一个空的Session独对象false:没有获取到Session时,返回null
从Session中获取用户信息:
java
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
//从cookie中获取sessionId,再根据sessionId获取session对象
HttpSession session = request.getSession(false);
//如果用户登录,session不为空,如果用户未登录,返回null
if (session == null) {
return "用户未登录";
}
else{
//从session中获取用户信息
String userName = session.getAttribute("userName").toString();
}
return "登录用户:Daisy";
}
设置Session有效期
Session默认有效期为30分钟(可在application.properties中全局配置),也可通过setMaxInactiveInterval()方法为单个Session设置有效期(单位:秒)。
全局配置(Spring Boot项目):
properties
# 设置Session有效期为1小时(3600秒)
server.servlet.session.timeout=3600s
单个Session设置:
java
// 设置当前Session 30分钟内无操作则失效
session.setMaxInactiveInterval(1800);
销毁Session
通过invalidate()方法销毁当前Session(常用于退出登录),所有存储的数据会被清空,SessionID失效。
示例:退出登录时销毁Session
java
@GetMapping("/logoutWithSession")
public String logoutWithSession(HttpSession session) {
// 销毁Session
session.invalidate();
return "退出登录成功,Session已销毁";
}
Cookie与Session的对比
| 维度 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务器端 |
| 安全性 | 较低(数据在客户端,易被篡改) | 较高(数据在服务器,仅传递SessionID) |
| 存储大小 | 有限制(通常4KB以内) | 无严格限制(受服务器内存/存储影响) |
| 性能影响 | 增加请求体积(每次携带) | 占用服务器资源(大量用户时需优化) |
| 有效期 | 可长期保存(通过maxAge设置) | 通常短期有效(超时自动销毁) |
典型使用场景
-
用Cookie的场景:
- 记住登录状态("7天内自动登录");
- 存储非敏感配置(如网站主题、语言偏好);
- 跟踪用户行为(如广告推荐,需注意隐私合规)。
-
用Session的场景:
- 存储登录状态(会话级,关闭浏览器后失效);
- 保存临时数据(如购物车、表单填写进度);
- 实现验证码、防重复提交等功能。
最佳实践
- 敏感数据放Session:用户ID、权限等敏感信息必须存在Session,避免在Cookie中明文存储;
- Cookie需加密:若必须在Cookie中存储数据(如用户ID),需加密处理(如MD5加盐);
- 设置HttpOnly和Secure :Cookie添加
HttpOnly=true防止XSS攻击,Secure=true限制HTTPS传输; - Session共享:分布式系统中,需通过Redis等实现Session共享(避免用户在不同服务器间切换时登录失效);
- 控制Session数量:避免长期保存大量Session,定期清理无效会话,减轻服务器压力。
2.2.10 header请求头作为参数
@RequestHeader:获取HTTP请求头中的信息(如User-Agent),示例:
java
@RequestMapping("/getHeader")
public String getHeader(@RequestHeader("User-Agent") String userAgent) {
return "请求头User-Agent:" + userAgent;
}
2.3 返回响应结果:给浏览器返回数据或页面
处理完业务逻辑后,需要将结果返回给前端,Spring MVC支持返回文本、JSON、HTML片段、静态页面等多种响应类型,核心注解是@ResponseBody。
2.3.1 返回数据 vs 返回页面:@RestController与@Controller的区别
@RestController:是@Controller和@ResponseBody的组合,标记的类中所有方法返回数据(文本、JSON等),不返回页面;@Controller:标记的类默认返回页面 (如HTML文件),若某个方法需要返回数据,需单独添加@ResponseBody注解。
返回页面:
java
// 标记为控制器,默认返回页面
@Controller
public class PageController {
// 返回static目录下的index.html页面
@RequestMapping("/index")
public String index() {
return "/index.html";
}
// 单独添加@ResponseBody,返回数据
@RequestMapping("/returnData")
@ResponseBody
public String returnData() {
return "这是返回的数据,不是页面";
}
}
2.3.2 返回JSON数据
Spring MVC会自动将Java对象(如HashMap、自定义类对象)转换为JSON格式返回,无需手动处理。
java
@RequestMapping("/returnJson")
@ResponseBody
public HashMap<String, String> returnJson() {
HashMap<String, String> data = new HashMap<>();
data.put("name", "zhangsan");
data.put("role", "admin");
return data;
}
访问该接口,浏览器会返回JSON格式数据:{"name":"zhangsan","role":"admin"},且响应头Content-Type会自动设置为application/json。
2.3.3 返回HTML片段
若返回的字符串包含HTML标签,Spring MVC会将其作为HTML片段返回,浏览器会自动解析渲染。
java
@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml() {
return "<h1>这是一个HTML标题</h1><p>这是一个段落</p>";
}
访问该接口,浏览器会显示带有标题和段落的页面,响应头Content-Type为text/html。
2.3.4 手动设置响应状态码
Spring MVC会自动根据请求结果设置状态码(如成功返回200,参数错误返回400),也可通过HttpServletResponse参数手动设置状态码。
java
@RequestMapping("/setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response) {
// 设置状态码为401(未授权)
response.setStatus(401);
return "状态码已设置为401";
}