(一).SpringMVC 學習-初識SpringMVC
1.1、 Spring MVC是什麼
Spring MVC是一種基於Java的實現了Web MVC設計模式的請求驅動型別的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。
Spring Web MVC也是服務到工作者模式的實現,但進行可優化。前端控制器DispatcherServlet ;
應用控制器其實拆為處理器對映器(Handler Mapping)進行處理器管理和檢視解析器(View Resolver)進行檢視管理;頁面控制器/動作/處理器為Controller介面(僅包含ModelAndView handleRequest(request, response)
1.2、Spring MVC能幫我們做什麼
√讓我們能非常簡單的設計出乾淨的Web層和薄薄的Web層;
√進行更簡潔的Web層的開發;
√天生與Spring框架整合(如IoC容器、AOP等);
√提供強大的約定大於配置的契約式程式設計支援;
√能簡單的進行Web層的單元測試;
√支援靈活的URL到頁面控制器的對映;
√非常容易與其他檢視技術整合,如Velocity、FreeMarker等等,因為模型資料不放在特定的API裡,而是放在一個Model裡(Map
√非常靈活的資料驗證、格式化和資料繫結機制,能使用任何物件進行資料繫結,不必實現特定框架的API;
√提供一套強大的JSP標籤庫,簡化JSP開發;
√支援靈活的本地化、主題等解析;
√更加簡單的異常處理;
√對靜態資源的支援;
√支援Restful風格(REST風格的請求方式)。
1.3、Spring MVC架構
Spring Web MVC框架也是一個基於請求驅動的Web框架,並且也使用了前端控制器模式來進行設計,再根據請求對映規則分發給相應的頁面控制器(動作/處理器)進行處理。首先讓我們整體看一下Spring Web MVC處理請求的流程:
核心架構的具體流程步驟如下
1、 首先使用者傳送請求——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作為統一訪問點,進行全域性的流程控制;
2、 DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求對映為HandlerExecutionChain物件(包含一個Handler處理器(頁面控制器)物件、多個 HandlerInterceptor攔截器)物件,通過這種策略模式,很容易新增新的對映策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為介面卡,從而支援多種型別的處理器,即介面卡設計模式的應用,從而很容易支援很多型別的處理器;
4、 HandlerAdapter——>處理器功能處理方法的呼叫,HandlerAdapter將會根據適配的結果呼叫真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView物件(包含模型資料、邏輯檢視名);
5、 ModelAndView的邏輯檢視名——> ViewResolver, ViewResolver將把邏輯檢視名解析為具體的View,通過這種策略模式,很容易更換其他檢視技術;
6、 View——>渲染,View會根據傳進來的Model模型資料進行渲染,此處的Model實際是一個Map資料結構,因此很容易支援其他檢視技術;
7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給使用者,到此一個流程結束。
此處我們只是講了核心流程,沒有考慮攔截器、本地解析、檔案上傳解析等,後邊再細述。
到此提出以下問題:
1、 請求如何給前端控制器?這個應該在web.xml中進行部署描述。將在以下中詳細講解。
2、 前端控制器如何根據請求資訊選擇頁面控制器進行功能處理? 我們需要配置HandlerMapping進行對映
3、 如何支援多種頁面控制器呢?配置HandlerAdapter從而支援多種型別的頁面控制器
4、 如何頁面控制器如何使用業務物件?可以預料到,肯定利用Spring IoC容器的依賴注入功能
5、 頁面控制器如何返回模型資料?使用ModelAndView返回
6、 前端控制器如何根據頁面控制器返回的邏輯檢視名選擇具體的檢視進行渲染? 使用ViewResolver進行解析
7、 不同的檢視技術如何使用相應的模型資料? 因為Model是一個Map資料結構,很容易支援其他檢視技術
在此我們可以看出具體的核心開發步驟:
1、 DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC
2、 HandlerMapping的配置,從而將請求對映到處理器
3、 HandlerAdapter的配置,從而支援多種型別的處理器
4、 ViewResolver的配置,從而將邏輯檢視名解析為具體檢視技術
5、處理器(頁面控制器)的配置,從而進行功能處理
1.4、 Spring MVC優勢
1、清晰的角色劃分:前端控制器(DispatcherServlet)、 請求到處理器對映(HandlerMapping)、處理器介面卡(HandlerAdapter)、檢視解析器(ViewResolver)、處理器或 頁面控制器(Controller)、驗證器( Validator)、命令物件(Command 請求引數繫結到的物件就叫命令物件)、表單物件(Form Object 提供給表單展示和提交到的物件就叫表單物件)。
2、分工明確,而且擴充套件點相當靈活,可以很容易擴充套件,雖然幾乎不需要;
3、由於命令物件就是一個POJO,無需繼承框架特定API,可以使用命令物件直接作為業務物件;
4、和Spring 其他框架無縫整合,是其它Web框架所不具備的;
5、可適配,通過HandlerAdapter可以支援任意的類作為處理器;
6、可定製性,HandlerMapping、ViewResolver等能夠非常簡單的定製;
7、功能強大的資料驗證、格式化、繫結機制;
8、利用Spring提供的Mock物件能夠非常簡單的進行Web層單元測試;
9、本地化、主題的解析的支援,使我們更容易進行國際化和主題的切換。
10、強大的JSP標籤庫,使JSP編寫更容易。
還有比如RESTful風格的支援、簡單的檔案上傳、約定大於配置的契約式程式設計支援、基於註解的零配置支援等等。
1.5、重要的介面和類的簡單說明
DispatcherServlet:前端控制器,用於接收請求。
HandlerMapping介面:用於處理請求的對映。
DefaultAnnotationHandlerMapping:HandlerMapping介面的實現,用於把一個URL對映到具體的Controller類上。
HandlerAdapter介面:用於處理請求的對映。
AnnotationMethodHandlerAdapter:HandlerAdapter介面的實現 ,用於把一個URL對映到對應Controller類的某個方法上。
ViewResolver介面:用於解析View。
InternalResourceViewResolver:ViewResolver介面的實現,用於把ModelAndView的邏輯檢視名解析為具體的View。
1.6、springMVC 常用註解
負責註冊一個bean 到spring 上下文中,指定此類為一個控制器
@RequestMapping
註解為控制器指定可以處理哪些 URL 請求(類+方法=請求地址)
@RequestBody
該註解用於讀取Request請求的body部分資料,使用系統預設配置的HttpMessageConverter進行解析,然後把相應的資料繫結 到要返回的物件上,再把HttpMessageConverter返回的物件資料繫結到 controller中方法的引數上
@ResponseBody
該註解用於將Controller的方法返回的物件,通過適當的HttpMessageConverter轉換為指定格式後,寫入到Response物件的body資料區
@ModelAttribute
在方法定義上使用 @ModelAttribute 註解:Spring MVC 在呼叫目標處理方法前,會先逐個呼叫在方法級上標註了@ModelAttribute 的方法
在方法的入參前使用 @ModelAttribute 註解:可以從隱含物件中獲取隱含的模型資料中獲取物件,再將請求引數 –繫結到物件中,再傳入入參將方法入參物件新增到模型中
@RequestParam
在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法
@PathVariable
繫結 URL 佔位符到入參
@ExceptionHandler
註解到方法上,出現異常時會執行該方法
@ControllerAdvice
使一個Contoller成為全域性的異常處理類,類中用@ExceptionHandler方法註解的方法可以處理所有Controller發生的異常
到此我們已經簡單的瞭解了Spring Web MVC,接下來讓我們來個例項來具體使用下這個框架!
持續更新中.......
轉載於:https://my.oschina.net/hapier/blog/711826