Spring 4.x官方參考文件中文版——第21章 Web MVC框架(8)
阿新 • • 發佈:2019-02-07
支援的方法返回引數型別
以下是支援的方法返回引數型別:
使用@RequestParam把請求引數繫結到方法引數上
使用@RequestParam註解,能夠在你的controller上,把請求引數繫結到方法引數上。
如果目標的方法引數的型別不是String,會被自動轉換成String,請參考”方法引數和型別轉換”這一章節。
如果在Map<String, String>或者MultiValueMap<String, String>的方法入參上使用@RequestParam註解,這個map將被所有請求引數填充。
使用@RequestBody註解來對映request請求主體
通過使用HttpMessageConverter,你把請求的主體轉換成了一個方法入參。HttpMessageConverter可以把HTTP請求的訊息轉換為一個物件,也可以把一個物件轉換成HTTP響應主體。利用以下預設的HttpMessageConverters,RequestMappingHandlerAdapter可以支援@RequestBody註解:
如果需要詳細瞭解這些轉換器,見”訊息轉換器”這一章節。同時請注意,如果使用MVC名稱空間或者MVC java配置,預設會註冊很多不同功能的資訊轉換器。詳見”啟用MVC Java配置或MVC XML名稱空間”這一章節。
一個@RequestBody方法引數能被@Valid所註解,這種情況下,這個方法引數能被配置好的Validator例項所驗證。當使用MVC 名稱空間或MVC Java配置時,假定在classpath(類路徑)中可以使用JSR-303的實現時,JSR-303驗證器將會被自動配置好。
小提示:
以下是支援的方法返回引數型別:
- ModelAndView : 這個物件由包括了指令物件的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果組成。
- Model : 模型物件,由通過RequestToViewNameTranslator決定了的檢視名,包括了指令物件的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果共同組成。
- Map : map物件代表了model模型,由通過RequestToViewNameTranslator決定了的檢視名,包括了指令物件的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果共同組成。
- View : view物件,由通過指令物件決定了的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果共同組成。它的處理器方法中,也可以用程式設計的方式來宣告一個Model引數,並新增進這個model模型裡。
- String : 一個字串值,可以被當成檢視名,由通過指令物件決定了的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果共同組成。它的處理器方法中,也可以用程式設計的方式來宣告一個Model引數,並新增進這個model模型裡。
- void :如果這個方法自己處理響應(通過宣告一個ServletResponse/HttpServletResponse型別的方法入參,在裡面直接寫響應的內容這種方式),或者檢視名支援通過RequestToViewNameTranslator來指定時使用(在處理器方法中沒有宣告一個response(響應)入參)。
- 如果方法被@ResponseBody註解了,返回的引數型別會被寫到響應的HTTP主體中,返回值會被HttpMessageConverters轉換成聲明瞭的方法入參型別。詳見”使用@ResponseBody註解對映響應主體”這一章節。
- HttpEntity<?> 或 ResponseEntity<?> : 這兩個物件是提供了Servlet響應HTTP 報頭和內容的訪問權。這個實體的主體部分會被HttpMessageConverters轉換為響應stream(資料流),詳見”使用HttpEntity”這一章節。
- HttpHeaders : 這個物件可以返回一個沒有body(主體)部分的響應。
- Callable<?> : 在Spring MVC的管控下,當應用需要在一個執行緒中非同步地產生返回值時,這個值能夠通過這個物件進行返回。
- DeferredResult<?> : 當應用需要在被特定的執行緒中非同步地產生返回值時,這個值能夠通過這個物件進行返回。
- ListenableFuture<?> : 當應用需要在被特定的執行緒中非同步地產生返回值時,這個值能夠通過這個物件進行返回。
- ResponseBodyEmitter : 能把多個物件非同步地寫到響應中並返回,同樣也能通過在主體中使用ResponseEntity來支援。
- SseEmitter : 能把Server-Sent Events(服務端推送事件)非同步地寫入到響應中並返回,也能通過在主體中使用ResponseEntity來支援。
- StreamingResponseBody : 能把響應的OutPutStream非同步地寫入到返回值中,也能通過在主體中使用ResponseEntity來支援。
- 使用通過在方法級的@ModelAttribute特定的屬性名(或者基於返回型別的類名的預設屬性名)的任何能在檢視中展示的單個model模型屬性的返回型別,包括了有指令物件的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果共同組成。
使用@RequestParam把請求引數繫結到方法引數上
使用@RequestParam註解,能夠在你的controller上,把請求引數繫結到方法引數上。
請看下面的使用例項程式碼:
如果目標的方法引數的型別不是String,會被自動轉換成String,請參考”方法引數和型別轉換”這一章節。
如果在Map<String, String>或者MultiValueMap<String, String>的方法入參上使用@RequestParam註解,這個map將被所有請求引數填充。
使用@RequestBody註解來對映request請求主體
方法引數中的@RequestBody註解,代表了這個方法引數與HTTP請求主體的值繫結在一起,比如:
通過使用HttpMessageConverter,你把請求的主體轉換成了一個方法入參。HttpMessageConverter可以把HTTP請求的訊息轉換為一個物件,也可以把一個物件轉換成HTTP響應主體。利用以下預設的HttpMessageConverters,RequestMappingHandlerAdapter可以支援@RequestBody註解:
- ByteArrayHttpMessageConverter : 可以轉換位元組陣列。
- StringHttpMessageConverter : 可以轉換字串。
- FormHttpMessageConverter : 可以在表單資料和MultiValueMap<String, String>間互相轉換。
- SourceHttpMessageConverter : 可以轉換成一個javax.xml.transform.Source。
如果需要詳細瞭解這些轉換器,見”訊息轉換器”這一章節。同時請注意,如果使用MVC名稱空間或者MVC java配置,預設會註冊很多不同功能的資訊轉換器。詳見”啟用MVC Java配置或MVC XML名稱空間”這一章節。
如果你想讀寫XML,你需要利用在org.springframework.oxm包裡的Marshaller和Unmarshaller實現,來配置MarshallingHttpMessageConverter。下面的例子展示了在配置檔案中的配置方法,但是如果你是通過MVC名稱空間或者MVC Java配置應用,請參考” 啟用MVC Java配置或MVC XML名稱空間”這一章節。
一個@RequestBody方法引數能被@Valid所註解,這種情況下,這個方法引數能被配置好的Validator例項所驗證。當使用MVC 名稱空間或MVC Java配置時,假定在classpath(類路徑)中可以使用JSR-303的實現時,JSR-303驗證器將會被自動配置好。
小提示:
也可參考” 啟用MVC Java配置或MVC XML名稱空間”這一章節,來獲得更多關於通過使用MVC配置名稱空間或MVC Java配置,來配置訊息轉換器和驗證器的資訊。
利用@ResponseBody註解對映響應主體
@ResponseBody註解與@RequestBody很相似,這個註解放在方法上面,代表方法的返回型別直接寫入到HTTP響應的主體中(而不是被放置在一個model模型中,或者被當作一個檢視名),例如:
上面的例子會把“Hello World”直接寫入到HTTP響應資料流中。
利用@RequestBody,Spring會利用HttpMessageConverter來把返回的物件轉換成一個響應主體。如需瞭解關於轉換器的更多資訊,見前面的”訊息轉換器”這一章節。