springmvc处理请求逻辑
只看这张图,总觉得对这个过程不是很了解;因此决定通过debug的方式来看dispatcherServlet处理请求的流程;
我们通过debug可以看到handlerMapping有什么用?
handlerAdapter适配器做了什么,怎么适配?
dispatcherServlet在收到请求后,会先执行doService方法,在这个方法中会调用doDispatch;请求的处理流程主要过程就是在这个方法中完成的;
1.进入到doDispatch
2.找到当前请求的handleMapping:
getHandler:
BeanNameUrlHandlerMapping:
RequeatMappingHandlerMapping(注解类的handlerMapping):
看到这里我们已经清楚了,处理器映射器的作用。我在项目中配置了2个映射器:他们的作用就是将url和handler分别作为key,value存储在hashmap中;
BeanNameUrlHandlerMapping:是处理xml中配置的controller;
RequeatMappingHandlerMapping:是处理注解类的controller;
到这一步我们已经能够根据当前request找到要执行的controller类,或者handlerMethod。我们不能直接执行方法吗?为什么还需要处理器适配器呢?
我们继续debug:
3.handler适配器
HandlerAdapter 源码:
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {//核心
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
可以看到如果找不到适配器会抛异常;这段代码的核心就是adapter.supports(handler),判断handler是属于什么类型的,根据handler的类型返回对应的适配器;实验配置的adpater有3类:
3.1.实现Controller
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);//如果实现
}
}
3.2.实现Servlet
public class SimpleServletHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof Servlet);
}
}
3.3.注解
public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {
public final boolean supports(Object handler) {
return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}
}
4.执行handler
和上面adapter一样,不同类型的handle实现不同;
4.1实现Controller类
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
}
4.2实现Servlet类
public class SimpleServletHandlerAdapter implements HandlerAdapter {
@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
((Servlet) handler).service(request, response);
return null;
}
4.3注解
public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {
@Override
@Nullable
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return handleInternal(request, response, (HandlerMethod) handler);//执行RequestMappingHandlerAdapter的handleInternal方法,
}
看到这里可以解释,为什么找到handler之后还要找到对应的adapter,最后才执行handler;因为不同的handler类型,实际执行的方法不同;如果只考虑一种handler类型,那找到handler之后就应该立即执行handler而不需要搞一个adapter。但如果考虑到有多种handler,以后还能自定义拓展handler,那这种写法就非常好了;