springmvc5的四个HandlerAdapter

springmvc5中有四个非抽象的HandlerAdapter:
1.SimpleServletHandlerAdapter
2.SimpleControllerHandlerAdapter
3.HttpRequestHandlerAdapter
4.RequestMappingHandlerAdapter
 
springmvc通过HandlerMapping将请求URL映射到handler,再将handler交给HandlerAdapter进行调用处理。
 
HandlerAdapter里重要的有两个方法:
springmvc5的四个HandlerAdapter_第1张图片
springmvc5的四个HandlerAdapter_第2张图片
supports()方法用来判断当前HandlerAdapter是否可以调用处理handler;
handle()方法用来调用handler,具体的来处理请求。
 
接下来对四个HandlerAdapter进行一一分析。
 
1.SimpleServletHandlerAdapter
springmvc5的四个HandlerAdapter_第3张图片
SimpleServletHandlerAdapter可以处理类型为Servlet的handler,对handler的处理是调用Servlet的service方法处理请求。
看具体的配置和handler:
springmvc5的四个HandlerAdapter_第4张图片
可以使用BeanNameUrlHandlerMapping将请求URL"/testServlet"和handler(Servlet1)相映射,使用SimpleServletHandlerAdapter调用处理成功:
springmvc5的四个HandlerAdapter_第5张图片
 
2.SimpleControllerHandlerAdapter
springmvc5的四个HandlerAdapter_第6张图片
SimpleControllerHandlerAdapter可以处理类型为Controller的handler,对handler的处理是调用Controller的handleRequest()方法。
Controller是springmvc的一个接口:
springmvc5的四个HandlerAdapter_第7张图片
看具体的配置和handler:

springmvc5的四个HandlerAdapter_第8张图片
可以使用BeanNameUrlHandlerMapping将请求URL"/testController"和handler(Controller1)相映射,使用SimpleControllerHandlerAdapter调用处理成功:
springmvc5的四个HandlerAdapter_第9张图片
 
3.HttpRequestHandlerAdapter
springmvc5的四个HandlerAdapter_第10张图片
HttpRequestHandlerAdapter可以处理类型为HttpRequestHandler的handler,对handler的处理是调用HttpRequestHandler的handleRequest()方法。
HttpRequestHandler是springmvc的一个接口:
springmvc5的四个HandlerAdapter_第11张图片
 
看具体的配置和handler:

springmvc5的四个HandlerAdapter_第12张图片
可以使用BeanNameUrlHandlerMapping将请求URL"/testHttpRequestHandler"和handler(HttpRequestHandler1)相映射,使用HttpRequestHandlerAdapter调用处理成功:
springmvc5的四个HandlerAdapter_第13张图片
 
4.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter类代码相比之前三个HandlerAdapter,代码要复杂的多,这里只截取重要的部分:


springmvc5的四个HandlerAdapter_第14张图片

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

springmvc5的四个HandlerAdapter_第15张图片
只有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)