Spring MVC 綁定請求包中的數據
1. 前言
Spring MVC 框架的目的是為了解放開發者,讓開發者更專注于核心邏輯,它提供了很多輔助性功能模塊,來提高開發者的開發效率。
本節課將和大家一起講解 Spring MVC 是如何使用下面的幾個注解解析請求包中的數據。
- @RequestParam ;
- @CookieValue;
- @RequestHeader;
- @PathVariable 。
本章節的重點就是你要記住它們的使用場景。
2. 使用注解解析數據
原生 Servlet 開發過程中,開發者定義的 Servlet 具有請求響應功能。因為 J2EE 中的 Servlet 僅僅只是提供了編寫企業級應用程序的規范,并沒有提供更多實質性的功能。在執行響應邏輯之前或之后需要開發者編寫一些通用的功能代碼。
如解析請求包中的數據、構建響應路徑……
Spring MVC 提供了很多實用的注解,用來解析請求包、自動綁定請求包中不同位置的數據。在使用注解解析請求包中的數據前,先了解一下請求包的格式。
WEB 應用程序中, 所謂的請求包是指遵循 HTTP 協議的一種數據格式包。在某些文章中,稱請求包為報文。
一個完整的請求包應該由 3 個部分組成:
- 請求行: 包括請求方法、請求的資源地址(URL) 、HTTP 協議版本號;
- 消息頭: 消息頭是傳送給服務器的信息,以 key:value 的格式描述;
- 實體部分或報文體: 以 key=value 的數據格式保存客戶端傳遞給應用程序的數據。
2.1 @RequestParam
功能: 自動綁定請求包中的請求參數中的值。
請求參數可以出現在請求包中的 2 個位置:
- 用 ? 的方式附加在 URL 后面。如 http://localhost:8888/saveUser?name=abc 。name 就是請求參數,abc 是值;
- 以類似于 name=abc 的方式存儲在請求包的報文體中(實體部分)。
Tips: 當客戶端以 POST 方法請求時,數據將存儲在實體部分。
實例:
@RequestMapping(value="/saveUser")
public String save(@RequestParam("userName") String userName,@RequestParam("password") password){}
當請求格式類似于 http://localhost:8888/saveUser?userName=abc&password=123456 時,save()方法中的 userName 和 password 2 個參數會被分別注入 abc 和 123456 這 2 個值。
客戶端在表單中以 POST 方法發送請求時,數據將會以 userName=abc&password=123456 的格式存放在請求包的實體部分,也會自動注入到 save() 方法的參數中。
Tips: 一定要保證 @RequestParam(“參數名”) 中的 “參數名” 和請求包中的參數名的命名相同。
@RequestParam 注解中有 3 個常用的屬性:
- value(): 指定要解析的請求包中的參數名;
@AliasFor("name")
String value() default "";
- required(): 表示請求包中是否必須存在由 value() 指定的參數名,默認值是 true。如果沒有此參數則會拋出異常;
boolean required() default true;
- defaultValue(): 表示如果不能正確獲取到指定參數的值時,則提供一個默認值。設置該參數時,自動將 required 設為 false。
String defaultValue() default ValueConstants.DEFAULT_NONE;
綜合實例:
@RequestMapping(value="/saveUser")
public String save(@RequestParam(value = "userName",defaultValue="mk",required = false) String userName,){
}
Tips: 當不能確定是否存在名為 “userName” 的參數時,可使用 defaultValue 提供默認值,并設置 required 為 false。
2.2 @CookieValue
功能描述: @CookieValue 用來自動綁定請求包中的 Cookie 值。
Cookie 一般由 WEB 應用程序在服務器端創建,通過響應包傳遞給瀏覽器,并可以在瀏覽器端以文件的形式存儲。在后續請求過程中,請求包又可以攜帶此 Cookie 返回給服務器。
Cookie 所能保存的數據量有限且只能是字符類型,但其應用場景較多,如 WEB 程序中的 Session 組件的狀態維護、用戶免輸入登錄、歷史記錄顯示等功能都可以通過 Cookie 實現。
如果要獲取請求包中的 Cookie 中的值,控制器中只需要如下編碼便可:
@RequestMapping(value="/sessionId")
public String getSessionId(@CookieValue("JSESSIONID") String sessionId){
}
當請求格式類似于 http://localhost:8888/saveUser?sessionId 時,getSessionId()方法中的 sessionId 參數會被注入 Cookie 中所攜帶的 JSESSIONID 的值。
只要指定 Cookie 的名稱,@CookieValue 便能自動獲取此 Cookie 的值。
2.3 @RequestHeader
功能描述: 請求包中有很多消息頭信息,都是以 key:value 的格式存在。在開發過程中,當需要獲取這些消息頭信息時,可以使用 @RequestHeader 注解自動綁定。
實例:
@RequestMapping(value="/header")
public String getHeader(@RequestHeader("Accept-Language") String accpetLanguage){
...
}
當請求格式類似于 http://localhost:8888/header 時,**getHeader()**方法的 accpetLanguage 參數會被注入請求包中 key 名為 Accept-Language 的消息頭值。
當然,你可以更改成你所需要的消息頭的 key 名,然后獲取其對應的值。
@RequestHeader 注解中的方法如下:
@AliasFor("name")
String value() default "";
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
其功能和 @RequestMapping 注解中的一樣。兩者只是關心的請求包中的數據不同而已。
2.4 @PathVariable
功能描述: @PathVariable 注解用來獲取 URL 中變量的值。
什么是 URL 中的變量?還是用一個實例來說話:
@RequestMapping("/user/{userId}")
public String getUserById(@PathVariable("userId") String userId){
}
{userId} 就是變量占位符。具體請求時,可使用一個真實值替換。如請求格式:http://localhost:8888/user/1 時,@PathVariable 可以為 getUserById() 方法中的 userId 參數注入值 1。
@PathVariable 注解同樣有一個 required 屬性,表示是否強制 URL 中有變量的存在。
boolean required() default true;
@PathVariable 注解非常有用,請你一定要記住它。
3. 小結
本節向大家介紹了 4 個注解,大家可以使用它們很輕松的從請求包中解析自己所需要的數據。
這 4 個注解的使用方式大同小異,每一種注解各自關注了請求包中不同位置的數據:
- @RequestParam :關注請求參數中的值;
- @CookieValue:關注 Cookie 的值;
- @RequestHeader 關注請求頭的值;
- @PathVariable :關注請求變量的值。