一、@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