SpringMVC基礎總結

SpringMVC執行流程:

客戶端發送請求,前端控制器(DispatcherServlet)將請求中的RUI傳遞給處理器映射器(HandlerMapping,由處理器和攔截器組成),處理器映射器將對應的處理器名字返回給前端控制器.

前端控制器根據處理器映射器返回的控制器名字調用對應的處理器適配器(HandlerAdapter),處理器適配器調用handler()方法,handle方法利用java的反射機制執行Controller的具體方法來獲得ModelAndView,Controller將ModelAndView(數據和視圖名)返回給處理器適配器,處理器適配器再將其返回給前端控制器.

如果是邏輯視圖,則前端控制器會將ModelAndView傳遞給視圖解析器(ViewResolver),視圖解析器會根據ModelAndView定位真實視圖,並由View將模型渲染到視圖中,最終響應請求;

如果是非邏輯視圖,則直接由View對視圖進行渲染(將模型填充到視圖中),最終響應請求.

處理器在要調用控制器之前,需要先獲取HTTP發送過來的信息,然後通過消息轉換器和格式化器將其轉變爲控制器的不同類型參數,處理完成後就會進行驗證器的驗證,最後調用控制器的方法.控制器完成返回結果後,再通過消息轉換器將結果進行HTTP轉換.

SpringMVC常用註解

@Controller標識爲控制器組件.

@RestController相當於@Controller+@ResponseBody

@RequestMapping用於指定請求的映射路徑.

@RequestBody用於接收前端傳來的JSON格式的數據.默認不允許爲空.

@RequestParam用於接收前端傳來 不同名稱的參數.默認不允許爲空

@PathVariable用於接收Rest風格下(Rest風格用URL的形式傳遞參數)的參數.默認允許爲空.

@RequestAttribute用於獲取HTTP請求(request)對象中的屬性,默認不能爲空

@SessionAttribute用於獲取HTTP會話(session)對象中的屬性,默認不能爲空

@CookieValue用於獲取Cookie中的信息.默認不能爲空

@RequestHeader用於獲取HTTP請求頭中的信息,默認不能爲空

@SessionAttributes用於給HTTP會話(session)對象中設置KV屬性.

@ResponseBody用於返回JSON數據.(取消後續的視圖渲染過程).

重定向

SpringMVC在返回的字符串帶有redirect:的時候,會進行重定向.遇到forward:的時候,會進行請求轉發.

如果進行重定向時要傳遞JSON數據,則會出錯,因爲HTTP的重定向參數是以字符串傳遞的.這時候只需要給進行重定向方法加一個RedirectAttribute類型的參數,通過該類的addFlashAttribute方法即可將參數傳遞.原理是:將數據存入一個只在會話期有效的Session中(重定向完成後就會清除),這樣就能傳遞數據給下一個地址了.

攔截器

配置攔截器,實現接口HandlerInterceptor.

preHandle方法:處理器執行之前調用,返回布爾值,如果爲false,則同一個類中的下面兩個方法都不執行

postHandle方法:處理器執行之後調用

afterCompletion方法:無論是否發生異常,都會在渲染視圖完成後執行的方法.

如果只想實現其中某個方法,可以繼承HandlerInterceptorAdapter抽象類(缺省適配器).

驗證器

用@Valid標明那個Bean需要啓用註解式的驗證,Errors類型的對象會接收錯誤信息,以下爲JS303規範給出的註解

@Null必須爲空

@NotNull必須不爲空

@AssertTrue必須爲true

@AssertFalse必須爲false

@Min(value)必須大於定於指定值.

@Max(value)必須小於等於指定值

@Size(max,min)必須在指定的範圍內

@Past必須是過去的日期

@Future必須是將來的日期

@Pattern(value)必須符合指定的正則表達式.

要自定義驗證器規則,可以實現Validator接口.使用@InitBinder註解可以將驗證器綁定到控制器中.

JSR303和自定義驗證器不能同時使用.

消息轉換器

HTTPMessageConverter稱爲HTTP消息轉換器根接口

MappingJackson2HttpMessageConverter稱爲JSON消息轉換器.派生自HTTP消息轉換器.

Converter一對一轉換器根接口.

GenericConverter數組和集合轉換器根接口(一對多).

Formatter格式化器接口.

@DateTimeFormat用於進行日期格式的定義.

@NumberFormat用於數字的格式轉換.

爲控制器添加通知

@ControllerAdvice作用於類,用以標識全局性的控制器的攔截器,它將被應用於對應的控制器.

@InitBinder是一個允許構建POJO參數的方法,允許在構造控制器參數的時候加入一定的自定義控制.

@ExceptionHandler通過它可以註冊一個控制器異常,使用當控制器發生註冊異常時,就會跳轉到該方法上.

@ModelAttribute用於數據模型的註解,優先於控制器方法運行,用於接收數據保存到數據模型中,或者從數據模型中取出數據.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章