SpringMVC的Control功能主要由
HandlerMapping和
HandlerAdapters两个组件提供
一、HandlerMapping组件
主要提供对handler的查找,举个例子
SimpleUrlHandlerMapping:字面意思,url到handler的映射,也就是url到控制器的映射
我们知道,dispatcherServlet的各种组件的初始化是在Spring容器的初始化中完成的,SimpleUrlHandlerMapping的初始化重要的两步:
(1). 将所有interceptor对象(拦截器,相当于一个个filter)保存在adapterInterceptor数组中,等到请求到来时执行其中所有拦截器
(2). 将URL与handler的映射关系保存到handlerMap中
二、HandlerAdapter组件
有HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter等,这些适配器的存在是为了适配多种处理器,让DispatcherServlet在调用时可以通过调用这些handlerAdapter的方法来调用到目标处理器的方法,举个例子
工作原理:handlerAdapter初始化时会保存在DispatcherServlet中的handlerAdapter集合中,当有url到来映射到某个handler时,在handlerAdapter集合中查询是哪个handlerAdapter support我们所要找的这个Handler,然后支持该handler的这个handlerAdapter对象会被返回,并调用这个对象的接口的方法(通过反射得到该对象接口?)
举个例子:如果请求是在找一个Controller的子类handler,则会找到SimpleControllerHandlerAdapter
public class SimpleControllerHandlerAdapter
implements HandlerAdapter {
public SimpleControllerHandlerAdapter() {
}
public boolean supports(Object handler) {
return handler
instanceof Controller
;
}
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((Controller)handler).handleRequest(request, response);
}
public long getLastModified(HttpServletRequest request
, Object handler) {
return handler
instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -
1L
;
}
}
此时,Dispatcher会调用handlerAdapter的handle方法,实际上是调用了目标handler的handleRequest方法
整个SpringMVC的调用是在DispatcherServlet的doService方法开始的,在该方法中会将ApplicationContext,localeResolver等对象添加进request中,然后调用doDispatch实现转发,
它里面保存了重要的handlerMapping和handlerAdapter,所以说,所有请求都要经由DispatcherServlet,可以说,它的身份是一个交接者
在doDispatch()方法中有比较重要的几行代码为:
获得请求的handler对象,并执行HandlerExecutionChain(mappedHandler)里的所有interceptor
获得请求对应的handler对应的handlerAdapter
调用该handlerAdapter的handle方法,从中我们也可以发现,不管你实际用的是哪种handler,最终返回的结果都是modelAndView对象