springBoot----@Controller和@RestController的区别

@Controller用于返回页面,配合视图解析器工作。而@RestController则相当于@Controller和@ResponseBody的组合,主要用于返回JSON等数据,不能返回jsp/html页面。使用@RestController注解的Controller方法会直接返回内容,无需加@ResponseBody。

@Controller和@RestController的区别

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页 面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回 的内容就是Return 里的内容。
  2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器 InternalResourceViewResolver才行。 如果需要返回JSON,XML或自定义 mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

例如:
1.使用@Controller 注解
在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面 若返回json等内容到页面,则需要加@ResponseBody注解
2.@RestController注解
相当于@Controller+@ResponseBody两个注解的结合。 返回json数据不需要在方法前面加@ResponseBody注解了 使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析 jsp,html页面

### Spring Boot中@RestController@Controller区别及使用场景 #### 一、基本概念 `@RestController` `@Controller` 均为 Spring MVC 中的核心注解,用于定义控制器类。然而,两者在功能应用场景上存在显著差异。 - **@Controller** `@Controller` 是一个标准的 Spring MVC 控制器注解,主要用于传统的 Web 应用开发。当方法返回字符串时,默认会解析为视图名称,并交由视图解析器处理,最终渲染成 HTML 页面展示给客户端[^1]。 - **@RestController** `@RestController` 实际上是 `@Controller` `@ResponseBody` 的组合注解。这意味着它不仅具备 `@Controller` 的功能,还自动将方法的返回值序列化为 JSON 或 XML 数据并直接写入 HTTP 响应体中,而不会通过视图解析器进行进一步处理[^2]。 #### 二、主要区别 | 特性 | @Controller | @RestContoller | |---------------------|--------------------------------------|------------------------------------| | 返回值 | 默认返回视图名 | 默认返回 JSON/XML 数据 | | 是否需要@ResponseBody | 需要显式添加 | 已内置,无需单独声明 | | 使用场景 | 传统 Web 应用,需返回页面 | RESTful API 开发,需返回数据 | 具体来说: - 当使用 `@Controller` 注解时,如果希望返回的是 JSON 数据而非视图,则需要额外加上 `@ResponseBody` 注解来实现这一点[^3]。 - 而对于 `@RestController` 来说,由于其本身已包含 `@ResponseBody` 的语义,因此可以直接简化代码结构,在开发 RESTful API 场景下显得更为高效直观[^4]。 #### 三、典型应用案例 以下是两个分别基于 `@Controller` `@RestController` 编写的简单例子: ##### 1. 使用@Controller的情况 适合于需要跳转到特定页面的应用场合。 ```java @Controller public class TraditionalWebController { @GetMapping("/home") public String home(Model model){ model.addAttribute("message", "Welcome to the Home Page!"); return "index"; // index.html or JSP file will be rendered. } } ``` ##### 2. 使用@RestController的情境 更倾向于提供纯粹的数据交互接口,比如供前端调用获取用户列表信息的服务端点。 ```java @RestController @RequestMapping("/api/users") public class UserController { private final List<User> users = Arrays.asList( new User(1, "Alice"), new User(2, "Bob") ); @GetMapping("") public List<User> getAllUsers(){ return this.users; } static class User{ int id; String name; public User(int id, String name){ this.id=id; this.name=name; } // Getters and Setters omitted for brevity... } } ``` #### 四、总结 综上所述,`@Controller` 更加适用于那些涉及前后端分离不明显或者仍然采用服务器端渲染技术的传统型网站;相对而言,随着微服务架构以及前后端完全独立趋势的发展壮大,越来越多的新建项目会选择利用 `@RestController` 构造轻量级REST风格API接口[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值