SpringMVC執(zhí)行流程

JavaEE.jpg

圖片有些是百度上面找到的,感覺蠻好的,如果侵權(quán)了請告訴我
首先說明一下,本章節(jié)是不會(huì)對SpringMVC里面的具體內(nèi)容做解釋.只是一個(gè)執(zhí)行流程而已,具體的解釋請看<a href="#">SpringMVC淺入深出系列</a>

SpringMVC執(zhí)行流程.png
SpringMVC執(zhí)行流程圖經(jīng)典版.png
執(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í)行流程嗎?

好,接下來是我個(gè)人的理解,如果講錯(cuò),請幫我糾正,謝謝!

SpringMVC執(zhí)行流程

1.用戶發(fā)送一個(gè)請求
2.一個(gè)web項(xiàng)目啟動(dòng)時(shí),它會(huì)先去讀取它的配置文件web.xml

具體為什么,請移步到 <a >web.xml文件詳解</a>
因?yàn)镾pringMVC控制頁面的請求和響應(yīng)都是通過前端控制器(DispatcherServlet)完成的,所以我們在web.xml里面配置了這個(gè)(配置內(nèi)容不解釋,有空先)

所以這步,我想表達(dá)的是為什么 DispatcherServlet會(huì)收到請求
  <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>
    <!-- 啟動(dòng)級別 -->
    <load-on-startup>1</load-on-startup>
  </servlet>

Servlet.xml跟applicationContext.xml是有區(qū)別的,請移步到<a >web.xml 中spring-servlet.xml 和 application.xml 配置位置及含義 </a>


第一步.png
3.我們看一下DispatcherServlet這個(gè)類在干嘛
public class DispatcherServlet extends FrameworkServlet {}

我們是可以看到DispatcherServlet 是繼承于FrameworkServlet 這個(gè)接口,那么FrameworkServlet 本質(zhì)是一個(gè)Servlet,有興趣的,可以一直跳進(jìn)去看,這邊就不深入了.

好,在Servlet生命周期里面,Servlet第二步是在調(diào)用service方法
那我們看一下DispatcherServlet

證明DispatcherServlet 沒有service方法.png

我們?nèi)タ匆幌翭rameworkServlet

證明FrameworkServlet 有service方法.png

可以看到下面的源碼

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

我們來分析一下這個(gè)代碼

1.當(dāng)我們的請求進(jìn)來的時(shí)候,就會(huì)對請求的方法進(jìn)行判斷
如果方法的名稱不是RequestMethod.PATCH.name(),那么就會(huì)調(diào)用父類的service方法
HttpServlet里面的Service方法.png
2.javax.servlet.http.HttpServlet.service里面會(huì)根據(jù)你不同的請求,調(diào)用doGet,doPost方法,
  然后就會(huì)來到子類(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方法了,后面的流程為了簡便,我決定畫圖演示給大家看
(注意下面的代碼都是比較核心點(diǎn)的,有刪減,其他不是很重要的就不畫出來給大家看)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容