首先,我们发出的一个请求被传入到 web.xml 中的 DispatchServelt 中
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这个请求被 servlet 捕获,servlet 首先执行的是 service 方法。然而我们在 DispatcherServlet 中发现并没有 service 方法。这时问我们可以看到 DispatcherServlet 继承了 FrameworkServlet 方法
我们进入 FrameworkServlet 方法可以找到 service 方法 ,
所以一个请求进入首先执行的是 FrameworkServlet 中的 service 方法 ,进来 service 方法,不为空执行父类的 service 方法,
get方法回调执行 doGet 然后此方法会调用会 processRequest 方法
该请求会顺序执行至该方法中的 doService 方法,
然而我们发现 FrameworkServlet 中的 doService 方法只是一个抽象方法。
我们再回到 DispatcherServlet 中,发现该抽象方法在其子类中得到了实现。
在 doService 里面将数据放进请求对象中,然后 执行doDispatch 方法
doDispatch 该方法中
mappedHandler = getHandler(processedRequest); 获得一个处理器链
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 获得一个适配器
mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 真正执行handler方法
ModelAndVie 视图
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); 将目标方法的返回值结果与视图结合,并响应客户端处理结果
至此一个请求执行的过程在sevlet中结束