SpringMVC常见的参数接收大全
一篇文章让你彻底搞懂到底该如何传参和接收参数
在写代码时, 后端经常需要定义控制层的参数, 比如我需要这个这个或者这种格式那种格式的参数, 定义好之后, 在前端去调接口, 却发现接收不了的情况. 接下来我们就总结一下各种情况定义的参数, 应该如何接收.
我们从前端调接口的情况分析出几种传参的类, 大致分为两种
- 放在url的参数-Params
- 放在body的参数-data
放在url的参数–Params
这种参数的携带很简单, 在发起 HTTP 请求时直接拼接在url上即可, 例如
http://127.0.0.1:8080/user?name=123
,
https://www.baidu.com/s?ie=UTF-8&wd=%E9%B8%A1%E4%BD%A0%E5%A4%AA%E7%BE%8E
等
接收这种参数很简单
@RequestMapping("/user")
public String ok(@RequestParam("name") String name){
// 第一种 使用 @RequestParam 获取参数
return "ok";
}
@RequestMapping("/user")
public String ok2(String name){
// 第二种 其实不需要 @RequestParam 注解也能获取得到
return "ok";
}
// 第三种 定义一个类, 用一个类 也能接收
public static class User{
private String name;
// getter and setter
}
@RequestMapping("/ok")
public String ok3(User user){
return "ok";
}
以上是一个单个简单对象的接收, 那问题来了, 我能不能把复杂对象或者数组放在url上传参呢, 当然是可以的, 请看例子
嵌套对象
// 定义两个类
public static class User{
private String name;
// user 类 嵌套了一个部门类
private Dept dept;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
public static class Dept{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RequestMapping("/ok")
public String ok4(User user){
// 复杂嵌套对象 可以直接 通过xxx.xxx 这样传输
System.out.println(user.dept.name);
return user.dept.name;
}
此时的请求方式为:
- ?xxx.yyy=aaa
例如: http://127.0.0.1:8107/test/ok?name=123&dept.name=456
也就是说 可以直接 通过xxx.xxx 这样传参
数组或者MAP
ok, 直接上大招
// 现在有一个非常复杂的类 user
// 里面有字段 有List 有array 有map
public static class User{
private String name;
private Dept dept;
private Map<String,String> map;
private List<String> aList;
private String[] arr;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public List<String> getaList() {
return aList;
}
public void setaList(List<String> aList) {
this.aList = aList;
}
public String[] getArr() {
return arr;
}
public void setArr(String[] arr) {
this.arr = arr;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
if (name != null) {
sb.append("\"name\":\"").append(name).append("\",");
}
if (dept != null) {
sb.append("\"dept\":").append(dept).append(",");
}
if (map != null) {
sb.append("\"map\":").append(map).append(",");
}
if (aList != null) {
sb.append("\"aList\":").append(aList).append(",");
}
if (arr != null) {
sb.append("\"arr\":").append(Arrays.toString(arr)).append(",");
}
if (sb.lastIndexOf(",") != -1)
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append('}');
return sb.toString();
}
}
public static class Dept{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
if (name != null) {
sb.append("\"name\":\"").append(name).append("\",");
}
if (sb.lastIndexOf(",") != -1)
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append('}');
return sb.toString();
}
}
这个时候我的Controller 依旧是这样:
@RequestMapping("/ok")
public String ok3(User user){
System.out.println(user.toString());
return user.toString();
}
我该如何传参呢
诶, 其实也不难
我们可以用以下的方式进行传参:
注意 这里需要对参数进行url编码,对中括号’[ ]'进行转义, 在postmen 中 可以选中参数,右键->EncodeURIComponent
完成之后我的得到的参数就是 下面这样的
key | Value |
---|---|
name | ikun |
dept.name | deptName |
arr | a,b,c |
aList%5B%5D | L1,L2,L3 |
map%5BaKey%5D | aVal |
最终我们的url 长成这样
.../ok?name=ikun&dept.name=deptName&arr=a,b,c&aList%5B%5D=L1,L2,L3&map%5BaKey%5D=aVal
学会了这个, 剩下很多你就自动学会了
比如我的接口是这样的Array
@RequestMapping("/ok")
public String ok(String[] arr)
那我传参就是
...ok?arr=1,2,3
比如我的接口是这样的List
@RequestMapping("/ok")
public String ok(List<String> list)
那我传参就是
...ok?list[]=1,2,3 转义后: ...ok?list%5B%5D=1,2,3
以上就是放在url的参数的大多数情况, 其实还有一种 @PathVariable
这种只能接收单个参数 , 当然也可以是数组
像这样:
@DeleteMapping("/ok/{ids}")
public String ok(@PathVariable Long[] ids )
传参时是这样的
.../ok/1,2.3
ok 你学废了没
接下来说 放在body的参数 data
放在body里的也有两种类型
- form-data
- raw
一种是form-data
, 也就是表单数据, 当参数放在这里时, Controller的方法不需要加任何东西就可以获取到
@RequestMapping("/user")
public String ok(String name){
return "ok";
}
public static class User{
private String name;
// getter and setter
}
@RequestMapping("/ok")
public String ok2(User user){
return "ok";
}
这个就跟放在url的参数差不多, List Array, Map 传参的方式是一样的, 唯一的区别就是, 因为参数不显示在url上,所以不需要转义.
另外一种是 放在raw
里的, 这种参数通常以json格式传参, 那么在Controller
的方法就需要加@RequestBody
注解
@RequestMapping("/ok")
public String ok(@RequestBody User u ){
return u.toString();
}
这种方式没啥好说的, 直接对应就行
{
"name": "ikun",
"dept": {
"name": "deptName"
},
"map": {
"aKey":"aVal"
},
"aList": ["L1", "L2", "L3"],
"arr": ["a", "b", "c" ]
}
非常简单
ok 以上就是springMVC常用的接收参数的方式, 我们学会之后, 一定要灵活运用
比如说url参数+raw参数一起使用
@RequestMapping("/ok2")
public String ok2(String id, @RequestBody User user){
return id+user.toString();
}
@RequestMapping("/ok3")
public String ok3(Chicken chicken, @RequestBody User user){
return chicken.toString()+user.toString();
}
public static class Chicken{
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
if (age != null) {
sb.append("\"age\":\"").append(age).append("\",");
}
if (sb.lastIndexOf(",") != -1)
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append('}');
return sb.toString();
}
}
你甚至可以加两个@RequestBody
@RequestMapping("/ok")
public String ok(@RequestBody Chicken chicken, @RequestBody Dept dept){
return chicken.toString()+chicken.toString();
}
在前端传的时候, 就可以把它们拼在一起, 太牛逼了
{
"name": "ikun",
"age":"2.5"
}
哇 这种情况下我就不需要专门建一个类来接收参数了, 节省太多了
怎么样 spring
是不是很强大!
总之 就是你想怎么用就怎么用
好了 以上就是全部内容 再见