【Java EE】了解Spring Web MVC:请求与响应的全过程

文章目录

  • [一、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.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框架。它的核心关注点有两个:

  1. 遵循MVC模式:但在前后端分离的主流开发模式下,View层的职责被弱化------后端不再返回完整页面,而是返回JSON、文本等数据,让前端自行渲染页面。
  2. 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会自动根据"参数名"匹配对象的属性并赋值。

  1. 定义User类(封装参数):
java 复制代码
public class User {
    private String name;
    private String password;
    private Integer age;
    // getter、setter、构造方法
}
  1. 控制器方法:
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数据由两种基本结构组成:

  1. 键值对集合 :类似对象(Object),用大括号 {} 包裹,内部是一系列 key: value 键值对,键和值之间用冒号分隔,多个键值对用逗号分隔。

    • 键(key)必须是字符串,用双引号 "" 包裹。
    • 值(value)可以是以下类型:字符串(双引号包裹)、数字、布尔值(true/false)、null、对象(嵌套)、数组。
  2. 有序值列表 :类似数组(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
}

注意

  1. @RequestBody只能解析请求体中的JSON数据,无法解析URL中的参数;并且请求的Content-Type需设置为application/json
  2. 对于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)

HTTP协议的"无状态 "是指:服务器对每一次请求的处理都是独立的,不会保留上一次请求的任何信息

为了在无状态的HTTP协议上实现"状态保持",Cookie和Session应运而生:

  • Cookie:将状态数据存储在客户端(浏览器),每次请求时自动携带;
  • Session:将状态数据存储在服务器,客户端仅保存一个标识(通常是SessionID)。

二者本质是"客户端存储"与"服务器存储"的分工,共同解决Web应用的状态管理问题。

Cookie是服务器发送给浏览器的小型文本数据,浏览器会将其保存(通常在本地文件中),并在后续向该服务器发送请求时,自动携带这些数据。

Cookie的工作流程

Cookie的交互过程可分为3步,类似"图书馆借书"的场景:

  1. 首次请求:用户第一次访问服务器(如登录页面),此时浏览器没有相关Cookie,请求中不携带任何状态信息;
  2. 服务器生成Cookie :服务器处理请求后,在响应中附加Cookie(如包含用户标识的信息),并通过Set-Cookie响应头发送给浏览器;
    • 类比:图书馆给用户一张"会员卡"(Cookie),卡上记录用户ID;
  3. 后续请求 :浏览器收到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

通过HttpServletResponseaddCookie()方法添加Cookie,服务器会自动通过Set-Cookie响应头发送给浏览器。

读取请求中的Cookie

通过@CookieValue注解直接获取指定名称的Cookie值,或通过HttpServletRequestgetCookies()方法遍历所有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多一步服务器端存储,类似"超市储物柜":

  1. 首次请求 :用户第一次访问服务器,服务器创建一个Session(生成唯一SessionID),并将SessionID通过Cookie发送给浏览器;
    • 类比:超市给用户一个带编号的储物柜钥匙(SessionID),柜子(Session)由超市保管;
  2. 存储数据 :服务器将用户状态(如登录信息)存入该Session;
    • 类比:用户将物品(状态数据)放入对应编号的柜子;
  3. 后续请求 :浏览器携带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数据

通过HttpSessionsetAttribute()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的场景

    • 存储登录状态(会话级,关闭浏览器后失效);
    • 保存临时数据(如购物车、表单填写进度);
    • 实现验证码、防重复提交等功能。
最佳实践
  1. 敏感数据放Session:用户ID、权限等敏感信息必须存在Session,避免在Cookie中明文存储;
  2. Cookie需加密:若必须在Cookie中存储数据(如用户ID),需加密处理(如MD5加盐);
  3. 设置HttpOnly和Secure :Cookie添加HttpOnly=true防止XSS攻击,Secure=true限制HTTPS传输;
  4. Session共享:分布式系统中,需通过Redis等实现Session共享(避免用户在不同服务器间切换时登录失效);
  5. 控制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-Typetext/html

2.3.4 手动设置响应状态码

Spring MVC会自动根据请求结果设置状态码(如成功返回200,参数错误返回400),也可通过HttpServletResponse参数手动设置状态码。

java 复制代码
@RequestMapping("/setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response) {
    // 设置状态码为401(未授权)
    response.setStatus(401);
    return "状态码已设置为401";
}
相关推荐
冰冰菜的扣jio8 小时前
Redis缓存问题——一致性问题、事务、持久化
java·spring·mybatis
程序员张311 小时前
Mybatis条件判断某属性是否等于指定字符串
java·spring boot·mybatis
invicinble13 小时前
从逻辑层面理解Shiro在JVM中是如何工作的
jvm·spring boot
好好研究16 小时前
SpringBoot注解的作用
java·spring boot·spring
Libby博仙16 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
子非鱼92116 小时前
SpringBoot快速上手
java·spring boot·后端
我爱娃哈哈17 小时前
SpringBoot + XXL-JOB + Quartz:任务调度双引擎选型与高可用调度平台搭建
java·spring boot·后端
Coder_Boy_17 小时前
基于SpringAI的在线考试系统-AI智能化拓展
java·大数据·人工智能·spring boot
内存不泄露17 小时前
二手物品交易平台
spring boot·小程序·django