SpringMVC常见的参数接收大全

本文详细介绍了在SpringMVC中如何接收前端传递的参数,包括URL参数(@RequestParam,路径变量@PathVariable)和放在请求体body内的参数(form-data,rawJSON)。对于URL参数,支持简单类型、复杂对象和数组的传递,而body内的参数通常以JSON格式提交,需配合@RequestBody注解。文章提供了多种示例,展示了灵活运用这些接收方式的可能性。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

完成之后我的得到的参数就是 下面这样的

keyValue
nameikun
dept.namedeptName
arra,b,c
aList%5B%5DL1,L2,L3
map%5BaKey%5DaVal

最终我们的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是不是很强大!

总之 就是你想怎么用就怎么用

好了 以上就是全部内容 再见

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值