地基注解@Controller和@RestController区别

前记:基础啊,区别点重点理解;

在Spring和Spring Boot框架中,@Controller@RestController都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明:


1. 核心区别

特性@Controller@RestController
用途传统Web应用(返回视图名称)RESTful API(直接返回数据,如JSON/XML)
响应处理默认返回视图名称,需配合@ResponseBody返回数据自动将返回值序列化为HTTP响应体(内置@ResponseBody
视图解析器需要视图解析器(如JSP、Thymeleaf)不需要视图解析器,直接返回数据
组合注解@Controller + @ResponseBody

2. @Controller 用法示例

场景:传统Web应用,返回HTML视图。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class WebController {
    
    // 返回视图名称(由视图解析器处理,如Thymeleaf)
    @GetMapping("/home")
    public String home() {
        return "home"; // 对应src/main/resources/templates/home.html
    }

    // 需要显式添加@ResponseBody返回数据
    @GetMapping("/data")
    @ResponseBody
    public String getData() {
        return "Hello from @Controller!";
    }
}
说明
  • return "home":视图解析器会查找home.html模板并渲染。
  • @ResponseBody:强制将返回值作为响应体(不经过视图解析器)。

3. @RestController 用法示例

场景:REST API,直接返回JSON数据。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {

    // 自动将User对象序列化为JSON
    @GetMapping("/user")
    public User getUser() {
        return new User("Alice", 30);
    }

    // 直接返回字符串
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello from @RestController!";
    }
}

// 简单POJO类
class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 省略getter/setter
}
说明
  • 所有方法默认使用@ResponseBody,返回值直接写入HTTP响应体。
  • 返回对象会被自动序列化为JSON(需Jackson库支持,Spring Boot默认包含)。

4. 关键总结

  • 使用@Controller

    • 适合需要服务端渲染的页面(如JSP、Thymeleaf)。
    • 若返回数据,必须配合@ResponseBody
  • 使用@RestController

    • 专为REST API设计,直接返回数据(无需视图解析)。
    • 简化代码,避免重复使用@ResponseBody

5. 常见HTTP方法注解

两者均可使用@GetMapping@PostMapping等快捷注解:

// 在@Controller或@RestController中均可使用
@PostMapping("/create")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // 处理创建逻辑
    return ResponseEntity.ok("User created!");
}

通过合理选择@Controller@RestController,可以高效构建传统Web应用或现代RESTful API。

(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值