一、handlerAdapter类
1、handlerAdapter简介
在前面我们已经分析了通过HandlerMapping(处理器映射器)将请求映射到了对应的Handler上,下面就需要考虑如何解析并执行该handler对象,这里HandlerAdapter(处理器适配器)就登场了,我直接解析调用handler不就行了为啥还要使用HandlerAdapter包装一层呢?在之前的分析中我们了解到了两种类型的handler对象。
(1)以实现了Controller接口的Handler类
public class DemoController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("进入DemoController方法执行处理逻辑");
return new ModelAndView("demo");
}
}
(2)以@RequestMapping注解修饰的HandlerMethod对象
@RequestMapping(value = "/book/ListPage",method = RequestMethod.POST)
@ResponseBody
public String getBookPage(@RequestBody BookQuery bookQuery){
return success(pageTotal(pageInfo));
}
(3)其他类型Handler对象
其他还有实现Servlet的实例,HandlerFunction实例、HttpRequestHandler实例等,不同的实例对象调用时走不同的方法,为了能将不同的方法转换成统一的调用形式,这里使用了适配器模式,将各个实例的方法调用包装到HandlerAdapter统一调用。
2、HandlerAdapter的体系结构
HandlerAdapter是一个顶层接口,其提供如下三个方法
supports(Object handler) |
该方法判断该适配器类是否支持解析调用Handler对象,因为Adapter被设计成了一个只适配执行某一种类型比如Controller接口类型或@RequestMapping类型的Handler需要使用SimpleControllerHandlerAdapter来进行处理,该方法在执行handler()方法之前需要使用该方法来判断是否支持调用这种类型的Handler对象。 |
handle(req,rep,handler) |
解析并调用Handler对象的方法执行业务逻辑,从request请求中获取参数,执行handler并将响应结果放入reponse对象 |
getLastModified |
获取请求的资源的最终修改时间,如果请求的资源未被修改则直接使用浏览器缓存,这个方法主要是针对http请求为get/head请求为提高性能的缓存处理。 |
通过HandlerAdapter的UML类图我们可以看到该接口的继承关系比较简单,其提供了若干个分别对应上述不同Handler实例的适配器对象实现,由于@RequestMapping修饰的方法一个普通的方法因此比较复杂这里提供了一AbstractHandlerMethodAdapter简单抽象和继承前者的RequestMappingHandlerAdapter子类来处@RequestMapping修饰的普通方法的调用。
类实例 |
功能描述 |
SimpleControllerHandlerAdapter |
用于处理实现Controller接口的实现类,调用其handleRequest方法处理请求 |
HandlerFunctionAdapter |
用于处理实现HandlerFunction接口的实现类,调用其handle方法处理请求 |
HttpRequestHandlerAdapter |
用于处理实现HttpRequestHandler接口的实现类,调用其handleRequest方法处理请求 |
SimpleServletHandlerAdapter |
用于处理实现Servlet接口的实现类,调用其service方法处理请求 |
AbstractHandlerMethodAdapter |