1. @Controller 注解
@Controller是传统的Spring MVC控制器注解,主要用于返回视图页面。(因为现在都是前后端分离了,所以一般不用这个了)
关键点要点:
- 视图解析: 方法返回的是视图名称(比如页面模板的名称),而不是直接的数据。
- 灵活性: 这个注解不仅可以返回视图,还可以返回JSO对象,只需要搭配@ResponseBody使用即可。
示例代码:
@Controller
public class MyController {
//方法1
@RequestMapping("/hello")
public String hello(Model model) {
// 向页面传递数据
model.addAttribute("message", "Hello, Spring MVC!");
// 返回视图名称(对应的模板文件,比如 hello.html 或 hello.jsp)
return "hello";
}
//方法二
// 直接跳转到login.html页面
@RequestMapping("/login")
public String welcomePage() {
// 返回视图名称,对应资源文件比如 welcome.html 或 welcome.jsp
return "redirect:/login.html";
}
//方法三
// 如果你想在@Controller中直接返回JSON数据,需要使用@ResponseBody
@RequestMapping("/data")
@ResponseBody
public Map<String, String> data() {
Map<String, String> result = new HashMap<>();
result.put("message", "This is a JSON response");
return result;
}
}
- 方法一:将其解析为视图名称;
- 方法二:直接重定向到指定页面。(redirect:/ 后的文件必须在static目录下,否则前端会报错:
404
!) - 方法三:则通过@ResponseBody可以自动把对象转换成JSON数据。这样做虽然灵活,但每个需要返回JSON的方法都必须手动添加@ResponseBody(也可以直接返回字符串)
2. @RestController 注解
@RestController是专为构建RESTful API而设计的,它的本质其实是@Controller和@ResponseBody的结合体。
@RestController = @Controller + ResponseBody
优点:
- 自动序列化: 方法返回的对象会自动转换为JSON(或XML,视配置而定)。
- 简化开发: 不需要在每个方法上都添加@ResponseBody,减少了重复代码。
- 明确语义: 当接口的主要目的是提供数据服务时,@RestController能够更准确地表达开发者的意图。
美中不足:
当使用@RestController后,此注解下的方法都不能解析视图界面了,只能返回数据。
示例代码:
@RestController
public class MyRestController {
@RequestMapping("/greet")
public Map<String, String> greet() {
Map<String, String> result = new HashMap<>();
result.put("message", "Hello, RESTful API!");
return result;
}
}
上面的代码中,我们只需要使用@RestController,方法返回的Map对象会被自动转换成JSON格式输出,开发者不需要额外标注@ResponseBody。
3. 具体选择使用哪一个?
由于当下,许多项目都是前后端分离的,所以直接用Controller的很少(它可以用于后端进行视图渲染),所以建议用RestController。不过这也不是绝对的,依据情况灵活判断即可。