SpringMVC原始碼剖析(一)- 從抽象和介面說起
註明:文章是本人在中國開源網上看到的經典文章,出處:http://my.oschina.net/lichhao 作者:相見歡
SpringMVC作為Struts2之後異軍突起的一個表現層框架,正越來越流行,相信javaee的開發者們就算沒使用過SpringMVC,也應該對其略有耳聞。我試圖通過對SpringMVC的設計思想和原始碼實現的剖析,從抽象意義上的設計層面和實現意義上的程式碼層面兩個方面,逐一揭開SpringMVC神祕的面紗,本文的程式碼,都是基於Spring的 3.1.3RELEASE版本。
任何一個框架,都有自己特定的適用領域,框架的設計和實現,必定是為了應付該領域內許多通用的,煩瑣的、基礎的工作而生。SpringMVC作為一個表現層框架,也必須直面Web開發領域中表現層中的幾大課題,並給出自己的回答:
- URL到框架的對映。
- http請求引數繫結
- http響應的生成和輸出
這三大課題,組成一個完整的web請求流程,每一個部分都具有非常廣闊的外延。SpringMVC框架對這些課題的回答又是什麼呢?
學習一個框架,首要的是要先領會它的設計思想。從抽象、從全域性上來審視這個框架。其中最具有參考價值的,就是這個框架所定義的核心介面。核心介面定義了框架的骨架,也在最抽象的意義上表達了框架的設計思想。
下面我以一個web請求流程為載體,依次介紹SpringMVC的核心介面和類。
使用者在瀏覽器中,輸入了http://www.xxxx.com/aaa/bbb.ccc的地址,回車後,瀏覽器發起一個http請求。請求到達你的伺服器後,首先會被SpringMVC註冊在web.xml中的前端轉發器DispatcherServlet接收,DispatcherServlet是一個標準的Servlet,它的作用是接受和轉發web請求到內部框架處理單元。
下面看一下第一個出現在你面前的核心介面,它是在org.springframework.web.servlet包中定義的HandlerMapping介面:
01 |
package org.springframework.web.servlet; |
02 |
03 |
import javax.servlet.http.HttpServletRequest; |
04 |
05 |
public interface HandlerMapping
{ |
06 |
07 |
String
PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping. class .getName()
+ ".pathWithinHandlerMapping" ; |
08 |
09 |
String
BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping. class .getName()
+ ".bestMatchingPattern" ; |
10 |
11 |
String
INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping. class .getName()
+ ".introspectTypeLevelMapping" ; |
12 |
13 |
String
URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping. class .getName()
+ ".uriTemplateVariables" ; |
|