游乐游手机版
首页/编程语言/文章详情

SpringMVC多种响应返回方式详解

时间:2026-07-30 22:08
SpringMVC控制器支持多种返回方式:返回字符串作为视图名(配合Model)用于服务端渲染;返回void需手动处理响应否则易404;ModelAndView封装数据与视图;Model+String分离写法最常用;@ResponseBody将对象序列化为JSON返回,配合@RestController可免去类级别注解。需注意@ResponseBody下fo

近期在后台收到不少开发者关于 SpringMVC 返回方式的咨询,问题主要集中在几个方面:Controller 方法的返回值类型有哪些?不同返回形式在底层流程上有何区别?什么情况下页面会报 404 错误?@ResponseBody 注解应该加在哪里?@RestController 的工作原理是什么?

本文将围绕传统服务端渲染(JSP/模板引擎)与前后端分离两种主流开发模式,系统梳理 SpringMVC 中各类返回形式的使用方式与适用场景。

一、SpringMVC 各类返回形式完整梳理

1. 返回普通字符串(视图名称,传统服务端渲染)

@RequestMapping("/index")
public String index(){
    // 返回视图名
    return "index";
}

✅ 执行流程:

  1. SpringMVC 获取返回字符串 index
  2. 视图解析器 ViewResolver 拼接前缀与后缀,定位到视图资源(如 /WEB-INF/index.jsp)
  3. 将请求转发至该页面进行渲染,同时将 Model 中存放的数据传递到页面

默认规则:返回字符串 = 视图名称 特殊前缀:

  • return "forward:/page":表示请求转发,不再经过视图解析器
  • return "redirect:/login":表示重定向,不再经过视图解析器

SpringMVC多种响应返回方式详解

2. 返回 void(极易出现404,重点避坑)

@RequestMapping("/demo")
public void demo(HttpServletRequest request,HttpServletResponse response){
}

⚠️ 如果方法直接返回 void,SpringMVC 会尝试查找与当前访问路径同名的视图,若找不到则返回 404 错误。若希望 void 返回不报错,可采用以下三种方案(与图片描述一致):

(1)使用 response 手动输出响应(直接写入文本或 JSON)

response.setContentType("application/json;charset=utf-8");
response.getWriter().write("{"code":200}");

缺点:依赖原生 Servlet API,代码较为繁琐,项目中不推荐大规模使用。

(2)在方法内手动执行请求转发 forward

request.getRequestDispatcher("/success").forward(request,response); 

(3)在方法内手动执行重定向 redirect

response.sendRedirect("/login"); 

重要提醒:一旦执行 forward 或 redirect,不要再返回视图名称,也不要重复输出响应,否则会抛出异常。

3. 返回 ModelAndView

ModelAndView = Model(数据) + View(视图名称)

@RequestMapping("/list")
public ModelAndView list(){
    ModelAndView mv = new ModelAndView();
    mv.addObject("name","张三"); // 存入request域,页面可获取
    mv.setViewName("list"); // 设置视图名称
    return mv;
}

特点:将数据与视图封装在同一个对象,老式项目中较为常见;现代开发更推荐使用 Model + String 的返回形式。

4. 返回 Model + String(分离写法,开发中最常用)

@RequestMapping("/list")
public String list(Model model){
    model.addAttribute("name","张三");
    return "list"; // 视图名称
}
  • Model:用于向 request 域存放页面所需数据
  • 返回字符串:视图名称 优势:数据与视图分离,代码可读性优于 ModelAndView,是服务端渲染项目的主流写法。

5. 返回JSON数据(前后端分离核心,@ResponseBody登场)

以上 4 种方式均属于服务端渲染,用于页面跳转;而在前后端分离项目中,我们不再需要跳转页面,而是直接返回 JSON 字符串给前端。要实现这一效果,核心注解为:@ResponseBody

// 方式1:注解加在方法上
@RequestMapping("/user")
@ResponseBody
public User getUser(){
    User user = new User();
    user.setName("李四");
    return user; // 框架自动转为JSON
}

@ResponseBody核心作用

告知 SpringMVC:不要使用视图解析器,也不要跳转页面!直接将返回对象转换为 JSON,写入响应体并返回给浏览器。 底层原理: 返回对象 → MappingJackson2HttpMessageConverter → Jackson 序列化 → JSON 字符串 → 输出到 response 响应体。

二、重点注解深度解析 @ResponseBody / @RestController

1. @ResponseBody 可以写在哪里?

两种合法位置:

  1. 写在Controller方法上:仅对当前方法生效
@Controller
public class UserController{
    @ResponseBody
    @RequestMapping("/user")
    public User getUser(){
        return new User();
    }
}
  1. 写在Controller类上:当前类中所有方法均生效
@Controller
@ResponseBody
public class UserController{
    // 所有方法返回值都会序列化为JSON,不再解析视图
}

2. @RestController 是什么?

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}

✅ 结论: @RestController = @Controller + @ResponseBody 标注在类上,表示当前 Controller 中所有方法默认直接返回 JSON,不进行视图跳转。

// 等价于 @Controller + @ResponseBody
@RestController
public class UserController{
    @RequestMapping("/user")
    public User getUser(){
        return new User();
    }
}

3. 高频面试区分:@Controller VS @RestController

  1. @Controller
    • 默认:方法返回字符串 = 视图名称,用于页面跳转
    • 若需返回 JSON,必须在方法上添加 @ResponseBody
  2. @RestController
    • 自带 @ResponseBody,所有方法默认直接返回 JSON

无法直接通过返回字符串跳转页面

如果在 RestController 中确实需要跳转页面,只能手动执行 forward 或 redirect

4. 极易踩坑的误区

误区1:@RestController 能否实现页面跳转?

不能直接 return 视图名称。 如果必须跳转:

// RestController中跳转写法
return "forward:/index";
return "redirect:/login";

误区2:同时使用 @ResponseBody 和 forward/redirect

@ResponseBody
public String test(){
    // 冲突!@ResponseBody会把"forward:/index"当成普通字符串直接返回给前端,不会执行转发
    return "forward:/index";
}

重点:添加了 @ResponseBody 的方法,返回 forward/redirect 前缀字符串会失效!若想实现转发或重定向,需要手动调用 response.sendRedirect,但这与 @ResponseBody 的语义矛盾,因此不推荐混用

误区3:@ResponseBody 可以解析 JSP 页面 不可能。@ResponseBody 的语义是「返回响应体数据,放弃视图解析」。

三、所有返回方式分类总结

类别A:服务端渲染(跳转页面,传统JSP/Thymeleaf)

  1. 返回视图名称 String(配合Model传数据)
  2. 返回 ModelAndView

控制器注解:@Controller,不能加 @ResponseBody

类别B:手动操控原生响应(void返回)

  1. response 输出内容
  2. 代码内手动 forward / redirect

适用于特殊场景,项目中不推荐大量使用

类别C:前后端分离(返回JSON,不跳转页面)

  1. @Controller + 方法上 @ResponseBody
  2. @RestController(内置 ResponseBody,直接返回实体对象)

四、一张表梳理所有场景

返回类型配套注解作用
String(普通视图名)@Controller走视图解析器,跳转页面
String(forward:/ redirect:/)@Controller转发/重定向
ModelAndView@Controller封装数据+视图,跳转页面
void@Controller需手动 response 输出/转发/重定向,否则返回404
实体类/集合@Controller + @ResponseBody自动序列化为JSON返回
实体类/集合@RestController全部方法默认返回JSON

五、选型建议

  1. 传统服务端渲染项目(页面模板) 建议使用 @Controller,返回视图名称,配合 Model 传递数据。
  2. 前后端分离项目(Vue/小程序) 统一使用 @RestController,方法直接返回实体或统一结果对象。
  3. 一个 Controller 中既有页面跳转,又有 JSON 接口 建议使用 @Controller,页面方法正常返回视图,接口方法单独添加 @ResponseBody。

以上就是 SpringMVC 多种响应返回方式详解的全部内容,希望对你的开发工作有所帮助。

来源:https://www.jb51.net/program/368321x4v.htm
上一篇SpringBoot整合Druid参数配置详细步骤 下一篇Ubuntu Java编译工具链完整选择方法详解与实操指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
用 pytest-benchmark 建立可复现的性能基线:从对比到回归
编程语言 · 2026-10-09

用 pytest-benchmark 建立可复现的性能基线:从对比到回归

本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。

Python数据清洗:缺失值处理与异常值检测
编程语言 · 2026-10-09

Python数据清洗:缺失值处理与异常值检测

系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理
编程语言 · 2026-10-09

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S

Redis 与 Memcached 选型指南:从架构差异到生产实践
编程语言 · 2026-10-09

Redis 与 Memcached 选型指南:从架构差异到生产实践

本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题

Linux服务器初始化:防火墙与SELinux策略配置
编程语言 · 2026-10-09

Linux服务器初始化:防火墙与SELinux策略配置

从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。