一、什么是 SpringMVC ?
SpringMVC框架是以請求為驅動,圍繞Servlet設計,將請求發給控制器,然后通過模型對象,分派器來展示請求結果視圖。其中核心類是DispatcherServlet,它是一個Servlet,頂層是實現的Servlet接口。
在介紹什么是 SpringMVC 之前,我們先看看 Spring 的基本架構。如下圖:
我們可以看到,在 Spring 的基本架構中,紅色圈起來的 Spring Web MVC ,也就是本系列的主角 SpringMVC,它是屬於Spring基本架構里面的一個組成部分,屬於SpringFrameWork的后續產品,已經融合在Spring Web Flow里面,所以我們在后期和 Spring 進行整合的時候,幾乎不需要別的什么配置。
SpringMVC 是類似於 Struts2 的一個 MVC 框架,在實際開發中,接收瀏覽器的請求響應,對數據進行處理,然后返回頁面進行顯示,但是上手難度卻比 Struts2 簡單。而且由於 Struts2 所暴露出來的安全問題,SpringMVC 已經成為了大多數企業優先選擇的框架。
二、SpringMVC流程圖詳解
要把SpringMVC流程圖搞明白,首先需要先搞明白6個組件
1.DisPatcherServlet 前端控制器
核心。用戶在瀏覽器輸入url,發起請求,首先會到達DisPatcherServlet,由它來調用其他組件來配合工作的完成,DisPatcherServlet的存在大大降低了組件之間的耦合性
2.HandlerMapping 處理器映射器
記錄url與處理器的映射,方式有注解、XML配置等
3.HandLer 處理器
后端控制器(通俗一點:Controller層所寫的業務代碼)。對用戶的請求進行處理
4.HandlerAdapter 處理器適配器
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。(我也不太明白)
5.ViewResolver 視圖解析器
ViewResolver負責解析view視圖,並進行渲染(數據填充),將處理結果通過頁面展示給用戶看
6.View 視圖
View是一個接口,實現類支持不同的View類型(jsp、freemarker、velocity)
一般情況下需要通過頁面標簽或者頁面模板技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
【流程圖說明】
1.用戶發送請求至 前端控制器DispatcherServlet。
2.前端控制器DispatcherServlet收到請求后調用處理器映射器HandlerMapping。
3.處理器映射器HandlerMapping根據請求的Url找到具體的處理器,生成處理器對象Handler及處理器攔截器HandlerIntercepter(如果有則生成)一並返回給前端控制器DispatcherServlet。
4.前端控制器DispatcherServlet通過處理器適配器HandlerAdapter調用處理器Controller。
5.執行處理器(Controller,也叫后端控制器)
6.處理器Controller執行完后返回ModelAnView。
7.處理器映射器HandlerAdapter將處理器Controller執行返回的結果ModelAndView返回給前端控制器DispatcherServlet。
8.前端控制器DispatcherServlet將ModelAnView傳給視圖解析器ViewResolver。
9.視圖解析器ViewResolver解析后返回具體的視圖View。
10.前端控制器DispatcherServlet對視圖View進行渲染視圖(即:將模型數據填充至視圖中)
11.前端控制器DispatcherServlet響應用戶。
三、配置
配置及測試demo參照:https://www.cnblogs.com/sunniest/p/4555801.html
四、擴展
1.解決post請求亂碼問題
在web.xml中配置
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.解決get請求中的中文亂碼問題
a.第一種:修改tomcat配置文件添加編碼與工程編碼一致,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
b.第二種:對參數進行重新編碼(ISO8859-1是tomcat默認編碼,需要將tomcat編碼后的內容按utf-8編碼)
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
3.SpringMVC與Struts2的主要區別?
③Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request對象內容進行解析成方法形參,將響應數據和頁面封裝成ModelAndView對象,最后又將模型數據通過request對象傳輸到頁面。 Jsp視圖解析器默認使用jstl。