当前位置: 首页 > news >正文

@Controller 与 @RestController-笔记

1.@Controller@RestController对比

Spring MVC 中 @Controller 与 @RestController 的功能对比:

  • @Controller是Spring MVC中用于标识一个类作为控制器的标准注解。它允许处理HTTP请求,并返回视图名称通常和视图解析器一起使用来渲染页面
  • 而@RestController是Spring 4.0引入的,它结合了@Controller和@ResponseBody两个注解的功能,主要用于构建RESTful Web服务,直接返回响应体数据,比如JSON或XML,而不是视图。
注解功能描述
@Controller标识一个类为 Spring MVC 控制器,处理 HTTP 请求并返回视图名称 或 ModelAndView
@RestController组合注解,等效于 @Controller + @ResponseBody,返回值直接写入 HTTP 响应体(如 JSON/XML),不经过视图解析器

 @Controller 与 @RestController 的关键区别:

特性@Controller@RestController
返回值类型通常返回视图名称(String)或 ModelAndView返回任意对象(如 POJO),自动序列化为 JSON/XML
是否需要视图解析器✅ 是(需配合模板引擎如 Thymeleaf)❌ 否(直接写入响应体)
是否自动添加 @ResponseBody❌ 否✅ 是
适用场景传统服务端渲染网页(如 JSP/Thymeleaf)构建 RESTful API(前后端分离项目)

2. 使用示例

2.1 代码演示

准备工作:下面代码演示所需的 User 实体类定义如下

public class User {private String name;private String email;// 构造方法、Getter 和 Setterpublic User(String name, String email) {this.name = name;this.email = email;}// Getter 和 Setter 省略
}

2.1.1 使用 @Controller 

使用 @Controller 返回String类型的视图名称 或 ModelAndView:

@Controller
public class ViewController {//case1.处理请求并返回视图名称 userProfile(对应 templates/userProfile.html)@GetMapping("/user/{id}")public String getUserProfile(@PathVariable String id, Model model) {User user = new User("Alice", "alice@example.com");model.addAttribute("user", user); // 将数据传递给视图return "userProfile"; // 返回视图名称}//case2.处理请求并返回ModelAndView@GetMapping("/userV2/{id}")public ModelAndView getUser(@PathVariable String id) {User user = new User("Alice", "alice@example.com");ModelAndView modelAndView = new ModelAndView("userProfile");modelAndView.addObject("user", user);return modelAndView;}
}

其中,视图文件(src/main/resources/templates/userProfile.html)定义如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"><body><h1>User Profile</h1><p>Name: <span th:text="${user.name}"></span></p><p>Email: <span th:text="${user.email}"></span></p></body>
</html>

访问路径GET http://localhost:8080/user/1
输出:渲染后的 HTML 页面,显示用户信息。

2.1.2 使用 @RestController

使用 @RestController 返回 JSON:

@RestController
@RequestMapping("/api")
public class UserController {// 处理请求并返回 JSON 数据@GetMapping("/user/{id}")public User getUser(@PathVariable String id) {return new User("Bob", "bob@example.com"); // 直接返回对象}
}

访问路径GET http://localhost:8080/api/user/1

输出:JSON

{"name": "Bob","email": "bob@example.com"
}

2.2 使用说明

2.2.1 核心处理流程对比

处理步骤@Controller@RestController
请求映射@RequestMapping 或 @GetMapping 等@RequestMapping 或 @GetMapping 等
返回值处理返回视图名称或ModelAndView,需视图解析器渲染返回对象,自动序列化为 JSON/XML
数据传递通过 Model 参数传递数据给视图无需 Model,直接返回数据对象
依赖组件视图解析器(ViewResolver)、模板引擎HttpMessageConverter(如 Jackson)

2.2.2 适用场景建议

  • 使用 @Controller 的场景
    • 传统 Web 应用,服务端渲染 HTML 页面。
    • 需要结合模板引擎(如 Thymeleaf、JSP)。
  • 使用 @RestController 的场景
    • 构建前后端分离的 RESTful API。
    • 返回 JSON/XML 数据给前端(如 Vue/React 应用)。
    • 微服务架构中的服务间通信。

2.2.3. 补充说明

  • @RestController 是 Spring 4.0 引入的,简化了 RESTful API 的开发。
  • 若需在 @Controller 中返回 JSON 数据,可单独添加 @ResponseBody 注解到方法或类级别:
    • @Controller
      public class MixedController {@GetMapping("/user/json")@ResponseBodypublic User getUserAsJson() {return new User("Charlie", "charlie@example.com");}
      }
      

相关文章:

  • 斜率变化策略
  • 在星河社区学习PARL使用强化学习来训练AI
  • [python] python静态方法,类方法,实例方法实现及其区别
  • 【嵌入式开发-按键扫描】
  • 某智能家电龙头,社招 校招全面应用 AI 面试的创新实践
  • 【Lua】java 调用redis执行 lua脚本
  • 【证书与信任机制​】自签名证书的风险与适用场景​​
  • 【Python 异常处理】
  • 梯度优化提示词:模型生成精准回答的秘密
  • 青蛙跳杯子--bfs最短路
  • 普通IT的股票交易成长史--20250514复盘
  • 基于GPUGEEK 平台进行深度学习
  • 高德地图在Vue3中的使用方法
  • vue3实现JSON格式化和JSONPath提取功能
  • 最大熵逆强化学习
  • Seata源码—2.seata-samples项目介绍
  • OrangePi Zero 3学习笔记(Android篇)9 - I2C和从设备
  • C++类和对象--高阶
  • 【C++】类与对象【下】
  • “智”造升级:金众诚如何赋能重型机械企业高效项目管理?
  • 巴基斯坦与印度停火延长至18日
  • 30平米的无障碍酒吧里,我们将偏见折叠又摊开
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 冰雹造成车损能赔吗?如何理赔?机构答疑
  • 上海北外滩,未来五年将如何“长个子”“壮筋骨”?
  • 习近平出席中拉论坛第四届部长级会议开幕式并发表主旨讲话