1.DispatcherServlet会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么DispatcherServlet会获取HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlet会读取DispatcherServlet.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter。DispatcherServlet会将这三个HandlerAdapter对象存储到它的handlerAdapters这个集合属性中,这样就完成了HandlerAdapter的注册。
2.DispatcherServlet会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该controller类型的,如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用Java的反射机制执行controller的具体方法来获得ModelAndView,例如SimpleControllerHandlerAdapter是支持实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么SimpleControllerHandlerAdapter就会去执行自己写的控制器中的具体方法来完成请求。
下面来介绍一下几种适配器对应的处理器以及这些处理器的作用
1. AnnotationMethodHandlerAdapter主要是适配注解类处理器,注解类处理器就是我们经常使用的@Controller的这类处理器
2. HttpRequestHandlerAdapter主要是适配静态资源处理器,静态资源处理器就是实现了HttpRequestHandler接口的处理器。
3.SimpleControllerHandlerAdapter是Controller处理适配器,适配实现了Controller接口或Controller接口子类的处理器,比如我们经常自己写的Controller来继承AbstractController,那么自己写的这些Controller就会由SimpleControllerHandlerAdapter来适配,而且SpringMVC默认的适配器没有他,默认的是前面的三种。
方法由相应adapter适配器通过handler( controller对象)方法传入的controller对象,在里面调用controller具体方法
HandlerMapping接口的实现
1.BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象
2.SimpleUrlHandlerMapping
3.ControllerClassNameHandlerMapping
4.DefaultAnnotationHandlerMapping : 主要是针对注解配置@RequestMapping的,已过时,在spring3.2版本中使用RequestMappingHandlerMapping 代替上一个
1.HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口
2.SimpleControllerHandlerAdapter:要求handler实现Controller接口 3.AnnotationMethodHandlerAdapter :和DefaultAnnotationHandlerMapping配对使用的,已过时
使用RequestMappingHandlerAdapter 代替