Skip to content

注解控制器 (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

Based on Spring Framework.