MVC、Spring MVC 學習筆記
一、MVC
1、Model
模型層,可以簡單理解就是資料層,用於提供資料。在專案中,(簡單理解)一般把資料訪問和操作,比如將物件關係對映這樣的程式碼作為Model層,也就是對資料庫的操作這一些列的程式碼作為Model層。比如程式碼中我們會寫DAO和DTO型別的程式碼,那這個DAO和DTO我們可以理解為是屬於Model層的程式碼。
2、View
檢視層,就是UI介面,用於跟使用者進行互動。一般所有的JSP、Html等頁面就是View層。
3、Controller
控制層,Controller層的功能就是將Model和View層進行關聯。比如View主要是顯示資料的,但是資料又需要Model去訪問,這樣的話,View會先告訴Controller,然後Controller再告訴Model,Model請求完資料之後,再告訴View。這樣View就可以顯示資料了。
二、SpringMVC
關於Spring MVC和Struts,與MVC的關係:
大家還記得在上面我舉過的一個例子,MVC好比鞋櫃。那Spring和Struts2只是不同牌子的鞋櫃而已。並且Spring MVC和Struts2只是一個協助程式設計師更好實現MVC分層架構的框架而已。就是說,我們實現MVC不一定非要使用Spring或者struts2,自己按照MVC的理解,自己完成自己程式碼的分層也行。就好比自己在家用木棍自己製作一個鞋櫃也照樣可以把鞋子擺放整齊,當然,這樣做的話首先要你有這樣的一個木工技術。我們沒有必要為了一個鞋櫃,還要自己去學習木工技術,所以最好最快的方式就是去超市買一個鞋櫃。
我們直接使用Spring mvc或者struts2來實現MVC,就是我們直接使用別人做好的東西,直接用。快捷、省時、省事、而且質量好。
三、SpringMVC執行原理
- 客戶端請求提交到DispatcherServlet
- 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller
- DispatcherServlet將請求提交到Controller
- Controller呼叫業務邏輯處理後,返回ModelAndView
- DispatcherServlet查詢一個或多個ViewResoler檢視解析器,找到ModelAndView指定的檢視
- 檢視負責將結果顯示到客戶端
四、SpringMVC常用註解
@Controller
負責註冊一個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發生的異常
五、知識點
SpringMVC註解@initbinder解決型別轉換問題
在使用SpringMVC的時候,經常會遇到表單中的日期字串和JavaBean的Date型別的轉換,而SpringMVC預設不支援這個格式的轉換,所以需要手動配置,自定義資料的繫結才能解決這個問題。
在需要日期轉換的Controller中使用SpringMVC的註解@initbinder和Spring自帶的WebDateBinder類來操作。
WebDataBinder是用來繫結請求引數到指定的屬性編輯器.由於前臺傳到controller裡的值是String型別的,當往Model裡Set這個值的時候,如果set的這個屬性是個物件,Spring就會去找到對應的editor進行轉換,然後再SET進去。
程式碼如下:
@InitBinder public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd”);
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
需要在SpringMVC的配置檔案加上
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter"/>
</list>
</property> </bean> <!-- String型別解析器,允許直接返回String型別的訊息 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>