javascript
5.SpringMVC
1.SpringMVC概述
概述:
SpringMVC是基于請求驅動,圍繞一個核心Servlet 轉發請求到對應的Controller而設計的
優點:
是一個典型的教科書式的MVC構架,易學易用
提供了清晰的角色劃分,比如Controller、validator、handler mapping、view resolver等
可重用的業務代碼
可定制的數據綁定和驗證,可定制的視圖解決方案
提供了一套強大又使用簡單的標簽庫
支持Restful風格
體系結構:
1、客戶端發出請求,交給DispatcherServlet處理
2、DispatcherServlet根據請求信息及HandlerMapping的配置找到處理請求的處理器(Handler)
3、DispatcherServlet通過HandlerAdapter對Handler進行封裝,再以統一的適配器接口調用Handler
4、處理器完成業務邏輯,返回一個ModelAndVIew給DispatcherServlet,ModelAndView包含視圖邏輯名和模型數據信息
5、DispatcherServlet借由ViewResolver完成邏輯視圖名到真實視圖的解析工作
6、得到View真實視圖后,DispatcherServlet就使用這個View對象對ModelAndView中的模型數據進行渲染
7、最終客戶得到響應
?
?2.控制器
DispatcherServlet:
DispatcherServlet繼承自HttpServlet,是整個SpringMVC中的前端控制器,主要負責流程控制
DispatcherServlet使用了專有的Bean來處理請求和渲染視圖,可以在WebApplicationContext中進行配置,這些Bean包括:
| Bean類型 | 解釋 |
| HandlerMapping | 將傳入請求映射到處理器 |
| HandlerAdapter | 將處理器包裝為適配器,從而支持多種類型的處理器 |
| ViewResolver | 將邏輯視圖名解析為具體的View |
| LocaleResolver & LocaleContextResolver | 解釋客戶端所在地區和其時區(本地化),以便提供國際化的視圖 |
| ThemeResolver | 解釋Web程序可用主題,比如提供個性化布局 |
| MultipartResolver | 解釋multi-part請求,比如表單里支持文件上傳 |
當一個請求傳進來后,DispatcherServlet會按以下順序處理:
尋找 WebApplicationContext,并將 WebApplicationContext作為一個屬性綁定到請求里,以便控制器或其他原件在后續中使用。默認會以DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE 鍵綁定到請求里
將本地化解析器綁定到請求里,以便在處理這個請求時,原件可以解析到客戶端的地區(為了渲染視圖,準備日期等)
將主題解析其綁定到請求里,讓原件(如視圖)決定去使用哪一種主題
若指定一個multipart file解析器,會檢查這個請求包含multiparts請求
尋找合適的 handler。如何找到這個 handler,執行與這個 handler 關聯的執行鏈
如果返回一個 model,渲染相對應的視圖
?
Controller:
客戶請求經由前端控制器DispatcherServlet后,分發給后續子控制器Controller
SpringMVC的Controller會獲取用戶的輸入,訪問由服務接口定義的業務邏輯功能,并通過視圖將模型數據再響應給用戶
從Spring2.5以后,提供了一組注解用于SpringMVC的編程,比如:@Controller、@RequestMapping、@RequestParam
@RequestMapping中,還可以使用method來限制請求的類型,比如以下例子中映射login的URL,并且是Get方式的請求
?
URI模板模式
URI模版是一個類似于URI的字符串,其中包含了一個或多個變量。當你將這些變量替換掉市,就變回了URI
例如:路徑為http://www.example.com/owners/fred,則方法中ownerId的值即為“fred”
路徑模式
@RequestMapping注解處理支持URI模版,也支持使用Ant風格模式
/user/regist, 匹配/user/regist
/user/*/regist, 匹配/user/aaa/regist
/user/**/regist, 匹配/user/regist、/user/aaa/bbb/regist等
/user/regist?, 匹配/user/regista等
@RequestMapping還支持組合使用URI模版和Ant風格模式
如:/owners/*/pets/{petId}
矩陣變量:
開啟矩陣變量的支持:<mvc:annotation-driven enable-matrix-variables="true"/>矩陣變量實例:
?
?
@RequestParam將請求參數綁定到方法參法:
@CookieValue注解允許將方法參數與HTTPcookie 值綁定
?
?
@RequestHeader 映射請求頭字段屬性
?
@ResponseBody此注解用在方法上,用來表示直接將返回數據寫到HTTP響應體里
一般用于響應AJAX的請求,返回JSON格式的字符串
注意:不是將數據放到Model中,或解析為視圖名稱
3.攔截器
Spring的handler映射機制包含了handler攔截器
使用handler攔截器,可以在某些的請求中應用的特殊的功能,比如說檢查權限、防止表單重復提交等等
handler映射的攔截器必須實現HandlerInterceptor接口,該接口有3個方法:
preHandle(..) 在handler執行前調用
postHandle(..) 在handler執行后調用
afterCompletion(..) 在整一個請求完成后調用
注意:不是將數據放到Model中,或解析為視圖名稱
攔截器在SpringMVC配置文件中如下配置:
4.文件上傳
文件上傳在Web項目中使用廣泛,而SpringMVC提供了2種常用的方法來實現
基于Servlet3.0的文件上傳
基于Commons FileUpload的文件上傳
頁面表單代碼如下:
基于Servlet3.0的實現:
在web.xml中的DispatcherServlet增加“multipart-config”配置
在SpringMVC配置文件中增加
?
編寫Controller類:
Commons Fileupload:
需要導入commons-fileupload.jar和commons-io.jar
在SpringMVC配置文件中增加:
編寫Controller類:
?
轉載于:https://www.cnblogs.com/Firesun/p/9921111.html
總結
以上是生活随笔為你收集整理的5.SpringMVC的全部內容,希望文章能夠幫你解決所遇到的問題。