SpringMVC的前后端参数传递主要分为三大类
- 基本数据类型(包括String类)
- 对象数据类型(一般都是自定义的类)
- 数组和List集合
- 复杂的数据类型
根据格式又分为
- json数据格式
- 非json数据格式
一、演示基本数据类型(String)
下面是请求的路径
@RequestMapping(path= "demo") // demo ip+端口 +项目根路径 + / + demo
@ResponseBody // 返回类型是一个对象:可以是字符串、对象、List等等;不是一个页面
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";
}
测试一:不传递参数值
@RequestParam注解的required属性默认是true,也就是说,name0,name1和name44必须传值
测试二:(传递name0,name1和name444)
后台打印:
因为name属性没有加@RequestParam注解,采用SpringMVC的默认匹配规则,如果不传值默认为空
二、演示注解@PathVariable
@RequestMapping(value={
"demo1/{name1}/{name2}/{name3}"
// 配合name3选传,此种场景应用较少,一般使用此注解均为必传参数
,"demo1/{name1}/{name2}"
})
@ResponseBody
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";
}
@PathVariable注解主要是在路径后面传递参数,默认也是必传
测试一:(传入name,name1,和name2属性)
因为name属性用的是@RequestParam注解,所有不是在路径里面传,而是在参数里面加
而且匹配的是demo1/{name1}/{name2}路径,因为没有传入name3属性的值
测试二:(传入name,name1,name2和name3)
这个时候匹配的路径就是demo1/{name1}/{name2}/{name3}
二、演示对象数据类型
定义Demo类
public class Demo {
private String name;
private String number;
private List<DemoC> demoCList;
}
@ResponseBody //返回是一个对象 不是渲染页面
@RequestMapping("demo2")
public Demo demo2(Demo demo){
System.out.println("demo:"+demo);
return demo;
}
1. 采用form表单形式(非json格式)
SpringMVC会自动把name属性值和number属性值封装到Demo类当中
2. 采用json格式传递
/**
* @RequestBody 要求前台通过json格式传递参数 header: content-type : application/josn
* @param demo
* @return
*/
@ResponseBody
@PostMapping("demo22") // 只允许使用post方式
@GetMapping
// @RequestMapping(
// method = {RequestMethod.POST},value = "demo22"
// )
public Demo demo22(@RequestBody Demo demo){
System.out.println("demo:"+demo);
return demo;
}
测试结果
加了@ResponseBody注解说明前台只能传递json格式的数据
三、数组和List集合
1. 非json格式
@ResponseBody
@RequestMapping("demo3")
public Long[] demo3(Long[] ids){
System.out.println("ids:"+ids.length);
return ids;
}
不加@RequestParam注解采用SpringMVC的自动匹配规则
测试结果:
也可以采用:
两种方式SpringMVC都能解析
2. json格式
@ResponseBody
@RequestMapping("demo33")
public Long[] demo33(@RequestBody Long[] ids){
System.out.println("ids:"+ids.length);
return ids;
}
List集合测试
1. 非json格式
@ResponseBody
@RequestMapping("demo4")
public List<Long> demo4(@RequestParam List<Long> idList){
// 0不能作为被除数
// int c= 1/ 0;
System.out.println("ids:"+idList);
return idList;
}
List集合进行传参的时候不能采用SpringMVC的自动匹配规则
必须加上@RequestParam注解,但是测试方法和数组差不多
2. json格式
@ResponseBody
@RequestMapping("demo5")
public List<Long> demo5(@RequestBody List<Long> idList){
System.out.println("ids:"+idList);
return idList;
}
四、对象加List接收
public class Demo {
private String name;
private String number;
private List<DemoC> demoCList;
}
public class DemoC {
private String nickname;
private String number;
}
@ResponseBody
@RequestMapping("demo6")
public Demo demo6(Demo demo){
System.out.println("demo:"+demo);
return demo;
}
采用form表单的提交方式
<form action="/demo2" method="POST">
name:<input type="text" name="name"/><br/>
number:<input type="text" name="number"/><br/>
<!-- 以下部分可以动态添加 -->
nickname:<input type="text" name="demoCList[0].nickname"/>
number:<input type="text" name="demoCList[0].number"/><br/>
nickname:<input type="text" name="demoCList[1].nickname"/>
number:<input type="text" name="demoCList[1].number"/><br/>
nickname:<input type="text" name="demoCList[2].nickname"/>
number:<input type="text" name="demoCList[2].number"/><br/>
nickname:<input type="text" name="demoCList[3].nickname"/>
number:<input type="text" name="demoCList[3].number"/><br/>
<button type="submit">提交</button>
</form>
返回内容如下:
采用json格式
这种格式在日常项目中还是很常见的,所有都要熟练掌握