Spring Mvc 参数传递

 

一、基本数据类型

@RequestParam,POST和GET均支持

注解定义

@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注解中也有应用。

注解使用示例

后台代码:

@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";
}

请求连接1:

localhost:8080/demo?name0=高德龙

Spring Mvc 参数传递_第1张图片

请求连接2:

localhost:8080/demo?name0=高德龙&name123=111

Spring Mvc 参数传递_第2张图片

Spring Mvc 参数传递_第3张图片

请求链接3:

localhost:8080/demo?name0=高德龙&name1=111&name444=44

Spring Mvc 参数传递_第4张图片

Spring Mvc 参数传递_第5张图片

 

@PathVariable,POST和GET均支持

注:和@RequestParam注解使用相同的地方简述

注解定义,注释同上

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;
}

注解使用示例

后台代码:

@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:

localhost:8080/demo1

Spring Mvc 参数传递_第6张图片

请求连接2:

localhost:8080/demo1/45/78

Spring Mvc 参数传递_第7张图片

Spring Mvc 参数传递_第8张图片

请求连接3:

localhost:8080/demo1/45/78/45654

Spring Mvc 参数传递_第9张图片

Spring Mvc 参数传递_第10张图片

请求连接4:

localhost:8080/demo1/45/78/45654?name0=sd

Spring Mvc 参数传递_第11张图片

Spring Mvc 参数传递_第12张图片

总结:参数传递时,可以使用@RequestParam和@PathVariable传递参数,也可以走Spring Mvc默认的装配规则,根据实际使用场景来选择即可。

 

二、普通对象

非JSON请求

前台:

localhost:8080/demo2?name=name1&number=456

后台:

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

Spring Mvc 参数传递_第13张图片

JSON请求

前台

localhost:8080/demo22
===========headers==============
Content-Type:application/json
============body==============
{
    "name":"11",
    "number":"22"
}

 后台

@ResponseBody
@PostMapping("demo22")
public Demo demo22(@RequestBody Demo demo){
    System.out.println("demo:"+demo);
    return demo;
}
@PostMapping = @RequestMapping(
         		method = {RequestMethod.POST},value = "demo22"
 		 	)

请求连接:

localhost:8080/demo22

Spring Mvc 参数传递_第14张图片

 

三、数组

非JSON请求

前台

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

后台

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

Spring Mvc 参数传递_第15张图片

 

JSON请求

前台

localhost:8080/demo33
===========headers==============
Content-Type:application/json
============body==============
[1,2,3]

后台

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

 

Spring Mvc 参数传递_第16张图片

 

}

四、集合List

非JSON请求

前台

localhost:8080/demo4?idList=1&idList=2

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

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

Spring Mvc 参数传递_第17张图片

JSON请求

前台

localhost:8080/demo5
===========headers==============
Content-Type:application/json
============body==============
[1,2,3]

后台

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

Spring Mvc 参数传递_第18张图片

 

五、对象+List同时接收

非JSON请求

前台

html

name:
number:
nickname: number:
nickname: number:
nickname: number:
nickname: number:

请求

http://localhost:8080/demo2
=============Form Data====================
name: 
111
number: 
111
demoCList[0].nickname: 
1
demoCList[0].number: 
11
demoCList[1].nickname: 
222
demoCList[1].number: 
22
demoCList[2].nickname: 
333
demoCList[2].number: 
333
demoCList[3].nickname: 
444
demoCList[3].number: 
44

后台

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

    private String name;
    private String number;
    private List demoCList;
    ....省略get set方法....
}

JSON请求

前台

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

后台

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

Spring Mvc 参数传递_第19张图片

你可能感兴趣的:(springmvc)