• Spring Scheduling 註解
• Spring Data 註解
• Spring Bean 註解
1. 概述
在本教程中,我們將探討 Spring Web 註解,這些註解位於 org.springframework.web.bind.annotation 包中。
2. @RequestMapping
簡單來説,@RequestMapping 標記了位於 @Controller 類中的請求處理器方法;它可以配置使用:
- path, 或其別名,name, 和 value: 指定方法映射到的 URL
- method: 兼容的 HTTP 方法
- params: 根據 HTTP 參數的存在、缺失或值過濾請求
- headers: 根據 HTTP 頭部的值過濾請求
- consumes: 方法可以消耗的 HTTP 請求體媒體類型
- produces: 方法可以產生的 HTTP 響應體媒體類型
下面是一個示例,説明了它的外觀:
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}我們可以為所有處理方法提供 默認設置,如果我們在類級別上應用此註解(@Controller)的話。唯一 例外是 Spring 不會使用方法級別的設置覆蓋 URL,而是追加兩個路徑部分。
例如,以下配置具有與上述相同的效果:
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}此外,<em @GetMapping</em>>, <em @PostMapping</em>>, <em @PutMapping</em>>, <em @DeleteMapping</em>>, 和 <em @PatchMapping</em>> 是 <em @RequestMapping</em>> 的不同變體,HTTP 方法分別設置為 GET、POST、PUT、DELETE 和 PATCH。
這些功能在 Spring 4.3 版本中可用。
3. @RequestBody
接下來我們討論一下 @RequestBody – 它將 HTTP請求的主體映射到對象:
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
// ...
}反序列化是自動進行的,取決於請求的內容類型。
4. @PathVariable
接下來,我們來談談 @PathVariable。
這個註解指示一個 方法參數綁定到 URI 模板變量。我們可以使用 @RequestMapping 註解指定 URI 模板,並使用 @PathVariable 將方法參數綁定到模板的一部分。
我們可以使用 name 或其別名,value 參數來實現這一點:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
// ...
}如果模板中部件的名稱與方法參數的名稱匹配,則無需在註釋中指定它:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}此外,通過將 required 標誌設置為 false,我們可以標記路徑變量為可選的。
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}5. @RequestParam</em/>
我們使用 @RequestParam 來 訪問 HTTP 請求參數:
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}它具有與 @PathVariable 註解相同的配置選項。
除了這些設置之外,使用 @RequestParam,我們可以指定在 Spring 未找到或請求值為空時注入的值。要實現這一點,必須設置 defaultValue 參數。
提供默認值會隱式地將 required 設置為 false。
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}除了參數之外,我們還可以訪問其他 HTTP 請求部分:Cookie 和 Header。我們可以使用註解 @CookieValue和@RequestHeader分別訪問它們。
我們可以以與 @RequestParam 相同的方式進行配置。
6. 響應處理標註
在接下來的部分,我們將看到在 Spring MVC 中操縱 HTTP 響應的常見標註。
6.1. <em @ResponseBody
如果我們將請求處理方法標記為 <em @ResponseBody,Spring 會將該方法的返回值視為響應本身:
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}如果我們在該註解中對 @Controller 類進行標註,則所有請求處理方法都會使用它。
6.2. <em @ExceptionHandler</em>>
通過此註解,我們可以聲明一個 自定義錯誤處理方法。Spring 在任何指定異常的請求處理方法拋出異常時,都會調用該方法。
捕獲的異常可以作為參數傳遞給該方法:
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}6.3. <em @ResponseStatus</em>
我們可以通過註解請求處理方法,指定響應的所需 HTTP 狀態碼。可以使用code參數或其別名value來聲明狀態碼。
還可以使用reason參數提供原因。
我們還可以將其與<em @ExceptionHandler一起使用:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}欲瞭解有關 HTTP 響應狀態碼的更多信息,請訪問本文檔。
7. 其他網頁標註
某些標註不直接管理 HTTP 請求和響應。在下一部分,我們將介紹最常見的標註類型。
7.1. <em @Controller
我們可以使用 <em @Controller 定義 Spring MVC 控制器。 欲瞭解更多信息,請訪問我們關於 Spring Bean 註解的文章。
7.2. <em data-translation-id="7.2. @RestController"
@RestController 結合了 @ResponseBody。
因此,以下聲明是等效的:
@Controller
@ResponseBody
class VehicleRestController {
// ...
}@RestController
class VehicleRestController {
// ...
}7.3. <em @ModelAttribute@
通過此註解,我們可以訪問 MVC 模型的已存在元素,通過提供模型鍵來實現:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
// ...
}類似於使用 @PathVariable 和 @RequestParam 時,如果參數名稱相同,我們就不需要指定模型鍵:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
// ...
}此外,<em style="font-style: italic;">@ModelAttribute</em> 還有另一個用途:如果我們用它標註一個方法,Spring 會自動將該方法的返回值添加到模型中:`
@ModelAttribute("vehicle")
Vehicle getVehicle() {
// ...
}與之前一樣,我們無需指定模型鍵,Spring 默認使用方法的名稱:
@ModelAttribute
Vehicle vehicle() {
// ...
}在 Spring 調用請求處理方法之前,它會調用類中所有帶有 @ModelAttribute 註解的方法。
關於 @ModelAttribute 的更多信息,請參閲本文。
7.4. <em @CrossOrigin >
@CrossOrigin 允許為標註的請求處理方法啓用跨域通信:
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}如果我們將一個類標記為這樣,它將應用於該類中所有請求處理方法。
我們可以使用此註解的參數來微調 CORS 行為。
有關更多詳細信息,請參閲本文。
8. 結論
在本文中,我們學習瞭如何使用 Spring MVC 處理 HTTP 請求和響應。