SpringMVC注解 @Requestparam 和 @PathVariable 详解

一、@Requestparam

  • 作用:绑定前端请求参数到对应的Controller层中方法的形参上
  • 注解参数:
    1. value:参数名称,请求参数名必须与value一致,否则参数不会自动映射
    2. required:被标注参数是否必须包含;默认为true,请求参数中必须包含被标注参数,否则会报错,如果是false,请求参数可以不传被标注参数,Boolean类型默认赋值为false,其他类型默认赋值为null;
    3. defaultValue:设置默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用所设置的默认值;
  • 示例:
 /**
     * @RequestParam()括号中什么值都不写的时候
     * value: 默认形参名 hello
     * required: 默认为true 如果前端不传值 程序会报错
     * defaultValue:boolean默认赋值false,其他包装类型默认赋值null
     * 注意:
     *      @RequestParam源码中 name和 value 两个属性基本是等价的,都是获取从前端传入的参数
     */
    @RequestMapping("/test1")
    public void testRequestParam1(@RequestParam String hello){
    
    
    }

    /**
     * @RequestParam(value = "HELLO",required = false)
     * value: 前端请求参数名称必须为 HELLO,不一致则映射失败
     * required: 此时前端不传值,默认给HELLO赋值为null
     * defaultValue:boolean默认赋值false,其他包装类型默认赋值null
     *
     */
    @RequestMapping("/test2")
    public void testRequestParam2(@RequestParam(value = "HELLO",required = false) String hello){
    
    
    }

    /**
     * @RequestParam(value = "HELLO", defaultValue = "flag")
     * value: 前端请求参数名称必须为 HELLO,不一致则映射失败
     * required: 因为defaultValue设置了默认值,所以required=true失效,此时前端不传HELLO不会报错,默认赋值为"flag"
     * defaultValue:如果前端传值就原样输出,否则 HELLO = flag
     *
     */
    @RequestMapping("/test3")
    public void testRequestParam3(@RequestParam(value = "HELLO", defaultValue = "flag") String hello){
    
    
    }

二、@PathVariable

  • 作用:将 URL中的占位符参数{xxx}绑定到Controller控制器处理方法的形参中;
  • 注解参数:
    1. value:参数名称,需要跟URL中占位符名称一致;
    2. required:被标注参数是否必须包含;默认为true,请求参数中必须包含被标注参数,否则会报错,如果是false,请求参数可以不传被标注参数,Boolean类型默认赋值为false,其他类型默认赋值为null(注意设置为false,需要在@RequestMapping中配置多个请求路径,示例Demo4);
  • 示例:

1、示例1(原始注解@PathVariable )

  • Demo1中URL中的占位符名称和Controller中方法形参一致,所以可以映射成功
  • Demo1示例:
@RestController
public class TestController {
    
    
   /**
     * Demo1
     * @PathVariable()
     * value: 默认形参名 hello
     * required: 默认为true 如果前端不传值 程序会报错
     */
    @RequestMapping("/test4/{hello}/{world}")
    public String testPathVariable1(@PathVariable String hello, @PathVariable String world) {
    
    
        String str = "@PathVariable 占位符映射-hello:"+ hello+"  world:"+world;
        return str;
    }
}
  • Demo1结果:
    在这里插入图片描述

2、示例2(URL占位符名称与Value名称一致)

  • Demo2中URL占位符名称与Controller中方法形参名称不一致,所以需要在@PathVariable中去声明(@PathVariable中声明名称必须与URL占位符名称一致)
  • Demo2示例:
@RestController
public class TestController {
    
    
	/**
	  * Demo2
      * @PathVariable()
      * value: 默认形参名 hello
      * required: 默认为true 如果前端不传值 程序会报错
      */
      @RequestMapping("/test5/{abc}/{efg}")
      public String testPathVariable2(@PathVariable("abc") String hello,  @PathVariable("efg") String world) {
    
    
     	 String str = "@PathVariable 占位符映射-hello:"+ hello+"  world:"+world;
         return str;
    }
}

在这里插入图片描述

  • Demo2结果:
    在这里插入图片描述

3、示例3(URL占位符名称与Value名称不一致)

  • Demo3中URL占位符名称与Controller中方法形参名称不一致,并且@PathVariable中也没有进行声明,所以请求时会报错;
  • Demo3示例:
@RestController
public class TestController {
    
    
   /**
   	 * Demo3
     * @PathVariable()
     * value: 默认形参名 hello
     * required: 默认为true 如果前端不传值 程序会报错
     */
    @RequestMapping("/test6/{abc}/{efg}")
    public String testPathVariable3(@PathVariable String hello, @PathVariable String world) {
    
    
        String str = "@PathVariable 占位符映射-hello:"+ hello+"  world:"+world;
        return str;
    }
}
  • Demo3结果:
    在这里插入图片描述

4、示例4(required = false)

  • Demo4中主要是测试required = false时,配置多个请求映射路径;
  • Demo4示例:
@RestController
public class TestController {
    
    
   /**
   	 * demo4
     * @PathVariable(value = "abc",required = false)
     * value: 跟URL占位符名称一致
     * required: 默认为true,如果前端不传值程序会报错,如果设置为false需要配置多个请求路径
     */
    @RequestMapping(value = {
    
    "/test7/{abc}/{efg}","/test7/{abc}","/test7"})
    public String testPathVariable4(@PathVariable(value = "abc",required = false) String hello,
                                    @PathVariable(value = "efg",required = false) String world) {
    
    
        String str = "@PathVariable 占位符映射-hello:"+ hello+"  world:"+world;
        return str;
    }
}
  • Demo4结果:
    在这里插入图片描述

5、示例5(正则表达式规范请求URL)

  • Demo5中主要测试在@RequestMapping()的URL中配置正则表达式规范请求参数格式;
  • Demo5示例:
@RestController
public class TestController {
    
    
   /**
     *
     * @RequestMapping(value = {"/test8/{abc:^[a-zA-Z]+$}/{efg}","/test8/{abc:^[a-zA-Z]+$}","/test8"}
     * 正则表达式:^[a-zA-Z]+$  //只能是字母
     * @PathVariable(value = "abc",required = false)
     * value: 默认形参名 hello
     * required: 默认为true 如果前端不传值 程序会报错
     */
    @RequestMapping(value = {
    
    "/test8/{abc:^[a-zA-Z]+$}/{efg}","/test8/{abc:^[a-zA-Z]+$}","/test8"})
    public String testPathVariable5(@PathVariable(value = "abc",required = false) String hello,
                                    @PathVariable(value = "efg",required = false) String world) {
    
    
        String str = "@PathVariable 占位符映射-hello:"+ hello+"  world:"+world;
        return str;
    }

}
  • Demo5结果:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhuzicc/article/details/106086399