当前位置: 代码网 > it编程>编程语言>Java > SpringMVC多种响应返回方式详解

SpringMVC多种响应返回方式详解

2026年07月30日 Java 我要评论
学习 springmvc 的过程会有一些疑问:controller 方法到底能怎么返回数据?不同返回形式底层流程有什么区别?什么时候页面404?@responsebody 加在哪里?@restcont

学习 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多种响应返回方式的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com