第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁(yè) 慕課教程 Spring MVC 入門教程 Spring MVC 入門教程 Spring MVC 綁定請(qǐng)求包中的數(shù)據(jù)

Spring MVC 綁定請(qǐng)求包中的數(shù)據(jù)

1. 前言

Spring MVC 框架的目的是為了解放開(kāi)發(fā)者,讓開(kāi)發(fā)者更專注于核心邏輯,它提供了很多輔助性功能模塊,來(lái)提高開(kāi)發(fā)者的開(kāi)發(fā)效率。

本節(jié)課將和大家一起講解 Spring MVC 是如何使用下面的幾個(gè)注解解析請(qǐng)求包中的數(shù)據(jù)。

  • @RequestParam ;
  • @CookieValue;
  • @RequestHeader;
  • @PathVariable 。

本章節(jié)的重點(diǎn)就是你要記住它們的使用場(chǎng)景。

2. 使用注解解析數(shù)據(jù)

原生 Servlet 開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者定義的 Servlet 具有請(qǐng)求響應(yīng)功能。因?yàn)?J2EE 中的 Servlet 僅僅只是提供了編寫企業(yè)級(jí)應(yīng)用程序的規(guī)范,并沒(méi)有提供更多實(shí)質(zhì)性的功能。在執(zhí)行響應(yīng)邏輯之前或之后需要開(kāi)發(fā)者編寫一些通用的功能代碼。

如解析請(qǐng)求包中的數(shù)據(jù)、構(gòu)建響應(yīng)路徑……

Spring MVC 提供了很多實(shí)用的注解,用來(lái)解析請(qǐng)求包、自動(dòng)綁定請(qǐng)求包中不同位置的數(shù)據(jù)。在使用注解解析請(qǐng)求包中的數(shù)據(jù)前,先了解一下請(qǐng)求包的格式。

WEB 應(yīng)用程序中, 所謂的請(qǐng)求包是指遵循 HTTP 協(xié)議的一種數(shù)據(jù)格式包。在某些文章中,稱請(qǐng)求包為報(bào)文。

圖片描述

一個(gè)完整的請(qǐng)求包應(yīng)該由 3 個(gè)部分組成:

  • 請(qǐng)求行: 包括請(qǐng)求方法、請(qǐng)求的資源地址(URL) 、HTTP 協(xié)議版本號(hào);
  • 消息頭: 消息頭是傳送給服務(wù)器的信息,以 key:value 的格式描述;
  • 實(shí)體部分或報(bào)文體:key=value 的數(shù)據(jù)格式保存客戶端傳遞給應(yīng)用程序的數(shù)據(jù)。

2.1 @RequestParam

功能: 自動(dòng)綁定請(qǐng)求包中的請(qǐng)求參數(shù)中的值。

請(qǐng)求參數(shù)可以出現(xiàn)在請(qǐng)求包中的 2 個(gè)位置:

  • ? 的方式附加在 URL 后面。如 http://localhost:8888/saveUser?name=abc 。name 就是請(qǐng)求參數(shù),abc 是值;
  • 以類似于 name=abc 的方式存儲(chǔ)在請(qǐng)求包的報(bào)文體中(實(shí)體部分)。

Tips: 當(dāng)客戶端以 POST 方法請(qǐng)求時(shí),數(shù)據(jù)將存儲(chǔ)在實(shí)體部分。

實(shí)例:

@RequestMapping(value="/saveUser")
public String save(@RequestParam("userName") String userName,@RequestParam("password")  password){}

當(dāng)請(qǐng)求格式類似于 http://localhost:8888/saveUser?userName=abc&password=123456 時(shí),save()方法中的 userNamepassword 2 個(gè)參數(shù)會(huì)被分別注入 abc 和 123456 這 2 個(gè)值。

客戶端在表單中以 POST 方法發(fā)送請(qǐng)求時(shí),數(shù)據(jù)將會(huì)以 userName=abc&password=123456 的格式存放在請(qǐng)求包的實(shí)體部分,也會(huì)自動(dòng)注入到 save() 方法的參數(shù)中。

Tips: 一定要保證 @RequestParam(“參數(shù)名”) 中的 “參數(shù)名” 和請(qǐng)求包中的參數(shù)名的命名相同。

@RequestParam 注解中有 3 個(gè)常用的屬性:

  • value(): 指定要解析的請(qǐng)求包中的參數(shù)名;
@AliasFor("name")
String value() default "";
  • required(): 表示請(qǐng)求包中是否必須存在由 value() 指定的參數(shù)名,默認(rèn)值是 true。如果沒(méi)有此參數(shù)則會(huì)拋出異常;
boolean required() default true;
  • defaultValue(): 表示如果不能正確獲取到指定參數(shù)的值時(shí),則提供一個(gè)默認(rèn)值。設(shè)置該參數(shù)時(shí),自動(dòng)將 required 設(shè)為 false。
String defaultValue() default ValueConstants.DEFAULT_NONE;

綜合實(shí)例:

@RequestMapping(value="/saveUser")
public String save(@RequestParam(value = "userName",defaultValue="mk",required = false)  String userName,){
}

Tips: 當(dāng)不能確定是否存在名為 “userName” 的參數(shù)時(shí),可使用 defaultValue 提供默認(rèn)值,并設(shè)置 required 為 false。

2.2 @CookieValue

功能描述: @CookieValue 用來(lái)自動(dòng)綁定請(qǐng)求包中的 Cookie 值。

Cookie 一般由 WEB 應(yīng)用程序在服務(wù)器端創(chuàng)建,通過(guò)響應(yīng)包傳遞給瀏覽器,并可以在瀏覽器端以文件的形式存儲(chǔ)。在后續(xù)請(qǐng)求過(guò)程中,請(qǐng)求包又可以攜帶此 Cookie 返回給服務(wù)器。

Cookie 所能保存的數(shù)據(jù)量有限且只能是字符類型,但其應(yīng)用場(chǎng)景較多,如 WEB 程序中的 Session 組件的狀態(tài)維護(hù)、用戶免輸入登錄、歷史記錄顯示等功能都可以通過(guò) Cookie 實(shí)現(xiàn)。

如果要獲取請(qǐng)求包中的 Cookie 中的值,控制器中只需要如下編碼便可:

@RequestMapping(value="/sessionId")
public String getSessionId(@CookieValue("JSESSIONID") String sessionId){

}

當(dāng)請(qǐng)求格式類似于 http://localhost:8888/saveUser?sessionId 時(shí),getSessionId()方法中的 sessionId 參數(shù)會(huì)被注入 Cookie 中所攜帶的 JSESSIONID 的值。

只要指定 Cookie 的名稱,@CookieValue 便能自動(dòng)獲取此 Cookie 的值。

2.3 @RequestHeader

功能描述: 請(qǐng)求包中有很多消息頭信息,都是以 key:value 的格式存在。在開(kāi)發(fā)過(guò)程中,當(dāng)需要獲取這些消息頭信息時(shí),可以使用 @RequestHeader 注解自動(dòng)綁定。

實(shí)例:

@RequestMapping(value="/header")
public String getHeader(@RequestHeader("Accept-Language") String accpetLanguage){
  ...
}

當(dāng)請(qǐng)求格式類似于 http://localhost:8888/header 時(shí),**getHeader()**方法的 accpetLanguage 參數(shù)會(huì)被注入請(qǐng)求包中 key 名為 Accept-Language 的消息頭值。

當(dāng)然,你可以更改成你所需要的消息頭的 key 名,然后獲取其對(duì)應(yīng)的值。

@RequestHeader 注解中的方法如下:

@AliasFor("name")
String value() default "";
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;

其功能和 @RequestMapping 注解中的一樣。兩者只是關(guān)心的請(qǐng)求包中的數(shù)據(jù)不同而已。

2.4 @PathVariable

功能描述: @PathVariable 注解用來(lái)獲取 URL 中變量的值。

什么是 URL 中的變量?還是用一個(gè)實(shí)例來(lái)說(shuō)話:

@RequestMapping("/user/{userId}")
public String getUserById(@PathVariable("userId") String userId){

}

{userId} 就是變量占位符。具體請(qǐng)求時(shí),可使用一個(gè)真實(shí)值替換。如請(qǐng)求格式:http://localhost:8888/user/1 時(shí),@PathVariable 可以為 getUserById() 方法中的 userId 參數(shù)注入值 1。

@PathVariable 注解同樣有一個(gè) required 屬性,表示是否強(qiáng)制 URL 中有變量的存在。

boolean required() default true;

@PathVariable 注解非常有用,請(qǐng)你一定要記住它。

3. 小結(jié)

本節(jié)向大家介紹了 4 個(gè)注解,大家可以使用它們很輕松的從請(qǐng)求包中解析自己所需要的數(shù)據(jù)。

這 4 個(gè)注解的使用方式大同小異,每一種注解各自關(guān)注了請(qǐng)求包中不同位置的數(shù)據(jù):

  • @RequestParam :關(guān)注請(qǐng)求參數(shù)中的值;
  • @CookieValue:關(guān)注 Cookie 的值;
  • @RequestHeader 關(guān)注請(qǐng)求頭的值;
  • @PathVariable :關(guān)注請(qǐng)求變量的值。