springmvc5的四个HandlerAdapter

本文解析了SpringMVC中四种非抽象HandlerAdapter的工作原理,包括SimpleServletHandlerAdapter、SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter及RequestMappingHandlerAdapter。重点介绍了它们如何处理不同的handler类型,并对返回值进行了分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springmvc5中有四个非抽象的HandlerAdapter:
1.SimpleServletHandlerAdapter
2.SimpleControllerHandlerAdapter
3.HttpRequestHandlerAdapter
4.RequestMappingHandlerAdapter
 
springmvc通过HandlerMapping将请求URL映射到handler,再将handler交给HandlerAdapter进行调用处理。
 
HandlerAdapter里重要的有两个方法:


supports()方法用来判断当前HandlerAdapter是否可以调用处理handler;
handle()方法用来调用handler,具体的来处理请求。
 
接下来对四个HandlerAdapter进行一一分析。
 
1.SimpleServletHandlerAdapter
SimpleServletHandlerAdapter可以处理类型为Servlet的handler,对handler的处理是调用Servlet的service方法处理请求。
看具体的配置和handler:

可以使用BeanNameUrlHandlerMapping将请求URL"/testServlet"和handler(Servlet1)相映射,使用SimpleServletHandlerAdapter调用处理成功:

 
2.SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter可以处理类型为Controller的handler,对handler的处理是调用Controller的handleRequest()方法。
Controller是springmvc的一个接口:

看具体的配置和handler:


可以使用BeanNameUrlHandlerMapping将请求URL"/testController"和handler(Controller1)相映射,使用SimpleControllerHandlerAdapter调用处理成功:

 
3.HttpRequestHandlerAdapter

HttpRequestHandlerAdapter可以处理类型为HttpRequestHandler的handler,对handler的处理是调用HttpRequestHandler的handleRequest()方法。
HttpRequestHandler是springmvc的一个接口:

 
看具体的配置和handler:


可以使用BeanNameUrlHandlerMapping将请求URL"/testHttpRequestHandler"和handler(HttpRequestHandler1)相映射,使用HttpRequestHandlerAdapter调用处理成功:

 
4.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter类代码相比之前三个HandlerAdapter,代码要复杂的多,这里只截取重要的部分:




RequestMappingHandlerAdapter可以处理类型为HandlerMethod的handler,对handler的处理是调用通过java反射调用HandlerMethod的方法。
看具体的配置和handler:


只有RequestMappingHandlerAdapter有order属性,其他三个HandlerAdapter没有order属性。前三个HandlerAdapter处理的handler类型各不相同,处理也比较简单,不需要使用order区分优先级。
使用RequestMappingHandlerMapping将请求URL"/test11"和handler(TestController.test2())相映射(需在方法上添加@RequestMapping注解),使用RequestMappingHandlerAdapter调用处理成功:

到这里,springmvc的四个HandlerAdapter就分析完了。前三个HandlerAdapter对handler的处理比较简单,HttpRequestHandlerAdapter和SimpleControllerHandlerAdapter直接调用固定唯一的方法handleRequest();
SimpleServletHandlerAdapter直接调用固定唯一的方法service()。
RequestMappingHandlerAdapter实现起来就很复杂了,处理调用的方法不唯一也不固定,需要有更多的处理。
 
在HandlerAdapter处理的返回值上,虽然统一的返回ModelAndView对象,但HttpRequestHandlerAdapter和SimpleServletHandlerAdapter实际上都是直接returnnull;
SimpleControllerHandlerAdapter返回handler(Controller)处理的结果,ModelAndView对象或者null;
RequestMappingHandlerAdapter是通过反射调用获取的结果,这个结果可能是ModelAndView对象,也可能是String类型对象,还可以是一个map等,需要对返回的结果做更多的判断处理,再返回统一的ModelAndView对象。
 
后面会对RequestMappingHandlerAdapter做更详细的分析。
 
### Spring MVC 四大核心组件详解 #### 1. DispatcherServlet 前端控制器 `DispatcherServlet` 是整个 Spring MVC 的前端控制器,负责接收所有的 HTTP 请求并分发给相应的处理器。它会根据请求的信息查找合适的处理器适配器和视图解析器,并最终返回响应结果给客户端[^1]。 ```java public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(AppConfig.class); container.addServlet("dispatcher", new DispatcherServlet(context)).addMapping("/"); } } ``` #### 2. HandlerMapping 处理器映射器 `HandlerMapping` 负责找到处理特定 URL 请求的目标对象(即 Controller)。通过 `@RequestMapping` 注解或其他方式指定的 URL 模式匹配规则来决定哪个控制器应该处理该请求。这使得开发者能够轻松地管理不同类型的请求路由逻辑[^4]。 ```java @Controller @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public String getUser(@PathVariable Long id, Model model) { // ... return "userView"; } } ``` #### 3. HandlerAdapter 处理器适配器 一旦 `HandlerMapping` 找到了具体的处理器实例之后,则由 `HandlerAdapter` 来调用这个处理器的方法执行实际业务操作。不同的处理器可能有不同的接口形式或参数列表,因此需要有一个统一的方式去调用它们——这就是 `HandlerAdapter` 的作用所在。 ```java // 这里展示的是如何创建一个简单的处理器适配器, // 实际应用中通常不需要手动编写此类代码。 class SimpleHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { /* ... */ } @Override public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { /* ... */ } @Override public long getLastModified(HttpServletRequest request, Object handler) { /* ... */ } } ``` #### 4. ViewResolver 视图解析器 当处理器完成数据处理后,可能会返回一个逻辑视图名称而不是完整的 HTML 页面内容。此时就需要 `ViewResolver` 将这些逻辑名转换成真实的物理视图资源(如 JSP 文件),以便渲染出最终要发送回浏览器的内容。 ```xml <!-- 配置 Thymeleaf 视图解析器 --> <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine"/> </bean> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值