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