圖片有些是百度上面找到的,感覺蠻好的,如果侵權(quán)了請告訴我
首先說明一下,本章節(jié)是不會對SpringMVC里面的具體內(nèi)容做解釋.只是一個執(zhí)行流程而已,具體的解釋請看<a href="#">SpringMVC淺入深出系列</a>
執(zhí)行步驟(文字說明):
1盲憎、 用戶發(fā)送請求至前端控制器DispatcherServlet
2、 DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器。
3按摘、 處理器映射器找到具體的處理器漠其,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet嘹承。
4拉庵、 DispatcherServlet調(diào)用HandlerAdapter處理器適配器
5射沟、 HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller辉巡,也叫后端控制器)恨憎。
6、 Controller執(zhí)行完成返回ModelAndView
7郊楣、 HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet
8憔恳、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、 ViewReslover解析后返回具體View
10净蚤、 DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)钥组。
11、 DispatcherServlet響應(yīng)用戶
上面只是前人幫你做出的總結(jié),你真的了解過SpringMVC的執(zhí)行流程嗎?
好,接下來是我個人的理解,如果講錯,請幫我糾正,謝謝!
SpringMVC執(zhí)行流程
1.用戶發(fā)送一個請求
2.一個web項目啟動時,它會先去讀取它的配置文件web.xml
具體為什么,請移步到 <a >web.xml文件詳解</a>
因為SpringMVC控制頁面的請求和響應(yīng)都是通過前端控制器(DispatcherServlet)完成的,所以我們在web.xml里面配置了這個(配置內(nèi)容不解釋,有空先)
所以這步,我想表達(dá)的是為什么 DispatcherServlet會收到請求
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 啟動級別 -->
<load-on-startup>1</load-on-startup>
</servlet>
Servlet.xml跟applicationContext.xml是有區(qū)別的,請移步到<a >web.xml 中spring-servlet.xml 和 application.xml 配置位置及含義 </a>
3.我們看一下DispatcherServlet這個類在干嘛
public class DispatcherServlet extends FrameworkServlet {}
我們是可以看到DispatcherServlet 是繼承于FrameworkServlet 這個接口,那么FrameworkServlet 本質(zhì)是一個Servlet,有興趣的,可以一直跳進(jìn)去看,這邊就不深入了.
好,在Servlet生命周期里面,Servlet第二步是在調(diào)用service方法
那我們看一下DispatcherServlet
我們?nèi)タ匆幌翭rameworkServlet
可以看到下面的源碼
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getMethod();
if (method.equalsIgnoreCase(RequestMethod.PATCH.name())) {
processRequest(request, response);
}
else {
super.service(request, response);
}
}
我們來分析一下這個代碼
1.當(dāng)我們的請求進(jìn)來的時候,就會對請求的方法進(jìn)行判斷
如果方法的名稱不是RequestMethod.PATCH.name(),那么就會調(diào)用父類的service方法
2.javax.servlet.http.HttpServlet.service里面會根據(jù)你不同的請求,調(diào)用doGet,doPost方法,
然后就會來到子類(org.springframework.web.servlet.FrameworkServlet)的doGet,doPost方法了
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
3.接下來就是進(jìn)入processRequest方法了,后面的流程為了簡便,我決定畫圖演示給大家看
(注意下面的代碼都是比較核心點的,有刪減,其他不是很重要的就不畫出來給大家看)