天天看點

Controller中常用注解的細節你了解嗎?一文帶你了解

作者:二進制狂人kxyL
Controller中常用注解的細節你了解嗎?一文帶你了解

一、@Controller

聲明該類為SpringMVC中的Controller,控制器Controller 負責處理分發處理器DispatcherServlet 發來的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,再傳回給對應的View 進行展示。

分發處理器DispatcherServlet會在整個項目目錄中掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解。@Controller 隻是定義了一個控制器類,而使用@RequestMapping 注解的方法才是真正處理請求的處理器。

二、@RequestMapping

@RequestMapping的作用是建立請求URL和處理方法之間的對應關系,可以作用在方法和類上。用于類上時,表示類中的所有響應請求的方法都是以該位址作為父路徑。

@RequestMapping的屬性

  • value:指定請求路徑的URL
  • method:指定該方法的請求方式,可以有post和get
less複制代碼@GetMapping 是一個組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫。
@PostMapping是一個組合注解,是@RequestMapping(method = RequestMethod.POST)的縮寫。
           

三、@RequestBody與@RequestParam

在POST請求且前端請求頭的Content-Type字段值為 application/json 時,後端就會将前端傳來的json格式的資料轉換為自己定義好的javabean對象,需要注意的是傳入資料的屬性名稱要和後端javabean中定義的一緻。

如果前端沒有特意設定這個字段,資料就會以預設的 Content-Type:application/x-www-form-urlencoded 格式發送到後端。後端就隻能以@RequestParam接收。

注解@RequestParam接收的參數除了這種預設的格式之外,還能接收form表單送出的form-data以及url裡?後面的參數。

@RequestParam有三個配置參數:

  • required:表示該參數是否必須有,預設為 true。也就是進行表單驗證
  • defaultValue:可設定請求參數的預設值。
  • value:對應url的參數名,相當于key值,名字必須一緻,後面的value類型要一緻,名字任意。

關于@RequestBody與@RequestParam使用的選擇 :

在GET請求中,不能使用@RequestBody,隻能用@RequestParam。因為沒有HttpEntity,HandlerAdapter 配置的HttpMessageConverters無處去解析。

在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,需要同時滿足兩個條件:1.前端必須規定 contentType:"application/json";2.傳入資料的屬性名稱要和後端javabean中定義的一緻。

另外,無論是POST請求還是GET請求, form-data以及url裡?後面的參數都不能用@RequestBody接收,隻能用@RequestParam

四、@ResponseBody

@ResponseBody注解通常使用在Controller方法上(寫在方法名上面),通過HandlerAdapter 配置的HttpMessageConverter接口,将方法傳回的對象轉換為指定格式的資料,如:json、xml等,然後寫入到Response的響應體中傳回給用戶端,配置的視圖解析器InternalResourceViewResolver不再起作用,傳回的内容就是Return 裡的内容,return的内容直接輸出在頁面上。

@ResponseBody注解也可以直接用于類上,就寫在@Controller下面,表示該類中的所有Controller方法均使用該注解。

另外需要注意的是,如果将對象轉換成json傳回,需要設定編碼,否則中文傳到頁面上會變成問号。

java複制代碼response.setCharacterEncoding("utf-8");
           

如果直接傳回中文字元串,頁面可能出現亂碼。需要在後端的注解中手動修改編碼格式

java複制代碼@RequestMapping(produces=“text/html;charset=utf-8”)
           

POST和GET請求都可以使用@ResponseBody

五、@RestController

通過上面我們知道,當@Controller寫在類上且@ResponseBody寫在類中某個方法上時,該方法傳回的對象會被轉化為json直接輸出在頁面上。而如果@RestController寫在類上,就相當于該類的所有方法都無法傳回到jsp頁面,而是直接return一個json檔案。

@RestController注解就相當于 @Controller + @ResponseBody 合在一起的作用。

來源:https://juejin.cn/post/7255220627794231357

繼續閱讀