最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC映射HTTP請求到Controller的處理方法

 更新時間:2025年05月21日 11:09:30   作者:冰糖心書房  
我們來詳細分析一下如何在 Spring MVC 中將 HTTP 請求映射到 Controller 的處理方法(Handler Methods)上,以及 @RequestMapping 注解的使用方法,需要的朋友可以參考下

請求映射的核心:@RequestMapping 注解

@RequestMapping 是 Spring MVC 中最核心、最通用的映射注解。它可以用于類級別(Class-level)和方法級別(Method-level)。

  1. 類級別映射 (Class-level Mapping):

    • 當 @RequestMapping 應用在類上時,它定義了Controller 處理所有請求的基類URL 路徑。
    • 這樣可以避免在每個方法上添加重復相同的路徑前綴。
  2. 方法級別映射 (Method-level Mapping):

    • 當 @RequestMapping 應用在方法上時,它指定了該方法具體處理哪個(或哪些)URL 路徑的請求。
    • 這個路徑是相對于類級別路徑的(如果存在的話)。

@RequestMapping 的主要屬性:

  • value 或 path:

    • 指定映射的 URL 路徑??梢允且粋€字符串數(shù)組,表示映射多個路徑到同一個方法。
    • 支持 Ant 風格的路徑模式(如 ***?)和 URI 模板變量(路徑變量,如 {userId})。
    • value 和 path 是同義詞,可以互換使用。
  • method:

    • 指定該方法處理的 HTTP 請求方法(GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD, TRACE)。
    • 可以是一個 RequestMethod 枚舉值的數(shù)組,表示處理多種 HTTP 方法。
    • 如果不指定,默認會匹配 所有 HTTP 方法。
  • params:

    • 根據(jù)請求參數(shù)(Query Parameters 或 Form Data)進行映射。只有當請求中包含(或不包含,或具有特定值)指定的參數(shù)時,才會匹配成功。
    • 表達式語法:
      • "myParam": 參數(shù) myParam 必須存在。
      • "!myParam": 參數(shù) myParam 必須不存在。
      • "myParam=myValue": 參數(shù) myParam 必須存在且值為 myValue。
      • "myParam!=myValue": 參數(shù) myParam 必須存在且值不為 myValue
      • 可以組合多個條件,如 {"myParam=val", "otherParam"}(AND 關(guān)系)。
  • headers:

    • 根據(jù)請求頭(Request Headers)進行映射。只有當請求包含(或不包含,或具有特定值)指定的頭信息時,才會匹配成功。
    • 語法與 params 類似,如 "Accept=application/json""!User-Agent""X-Custom-Header=value"。
  • consumes:

    • 指定該方法能夠處理的請求的 Content-Type(即客戶端發(fā)送的數(shù)據(jù)類型)。只有當請求的 Content-Type Header 與指定的值匹配時,才會映射成功。
    • 例如:consumes = "application/json" 或 consumes = MediaType.APPLICATION_JSON_VALUE??梢灾付ǘ鄠€,如 {"application/json", "application/xml"}。
  • produces:

    • 指定該方法能夠生成的響應的 Content-Type(即服務器返回的數(shù)據(jù)類型)。Spring 會根據(jù)請求的 Accept Header 和此屬性進行內(nèi)容協(xié)商(Content Negotiation),選擇最合適的 HttpMessageConverter 來序列化返回值。
    • 例如:produces = "application/json" 或 produces = MediaType.APPLICATION_JSON_VALUE??梢灾付ǘ鄠€。

示例:使用 @RequestMapping

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@Controller
@RequestMapping("/users") // 類級別映射,所有方法都在 /users 路徑下
public class UserController {

    // 映射 GET /users/{id}
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody // 如果用 @Controller 需要加這個來返回數(shù)據(jù)
    public User getUser(@PathVariable Long id) {
        // ... 獲取用戶邏輯 ...
        return new User(id, "Example User");
    }

    // 映射 POST /users
    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String createUser(@RequestBody User newUser) {
        // ... 創(chuàng)建用戶邏輯 ...
        return "User created";
    }

    // 映射 GET /users?admin=true (需要 admin 參數(shù))
    @RequestMapping(method = RequestMethod.GET, params = "admin=true")
    @ResponseBody
    public String getAdminUsers() {
        // ... 獲取管理員用戶列表 ...
        return "List of Admin Users";
    }

    // 映射 GET /users (只接受 JSON 請求)
    @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
    @ResponseBody
    public String getUsersAcceptingJson() {
        // ... 獲取用戶列表 ...
        return "List of Users (JSON requested)";
    }
}

@RequestMapping 的變體 (快捷方式注解)

為了提高代碼的可讀性和簡潔性,Spring 提供了針對特定 HTTP 方法的快捷方式注解。它們本質(zhì)上是 @RequestMapping 預設了 method 屬性的別名。

  • @GetMapping: 映射 HTTP GET 請求。等價于 @RequestMapping(method = RequestMethod.GET)。
  • @PostMapping: 映射 HTTP POST 請求。等價于 @RequestMapping(method = RequestMethod.POST)。
  • @PutMapping: 映射 HTTP PUT 請求。等價于 @RequestMapping(method = RequestMethod.PUT)。
  • @DeleteMapping: 映射 HTTP DELETE 請求。等價于 @RequestMapping(method = RequestMethod.DELETE)
  • @PatchMapping: 映射 HTTP PATCH 請求。等價于 @RequestMapping(method = RequestMethod.PATCH)。

這些快捷注解也支持 @RequestMapping 的 value/pathparamsheadersconsumesproduces 屬性。

使用快捷方式注解的優(yōu)點:

  • 更簡潔: 代碼更短。
  • 更清晰: 一眼就能看出方法處理的是哪種 HTTP 請求。

示例:使用快捷方式注解 (@RestController 簡化)

import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@RestController // 使用 @RestController,無需在每個方法上加 @ResponseBody
@RequestMapping("/api/items") // 類級別映射
public class ItemController {

    // 映射 GET /api/items/{itemId}
    // produces 也可直接寫字符串
    @GetMapping(value = "/{itemId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public Item getItem(@PathVariable String itemId) {
        // ... 獲取物品邏輯 ...
        return new Item(itemId, "Sample Item");
    }

    // 映射 POST /api/items
    // consumes 可以指定多個
    @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    public String createItem(@RequestBody Item newItem) {
        // ... 創(chuàng)建物品邏輯 ...
        return "Item created: " + newItem.getName();
    }

    // 映射 PUT /api/items/{itemId}
    @PutMapping("/{itemId}")
    public Item updateItem(@PathVariable String itemId, @RequestBody Item updatedItem) {
        // ... 更新物品邏輯 ...
        updatedItem.setId(itemId); // 假設更新成功
        return updatedItem;
    }

    // 映射 DELETE /api/items/{itemId}
    @DeleteMapping("/{itemId}")
    public String deleteItem(@PathVariable String itemId) {
        // ... 刪除物品邏輯 ...
        return "Item deleted: " + itemId;
    }

    // 映射 GET /api/items?type=gadget
    @GetMapping(params = "type=gadget")
    public String getGadgets() {
        return "List of Gadgets";
    }

    // 映射 GET /api/items (需要特定 Header)
    @GetMapping(headers = "X-API-Version=2")
    public String getItemsV2() {
        return "List of Items (API V2)";
    }
}

// 示例 Pojo
class Item {
    private String id;
    private String name;
    // constructors, getters, setters...
    public Item(String id, String name) { this.id = id; this.name = name; }
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

class User {
    private Long id;
    private String username;
    // constructors, getters, setters...
    public User(Long id, String username) { this.id = id; this.username = username; }
    public Long getId() { return id; }
    public String getUsername() { return username; }
}

總結(jié)

  • @RequestMapping 是基礎,可以映射任何 HTTP 方法,并提供最全面的配置選項(pathmethodparamsheadersconsumesproduces)。
  • @GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping 是針對特定 HTTP 方法的快捷方式,使代碼更簡潔明了,是目前 Spring MVC/WebFlux 開發(fā)中的推薦用法。
  • 可以在類級別方法級別同時使用映射注解,類級別定義基礎路徑,方法級別定義相對路徑。
  • URL 路徑通過 value 或 path 屬性匹配,支持模式和路徑變量 ({var})。
  • HTTP 方法通過 method 屬性(在 @RequestMapping 中)或選擇特定的快捷注解(如 @GetMapping)來匹配。
  • 請求參數(shù)通過 params 屬性進行匹配。
  • 請求頭通過 headers 屬性進行匹配。
  • 請求體類型 (Content-Type) 通過 consumes 屬性進行匹配。
  • 可接受的響應類型 (Accept) 通過 produces 屬性參與內(nèi)容協(xié)商。

以上就是Spring MVC映射HTTP請求到Controller的處理方法的詳細內(nèi)容,更多關(guān)于Spring MVC映射HTTP到Controller的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • swagger文檔增強工具knife4j使用圖文詳解

    swagger文檔增強工具knife4j使用圖文詳解

    這篇文章主要介紹了swagger文檔增強工具knife4j使用詳解,想要使用knife4j非常簡單,只要在Springboot項目中引入knife4j的依賴即可,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Springboot 配置RabbitMQ文檔的方法步驟

    Springboot 配置RabbitMQ文檔的方法步驟

    這篇文章主要介紹了Springboot 配置RabbitMQ文檔的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Spring bean為什么需要依賴注入

    Spring bean為什么需要依賴注入

    本篇文章主要介紹了Spring依賴注入的三種方式小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • IDEA2019.2.2配置Maven3.6.2打開出現(xiàn)Unable to import Maven project

    IDEA2019.2.2配置Maven3.6.2打開出現(xiàn)Unable to import Maven project

    這篇文章主要介紹了IDEA2019.2.2配置Maven3.6.2打開出現(xiàn)Unable to import Maven project,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • java?-jar指定spring配置文件完整示例

    java?-jar指定spring配置文件完整示例

    這篇文章主要介紹了java?-jar指定spring配置文件的相關(guān)資料,通過示例講解了激活dev profile、設置外部配置路徑、直接指定配置文件名,需要的朋友可以參考下
    2025-06-06
  • Spring中@Primary注解的作用與使用

    Spring中@Primary注解的作用與使用

    本文主要介紹了Spring中@Primary注解的作用與使用,@Primary?注解用于解決依賴注入時的歧義性問題,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • 淺談Java中向上造型向下造型和接口回調(diào)中的問題

    淺談Java中向上造型向下造型和接口回調(diào)中的問題

    這篇文章主要介紹了淺談Java中向上造型向下造型和接口回調(diào)中的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java設計模式 模板模式及應用場景解析

    Java設計模式 模板模式及應用場景解析

    這篇文章主要介紹了Java設計模式 模板模式及應用場景解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Spring超詳細講解AOP面向切面

    Spring超詳細講解AOP面向切面

    面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對象”來實現(xiàn),所以,面向?qū)ο缶幊唐鋵嵕褪菍?nbsp;“類”和“對象” 的使用,面向切面編程,簡單的說,就是動態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程
    2022-10-10
  • Java異常鏈表throw結(jié)構(gòu)assert詳細解讀

    Java異常鏈表throw結(jié)構(gòu)assert詳細解讀

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08

最新評論

东莞市| 巴青县| 民和| 武隆县| 云安县| 谷城县| 清苑县| 隆子县| 永春县| 密山市| 红安县| 元谋县| 花莲市| 呼和浩特市| 保靖县| 泾源县| 沈阳市| 葫芦岛市| 三门县| 高陵县| 汉沽区| 溧水县| 高安市| 余江县| 永康市| 西青区| 邵阳市| 天台县| 凤翔县| 晋江市| 康保县| 当阳市| 民和| 永城市| 阿瓦提县| 上杭县| 景谷| 兰溪市| 邵阳县| 天柱县| 嘉祥县|