SpringMVC之HandlerMapping和HandlerAdapter

说一下HandlerAdapter处理的大体流程,这样就有一个大体的掌握。大体流程有三步:

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默认的适配器没有他,默认的是前面的三种。

springMVC 的handler是指具体的controller对象,不是方法。
方法由相应adapter适配器通过handler( controller对象)方法传入的controller对象,在里面调用controller具体方法

第一步首先要找到是哪个对象,即handler,本工程的handler则是HomeAction对象。第二步要找到访问的函数,即HomeAction的handleRequest方法。所以就出现了两个源码接口 HandlerMapping和HandlerAdapter,前者负责第一步,后者负责第二步

HandlerMapping接口的实现
1.BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象  
2.SimpleUrlHandlerMapping
3.ControllerClassNameHandlerMapping
4.DefaultAnnotationHandlerMapping : 主要是针对注解配置@RequestMapping的,已过时,在spring3.2版本中使用RequestMappingHandlerMapping 代替上一个

HandlerAdapter 接口实现: 
1.HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口  
2.SimpleControllerHandlerAdapter:要求handler实现Controller接口        3.AnnotationMethodHandlerAdapter :和DefaultAnnotationHandlerMapping配对使用的,已过时 
使用RequestMappingHandlerAdapter 代替

你可能感兴趣的:(SpringMVC)