一 角度1:是否是json格式的數(shù)據(jù)
- 前端傳遞過來的數(shù)據(jù)類型,老師這里會把它分為兩個主要的方向:
- 第1個方向:非json格式的數(shù)據(jù)
- 第2個方向:json格式的數(shù)據(jù)
- 非json格式的數(shù)據(jù)
-
方式1:直接可以將控制層方法的參數(shù)名稱和請求的參數(shù)名稱保持一致來進行接收。
- 場景:數(shù)據(jù)量(參數(shù)個數(shù))比較小,<=3個參數(shù)
- 優(yōu)點:簡單
- 缺點:如果參數(shù)比較多,如果我們還是把每個前端傳輸過來參數(shù),在后端用單獨的一個參數(shù)去接收會比較麻煩。
- 注意:
- 因為我們這里涉及到與前端進行通信,所以項目必須要添加spring-web依賴。
- 為了構建業(yè)務的場景,我們得有一個數(shù)據(jù)的載體,即實體類User.java。
- 案例:
- 代碼
/* * 非json格式 * 第1種方式:如果有數(shù)據(jù)從前端過來,后端直接把這些數(shù)據(jù)都當成(看作是)字符串。 * 如: * String username:如果你前端傳輸過來的用戶名,后端直接看成字符串來接收。 * String password:如果你前端傳輸過來的密碼,后端直接看成字符串來接收。 */ @RequestMapping("add1") public String add1(String username,String password){ System.out.println("username = "+username); System.out.println("password = "+ password); return "success"; }
- 支持get請求,如下圖所示:
- 支持post請求,如下圖所示:
- 代碼
-
方式2:把前端傳輸過來的參數(shù),后端封裝成一個實體類。
- 注意:
- 前端提交的參數(shù)名稱,需要和后端實體類的屬性名稱保持一致。
- 代碼:
? /* * 非json格式 * 第2種方式:把前端傳輸過來的參數(shù),后端封裝成一個實體類。 * 如: * 把前端傳輸過來的參數(shù),(后端)封裝到User user實體類中。 */ @RequestMapping("add2") public String add2(User user){ System.out.println(user); return "success"; } ?
-
支持get請求,同上
-
支持post請求,同上
- 注意:
-
方式3:restful風格的請求與數(shù)據(jù)提交 ——?需要使用{變量名稱}語法來聲明RestFul的參數(shù)列表,通過一個注解@PathVariable指定參數(shù)的映射規(guī)則。
- 概述
- 思想路
- RestFul風格:只關注數(shù)據(jù)的的內(nèi)容。
- 思想路
- 應用場景
- 數(shù)據(jù)量不大
- 數(shù)據(jù)的安全性沒有嚴格要求
-
get請求
-
以前:localhost:8080/users/add1?username=tom&password=123&&&
-
缺點:因為get請求所提交的數(shù)據(jù)是有限制的,所以這里key=value的數(shù)據(jù)提交方式中"key="占用了很多空間,導致了可以傳輸?shù)臄?shù)據(jù)量的減少。如果可以把"key="給刪除掉,那么前端就可以多提交幾個參數(shù)給后端了。
-
-
restful風格:localhost:8080/users/add1?tom/123//
-
案例:后端接收方式
? /* * 非json格式 * 第3種方式:restful風格:get請求:localhost:8080/users/add3?tom/123456 * 注意: * (1)@RequestMapping支持變量占位符的寫法。如:@RequestMapping("add3/{username}/{password}"),其中的{username}和{password}是變量占位符,而其中的username和password是變量名稱。 * (2)@RequestMapping只是成功接收到前端傳輸?shù)臄?shù)據(jù),我們是還是把數(shù)據(jù)放到方法的參數(shù)列表中。 * (3)使用@PathVariable注解,可以指定請求路徑中的哪個變量(@RequestMapping接收的參數(shù))與add3參數(shù)列表中的哪個參數(shù)對應起來。 * 1)如果@RequestMapping的變量名稱和add3參數(shù)列表中的參數(shù)名稱一致,只需要加@PathVariable即可,它會自動注入。 * 2)如果名稱不一致,@RequestMapping("add3/{name}/{password}") 》 add3(@PathVariable("name") String username, @PathVariable String password) */ @RequestMapping("add3/{name}/{password}") public String add3(@PathVariable("name") String username, @PathVariable String password){ System.out.println(username+" / "+password); return "success"; } ?
-
- 概述
-
方式4:借助HttpServletRequest對象來接收
/* * 非json格式 * 第4種方式:借助HttpServletRequest對象來接收 * 無論前端提交的數(shù)據(jù)是簡單類型的還是復雜類型的,都會整體被打包放在HttpServletRequest對象中傳輸?shù)胶蠖肆恕? * 注: * (1)通過HttpServletRequest對象中的數(shù)據(jù)是以key- value的鍵值對的形式存儲的。比如,key就是前端的參數(shù)名稱username=tom - (key就是username) * (2)通過HttpServletRequest,不光可以獲取到前端提交的數(shù)據(jù),還可以獲取到關于前端的其它信息,如http協(xié)議版本、請求url、提交的數(shù)據(jù)的類型等 */ @RequestMapping("add4") public String add4(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+"http://"+password); return "success"; }
-
方式1:直接可以將控制層方法的參數(shù)名稱和請求的參數(shù)名稱保持一致來進行接收。
-
json格式的數(shù)據(jù)
-
概述
-
注意1:凡是前端提交的數(shù)據(jù)是json數(shù)據(jù),那么前端都會將數(shù)據(jù)存儲在請求的實體中,后端在獲取前端數(shù)據(jù)的時需要到請求的實體中獲取,因此后端會使用一個注解@RequestBody注解來進行標記。@RequestBody注解表明(指明),后端會從請求實體類拿數(shù)據(jù),也只有人請求實體中獲取才能拿到:
-
-
方式5:后端會將前端傳遞過來的json數(shù)據(jù)直接封裝到pojo對象中:
/* * json格式 * 第1種:后端會將前端傳遞過來的json數(shù)據(jù)直接封裝到pojo對象中。 * 注意: * (1)這種方式在前端提交數(shù)據(jù)的時候,不能夠在postman Body和postman Query中使用key=value的方式進行提交,而是通過json來提交 */ @RequestMapping("add5") public User add5(@RequestBody User user){ System.out.println(user.toString()); return user; }
-
方式6:引用類型。實體類對象中有除了有基本數(shù)據(jù)類型外,還有復雜數(shù)據(jù)類型的出現(xiàn),如引用類型。如果一個實體類中定義有引用數(shù)據(jù)類型,在傳遞數(shù)據(jù)的時候,使用{}的形式來進行提交。后端會使用一個注解@RequestBody注解來進行標記。
-
案例
-
實體類:
-
方法:
/* * json格式 * 第2種:實體類對象中有除了有基本數(shù)據(jù)類型外,還有復雜數(shù)據(jù)類型的出現(xiàn) */ @RequestMapping("add6") public User add6(@RequestBody User user){ System.out.println(user.toString()); return user; }
-
postman:
-
-
-
方式7:List集合,在實體類中出現(xiàn)
-
實體類:
-
代碼:
/* * json格式 * 第3種:實體類對象中有List集合 */ @RequestMapping("add7") public User add7(@RequestBody User user){ System.out.println(user.toString()); return user; }
-
postman:
-
實體類:
-
方式8:Map<String,String>
-
方法:
/* * json格式 * 第4種:Map<String,String> * 因為在java看來json本質(zhì)意義上就是一種map結(jié)構的內(nèi)容。 * 如:key分別會是"username"和"password" * { * "username":"tom", * "password":"123456" * } */ @RequestMapping("add8") public String add8(@RequestBody Map<String,String> map){ System.out.println(map.get("username")); System.out.println(map.get("password")); return "success"; }
- postman:
-
-
- 附1:完整的代碼
- User.java
package com.pojo; import java.util.List; public class User { private String username; private String password; private Cat cat; private List<Course> courseList; @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", cat=" + cat + ", courseList=" + courseList + '}'; } }
- UserController.java
package com.controller; import com.pojo.User; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Map; @RequestMapping("users") @RestController public class UserController { /* * 非json格式 * 第1種方式:如果有數(shù)據(jù)從前端過來,后端直接把這些數(shù)據(jù)都當成(看作是)字符串。 * 如: * String username:如果你前端傳輸過來的用戶名,后端直接看成字符串來接收。 * String password:如果你前端傳輸過來的密碼,后端直接看成字符串來接收。 */ @RequestMapping("add1") public String add1(String username,String password){ System.out.println("username = "+username); System.out.println("password = "+ password); return "success"; } /* * 非json格式 * 第2種方式:把前端傳輸過來的參數(shù),后端封裝成一個實體類。 * 如: * 把前端傳輸過來的參數(shù),(后端)封裝到User user實體類中。 */ @RequestMapping("add2") public String add2(User user){ System.out.println(user); return "success"; } /* * 非json格式 * 第3種方式:restful風格:get請求:localhost:8080/users/add3?tom/123456 * 注意: * (1)@RequestMapping支持變量占位符的寫法。如:@RequestMapping("add3/{username}/{password}"),其中的{username}和{password}是變量占位符,而其中的username和password是變量名稱。 * (2)@RequestMapping只是成功接收到前端傳輸?shù)臄?shù)據(jù),我們是還是把數(shù)據(jù)放到方法的參數(shù)列表中。 * (3)使用@PathVariable注解,可以指定請求路徑中的哪個變量(@RequestMapping接收的參數(shù))與add3參數(shù)列表中的哪個參數(shù)對應起來。 * 1)如果@RequestMapping的變量名稱和add3參數(shù)列表中的參數(shù)名稱一致,只需要加@PathVariable即可,它會自動注入。 * 2)如果名稱不一致,@RequestMapping("add3/{name}/{password}") 》 add3(@PathVariable("name") String username, @PathVariable String password) */ @RequestMapping("add3/{name}/{password}") public String add3(@PathVariable("name") String username, @PathVariable String password){ System.out.println(username+" / "+password); return "success"; } /* * 非json格式 * 第4種方式:借助HttpServletRequest對象來接收 * 無論前端提交的數(shù)據(jù)是簡單類型的還是復雜類型的,都會整體被打包放在HttpServletRequest對象中傳輸?shù)胶蠖肆恕? * 注: * (1)通過HttpServletRequest對象中的數(shù)據(jù)是以key- value的鍵值對的形式存儲的。比如,key就是前端的參數(shù)名稱username=tom - (key就是username) * (2)通過HttpServletRequest,不光可以獲取到前端提交的數(shù)據(jù),還可以獲取到關于前端的其它信息,如http協(xié)議版本、請求url、提交的數(shù)據(jù)的類型等 */ @RequestMapping("add4") public String add4(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+"http://"+password); return "success"; } /* * json格式 * 第1種:后端會將前端傳遞過來的json數(shù)據(jù)直接封裝到pojo對象中。 * 注意: * (1)這種方式在前端提交數(shù)據(jù)的時候,不能夠在postman Body和postman Query中使用key=value的方式進行提交,而是通過json來提交 */ @RequestMapping("add5") public User add5(@RequestBody User user){ System.out.println(user.toString()); return user; } /* * json格式 * 第2種:實體類對象中有除了有基本數(shù)據(jù)類型外,還有復雜數(shù)據(jù)類型的出現(xiàn) */ @RequestMapping("add6") public User add6(@RequestBody User user){ System.out.println(user.toString()); return user; } /* * json格式 * 第3種:實體類對象中有List集合 */ @RequestMapping("add7") public User add7(@RequestBody User user){ System.out.println(user.toString()); return user; } /* * json格式 * 第4種:Map<String,String> * 因為在java看來json本質(zhì)意義上就是一種map結(jié)構的內(nèi)容。 * 如:key分別會是"username"和"password" * { * "username":"tom", * "password":"123456" * } */ @RequestMapping("add8") public String add8(@RequestBody Map<String,String> map){ System.out.println(map.get("username")); System.out.println(map.get("password")); return "success"; } }
- User.java
-
參考
-
???????【Spring Boot接收前端數(shù)據(jù)】Spring Boot接收從前端傳過來的數(shù)據(jù)常用8種方式,帶你輕松搞定前后端數(shù)據(jù)聯(lián)調(diào)、
-
二 角度2:基于何種注解或無注解
-
一、基于@PathVariable注解
二、基于@RequestParam注解
三、基于@PathVariable+@RequestParam混合
四、基于@RequestBody注解
五、基于HttpServletRequest請求
六、不基于任何注解進行表單傳參?文章來源:http://www.zghlxwxcb.cn/news/detail-429353.html
-
參考:
- ??????????????(415條消息) SpringBoot接收參數(shù)的六種常用方式(全面詳細)_黃團團的博客-CSDN博客_springboot接收參數(shù)
????????文章來源地址http://www.zghlxwxcb.cn/news/detail-429353.html
到了這里,關于Spring Boot接收從前端傳過來的數(shù)據(jù)常用方式以及處理的技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!