springmvc5中有四个非抽象的HandlerAdapter:
supports()方法用来判断当前HandlerAdapter是否可以调用处理handler;
可以使用BeanNameUrlHandlerMapping将请求URL"/testServlet"和handler(Servlet1)相映射,使用SimpleServletHandlerAdapter调用处理成功:
SimpleControllerHandlerAdapter可以处理类型为Controller的handler,对handler的处理是调用Controller的handleRequest()方法。
看具体的配置和handler:
可以使用BeanNameUrlHandlerMapping将请求URL"/testController"和handler(Controller1)相映射,使用SimpleControllerHandlerAdapter调用处理成功:
HttpRequestHandlerAdapter可以处理类型为HttpRequestHandler的handler,对handler的处理是调用HttpRequestHandler的handleRequest()方法。
可以使用BeanNameUrlHandlerMapping将请求URL"/testHttpRequestHandler"和handler(HttpRequestHandler1)相映射,使用HttpRequestHandlerAdapter调用处理成功:
RequestMappingHandlerAdapter可以处理类型为HandlerMethod的handler,对handler的处理是调用通过java反射调用HandlerMethod的方法。
只有RequestMappingHandlerAdapter有order属性,其他三个HandlerAdapter没有order属性。前三个HandlerAdapter处理的handler类型各不相同,处理也比较简单,不需要使用order区分优先级。
到这里,springmvc的四个HandlerAdapter就分析完了。前三个HandlerAdapter对handler的处理比较简单,HttpRequestHandlerAdapter和SimpleControllerHandlerAdapter直接调用固定唯一的方法handleRequest();
1.SimpleServletHandlerAdapter
2.SimpleControllerHandlerAdapter
3.HttpRequestHandlerAdapter
4.RequestMappingHandlerAdapter
springmvc通过HandlerMapping将请求URL映射到handler,再将handler交给HandlerAdapter进行调用处理。
HandlerAdapter里重要的有两个方法:
supports()方法用来判断当前HandlerAdapter是否可以调用处理handler;
handle()方法用来调用handler,具体的来处理请求。
接下来对四个HandlerAdapter进行一一分析。
1.SimpleServletHandlerAdapter
SimpleServletHandlerAdapter可以处理类型为Servlet的handler,对handler的处理是调用Servlet的service方法处理请求。
看具体的配置和handler:
可以使用BeanNameUrlHandlerMapping将请求URL"/testServlet"和handler(Servlet1)相映射,使用SimpleServletHandlerAdapter调用处理成功:
2.SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter可以处理类型为Controller的handler,对handler的处理是调用Controller的handleRequest()方法。
Controller是springmvc的一个接口:
看具体的配置和handler:
可以使用BeanNameUrlHandlerMapping将请求URL"/testController"和handler(Controller1)相映射,使用SimpleControllerHandlerAdapter调用处理成功:
3.HttpRequestHandlerAdapter
HttpRequestHandlerAdapter可以处理类型为HttpRequestHandler的handler,对handler的处理是调用HttpRequestHandler的handleRequest()方法。
HttpRequestHandler是springmvc的一个接口:
看具体的配置和handler:
可以使用BeanNameUrlHandlerMapping将请求URL"/testHttpRequestHandler"和handler(HttpRequestHandler1)相映射,使用HttpRequestHandlerAdapter调用处理成功:
4.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter类代码相比之前三个HandlerAdapter,代码要复杂的多,这里只截取重要的部分:
RequestMappingHandlerAdapter可以处理类型为HandlerMethod的handler,对handler的处理是调用通过java反射调用HandlerMethod的方法。
看具体的配置和handler:
只有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做更详细的分析。