@RequestParam和@PathVariable的区别和使用
1.@RequestParam注解
1.1@RequestParam的简介
@RequestParam注解是SpringMVC中用来接收前端传递过来的参数的注解,在org.springframework.web.bind.annotation包下被定义,作用是将请求参数绑定到控制器Controller方法参数上,是将请求参数区域的数据和Controller方法上配置有@RequestParam注解的参数一一映射到一起。
1.2@RequestParam的语法
@RequestParam的语法形式是:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””),其中各个参数的定义和如何使用如下:
1.2.1 value
该参数是请求中传入参数的要映射的名称,必须与前端传过来参数的名称保持一致,如果不设置后台接口的value值,则会默认为该变量的名字。
如下图的例子中@RequestParam(value = "na") String name,如果指定了value="na",则前端传入的参数一定是na,而不是name,但是如果没有指定value的值,则前端传入的参数名称映射的名字会默认为变量name这个名字。如果确定前端传入的参数和Controller中的变量名称一致,可以只写@RequestParam加变量名,比如下图中的age写法,如果名称都不对应上,会接收不到数据。
1.2.2 required
该参数是是否为必传项。默认是true,即不写这个参数就是认为是必填项。
表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null。
对于基本数据类型的变量是必须有值的,当请求中没有此参数时会抛出空指针异常(但是设置required = false并且设置了defaultValue默认值就没有问题了)。如果允许空值,则接口中变量需要使用包装类来声明,然后才能设置required = false不必填。
1.2.3 defaultValue
该参数是表示传入参数的默认值,如果请求中没有同名的参数并且设置了defaultValue时,该变量默认为defaultValue的值。需要注意的是,默认值是可以使用SpEL表达式的,比如"#{testProperties['test.school']}"
@GetMapping("/test")
public void test1(@RequestParam(value = "na") String name,
@RequestParam String age,
@RequestParam(value = "school",required = false,defaultValue = "清北") String school){
System.out.println(name);
System.out.println(age);
System.out.println(school);
}
1.3@RequestParam的使用
@RequestParam接收的参数在请求中其实是这样表示的xxx?参数名称="参数的值"&参数名称="参数的值"。。。通过?接参数并且通过&进行拼接其他参数,需要映射的参数是出现在?后面进行一个个拼接的。
那么,在请求中传入多个同名参数吗?答案是可以。比如:xxx?name="值1"&name="值2"这其实种形式,这时我们接受的传入参数格式是:name="值1,值2"这种用逗号隔开的形式,此时在后台Controller中接收就需要使用数组或者集合类型的变量来进行接收了,如下图:
@GetMapping("/test2")
public void test2(@RequestParam(value = "name") String[] names){
System.out.println(names);
}
前端还是xxx?参数名称1="参数的值1"&参数名称2="参数的值2"...的形式,后端可以使用集合或者自定义Vo来接收参数,这样就可以不用那么麻烦的定义一堆变量,而且还有注意变量名称的一致,只需要定义好集合或者Vo,然后通过get方法获取就可以了。
@GetMapping("/test3")
public void test3(@RequestParam Map<String,Object> map){
System.out.println(map.get("name"));
}
2.@PathVariable注解
2.1@PathVariable的简介
@PathVariable注解是spring3.0的一个新功能,用来接收请求路径中占位符的值,顾名思义是需要在请求连接中占位的。
在org.springframework.web.bind.annotation下被定义,它的三个参数value,default,required和@RequestParam是基本一样的使用方法,唯一区别是它会在请求中占位而@RequestParam则不需要占位。
2.1@PathVariable的使用
@PathVariable在前端传入的请求是这样的xxx/张三,如果定义多个请求连接中可以写@RequestMapping(value="/test4/{name}/{age}"),而前端的请求则会以xxx/张三/12这种的形式传过来,这就是需要占位的@PathVariable注解的使用。
@GetMapping("/test4/{name}")
public void test4(@PathVariable(value = "name") String name){
System.out.println(name);
}
- 点赞
- 收藏
- 关注作者
评论(0)