您的位置:首页 >SpringMVC多种响应返回方式详解
发布于2026-07-30 阅读(0)
扫一扫,手机访问
这几天后台收到不少关于 SpringMVC 返回方式的提问,问题集中在几个点上:Controller 方法到底能怎么返回数据?不同返回形式底层流程有什么区别?什么时候页面会404?@ResponseBody 加在哪里?@RestController 原理是什么?
今天这篇文章,就围绕传统服务端渲染(JSP/模板引擎)和前后端分离两种场景,系统梳理一下 SpringMVC 的各类返回形式。
@RequestMapping("/index")
public String index(){
// 返回视图名
return "index";
}
✅ 执行流程:
index/WEB-INF/index.jsp)Model 中存放的数据带到页面默认规则:返回字符串 = 视图名称 特殊前缀:
return "forward:/page":代表请求转发,不再走视图解析器return "redirect:/login":代表重定向,不再走视图解析器
@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一旦执行,不要再次返回视图名称,也不要重复输出响应,会抛出异常。
ModelAndView = Model(数据) + View(视图名称)
@RequestMapping("/list")
public ModelAndView list(){
ModelAndView mv = new ModelAndView();
mv.addObject("name","张三"); // 存入request域,页面可以获取
mv.setViewName("list"); // 设置视图名称
return mv;
}
特点:把数据和视图封装在同一个对象,老式项目使用较多;现代开发更推荐 Model + String 返回形式。
@RequestMapping("/list")
public String list(Model model){
model.addAttribute("name","张三");
return "list"; // 视图名称
}
Model:用来向request域存放页面需要的数据上面4种全部是服务端渲染,跳转页面; 前后端分离项目,我们不需要跳转页面,而是直接返回JSON字符串给前端。 想要实现这个效果,核心注解:@ResponseBody
// 方式1:注解加在方法上
@RequestMapping("/user")
@ResponseBody
public User getUser(){
User user = new User();
user.setName("李四");
return user; // 框架自动转为JSON
}
告诉SpringMVC:不要使用视图解析器、不要跳转页面!直接把返回对象转为JSON,写入响应体返回浏览器。 底层原理: 返回对象 → MappingJackson2HttpMessageConverter → Jackson序列化 → JSON字符串 → 输出到response响应体。
两种合法位置:
@Controller
public class UserController{
@ResponseBody
@RequestMapping("/user")
public User getUser(){
return new User();
}
}
@Controller
@ResponseBody
public class UserController{
// 所有方法返回值都会序列化为JSON,不再解析视图
}
@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();
}
}
@Controller
@RestController无法直接通过返回字符串跳转页面
如果RestController里一定要跳转页面,只能手动forward/redirect
误区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的语义就是「返回响应体数据,放弃视图解析」。
控制器注解:
@Controller,不能加@ResponseBody
适合特殊场景,项目不推荐大量使用
| 返回类型 | 配套注解 | 作用 |
|---|---|---|
| String(普通视图名) | @Controller | 走视图解析器,跳转页面 |
| String(forward:/ redirect:/) | @Controller | 转发/重定向 |
| ModelAndView | @Controller | 封装数据+视图,跳转页面 |
| void | @Controller | 需要手动response输出/转发/重定向,否则404 |
| 实体类/集合 | @Controller + @ResponseBody | 自动序列化为JSON返回 |
| 实体类/集合 | @RestController | 全部方法默认返回JSON |
@Controller,返回视图名称,配合Model传递数据。@RestController,方法直接返回实体、统一结果对象。@Controller,页面方法正常返回视图,接口方法单独加上 @ResponseBody。以上就是SpringMVC多种响应返回方式详解的全部内容,希望对你有帮助。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8