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;
}
