前言
回顧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){}
四、其他