SpringMVC-DispatcherServlet源码分析
首先DispatcherServlet继承自FrameworkServlet
public class DispatcherServlet extends FrameworkServlet {
然后FrameworkServlet又继承了HttpServletBean
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware {
HttpServletBean又继承自HTTPServlet
public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware {
这里给个图:
当发送请求时,会由doget(),dopost()等方法来处理请求,向下传递,httpServletBean没有覆写,但FrameworkServlet中覆写了一系列请求方法,请求方法又都进入到processRequest(request, response)方法.这里拿doget()方法为例:
protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.processRequest(request, response); }
进入到processRequest方法中,又调用了doService(request, response)方法,在这里这个方法是一个抽象方法,需要由子类实现.
protected abstract void doService(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
最后就到了DispatcherServlet中覆写的doService()方法.doService()方法调用了doDispatch(request, response),这便是请求处理的核心方法.
总结(SpringMVC处理流程):
1.首先客户端的请求过去之后,会经过DispatcherServlet前端控制器. 2.接下来就调用Dispatch()方法处理:
----------------------------------------------------------------------------------------------
getHanler细节:
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { //使用迭代器寻找对应的处理器映射handlerMapping // handlerMapping中有handlerMap=LinkedhashMap<K,V> // url请求对应的Controller(处理器)信息 Iterator var2 = this.handlerMappings.iterator(); HandlerExecutionChain handler; do { if (!var2.hasNext()) { return null; } HandlerMapping hm = (HandlerMapping)var2.next(); if (this.logger.isTraceEnabled()) { this.logger.trace("Testing handler map [" + hm + "] in DispatcherServlet with name " + this.getServletName() + ""); } handler = hm.getHandler(request); } while(handler == null); return handler; }
----------------------------------------------------------------------------------------------
getHandlerAdapter()细节:
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { //遍历所有的适配器,要拿到能解析注解的适配器 Iterator var2 = this.handlerAdapters.iterator(); HandlerAdapter ha; do { if (!var2.hasNext()) { throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); } ha = (HandlerAdapter)var2.next(); if (this.logger.isTraceEnabled()) { this.logger.trace("Testing handler adapter [" + ha + "]"); } } while(!ha.supports(handler)); return ha; }