1. 程式人生 > >Spring 4.x官方參考文件中文版——第21章 Web MVC框架(8)

Spring 4.x官方參考文件中文版——第21章 Web MVC框架(8)

支援的方法返回引數型別
        以下是支援的方法返回引數型別:
  • 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上,把請求引數繫結到方法引數上。

        請看下面的使用例項程式碼:


         預設情況下,引數是必須要用這個註解的,但是你能通過把@RequestParam的required屬性設定為false,來使特定引數變得可選。(比如:@RequestParam(path=”id”,required=false))。
         如果目標的方法引數的型別不是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來把返回的物件轉換成一個響應主體。如需瞭解關於轉換器的更多資訊,見前面的”訊息轉換器”這一章節。