Springboot的Controller中常用註解(一)
@Controller和@RestController和@ResponseBody
@Controller
@Controller註解標註類的方法,return時會被檢視處理器識別成靜態檔案的路徑。預設為templates資料夾下。如
return "test/hello"
表示的是預設路徑下的test資料夾中的名叫hello的檔案,帶上字尾名.html或btl等也可以識別。
@ResponseBody
@ResponseBody可以標註方法也可以標註類,當標註方法時表示該方法的返回值會被解析成json(字串會不會被轉換),直接寫入HTTP Response Body中,檢視處理器將不會將return的引數識別成路徑。當它標註類時,類中所有方法的返回值都將直接返回值到頁面,相當於給所有的類都加上@ResponseBody註解。
@RestController
@RestController是@Controller和@ResponseBody的結合體,只能註解類,return返回的值將被轉換成json,字串除外,直接寫入HTTP相應體返回到頁面中。
需要注意的是,只在類上註解@ResponseBody類中方法對映的URL並不能起作用,加上@Controller註解後才可以接受處理HTTP請求,同時加上 @RestController是@Controller和只寫@ResponseBody是一樣的效果
@RequestMapping
它可以註解類也可以註解方法,註解類時標註請求的路徑,標註方法時表示將特定的URL對映到指定的方法。@RequestMapping中有多個屬性來進一步匹配HTTP請求到方法:
-
value,請求的URL路徑,支援URL模板,正則表示式。和Ant路徑表示式。例如:
則/test/tom,/test/123等路徑都會被匹配到Hello方法中來
加入正則表示式[a-z]表示匹配一位所有的小寫字母。所以類似/test/a;/test/b等路徑都會被對映到Hello方法中。
使用Ant路徑表示式時。“ * ”單個星號表示匹配任意字元:/test/ *.html,/test/hello. *
" ** "用兩個星號表示任意路徑如圖中的/**/hello。使用?匹配單個字元,如/test/?.html -
method,指定HTTP請求的方法,GET,POST,PUT,DELETE等,只有匹配才能呼叫。Spring提供了簡化的寫法:
@GetMapping
@PostMapping
@PutMapping等
所以
@RequestMapping(value = "/test/hello",method = RequestMethod.GET)和
@GetMapping("/test/hello")表示的意思是一樣的
- consumes,指定HTTP請求頭中的Content-Type。
例如。設定Content-Type=application/json,則對應接收ajax請求。可以在ajax中設定contentType="application/json"確保資料型別。
引數相關注解
@PathVariable:
用於獲取URL中的引數:一般{ }中的變數名與方法中的形參名一致(可以不加@PathVariable註解)
如果名稱不一致則寫成:否則不單單是獲取不到引數,連方法都不執行!
@RequestParam
@RequestParam,用來處理Content-Type為application/x-www-form-urlencoded(預設型別如果不指定),使用value屬性可以指定獲取引數的key。
@RequestBody
@RequestBody 註解一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的資料,在GET請求中沒有請求體所以一般不適用,在post請求中必須指定Content-Type後才能使用它,如ajax請求指定傳送格式為application/json。