知識庫 / Spring / Spring MVC RSS 訂閱

Spring Web 註解

Spring MVC
HongKong
6
02:01 PM · Dec 06 ,2025
該文章是系列的一部分
• Spring Core 註解
• Spring Web 註解 (當前文章)
• Spring Boot 註解
• 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 請求和響應。

下一章
Spring Boot 註解
上一頁
Spring Core 註解
user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.