成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringMVC接口定義RequestMapping這些細節(jié)你用過嗎?

開發(fā) 架構(gòu)
Spring MVC支持對請求映射使用組合注釋。這些注釋本身是用@RequestMapping進行元注釋的,并且組合起來重新聲明@RequestMapping屬性的一個子集(或全部),目的更窄、更具體。

環(huán)境:Spring5.3.25

概述

你可以使用@RequestMapping注釋將請求映射到控制器(controller)方法。它有各種屬性,可以根據(jù)URL、HTTP方法、請求參數(shù)、頭和媒體類型進行匹配。你可以在類級別使用它來表示共享映射,或者在方法級別使用它來縮小到特定的端點映射。

還有HTTP方法特定的快捷方式變體@RequestMapping:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

提供的快捷方式是自定義注釋,因為大多數(shù)控制器方法應該映射到特定的HTTP方法,而不是使用@RequestMapping,默認情況下,匹配所有HTTP方法。在類級別上仍然需要@RequestMapping來表示共享映射,統(tǒng)一前綴。

下面的例子有類型級和方法級的映射:?

@RestController
@RequestMapping("/persons")
class PersonController {
@GetMapping("/{id}")
public Person getPerson(@PathVariable Long id) {
// ...
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void add(@RequestBody Person person) {
// ...
}
}

URI模式

@RequestMapping方法可以使用URL模式進行映射。有兩種選擇:

PathPattern - 一個與URL路徑匹配的預解析模式,也被預解析為PathContainer。設計為web使用,該解決方案有效地處理編碼和路徑參數(shù),并有效地匹配。

AntPathMatcher

PathPattern是web應用程序的推薦解決方案,也是Spring WebFlux中的唯一選擇。在5.3版本之前,AntPathMatcher是Spring MVC中的唯一選擇,并且一直是默認選項。然而,PathPattern可以在MVC配置中啟用。

PathPattern支持與AntPathMatcher相同的模式語法。此外,它還支持捕獲模式,例如{*spring},用于在路徑的末尾匹配0個或多個路徑段。PathPattern還限制使用**來匹配多個路徑段,這樣它只允許在模式的末尾使用。在為給定的請求選擇最佳匹配模式時,這消除了許多不明確的情況。完整的模式語法請參考PathPattern和AntPathMatcher。

一些示例模式:

"/resources/ima?e.png" -匹配路徑段中的一個字符

"/resources/*.png" -在路徑段中匹配零個或多個字符

"/resources/**" -匹配多個路徑段

"/projects/{project}/versions" -匹配路徑段并將其作為變量捕獲

"/projects/{project:[a-z]+}/versions" -用正則表達式匹配并捕獲變量

獲取的URI變量可以通過@PathVariable訪問。例如:

@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}

你可以在類和方法級別聲明URI變量,如下例所示:?

@Controller
// 類級別的應該用的非常少
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
@GetMapping("/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
}

URI變量會自動轉(zhuǎn)換為適當?shù)念愋停蛘咭l(fā)TypeMismatchException異常。默認情況下支持簡單類型(int、long、Date等),你也可以注冊對任何其他數(shù)據(jù)類型的支持。請參閱類型轉(zhuǎn)換和DataBinder。

你可以顯式地命名URI變量(例如,@PathVariable("customId")),但是如果名稱相同,并且你的代碼是用調(diào)試信息或Java 8上的-parameters(用了該標記方法上的參數(shù)名稱就被記錄下來)編譯器標記編譯的,則可以省略該細節(jié)。

后綴匹配

從5.3開始,默認情況下Spring MVC不再執(zhí)行.*后綴模式匹配,其中映射到/person的控制器也隱式映射到/person.*。因此,路徑擴展不再用于解釋響應所請求的內(nèi)容類型——例如/person.pdf、/person.xml等等。

當瀏覽器用來發(fā)送難以一致解釋的Accept頭時,以這種方式使用文件擴展名是必要的。目前,這不再是必要的,使用Accept報頭應該是首選。

隨著時間的推移,文件擴展名的使用在許多方面都被證明是有問題的。當它與URI變量、路徑參數(shù)和URI編碼的使用重疊時,可能會導致歧義。關(guān)于基于url的授權(quán)和安全性的推理。

要在5.3之前的版本中完全禁用路徑擴展的使用,請設置如下:

useSuffixPatternMatching(false),參見PathMatchConfigurer

favorpatheextension(false),參見ContentNegotiationConfigurer

通過“Accept”頭以外的方式請求內(nèi)容類型仍然是有用的,例如在瀏覽器中輸入URL時。路徑擴展的安全替代方法是使用查詢參數(shù)策略。如果必須使用文件擴展名,請考慮通過ContentNegotiationConfigurer的mediaTypes屬性將它們限制為顯式注冊的擴展名列表。

Consumer媒體類型

你可以根據(jù)請求的Content-Type縮小請求映射,示例如下:?

// 使用consumes屬性按內(nèi)容類型縮小映射范圍
@PostMapping(path = "/pets", consumes = "application/json")
public void addPet(@RequestBody Pet pet) {
// ...
}

consume屬性還支持否定表達式——例如,!text/plain表示除text/plain以外的任何內(nèi)容類型。

你可以在類級別聲明共享消費屬性。然而,與大多數(shù)其他請求映射屬性不同的是,當在類級使用時,方法級使用屬性重寫,而不是擴展類級聲明。

MediaType為常用的媒體類型提供常量,例如APPLICATION_JSON_VALUE和APPLICATION_XML_VALUE。

Producer媒體類型

你可以根據(jù)Accept請求頭和控制器方法產(chǎn)生的內(nèi)容類型列表來縮小請求映射,如下面的例子所示:?

// 使用produces屬性按內(nèi)容類型縮小映射范圍。
@GetMapping(path = "/pets/{petId}", produces = "application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId) {
// ...
}

媒體類型可以指定字符集。支持非表達式——例如,!text/plain表示除“text/plain”之外的任何內(nèi)容類型。

你可以在類級別聲明一個共享的produces屬性。然而,與大多數(shù)其他請求映射屬性不同的是,當在類級使用時,方法級產(chǎn)生屬性重寫,而不是擴展類級聲明。

請求參數(shù)與Header

可以根據(jù)請求參數(shù)條件縮小請求映射。你可以測試是否有請求參數(shù)(myParam),或者是否有特定的值(myParam=myValue)。下面的例子展示了如何測試一個特定的值:?

// 測試myParam是否等于myValue
@GetMapping(path = "/pets/{petId}", params = "myParam=myValue")
public void findPet(@PathVariable String petId) {
// ...
}

你也可以使用相同的請求頭條件,如下面的例子所示:?

// 測試myHeader是否等于myValue
@GetMapping(path = "/pets", headers = "myHeader=myValue")
public void findPet(@PathVariable String petId) {
// ...
}

HTTP請求Method

@GetMapping(和@RequestMapping(method=HttpMethod.GET))對請求映射透明地支持HTTP HEAD。控制器方法不需要改變。應用于javax.servlet.http中的響應包裝器。HttpServlet,確保Content-Length頭被設置為寫入的字節(jié)數(shù)(而不實際寫入響應)。

@GetMapping(和@RequestMapping(method=HttpMethod.GET))隱式映射到并支持HTTP HEAD。處理HTTP HEAD請求時就像處理HTTP GET一樣,不同的是,它不是寫入正文,而是計算字節(jié)數(shù),并設置Content-Length報頭。

默認情況下,HTTP OPTIONS是通過將Allow響應頭設置為所有具有匹配URL模式的@RequestMapping方法中列出的HTTP方法列表來處理的。

對于沒有HTTP方法聲明的@RequestMapping,允許頭被設置為GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS。控制器方法應該始終聲明支持的HTTP方法(例如,通過使用特定于HTTP方法的變量:@GetMapping、@PostMapping和其他)。

你可以顯式地將@RequestMapping方法映射到HTTP HEAD和HTTP OPTIONS,但在一般情況下這是不必要的。

自定義注解

Spring MVC支持對請求映射使用組合注釋。這些注釋本身是用@RequestMapping進行元注釋的,并且組合起來重新聲明@RequestMapping屬性的一個子集(或全部),目的更窄、更具體。

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping和@PatchMapping是組合注釋的例子。提供它們的原因是,大多數(shù)控制器方法都應該映射到特定的HTTP方法,而不是使用@RequestMapping,默認情況下,它匹配所有HTTP方法。如果需要一個組合注釋的示例,請查看它們是如何聲明的。

Spring MVC還支持使用自定義請求匹配邏輯的自定義請求映射屬性。這是一個更高級的選項,需要子類化RequestMappingHandlerMapping并覆蓋getCustomMethodCondition方法,在該方法中你可以檢查自定義屬性并返回自己的RequestCondition。

顯示的注冊

你可以以編程方式注冊處理程序方法,可以將其用于動態(tài)注冊或高級情況,例如不同url下相同處理程序的不同實例。下面的例子注冊了一個處理器方法:?

@Configuration
public class MyConfig {

@Autowired
public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserHandler handler) throws NoSuchMethodException {
RequestMappingInfo info = RequestMappingInfo.paths("/user/{id}").methods(RequestMethod.GET).build();
// 指定接口處理的方法
Method method = UserHandler.class.getMethod("getUser", Long.class);
mapping.registerMapping(info, handler, method);
}
}

完畢!!!

責任編輯:武曉燕 來源: 實戰(zhàn)案例錦集
相關(guān)推薦

2023-01-16 08:09:51

SpringMVC句柄

2021-11-30 08:44:29

SpringRouter Func函數(shù)式接口

2024-03-21 10:39:24

CIOAI

2023-11-22 07:42:01

2019-03-18 15:56:56

IntelAMDCPU

2023-09-13 09:20:00

日志配置Spring

2019-05-22 10:25:50

人工智能AI

2021-05-31 05:12:11

Edge微軟瀏覽器

2019-08-27 15:12:12

Linux操作系統(tǒng)Windows

2021-09-27 13:02:10

Linux工具命令

2014-04-09 09:12:08

2023-09-09 12:23:24

函數(shù)式接口程序

2024-10-30 16:39:45

2020-10-14 14:44:51

iPhone 12蘋果iPhone

2021-05-24 05:36:31

壓縮圖片應用壓縮工具

2011-06-10 13:57:00

SEO

2020-04-22 15:27:30

Vue組件項目

2021-04-05 22:33:24

Windows 10Windows微軟

2021-02-24 11:13:48

IDE工具代碼編輯器

2020-04-29 13:30:38

腳本Chrome黑科技
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久婷婷 | 国产欧美一区二区三区久久手机版 | 九九福利 | xx视频在线观看 | 激情在线视频 | 亚洲高清视频在线观看 | 国产亚洲网站 | 精品久久久久久久久久久久久久 | 亚洲国产精品久久 | 伊人看片| 亚洲 中文 欧美 日韩 在线观看 | 亚洲一区二区av | 亚洲精选一区 | 天天干亚洲 | 日本成人中文字幕在线观看 | 亚洲国产区 | 日韩精品国产精品 | 亚洲高清在线 | 女人毛片a毛片久久人人 | 99re热精品视频国产免费 | 99久久精品国产一区二区三区 | 亚洲综合一区二区三区 | 99热首页| 国产高清美女一级a毛片久久w | 在线观看亚洲精品视频 | 古装人性做爰av网站 | 免费观看的av | 91精品麻豆日日躁夜夜躁 | 久久国产精品无码网站 | 国产精品一级在线观看 | 国产伦一区二区三区久久 | 99色在线| 欧美精品一区二区在线观看 | 日韩电影中文字幕 | 亚洲欧美v | 午夜网址| 四虎影| 久久精品国产久精国产 | 久草免费在线 | 欧美日韩在线免费观看 | 蜜桃视频在线观看www社区 |