Mvc参数传递

一.基本数据类型传递

1.@RequestParam,POST和GET均支持
注解定义

@RequestParam注解源码:

@Target({ElementType.PARAMETER}) // 只能作用于参数上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
     // 定义参数名称,默认和名字一致
    @AliasFor("name")
    String value() default "";
    // 定义参数名称,默认和名字一致
    @AliasFor("value")
    String name() default "";
    // 默认必填,一旦加上该注解,前台必须传递此参数
    boolean required() default true;
    // 定义默认值
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

关于@AliasFor注解说明:标识2个属性作用一致
在Spring的众多注解中,经常会发现很多注解的不同属性起着相同的作用,比如@RequestParam 的value属性和name属性,这就需要做一些基本的限制,比如value和path的值不能冲突,比如任意设置value或者设置path属性的值,都能够通过另一个属性来获取值等等。为了统一处理这些情况,Spring创建了@AliasFor标签。

传递参数时的使用:

@RequestMapping("demo")
public String demo(Model model
    // 走默认装配规则,参数名称和名字一致,选传
    ,String name
     // 参数名称和名字默认一直,必传参数,不传报错
    ,@RequestParam String name0
    // 通过value属性定义名称,必传参数,不传报错
    ,@RequestParam(value = "name1") String name1
     // 通过name属性定义,非必传参数
    ,@RequestParam(name = "name2",required = false) String name2
     // 通过value属性定义,必传参数,有默认值,可以不传自动赋值
    ,@RequestParam(value = "name3",defaultValue = "t3") String name3
    // 自定义参数名字,不必加name或者value属性,必传
    ,@RequestParam("name444") String name4
){
    System.out.println("name:"+name);
    System.out.println("name0:"+name0);
    System.out.println("name1:"+name1);
    System.out.println("name2:"+name2);
    System.out.println("name3:"+name3);
    System.out.println("name4:"+name4);
    return "hello";
}

请求链接:http://localhost:8080/demo?name=t&name0=t0&name1=t1&name2=t2&name444=t44

控制台输出:

name:t
name0:t0
name1:t1
name2:t2
name3:t3
name4:t44

注意:必传参数必须要传参,不然会报错;选传参数可以选择不传,如果不传,控制台输出的就是null

2.@PathVariable,POST和GET均支持

@RequestMapping(value={
        "demo1/{name1}/{name2}/{name3}"
        // 配合name3选传,此种场景应用较少,一般使用此注解均为必传参数
        ,"demo1/{name1}/{name2}"
})
public String demo1(Model model
        //注意,没加注解,使用问号后追加参数请求
        ,String name
        // 必传
        ,@PathVariable String name1
        // 必传
        ,@PathVariable("name2") String name2
        // 选传
        ,@PathVariable(value = "name3",required = false) String name3
){
    System.out.println("name:"+name);
    System.out.println("name1:"+name1);
    System.out.println("name2:"+name2);
    System.out.println("name3:"+name3);
    return "hello";
}

二.普通对象

1.非json请求
前台:localhost:8080/demo2?name=1&number=2
后台:

@ResponseBody
@RequestMapping("demo2")
public Demo demo2(Demo demo){
    System.out.println("demo:"+demo);
    return demo;
}

2.json请求

后台:

/**
     * @RequestBody  要求前台通过json格式传递参数  header:   content-type : application/josn
     * @param demo
     * @return
     */
    @ResponseBody
    @PostMapping("demo22") // 只允许使用post方式
    public Demo demo22(@RequestBody Demo demo){
        System.out.println("demo:"+demo);
        return demo;
    }

@RequestBody注解要求我们参数必须放到body里,就不可以使用上面那种方式了,需要借助Postman,传递json格式的数据

前台:
在这里插入图片描述
当我们使用json格式传递参数的时候,都是使用这种方式;
@RequestBody注解:我们的请求方式是json,加在参数那
@ResponseBody注解:返回的不是一个视图页面,而是一个对象,加在的是类方法上部

如果不加@ResponseBody,会报错:
在这里插入图片描述

三、数组

1.非JSON请求
前台:

localhost:8080/demo3?ids=1&ids=2&ids=3
或
http://localhost:8080/demo3?ids=1,2,3

后台:

@ResponseBody
@RequestMapping("demo3")
public Long[] demo3(Long[] ids){
    System.out.println("ids:"+ids.length);
    return ids;
}

2.json请求
后台:

@ResponseBody
    @RequestMapping("demo33")
    public Long[] demo33(@RequestBody Long[] ids){
        System.out.println("ids:"+ids.length);
        return ids;
    }

前台:
在这里插入图片描述

四、集合List

1.非JSON请求
前台:

localhost:8080/demo4?idList=1&idList=2
或
http://localhost:8080/demo4?idList=1,2,3

后台(@RequestParam注解不可缺少)

@ResponseBody
@RequestMapping("demo4")
public List<Long> demo4(@RequestParam List<Long> idList){
    System.out.println("ids:"+idList);
    return idList;
}

2.json请求
前台:
在这里插入图片描述
后台:

@ResponseBody
@RequestMapping("demo5")
public List<Long> demo5(@RequestBody List<Long> idList){
    System.out.println("ids:"+idList);
    return idList;
}

五、对象+List同时接收

json请求
后台:

@ResponseBody
@RequestMapping("demo7")
public Demo demo7(@RequestBody Demo demo){
    System.out.println("demo:"+demo);
    return demo;
}

前台:

localhost:8080/demo7
===========headers==============
Content-Type:application/json
============body==============
{
    "name":"0616",
    "number":"2",
    "demoCList":[
        {
            "id":"2",
            "nickname":"1111",
            "number":"11111"
        },
        {
            "nickname":"1111",
            "number":"11111"
        },
        {
            "nickname":"1111",
            "number":"11111"
        }
    ]
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值