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;
    }
经验分享 程序员 微信小程序 职场和发展