@restcontroller和@controller区别
时间: 2025-03-05 19:28:23 浏览: 48
### Spring Boot `@RestController` vs `@Controller` 注解区别及用法
#### 区分注解功能
`@RestController` 和 `@Controller` 都是用于定义控制器层组件的关键注解,然而两者有着不同的应用场景和特性。
- **`@Controller` 注解**
这一注解通常应用于传统的 MVC 控制器场景,在这种情况下,返回视图名称并携带模型数据给前端页面。为了实现 RESTful API 接口响应 JSON 或 XML 数据的需求,则需额外配合 `@ResponseBody` 来指定方法返回的内容直接写入 HTTP 响应体中[^1]。
- **`@RestController` 注解**
此注解专为开发 RESTful Web Service 设计,其内部已经包含了 `@Controller` 和 `@ResponseBody` 的效果,因此当使用此注解时无需再单独声明 `@ResponseBody` 即可让方法返回的对象自动序列化成 JSON 或者 XML 形式的字符串作为 HTTP Response Body 返回给客户端[^3]。
#### 实际应用案例展示
下面通过具体的代码实例来进一步说明两者的不同之处:
##### 使用 `@Controller`
```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyWebController {
@GetMapping("/hello")
public String hello(Model model){
model.addAttribute("message", "Hello, world!");
return "index"; // 返回模板名
}
}
```
在这个例子中,`MyWebController` 类被标记为 `@Controller` 并且有一个处理 GET 请求的方法 `/hello` 。该方法向 Model 添加了一个属性 message 后返回一个逻辑视图名为 `"index"` ,这表明服务器端会渲染相应的 JSP/Thymeleaf 页面并将其中的数据填充进去显示给用户。
##### 使用 `@RestController`
```java
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/greetings")
public class GreetingApiController {
@GetMapping("/{name}")
public ResponseEntity<Greeting> greet(@PathVariable String name) {
var greeting = new Greeting(String.format("Hello %s!", name));
return ResponseEntity.ok(greeting);
}
}
class Greeting{
private final String content;
public Greeting(String content) { this.content = content; }
public String getContent() { return content; }
}
```
这里展示了如何利用 `@RestController` 创建 RESTful API 接口。每当收到匹配路径模式 `/api/v1/greetings/{name}` 下的请求时就会调用对应的方法,并将结果对象转换成 JSON 格式发送回客户端。
阅读全文
相关推荐
















