Spring MVC框架以其优雅的设计和强大的功能,为开发Web应用程序提供了坚实的基石。其中,Controller与HandlerAdapter作为核心组件,共同承担了接收用户请求、执行业务逻辑以及生成响应的重任。它们紧密配合,实现了请求处理流程的解耦与灵活性。以下是对这两个组件的详细阐述,并辅以示例代码说明。
Controller(控制器)
Controller是Spring MVC体系中的关键角色,负责接收和处理客户端的HTTP请求,执行业务逻辑,并决定如何向客户端返回响应。它通常是一个Java类,通过实现org.springframework.stereotype.Controller接口或使用该注解进行标识。Controller类中的方法,即所谓的处理器方法,通过注解如@RequestMapping、@PostMapping等指定其对应的请求路径和HTTP方法。
Java1import org.springframework.stereotype.Controller;
2import org.springframework.web.bind.annotation.GetMapping;
3import org.springframework.web.bind.annotation.PostMapping;
4import org.springframework.web.bind.annotation.RequestParam;
5import org.springframework.web.servlet.ModelAndView;
6
7@Controller
8public class GreetingController {
9
10 @GetMapping("/greet")
11 public ModelAndView sayHello(@RequestParam("name") String name) {
12 String message = "Hello, " + name + "!";
13
14 // 创建ModelAndView对象,封装视图名和模型数据
15 ModelAndView modelAndView = new ModelAndView("greeting");
16 modelAndView.addObject("message", message);
17
18 return modelAndView;
19 }
20
21 @PostMapping("/submitForm")
22 public String processForm(UserForm userForm) {
23 // 执行业务逻辑,如保存用户信息到数据库
24 userService.save(userForm);
25
26 // 返回逻辑视图名,由ViewResolver解析为实际视图
27 return "confirmation";
28 }
29}
HandlerAdapter(处理器适配器)
HandlerAdapter是Spring MVC中用于调用Controller处理器方法的中介组件。它实现了对各种不同类型的处理器(如实现了Controller接口的类、使用注解的类等)的统一访问接口。通过适配器模式,DispatcherServlet无需关注处理器的具体实现细节,只需通过HandlerAdapter与其交互。
HandlerAdapter接口定义了几个关键方法:
- supports(Object handler):判断该适配器是否支持给定的处理器对象。
- handle(HttpServletRequest request, HttpServletResponse response, Object handler):实际执行处理器方法,处理请求并生成响应。返回一个ModelAndView对象或直接写入响应。
Spring MVC提供了多种HandlerAdapter实现,如:
- RequestMappingHandlerAdapter:适用于基于注解的处理器方法,如使用@Controller和@RequestMapping的类。
- HttpRequestHandlerAdapter:适用于实现了HttpRequestHandler接口的处理器。
在请求处理流程中,DispatcherServlet首先通过HandlerMapping找到对应的处理器(Controller),然后选择合适的HandlerAdapter来执行处理器方法。HandlerAdapter负责解析请求参数、调用方法、处理返回值,并可能参与视图渲染的过程。
Java1// 简化的HandlerAdapter接口示例
2public interface HandlerAdapter {
3
4 boolean supports(Object handler);
5
6 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
7}
协同工作
当客户端发起一个请求时,DispatcherServlet按照以下步骤与Controller和HandlerAdapter协作:
- DispatcherServlet接收请求,查询HandlerMapping以确定匹配的Controller和处理器方法。
- 根据选定的处理器,DispatcherServlet从已注册的HandlerAdapter集合中选择一个支持该处理器的适配器。
- 调用选中的HandlerAdapter的handle()方法,传入请求、响应和处理器对象。
- HandlerAdapter根据处理器类型解析请求、调用相应的处理器方法,并处理返回值(如ModelAndView)。
- 若返回的是ModelAndView,DispatcherServlet将模型数据传递给ViewResolver解析为实际视图,然后渲染视图并填充数据,生成最终的HTTP响应。
- DispatcherServlet将响应发送回客户端。
综上所述,Controller作为业务逻辑的载体,定义了如何响应特定HTTP请求,而HandlerAdapter则充当了DispatcherServlet与Controller之间的桥梁,负责透明地调用处理器方法并处理其返回值。二者携手合作,构成了Spring MVC请求处理流程的核心部分,实现了Web应用逻辑与表示层的清晰分离和灵活配置。
本文暂时没有评论,来添加一个吧(●'◡'●)