1. 程式人生 > >戲說 Spring MVC 框架

戲說 Spring MVC 框架

Spring MVC 是 Spring 框架的一部分,和 Struts 一樣都是屬於 web 層框架,根據專案分層的思想,一個專案基本可以分為持久層,業務層和 web 層。而 Spring MVC 主要作用在 web 層,也叫表現層。

 

web 層核心的功能自然是處理使用者的請求並返回資料,那我們就要介紹一下 Spring MVC 中是如何處理請求並返回資料的。首先來看一下它的大致流程。

 

 

上圖是框架中的大致方向,從使用者發出請求開始,前端處理器接收請求,但是自己不幹活,會把請求傳送到不同的處理器,處理器中會呼叫業務方法進行處理,得到結果返回給前端控制器,控制器再將結果傳送給 JSP 來渲染頁面,最終將含有結果的 HTML 頁面返回給瀏覽器。

 

仔細說一下,首先你要告訴我處理什麼樣的請求,不能來個阿貓阿狗我全接收了,這就需要我們在 web.xml 檔案中配置一下什麼樣的請求才能進入框架。

 

請求是進來了,但是那是一串 URL 呀,框架需要分析這個請求呀,分析請求這個活前端控制器依舊不幹,而是由處理器對映器 HandlerMapping 來處理。這個物件是 Spring MVC 提供好的,我們只需要配置一下就好,不要忘了 Spring 中強大的 IoC 功能。

 

處理器對映器的作用就在於,你給我一串 URL ,我來分析 URL,然後找到處理這個請求的包名+類名+方法名返回給控制器。找不到就報 404 唄。而這種 URL 和方法的對映關係,我們一般使用註解@RequestMapping 在方法的上面配置。

 

你以為控制器知道具體的方法以後就會執行嘛,想太多,這時候處理器介面卡就出現了,這就是控制器下面的二腿子啊,它也不幹活,那誰來處理啊,那肯定是我們牛逼哄哄的程式設計師了。

 

你自己配的方法的 URL ,你不寫方法你還想飛不成啊!

 

肯定是需要自己寫處理 URL 的邏輯呀,有了包名+類名+方法名之後,前端控制器和處理器介面卡說 “去看看這個方法在那裡,處理一下”。處理器介面卡一看,這不就是隔壁家的二狗子嘛,然後把二狗子叫來了,去處理一下請求吧。

 

好了,終於到找真正幹活的人了,就是我們可愛的程式設計師啊,然後,不出意外的情況下,方法返回了一個結果給到前端控制器。這時候老大又發話了,“檢視解析器你過來一下,給你個結果,去把結果渲染到頁面上去。“

 

檢視解析器拿到結果和頁面(不一定是 JSP,但是常見的是 JSP)一頓操作,該填充的填充,就得到了一個 HTML 頁面,然後這些完美的二進位制通過網線就從遠方的伺服器傳到了瀏覽器中供使用者欣賞。

 

以上說的就是一個請求在 web 層中 Spring MVC 框架處理的邏輯,要注意呦,我們手寫的處理器 Controller 中會呼叫 Service 層的東西,那就是業務層的範疇了。詳細的還可以看看下面這張圖。

 

但事情哪有那麼順利呢,總會出現異常啊,什麼 404,500,為了使我們的使用者大人矇在鼓裡,我們還可以配置一個全域性的異常處理類。只需要實現 HandlerExceptionResolver 即可,當然,我們也要在 Spring 中註冊一下實現類。

 

這樣在發生異常的時候,我們可以設定跳轉到一個卡哇伊的頁面,殊不知其實是系統出現問題了……

 

正常的和不正常的 Spring MVC 都能處理,但你以為這樣就夠了嘛,不,它還為我們提供了許多其它的功能。

 

還有什麼上傳圖片啊,簡直就是逆天啊,直接把圖片當成一個引數傳到後臺了,當然,肯定需要一定的條件,比方說前臺 form 必須有 enctype,後臺接收圖片的引數時必須使用 MultipartFile 介面且形參名一致,而且實現類還是固定的,我們需要注入一下 CommonsMultipartResolver 類。

 

還有一個攔截器的概念,這就是 AOP 程式設計的一個體現呀,一夫當關,萬夫莫開。而我們需要做的就是在配置檔案中使用 <mvc:interceptor> 標籤配置一下攔截器攔截的路徑和攔截器類。

 

在攔截器類中我們就可以處理具體的邏輯了,比方說,驗證使用者是否登入呀。給使用者分類呀,不用的使用者跳轉的頁面不一致。

 

最後說一下 Spring MVC 和 Struts2 的區別。

 

1、Spring MVC 的入口是一個 Servlet 即前端控制器,而 Struts2 入口是一個 Filter 過濾器。

 

2、Spring MVC 是基於方法開發 (一個 url 對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),Struts2 是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。

 

3、Struts2 採用值棧儲存請求和響應的資料,通過 OGNL 存取資料, Spring MVC 通過引數解析器是將 request 請求內容解析,並給方法形參賦值,將資料和檢視封裝成 ModelAndView 物件,最後又將 ModelAndView 中的模型資料通過 request 域傳輸到頁面。Jsp 檢視解析器預設使用 jstl 表示式。