SpringBoot从0到实战9:学习@RequestParam和@PathVariable

2024-06-06 21:47:08 浏览数 (1)

正确理解“访问请求”、“URI”、“URL”、“请求参数”的概念

  • 一个完整的请求路径:http://www.test.com/user/0866/viewusername=zhangsan&age=21
  • 请求URL (requestURL)=
  • http://www.test.com/user/031267/view
  • 请求URI (requestURI)= user/031267/view
  • 请求参数(queryString)= username=zhangsan&age=20
  • 上述中,URI为统一资源标识符Uniform Resource Identifer,是一个用于表示某一互联网资源名称的字符串,Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 -由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。

@RequestParam注解和@PathVariable注解的区别

  • 从字面上可以看出@RequestParam是获取请求里边携带的参数;
  • @PathVariable翻译过来就是路径变量,是获取请求路径里边的变量参数。
  • 例:127.0.0.1/user/{userId}userName=zhangshan,userId是路径上的变量,userName才是请求参数信息

@RequestParam注解

  • @RequestParam有三个参数:
  • value:参数名;
  • required:是否必需,默认为true,表示请求参数中必须包含该参数,如果不包含抛出异常。
  • defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数中没有包含该参数则使用默认值。
  • 示例:@RequestParam(value = “userId”, required = false, defaultValue = “1”)

@PathVariable注解

  • 当使用@RequestMapping URI占位符映射时,Url中可以通过一个或多个{xxxx}占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中。
  • 例如:@PathVariable(“userId”) Long userId,@PathVariable(“userName”) String userName (注:Long类型可以根据需求自己改变String或int,spring会自动做转换)
  • @RequestMapping(“/user/{userId}/{userName}/query")
  • 请求URL:http://localhost/user/8/张山/query
  • /Springmvc/user/page.do?pageSize=3&pageNow=2 pageSize和pageNow应该属于参数而不是路径,所以此处应该使用@RequestParam的注解

@PathVariable 映射 URL 绑定的占位符

  • @PathVariable 可以将 URL 中 占位符参数 绑定到控制器处理 方法的入参 中:URL 中的 { xxx } 占位符可以通过这样的方式:@PathVariable(“xxx”) 绑定到操作方法的入参中。

下面将给出详细例子: 请求路径 : http://www.test.com/user/031267/view?username=zhangsan&age=20 请求URL : http://www.test.com/user/031267/view

代码语言:javascript复制
@RequestMapping(value = "/user/{userid}/view")  //占位符 userid
public String view ( @PathVariable("userid") String userid){ //@PathVariable 中指定 userid
    System.out.println("userid= " userid);   //此处可以获取:userid= 031267
    return SUCCESS;
}

@RequestParam 获取request请求参数中的值

  • 请求路径:http://www.test.com/user/query?username=zhangsan&age=20 请求参数:username=zhangsan&age=20
代码语言:javascript复制
@RequestMapping(value = "/user/query")
public String query(@RequestParam(value="username") String username) {	
	System.out.println("username = "   username);   //此处打印:username = zhangsan
	return SUCCESS;
}

通过@RequestParam 获取 不同请求对应的值:

…/query?username=zhangsan 获取 username 等于 zhangsan …/query?username= 获取 username=="" …/query 获取 username==null @RequestParam 默认必传的,不能为null

如上面例子,请求路径是 http://www.test.com/user/query?age=20 ,程序一定会报错的, 如果username不传时, 就是null ,而 @RequestParam 默认是必传的。

解决方法:

  • 第1种: 请求路径改为 http://www.test.com/user/query?username=&age=20 表示 username=="",不为null;
  • 第2种: required=false,具体如下: @RequestParam(value=“username”,required=false) String username

两者的共同使用

请求路径 : http://www.test.com/user/031267/view?username=zhangsan&age=20

代码语言:javascript复制
@RequestMapping(value = "/user/{userid}/view")
public String query(@PathVariable("userid") String userid,@RequestParam(value="username") String username ) {	
	System.out.println("userid= " userid);   //此处可以获取:userid= 031267
	System.out.println("username = "   username);   //此处打印:username = zhangsan
	return SUCCESS;
}

关于两者的其他详细使用及特殊情况

  • 放上一篇csdn大佬文章链接:https://blog.csdn.net/qq_33355821/article/details/85619692?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-5.control
  • 参考借鉴链接: https://xiaojin21cen.blog.csdn.net/article/details/83628701

0 人点赞