注解控制器 (Annotated Controllers)
Spring MVC 提供了一种基于注解的编程模型,其中 @Controller 和 @RestController 组件使用注解来表达请求映射、请求输入、异常处理等。注解控制器具有灵活的方法签名,不需要扩展基类也不需要实现特定的接口。
以下是一个由注解定义的控制器示例:
java
@Controller
public class HelloController {
@GetMapping("/hello")
public String handle(Model model) {
model.addAttribute("message", "Hello World!");
return "index";
}
}kotlin
import org.springframework.ui.set
@Controller
class HelloController {
@GetMapping("/hello")
fun handle(model: Model): String {
model["message"] = "Hello World!"
return "index"
}
}在上面的示例中,方法接受一个 Model 并将视图名称作为 String 返回,但还存在许多其他选项。
补充教学
1. 为什么“注解”改变了开发方式?
在 Spring 2.5 之前,你需要实现 Controller 接口并重写 handleRequest 方法。
- 痛点:每个类只能处理一个 URL,且强耦合于 Servlet API。
- 变革:注解模型的引入使得一个普通 Java 对象(POJO)就能变身控制器。你可以在一个类里定义多个处理方法,这极大地提高了代码的组织效率。
2. @Controller vs @RestController
这是初学者最容易混淆的地方:
- @Controller:用于传统的 Web 页面开发。它返回一个字符串,Spring 会通过
ViewResolver找到对应的 HTML/JSP 模板进行渲染。 - @RestController:它是
@Controller+@ResponseBody的结合体。专门用于构建 RESTful API。它的所有方法返回值都会直接通过HttpMessageConverter写入响应体(通常转为 JSON),而不是去寻找视图。
3. 如何选择?
- 如果你在写 单页应用(SPA) 的后端(如 Vue/React),请统统使用
@RestController。 - 如果你在写 传统的服务端渲染项目(如 Thymeleaf/FreeMarker),则使用
@Controller。