@Controller
注解的作用
@Controller
是 Spring MVC 框架中的一个核心注解,用于标识一个类作为控制器(Controller)。当一个类被标记为 @Controller
时,它表示该类是处理Web请求的组件。以下是 @Controller
的主要作用:
-
识别为Spring Bean:
- 当Spring容器启动时,会扫描带有
@Controller
注解的类,并将它们注册为Spring管理的Bean。
- 当Spring容器启动时,会扫描带有
-
处理HTTP请求:
- 标记了
@Controller
的类可以包含多个方法来处理不同的HTTP请求。这些方法通常使用@RequestMapping
或其快捷方式(如@GetMapping
,@PostMapping
等)来指定处理特定URL路径和HTTP方法的规则。
- 标记了
-
与视图层交互:
- 控制器方法可以返回逻辑视图名称或
ModelAndView
对象,以便视图解析器能够选择正确的视图技术(如JSP、Thymeleaf等)进行渲染。
- 控制器方法可以返回逻辑视图名称或
-
数据绑定和验证:
- 控制器方法可以通过参数接收来自请求的数据,并利用Spring提供的数据绑定机制自动将请求参数映射到Java对象中。此外,还可以结合JSR-303/JSR-380规范进行数据验证。
-
支持依赖注入:
@Controller
类可以像其他Spring Bean一样接受依赖注入,这使得你可以轻松地将服务层组件或其他依赖项注入到控制器中,从而实现松耦合的设计。
思维导图结构
-
@Controller
注解- 作用
- 标识为Spring Bean
- 处理HTTP请求
- 与视图层交互
- 数据绑定和验证
- 支持依赖注入
- 工作流程
- Spring容器启动时扫描并注册为Bean
- 接收HTTP请求
- 查找处理器方法(通过
HandlerMapping
) - 调用处理器方法(通过
HandlerAdapter
) - 返回视图名称或
ModelAndView
- 视图解析器解析视图并渲染响应
- 配置
- XML配置
- JavaConfig配置
- 自动配置(Spring Boot)
- 作用
-
请求处理过程
- 用户发起HTTP请求
DispatcherServlet
接收到请求- 使用
HandlerMapping
找到对应的处理器方法 - 调用处理器方法处理请求
- 方法执行完毕后返回视图名称或数据
ViewResolver
解析视图名称为实际视图- 渲染视图并生成HTTP响应
代码示例
创建一个简单的控制器
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
// 添加数据到模型
model.addAttribute("message", "Hello, World!");
// 返回逻辑视图名
return "hello";
}
}
在这个例子中,HelloController
是一个常规控制器,它有一个处理器方法 hello()
来处理 /hello
URL 的GET请求。该方法向模型添加了一个消息属性,并返回了逻辑视图名 "hello"
,这将由视图解析器解析成实际的视图资源。
结合依赖注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ProductController {
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping("/products")
public String listProducts(Model model) {
// 使用注入的服务层组件来获取产品列表
model.addAttribute("products", productService.findAll());
return "productList";
}
}
这里展示了如何通过构造函数注入的方式引入服务层组件,使得控制器能够专注于处理HTTP请求而不必关心业务逻辑的具体实现。
返回JSON响应(可选)
如果你希望控制器直接返回JSON格式的数据而不是视图名称,可以考虑使用 @RestController
注解或者在 @Controller
中的方法上添加 @ResponseBody
注解:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/products")
public class ProductApiController {
private static final List<Product> products = Arrays.asList(
new Product(1L, "Product One"),
new Product(2L, "Product Two")
);
@GetMapping
public List<Product> getAllProducts() {
return products;
}
}
这段代码定义了一个RESTful风格的API端点,它会直接返回JSON格式的产品列表给客户端。
总结
@Controller
注解是Spring MVC架构的重要组成部分,它帮助开发者清晰地分离关注点,使代码更加模块化和易于维护。通过合理使用 @Controller
及其相关注解,我们可以构建高效且灵活的Web应用程序。