聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別
@RequestParam 和 @PathVariable 注解是用于從request中接收請求的,兩個都可以接收參數(shù),關(guān)鍵點(diǎn)不同的是@RequestParam 是從request里面拿取值,而 @PathVariable 是從一個URI模板里面來填充
@RequestParam
看下面一段代碼:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
根據(jù)上面的這個URL,你可以用這樣的方式來進(jìn)行獲取
public String getDetails( @RequestParam(value="param1", required=true) String param1, @RequestParam(value="param2", required=false) String param2){ ... }
@RequestParam 支持下面四種參數(shù)
defaultValue 如果本次請求沒有攜帶這個參數(shù),或者參數(shù)為空,那么就會啟用默認(rèn)值
name 綁定本次參數(shù)的名稱,要跟URL上面的一樣
required 這個參數(shù)是不是必須的
value 跟name一樣的作用,是name屬性的一個別名
@PathVariable
這個注解能夠識別URL里面的一個模板,我們看下面的一個URL
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
上面的一個url你可以這樣寫:
@RequestMapping("/hello/{id}") public String getDetails(@PathVariable(value="id") String id, @RequestParam(value="param1", required=true) String param1, @RequestParam(value="param2", required=false) String param2){ ....... }
區(qū)別很明顯了
@PathParam
這個注解是和spring的pathVariable是一樣的,也是基于模板的,但是這個是jboss包下面的一個實(shí)現(xiàn),上面的是spring的一個實(shí)現(xiàn),都要導(dǎo)包
@QueryParam
@QueryParam 是 JAX-RS 本來就提供的,和Spring的RequestParam作用一致
@ResponseBody
responseBody表示服務(wù)器返回的時候以一種什么樣的方式進(jìn)行返回, 將內(nèi)容或?qū)ο笞鳛?HTTP 響應(yīng)正文返回,值有很多,一般設(shè)定為json
@RequestBody
一般是post請求的時候才會使用這個請求,把參數(shù)丟在requestbody里面
補(bǔ)充:@pathvariable參數(shù)_SpringMVC 五種注解參數(shù)綁定
@pathvariable參數(shù)_SpringMVC 五種注解參數(shù)綁定
SpringMVC參數(shù)綁定,簡單來說就是將客戶端請求的key/value數(shù)據(jù)綁定到controller方法的形參上,然后就可以在controller中使用該參數(shù)了
下面通過5個常用的注解演示下如何進(jìn)行參數(shù)綁定:
1. @PathVariable注解
@PathVariable 是用來獲得請求url中的動態(tài)參數(shù)的,可以將URL中的變量映射到功能處理方法的參數(shù)上,其中URL 中的 {xxx} 占位符可以通過@PathVariable(“xxx“) 綁定到操作方法的入?yún)⒅小?/p>
示例代碼:
@ResponseBody @RequestMapping("/testUrlPathParam/{param1}/{param2}")public void testUrlPathParam(HttpServletRequest request, @PathVariable String param1, @PathVariable String param2) { System.out.println("通過PathVariable獲取的參數(shù)param1=" + param1); System.out.println("通過PathVariable獲取的參數(shù)param2=" + param2); }
輸出結(jié)果:
通過PathVariable獲取的參數(shù)param1=1
通過PathVariable獲取的參數(shù)param2=2
2.@RequestHeader注解
@RequestHeader 注解,可以把Request請求header部分的值綁定到方法的參數(shù)上。
示例代碼:
@ResponseBody @RequestMapping("/testHeaderParam")public void testHeaderParam(HttpServletRequest request, @RequestHeader String param1) { System.out.println("通過RequestHeader獲取的參數(shù)param1=" + param1); }
輸出結(jié)果:
通過RequestHeader獲取的參數(shù)param1=abc
3.@CookieValue注解
@CookieValue 可以把Request header中關(guān)于cookie的值綁定到方法的參數(shù)上。
示例代碼:
@ResponseBody @RequestMapping("/testCookieParam")public void testCookieParam(HttpServletRequest request, HttpServletResponse response, @CookieValue String sessionid) { System.out.println("通過CookieValue獲取的參數(shù)sessionid=" + sessionid); }
輸出結(jié)果:
通過CookieValue獲取的參數(shù)sessionid=ebef978eef6c46f8a95cc0990d2d360a
4.@RequestParam注解
@RequestParam注解用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。提交方式為get或post。(Http協(xié)議中,form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認(rèn)為application/x-www-form-urlencoded);
@RequestParam注解實(shí)質(zhì)是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉(zhuǎn)化機(jī)制ConversionService配置,轉(zhuǎn)化成參數(shù)接收對象或字段,
get方式中queryString的值,和post方式中body data的值都會被Servlet接受到并轉(zhuǎn)化到Request.getParameter()參數(shù)集中,所以@RequestParam可以獲取的到;
該注解有三個屬性:value、required、defaultValue;value用來指定要傳入值的id名稱,required用來指示參數(shù)是否必錄,defaultValue表示參數(shù)不傳時候的默認(rèn)值。
示例代碼:
@ResponseBody @RequestMapping("/testRequestParam")public void testRequestParam(HttpServletRequest request, @RequestParam(value = "num", required = true, defaultValue = "0") int num) { System.out.println("通過RequestParam獲取的參數(shù)num=" + num); }
輸出結(jié)果:
通過RequestParam獲取的參數(shù)num=10
5.@RequestBody注解
@RequestBody注解用來處理HttpEntity(請求體)傳遞過來的數(shù)據(jù),一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù);
GET請求中,因?yàn)闆]有HttpEntity,所以@RequestBody并不適用;
POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過使用HandlerAdapter配置的HttpMessageConverters來解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。
示例代碼:
@ResponseBody @RequestMapping("/testRequestBody")public void testRequestBody(HttpServletRequest request, @RequestBody String bodyStr){ System.out.println("通過RequestBody獲取的參數(shù)bodyStr=" + bodyStr); }
代碼運(yùn)行結(jié)果:
通過RequestBody獲取的參數(shù)bodyStr=這是body的內(nèi)容
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
- Spring/SpringBoot?@RequestParam注解無法讀取application/json格式數(shù)據(jù)問題解決
- Spring MVC如何使用@RequestParam注解獲取參數(shù)
- SpringMVC注解@RequestParam方法原理解析
- 親測SpringBoot參數(shù)傳遞及@RequestBody注解---踩過的坑及解決
- 解決SpringMVC使用@RequestBody注解報400錯誤的問題
- springMvc注解之@ResponseBody和@RequestBody詳解
- @ResponseBody 和 @RequestBody 注解的區(qū)別
- @RequestParam?和@RequestBody注解的區(qū)別解析
相關(guān)文章
MyBatis-Plus+達(dá)夢數(shù)據(jù)庫實(shí)現(xiàn)高效數(shù)據(jù)持久化的示例
這篇文章主要介紹了MyBatis-Plus和達(dá)夢數(shù)據(jù)庫實(shí)現(xiàn)高效數(shù)據(jù)持久化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Java實(shí)現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯?dāng)?shù)字相互轉(zhuǎn)換問題示例
這篇文章主要介紹了Java實(shí)現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯?dāng)?shù)字相互轉(zhuǎn)換問題,涉及java輸入輸出及字符串、數(shù)組的遍歷與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-04-04java實(shí)現(xiàn)線程調(diào)度器和時間分片
線程調(diào)度器和時間分片是多線程編程和操作系統(tǒng)設(shè)計中的核心概念,本文主要介紹了java實(shí)現(xiàn)線程調(diào)度器和時間分片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10利用反射實(shí)現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能
將Excel或CSV文件轉(zhuǎn)換為Java對象(POJO)以及將Java對象轉(zhuǎn)換為Excel或CSV文件可能是一個復(fù)雜的過程,但如果使用正確的工具和技術(shù),這個過程就會變得十分簡單,在本文中,我們將了解如何利用一個Java反射的庫來實(shí)現(xiàn)這個功能,需要的朋友可以參考下2023-11-11