萌新學習SpringMVC
阿新 • • 發佈:2020-05-20
## 前言
> 只有光頭才能變強。
> **文字已收錄至我的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