@Controller注解的作用 ?思维导图 代码示例(java 架构)

@Controller 注解的作用

@Controller 是 Spring MVC 框架中的一个核心注解,用于标识一个类作为控制器(Controller)。当一个类被标记为 @Controller 时,它表示该类是处理Web请求的组件。以下是 @Controller 的主要作用:

  1. 识别为Spring Bean

    • 当Spring容器启动时,会扫描带有 @Controller 注解的类,并将它们注册为Spring管理的Bean。
  2. 处理HTTP请求

    • 标记了 @Controller 的类可以包含多个方法来处理不同的HTTP请求。这些方法通常使用 @RequestMapping 或其快捷方式(如 @GetMapping, @PostMapping 等)来指定处理特定URL路径和HTTP方法的规则。
  3. 与视图层交互

    • 控制器方法可以返回逻辑视图名称或 ModelAndView 对象,以便视图解析器能够选择正确的视图技术(如JSP、Thymeleaf等)进行渲染。
  4. 数据绑定和验证

    • 控制器方法可以通过参数接收来自请求的数据,并利用Spring提供的数据绑定机制自动将请求参数映射到Java对象中。此外,还可以结合JSR-303/JSR-380规范进行数据验证。
  5. 支持依赖注入

    • @Controller 类可以像其他Spring Bean一样接受依赖注入,这使得你可以轻松地将服务层组件或其他依赖项注入到控制器中,从而实现松耦合的设计。

思维导图结构

  1. @Controller 注解

    • 作用
      • 标识为Spring Bean
      • 处理HTTP请求
      • 与视图层交互
      • 数据绑定和验证
      • 支持依赖注入
    • 工作流程
      • Spring容器启动时扫描并注册为Bean
      • 接收HTTP请求
      • 查找处理器方法(通过HandlerMapping
      • 调用处理器方法(通过HandlerAdapter
      • 返回视图名称或ModelAndView
      • 视图解析器解析视图并渲染响应
    • 配置
      • XML配置
      • JavaConfig配置
      • 自动配置(Spring Boot)
  2. 请求处理过程

    • 用户发起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应用程序。

08-21 299
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值