@RequestParam詳解(六)


 前言

回顧ssm開發中,用到的注解,回顧ssm用到的技術點。

一、@RequestParam詳解

@RequestParam主要用於將請求參數區域的數據映射到控制層方法的參數上

首先我們需要知道@RequestParam注解主要有哪些參數

1。value:請求中傳入參數的名稱,如果不設置后台接口的value值,則會默認為該變量名。比如上圖中第一個參數如果不設置value="page",則前端傳入的參數名必須為pageNum,否則在后台接口中pageNum將接收不到對應的數據

2。required:該參數是否為必傳項。默認是true,表示請求中一定要傳入對應的參數,否則會報404錯誤,如果設置為false時,當請求中沒有此參數,將會默認為null,而對於基本數據類型的變量,則必須有值,這時會拋出空指針異常。如果允許空值,則接口中變量需要使用包裝類來聲明。

3。defaultValue:參數的默認值,如果請求中沒有同名的參數時,該變量默認為此值。注意默認值可以使用SpEL表達式,如"#{systemProperties['java.vm.version']}"

如果在請求中傳入多個同名參數,比如:url?userName=zhl&userName=holley時怎么辦?

其實此時傳入的數據格式是:"zhl,holley",即多個數據之間使用逗號分隔開,在后台接口中可以使用數組或者list類型的變量來接收:

public String requestparam8(@RequestParam(value="userName") String []  userNames) 

或者

public String requestparam8(@RequestParam(value="list") List<String> list)

@PathVariable綁定uri模板變量值:通過@PathVariable可以綁定占位符參數到方法參數中,例如:

如果請求為"url/info/16",則spring會自動將16綁定到通過@PathVariable注解的同名變量uid上

@CookieValue綁定Cookie數據值

public String test(@CookieValue(value="SESSIONID", defaultValue="") String sessionId) 

自動將SESSIONID的值綁定到字符串sessionId上,如果Cookie中沒有sessionId時則默認為空

傳入數據類型也可以是javax.servlet.http.Cookie類型
public String test2(@CookieValue(value="SESSIONID", defaultValue="") Cookie sessionId)
 
        

@RequestHeader綁定請求頭數據

 
        
@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts)
 
        

如上配置將自動將請求頭中的“User-Agent"值綁定到userAgent上,將"Accept"的值綁定到accepts上

@ModelAttribute綁定請求參數到命令對象

@ModelAttribute具有三個作用

1.綁定請求到命令對象:放在后台接口方法(控制層)的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化綁定流程,而且自動暴露為模型數據用於視圖頁面展示時使用

2.暴露表單引用對象為模型數據:放在處理器的一般方法(非后台接口方法)上時,是為表單准備要展示的表單引用對象,如注冊時需要選擇所在的城市等,而且在執行后台接口方法之前,自動添加到模型對象中,用於視圖頁面展示時使用

3.暴露@RequestMapping方法返回值為模型數據:放在后台接口方法的返回值上時,世保祿處理方法的返回值為模型數據,用於視圖頁面的展示時使用

一、綁定請求參數到命令對象

如用戶登錄,我們需要捕獲用戶登錄的請求參數(用戶名、密碼)並封裝為用戶對象,此時我們可以使用@ModelAttribute綁定多個請求參數到我們的命令對象。

public String test1(@ModelAttribute("user") UserModel user)

注解@ModelAttribute("user"),它的作用是將該綁定的命令對象以“user”為名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來獲取綁定的命令對象的屬性。

綁定請求參數到命令對象支持對象圖導航式的綁定,如請求參數包含“?username=zhang&password=123&workInfo.city=bj”自動綁定到user中的workInfo屬性的city屬性中。

參看鏈接:https://www.cnblogs.com/zhlblogs/p/9553491.html

二、@RequestBody和@RequestParam區別

1.1區別簡述

1、@RequestParam

用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內容,Content-Type默認為該屬性。也可以處理orm-data。

2、@RequestBody

接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。就application/json類型的數據而言,使用注解@RequestBody可以將body里面所有的json數據傳到后端,后端再進行解析。

GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。

POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用。

HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然后綁定到相應的bean上。

1.2post請求使用場景簡單匯總

1.2.1 當后台用@RequestBody接收時

(@RequestBody Map map)
(@RequestBody Object object)
application/json時候可用
form-data、x-www-form-urlencoded時候不可用

1.2.2當后台用@RequestParam接收時

1、

(@RequestParam Map map)
application/json時候,json字符串部分不可用,url中的?后面添加參數即可用,form-data、x-www-form-urlencoded時候可用,但是要將Headers里的Content-Type刪掉

2、

(@RequestParam String waterEleId,@RequestParam String enterpriseName)
application/json時候,json字符串部分不可用,url中的?后面添加參數即可用
form-data、x-www-form-urlencoded時候可用,且參數可以沒有順序(即前端傳過來的參數或者url中的參數順序不必和后台接口中的參數順序一致,只要字段名相同就可以),但是要將Headers里的Content-Type刪掉

3、

(@RequestParam Object object)
不管application/json、form-data、x-www-form-urlencoded都不可用

1.2.3當后台未使用注解時

(Map map)
(Object object)
application/json時候:json字符串部分不可用,url中的?后面添加參數不可用。
因為沒有指定,它也不知道到底是用json字符串部分還是?后面添加參數部分,所以干脆都不可以用
form-data、x-www-form-urlencoded時都不可用,見圖二
 
(HttpServletRequest request)
application/json不可用
form-data、x-www-form-urlencoded時可用

1.2.4使用postman的簡單圖示

 

1.3get請求

get請求只能使用@RequestParam。

參看鏈接:https://blog.csdn.net/weixin_38004638/article/details/99655322

三、開發中用到的

//Controller添加默認值
@RequestMapping(value="/roleDelete",method=RequestMethod.POST)
public String roleDelete( @RequestParam(value = "number",defaultValue = PAGE_NUM) int number){} 

四、其他 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM