1. 程式人生 > >萌新學習SpringMVC

萌新學習SpringMVC

## 前言 > 只有光頭才能變強。 > **文字已收錄至我的GitHub精選文章,歡迎Star**:[https://github.com/ZhongFuCheng3y/3y](https://github.com/ZhongFuCheng3y/3y) 這篇`SpringMVC`被催了很久了,這陣子由於做整合系統的事,所以非常非常地忙。這週末早早就回了公司肝這篇文章了。 如果關注三歪的同學會發現,三歪最近寫的很多文章都是結合了現有的系統去寫的。這些問題都是真實開發場景會遇到的、用的上的,這些案例對未工作的同學幫助應該還是蠻大的。 不多BB了,還是進入今天的正題吧「**SpringMVC**」 ## 先簡單聊聊SpringMVC 如果你們玩知乎,很可能會看到我的身影。我經常會去知乎水回答。在知乎有很多初學者都會問的一個問題:「**我學習SpringMVC需要什麼樣的基礎**」 我一定會讓他們先學Servlet,再學SpringMVC的。雖然說我們在現實開發中幾乎不會寫原生Servlet的程式碼了,但我始終認為學完Servlet再學SpringMVC,對理解SpringMVC是有好處的。 > 三歪題外話:我當時在學SpringMVC之前其實已經接觸過另外一個web框架(當然了Servlet也是學了的),那就是「大名鼎鼎」的Struts2。只要是Struts2有的功能,SpringMVC都會有。 > > 當時初學Struts2的時候用的是XML配置的方式去開發的,再轉到SpringMVC註解的時候,覺得SpringMVC真香。 > > Struts2在2020年已經不用學了,**學SpringMVC的基礎是Servlet,只要Servlet基礎還行,上手SpringMVC應該不成問題。** 從Servlet到SpringMVC,你會發現SpringMVC幫我們做了很多的東西,我們的程式碼肯定是沒以前多了。 **Servlet:** 我們以前可能需要將傳遞進來的引數**手動**封裝成一個Bean,然後繼續往下傳: ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa036f6dd13b?w=1160&h=662&f=jpeg&s=79384) **SpringMVC:** 現在SpringMVC**自動**幫我們將引數封裝成一個Bean ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa03705a45ca?w=1026&h=590&f=jpeg&s=66210) **Servlet:** 以前我們要匯入其他的`jar`包去手動處理**檔案上傳**的細節: ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa0372a97bd3?w=1080&h=1150&f=jpeg&s=150602) **SpringMVC:** 現在SpringMVC上傳檔案用一個MultipartFile物件都給我們封裝好了 ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa0372d96cf1?w=1482&h=518&f=jpeg&s=60556) ........ 說白了,在Servlet時期我們這些活都能幹,只不過SpringMVC把很多東西都給遮蔽了,於是我們用起來就更加舒心了。 在學習SpringMVC的時候實際上也是學習這些功能是怎麼用的而已,並不會太難。這次整理的SpringMVC電子書其實也是在講SpringMVC是如何使用的 - 比如說傳遞一個日期字串來,SpringMVC預設是不能轉成日期的,那我們可以怎麼做來實現。 - SpringMVC的檔案上傳是怎麼使用的 - SpringMVC的攔截器是怎麼使用的 - SpringMVC是怎麼對引數繫結的 - ...... ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa03756e04b8?w=1910&h=1080&f=jpeg&s=270758) 現在「電子書」已經放出來了,但是**別急**,重頭戲在後面。顯然,通過上面的電子書是可以知道SpringMVC**是怎麼用的**。 但是這在面試的時候人家是不會問你SpringMVC的一些用法的,而SpringMVC面試問得最多的就是:**SpringMVC請求處理的流程是怎麼樣的**。 其實也很簡單,流程就是下面這張圖: ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa037654c811?w=1790&h=1044&f=jpeg&s=179556) 再簡化一點,可以發現流程不復雜 ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa0398abf802?w=925&h=357&f=jpeg&s=53310) 在面試的時候甚至能一句話就講完了,但這夠嗎,這是面試官想要的嗎?那肯定不是。那我們想知道SpringMVC是做了什麼嗎?想的吧(**不管你們想不想,反正三歪想看**)。 ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa039af307d7?w=698&h=764&f=jpeg&s=42865) **由於想要主流程更加清晰一點,我會在原始碼新增部分註釋以及刪減部分的程式碼** > 以@ResponseBody和@RequestBody的Controller程式碼講解為主,這是線上環境用得最多的 ## DispatcherServlet原始碼 首先我們看看DispatcherServlet的類結構,可以清楚地發現實際DispatcherServlet就是Servlet介面的一個子類(這也就是為什麼網上這麼多人說DispatcherServlet的原理實際上就是Servlet) ![](https://user-gold-cdn.xitu.io/2020/5/20/1722fa039c439278?w=2000&h=902&f=jpeg&s=104062) 我們在DispatcherServlet類上可以看到很多熟悉的成員變數(**元件**),所以看下來,我們要的東西,DispatcherServlet可**全都有**。 ```java // 檔案處理器 private MultipartResolver multipartResolver; // 對映器 private List