@RequestParam和@PathVariable的区别和使用

举报
多米诺的古牌 发表于 2022/03/21 23:01:44 2022/03/21
【摘要】 1.@RequestParam注解1.1@RequestParam的简介        @RequestParam注解是SpringMVC中用来接收前端传递过来的参数的注解,在org.springframework.web.bind.annotation包下被定义,作用是将请求参数绑定到控制器Controller方法参数上,是将请求参数区域的数据和Controller方法上配置有@Reque...

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);
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。