SpringMVC 之 HandlerAdapter 的作用


SpringMVC 之 HandlerAdapter 的作用

HandlerAdapter 字面上的意思就是处理适配器,它的作用用一句话概括就是调用具体的方法对用户发来的请求来进行处理。当 handlerMapping 获取到执行请求的 controller 时,DispatcherServlte 会根据 controller 对应的 controller 类型来调用相应的 HandlerAdapter 来进行处理。

1.HandlerAdapter 的注册

DispatcherServlte 会根据配置文件信息注册 HandlerAdapter,如果在配置文件中没有配置,那么 DispatcherServlte 会获取 HandlerAdapter 的默认配置,如果是读取默认配置的话,DispatcherServlte 会读取 DispatcherServlte.properties 文件, 该文件中配置了三种 HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter 和 AnnotationMethodHandlerAdapter。DispatcherServlte 会将这三个 HandlerAdapter 对象存储到它的 handlerAdapters 这个集合属性中,这样就完成了 HandlerAdapter 的注册。

2.HandlerAdapter 的执行

HandlerAdapter接口方法如下:

public interface HandlerAdapter {
	boolean supports(Object handler);
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
	long getLastModified(HttpServletRequest request, Object handler);
}

DispatcherServlte 会根据 handlerMapping 传过来的 controller 与已经注册好了的 HandlerAdapter 一一匹配,看哪一种 HandlerAdapter 是支持该 controller 类型的,这调用的是supports方法,如果支持的话就会返回true.如果找到了其中一种 HandlerAdapter 是支持传过来的 controller 类型,那么该 HandlerAdapter 会调用自己的 handle 方法,handle 方法运用 java 的反射机制执行 controller 的具体方法来获得 ModelAndView, 例如 SimpleControllerHandlerAdapter 是支持实现了 controller 接口的控制器,如果自己写的控制器实现了 controller 接口,那么 SimpleControllerHandlerAdapter 就会去执行自己写控制器中的具体方法来完成请求。

今天再来看源码,发现处理器根本就不只有 Controller 这一种。还有 HttpRequestHandler,Servlet 等处理器。下面来介绍一下几种适配器对应的处理器以及这些处理器的作用

  1. AnnotationMethodHandlerAdapter 主要是适配注解类处理器,注解类处理器就是我们经常使用的 @Controller 的这类处理器
  2. HttpRequestHandlerAdapter 主要是适配静态资源处理器,静态资源处理器就是实现了 HttpRequestHandler 接口的处理器,这类处理器的作用是处理通过 SpringMVC 来访问的静态资源的请求
  3. SimpleControllerHandlerAdapterController 处理适配器,适配实现了 Controller 接口或 Controller 接口子类的处理器,比如我们经常自己写的 Controller 来继承 MultiActionController.
  4. SimpleServletHandlerAdapterServlet 处理适配器, 适配实现了 Servlet 接口或 Servlet 的子类的处理器,我们不仅可以在 web.xml 里面配置 Servlet,其实也可以用 SpringMVC 来配置 Servlet,不过这个适配器很少用到,而且 SpringMVC 默认的适配器没有他,默认的是前面的三种。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM