Spring-MVC响应

在 SpringMVC 开发中,控制器 (Controller) 处理完请求后需要向客户端返回响应结果,常见的响应方式有多种。本文基于实际代码案例,总结 SpringMVC 中常用的响应处理方式

一、通过 ModelAndView 响应

ModelAndView 是 SpringMVC 提供的一个模型视图对象,既能携带数据,又能指定视图名称。

java 复制代码
@RequestMapping("/save")
public ModelAndView save(){
    // 创建ModelAndView对象
    ModelAndView mv = new ModelAndView();
    // 添加数据到模型(相当于request.setAttribute())
    mv.addObject("msg","save success");
    // 设置视图名称(会根据视图解析器规则查找对应的视图)
    mv.setViewName("suc");
    return mv;
}

特点:

  • 可以同时携带数据和视图信息
  • 适用于需要返回页面并展示数据的场景
  • 数据会被存放到 request 域中

二、通过 Servlet API 响应

SpringMVC 支持直接使用 HttpServletRequest 和 HttpServletResponse 对象进行响应处理,这是对 Servlet 原生方式的兼容。

1. 直接输出响应内容

java 复制代码
@RequestMapping("test1")
public void test1(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 设置响应内容类型和编码
    response.setContentType("text/json;charset=utf-8");
    // 直接输出JSON字符串
    String json = "{\"id\":\"1\"}";
    response.getWriter().write(json);
}

2. 请求转发

java 复制代码
@RequestMapping("test2")
public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    // 向request域中添加数据
    request.setAttribute("password","123123");
    // 转发到其他请求
    request.getRequestDispatcher("/dept/test3").forward(request,response);
    // 也可以转发到静态资源
    // request.getRequestDispatcher("/html/suc.html").forward(request,response);
}

3. 重定向

java 复制代码
@RequestMapping("/test4")
public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 重定向到其他请求
    response.sendRedirect("/MVC/dept/test5");
    // 也可以重定向到静态资源
    // response.sendRedirect("/MVC/html/suc.html");
}

特点:

  • 完全兼容 Servlet 原生 API
  • 适合熟悉 Servlet 开发的开发者
  • 请求转发和重定向需要手动处理路径问题

三、通过返回字符串实现转发和重定向

SpringMVC 提供了更简洁的方式实现请求转发和重定向,通过返回特定格式的字符串即可。

1. 直接返回视图路径

java 复制代码
@RequestMapping("/test6")
public String test6(){
    // 直接返回视图路径,默认是请求转发
    return "/html/suc.html";
}

2. 显式请求转发

java 复制代码
@RequestMapping("/test7")
public String test7(){
    // 使用forward:前缀表示请求转发
    return "forward:/html/suc.html";
}

3. 显式重定向

java 复制代码
@RequestMapping("/test8")
public String test8(){
    // 使用redirect:前缀表示重定向
    return "redirect:/html/suc.html";
}

特点:

  • 代码更简洁,无需直接操作 Servlet API
  • 通过特定前缀 (forward:/redirect:) 明确指定跳转方式
  • 路径处理更方便,无需手动拼接上下文路径

四、返回 JSON 数据

在前后端分离架构中,后端通常需要返回 JSON 格式的数据,SpringMVC 提供了 @ResponseBody 注解实现这一功能。

1. 手动返回 JSON 字符串

java 复制代码
@RequestMapping("/test9")
@ResponseBody  // 表示返回的字符串是响应体内容,而非视图名称
public String test9(){
    String json = "{\"id\":1,\"name\":\"test1\"}";
    return json;
}

2. 自动转换对象为 JSON

java 复制代码
@RequestMapping("/test10")
@ResponseBody   // 需要引入jackson相关依赖
public User test10(){
    User user = new User();
    user.setName("test10");
    user.setPassword("123456");
    // SpringMVC会自动将对象转换为JSON格式
    return user;
}

所需依赖(pom.xml 中配置):

XML 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.0</version>
</dependency>

特点:

  • @ResponseBody 注解用于标识方法返回值作为响应体

  • 结合 Jackson 依赖可实现 Java 对象到 JSON 的自动转换

  • 适用于 Ajax 请求和前后端分离场景

    总结

    SpringMVC 提供了多种灵活的响应方式,可根据实际业务场景选择:

  • ModelAndView:适合需要返回视图并携带数据的场景

  • Servlet API:适合需要直接操作请求响应对象的场景

  • 字符串返回值:简洁实现页面跳转(转发 / 重定向)

  • @ResponseBody:适合返回 JSON 数据,满足前后端分离需求

相关推荐
君顾18 分钟前
折扣卡 CPS 小程序定制:从业务流程到系统架构的实践指南
java·开发语言·折扣卡
见不散11 分钟前
GPT-5.6 Luna (Batch) 批量处理能力深度评测
java·gpt·batch
计算机毕设定制辅导-无忧学长28 分钟前
《基于SpringBoot的庭院玫瑰栽培养护知识交互式科普平台设计与实现》
java·spring boot·后端·毕业设计·个性化推荐·协同过滤算法·庭院玫瑰栽培养护知识科普平台
大模型码小白44 分钟前
Harness Engineering 驾驭工程:从使用到项目实战
大数据·数据库·人工智能·python·spring
Json____1 小时前
从零构建家政服务平台:一套全栈架构如何打通管理端与移动端-java-springboot
java·spring boot·后端·架构·毕设·wwwoop.com
云雀衔光2 小时前
Java Spring AI MCP:在 Spring 里把 AI 接上你的业务系统
java·开发语言·人工智能·后端·测试工具·spring
重生之小比特2 小时前
【Java SE】数据类型与变量
java·开发语言·python
苏渡苇2 小时前
Spring Insight 里如何对 Span 进行清洗
java·spring boot·后端·spring·系统监控
find1star2 小时前
LeetCode 54:螺旋矩阵——用四个边界模拟矩阵收缩
java·算法·leetcode·边缘计算·学习方法
Yeniden2 小时前
Java 后端从零到企业级:第1篇 Java 基础语法——变量、数据类型与运算符
java·开发语言·apache