【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";
}
相关推荐
小坏讲微服务5 分钟前
MaxWell中基本使用原理 完整使用 (第一章)
大数据·数据库·hadoop·sqoop·1024程序员节·maxwell
m0_6398171515 分钟前
基于springboot火锅店管理系统【带源码和文档】
java·spring boot·后端
会编程的林俊杰1 小时前
SpringBoot项目启动时的依赖处理
java·spring boot·后端
李慕婉学姐1 小时前
【开题答辩过程】以《Javaweb的火花流浪动物救助系统设计与实现》为例,不会开题答辩的可以进来看看
vue.js·spring boot·mysql
q***72871 小时前
SpringBoot中整合RabbitMQ(测试+部署上线 最完整)
spring boot·rabbitmq·java-rabbitmq
刘一说2 小时前
深入理解 Spring Boot 单元测试:从基础到最佳实践
spring boot·后端·单元测试
武子康3 小时前
Java-172 Neo4j 访问方式实战:嵌入式 vs 服务器(含 Java 示例与踩坑)
java·服务器·数据库·sql·spring·nosql·neo4j
白露与泡影3 小时前
Spring Boot项目优化和JVM调优
jvm·spring boot·后端
ruleslol3 小时前
SpringBoot18-redis的配置
spring boot·redis
昂子的博客3 小时前
Redis缓存 更新策略 双写一致 缓存穿透 击穿 雪崩 解决方案... 一篇文章带你学透
java·数据库·redis·后端·spring·缓存