SpringMVC多种响应返回方式详解

 更新时间:2026年07月30日 09:05:02   作者:月落归舟  
学习 SpringMVC 的过程会有一些疑问:Controller 方法到底能怎么返回数据?不同返回形式底层流程有什么区别?本文基于传统服务端渲染(JSP/模板引擎)+ 前后端分离两种场景,说一下各种返回形式,需要的朋友可以参考下

学习 SpringMVC 的过程会有一些疑问:Controller 方法到底能怎么返回数据?不同返回形式底层流程有什么区别?什么时候页面404?@ResponseBody 加在哪里?@RestController 原理是什么?

本文基于传统服务端渲染(JSP/模板引擎)+ 前后端分离两种场景,说一下各种返回形式:

一、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":代表重定向,不再走视图解析器

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}");

缺点:原生ServletAPI,代码繁琐,项目中不推荐大规模使用。

(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,但是不支持(因为很矛盾)

误区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多种响应返回方式详解的详细内容,更多关于SpringMVC多种响应返回方式的资料请关注脚本之家其它相关文章!

相关文章

  • 关于java String中intern的深入讲解

    关于java String中intern的深入讲解

    这篇文章主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 基于CyclicBarrier和CountDownLatch的使用区别说明

    基于CyclicBarrier和CountDownLatch的使用区别说明

    这篇文章主要介绍了基于CyclicBarrier和CountDownLatch的使用区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • jvm类加载器基础解析

    jvm类加载器基础解析

    这篇文章主要介绍了jvm类加载器基础解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Springboot3+Redis实现消息队列的多种方法小结

    Springboot3+Redis实现消息队列的多种方法小结

    本文主要介绍了Springboot3+Redis实现消息队列的多种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Spring boot+beetl+i18n国际化处理的方法

    Spring boot+beetl+i18n国际化处理的方法

    这篇文章主要介绍了Spring boot+beetl+i18n国际化处理的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解SpringMVC重定向传参数的实现

    详解SpringMVC重定向传参数的实现

    本篇文章主要介绍了详解SpringMVC重定向传参数的实现,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交。有兴趣的可以了解一下。
    2017-01-01
  • 如何动态替换Spring容器中的Bean

    如何动态替换Spring容器中的Bean

    这篇文章主要介绍了如何动态替换Spring容器中的Bean,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • springboot集成screw反向生成数据库说明文档

    springboot集成screw反向生成数据库说明文档

    screw是一个一键式生成数据库文档的开源工具包,目前screw可以生成word、md和html格式类的文档,本文主要来讲讲如何通过screw反向生成数据库说明文档,感兴趣的可以了解下
    2025-01-01
  • SSH框架网上商城项目第3战之使用EasyUI搭建后台页面框架

    SSH框架网上商城项目第3战之使用EasyUI搭建后台页面框架

    SSH框架网上商城项目第3战之使用EasyUI搭建后台页面框架,讨论两种搭建方式:基于frameset和基于easyUI,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论