前言
Spring官網的MVC模塊介紹:
Spring Web MVC是基于Servlet API構建的原始Web框架,從一開始就已包含在Spring框架中。正式名稱“ Spring Web MVC”來自其源模塊的名稱(spring-webmvc),但它通常被稱為“ Spring MVC”。
從Servlet到SpringMVC
最典型的MVC就是JSP + servlet + javabean的模式。
傳統Servlet:
弊端:
- xml下配置servlet的映射非常麻煩 開發效率低
- 必須要繼承父類、重寫方法 侵入性強
- 如果想在一個Servlet中處理同一業務模塊的的功能分發給不同方法進行處理非常麻煩
- 參數解析麻煩:單個參數(轉換類型)--->pojo對象 Json文本--->pojo對象
- 數據響應麻煩:pojo對象--->json ... Content-type
- 跳轉頁面麻煩, 對path的控制、 如果使用其他模板也很麻煩 、設置編碼麻煩...等等...
所以SpringMVC 就是在Servlet的基礎上進行了封裝,幫我把這些麻煩事都給我們做了。
Web框架的升級是一個不斷偷懶的過程
從最開始的Servlet到現在的SpringMVC、SpringBoot等等
SpringMVC
基于xml的實現方式:
1.給Servlet容器配置一個DispatcherServlet(web.xml )
2.添加SpringMVC的配置信息
- 繼承類/實現接口 方式:
implements HttpRequestHandler
不同的HandlerMapping
<!--通過設置屬性的方式去設置映射路徑-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings"><props><prop key="httpRequest">simpleController</prop></props>
</property><!--BeanNameUrlHandlerMapping 一定要為Controller設置一個有效映射地址的名字 如 @Controller("/xxxx")-->
- 注解方式:
配置控制器@Controller和處理方法的映射—@RequstMapping 即可
其實SpringMVC請求原理很簡單:說白了就是用一個DispatcherServlet 封裝了一個Servlet的調度中心, 由調度中心幫我們調用我們的處理方法:
在這個過程中調度中心委托給各個組件執行具體工作 ,比如幫我們映射方法請求、幫我解析參數、調用處理方法、響應數據和頁面 等
這就相當于你在家自己做飯和去飯店吃飯的區別了, 在家你買菜、洗菜、蒸飯、炒菜、洗碗都得自己來.
飯店都給你做好了, 你只要分服務員說你吃什么、就能得到響應. 殊不知呢, 你只是說了吃什么(請求), 后廚(DispatcherServlet)就有配菜員你給找到菜單-對應的食材(映射) 、切菜員切菜(解析參數)、 廚師給你炒菜(調用處理方法)、裝盤(處理返回值)、 抄完給你端出來(響應)
SpringMVC的具體執行流程
Spring MVC 是圍繞前端控制器模式設計的,其中:中央 Servlet DispatcherServlet 為請求處理流程提供統一調度,實際工作則交給可配置組件執行。這個模型是靈活的且開放的,我們可以通過自己去定制這些組件從而進行定制自己的工作流。
?
DispatcherServlet: 前端調度器 , 負責將請求攔截下來分發到各控制器方法中
HandlerMapping: 負責根據請求的URL和配置@RequestMapping映射去匹配, 匹配到會返回Handler(具體控制器的方法)
HandlerAdaper: 負責調用Handler-具體的方法- 返回視圖的名字 Handler將它封裝到ModelAndView(封裝視圖名,request域的數據)
ViewReslover: 根據ModelAndView里面的視圖名地址去找到具體的jsp封裝在View對象中
View:進行視圖渲染(將jsp轉換成html內容 --這是Servlet容器的事情了) 最終response到的客戶端
- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求調用處理器映射器HandlerMapping。
- 處理器映射器根據請求url找到具體的處理器,生成處理器執行鏈HandlerExecutionChain(包括處理器對象和處理器攔截器)一并返回給DispatcherServlet。
- DispatcherServlet根據處理器Handler獲取處理器適配器HandlerAdapter,執行HandlerAdapter處理一系列的操作,如:參數封裝,數據格式轉換,數據驗證等操作
- 執行處理器Handler(Controller,也叫頁面控制器)。
- Handler執行完成返回ModelAndView
- HandlerAdapter將Handler執行結果ModelAndView返回到DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- ViewReslover解析后返回具體View
- DispatcherServlet對View進行渲染視圖(即將模型數據model填充至視圖中)。
- DispatcherServlet響應用戶。
doDispatch
整個調用過程其實都在doDispatch中體現了:
- 用戶發送請求至前端控制器DispatcherServlet
- 由于它是個Servlet會先進入service方法——>doGet/doPost——>processRequestdoService——>doDispatch ↓
- 這個doDispatch非常重要--體現了整個請求流程
HandlerMapping
在整個過程中,涉及到非常多的組件,每個組件解析各個環節,其中HandlerMapping最為重要它是用來映射請求的,我們就著重介紹下HandlerMapping的解析過程和請求映射過程:
附上流程圖:
@RequestMapping原理| ProcessOn免費在線作圖,在線流程圖,在線思維導圖