方法参数相关属性params、@PathVariable和@RequestParam用法与区别

简介: 方法参数相关属性params、@PathVariable和@RequestParam用法与区别

【1】params

您可以根据请求参数条件缩小请求映射范围。您可以测试是否存在请求参数(myParam),是否缺少一个(!myParam),或针对特定值(myParam=myValue)。以下示例显示了如何测试特定值:

@GetMapping(path = "/pets/{petId}", params = "myParam=myValue") 
public void findPet(@PathVariable String petId) {
    // ...
}

您还可以将其用于请求头条件,如下例所示:

@GetMapping(path = "/pets", headers = "myHeader=myValue") 
public void findPet(@PathVariable String petId) {
    // ...
}

简而言之,params是指定request中必须包含某些参数值时,才让该方法处理。

@RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10" })
public String testParamsAndHeaders() {
    System.out.println("testParamsAndHeaders");
    return SUCCESS;
}

params 只是判断url 或者 form data 中的参数是否复合params的定义,并不会直接绑定数据到方法的参数中,起到一个请求过滤作用。


【2】@PathVariable绑定URL中变量


绑定路径中的占位符参数到方法参数变量中,只能绑定路径中的占位符参数,且路径中必须有参数。无论是 GET 或者POST 只要 URL中有参数即可!

① 前台实例

GET实例

Request URL:http://localhost:8080/SpringMVC-1/springmvc/testPathVariable/1

POST 实例

<form action="springmvc/testPathVariable/1" method="POST">
  <input type="text" name="username" value=""/>
  <input type="text" name="age" value=""/>
  <input type="text" name="sex" value=""/>
  <input type="submit" value="submit"/>
</form>

【注意】如果URL中无参数,将会出错;如果URL有参数,但是没有使用@PathVariabl该注解,那么URL的参数不会默认与方法参数绑定!方法里的参数会默认绑定表单里面对应的参数!

后台代码

如果参数名与占位符一致,则可直接使用@PathVariable。如果不一致,则在@PathVariable( )括号内绑定占位符。

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id2) {
  System.out.println("testPathVariable: " + id2);
  return SUCCESS;
}

③ 注解源码

@PathVariable 注解指示方法参数应绑定到URI模板变量。支持@RequestMapping注解的处理程序方法。如果方法参数类型为java.util.Map Map,该方法参数将会被所有路径变量name-value填充。

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
  @AliasFor("name")
  String value() default "";
   //路径变量绑定的名称
  @AliasFor("value")
  String name() default "";
   //路径变量是否必须。默认为true,当路径变量不存在时抛出异常。
   //如果当路径变量不存在时,你倾向赋予null或者Java 8的Optional,请设置为false,
   //例如,在一个@ModelAttribute注解的方法处理不同的请求时。
  boolean required() default true;

【3】@RequestParam

@RequestParam注解指示方法参数应绑定web请求参数。Spring MVC和Spring WebFlux中的注解处理程序方法支持如下:


在SpringMVC中,“request parameters”映射查询参数、表单数据和multipart requests中的参数。这是因为ServletAPI将查询参数和表单数据组合到一个a single map called "parameters",其中包括请求body的自动解析。


在Spring WebFlux中,“request parameters”只映射到查询参数。要在三部分起作用(query parameters, form data,and parts in multipart requests),可以使用数据绑定到用@ModelAttribute注解的命令对象。


如果方法参数类型为Map,并且指定了请求参数名称,则假设有适当的转换器可用,则请求参数值将转换为Map。


如果方法参数为java.util.Map Map或org.springframework.util.MultiValueMap MultiValueMap,如果未指定参数名,则方法参数Map会被所有的请求参数名-值填充。

注解源码

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
  @AliasFor("name")
  String value() default "";
  //请求参数要绑定的名称
  @AliasFor("value")
  String name() default "";
/
   //请求参数是否必须,默认为true。如果参数不存在,则抛出异常。
   //你可以选择设置为false或者给予默认值。
  boolean required() default true;
   //当请求参数不存在或为空时,使用默认值。提供一个默认值将会隐形设置required属性为false。
  String defaultValue() default ValueConstants.DEFAULT_NONE;
}


前台请求实例

GET

<a href="springmvc/testRequestParam?userName=tom&age=11&sex=boy">

POST

<form action="springmvc/testRequestParam" method="POST">
  <input type="text" name="userName" value=""/>
  <input type="text" name="age" value=""/>
  <input type="text" name="sex" value=""/>
  <input type="submit" value="submit"/>
</form>

注意 :

  • GET中的参数形式为:username=tom&age=11&sex=boy
  • POST中的参数形式为:以键值对形式保存在form data


后台代码

@RequestMapping(value="/regist",produces="application/json;charset=utf-8")
@ResponseBody
public String regist(SysUser sysUser , @RequestParam(required=true,name="sex") String sex){
  String userName = sysUser.getUserName();
  String age = sysUser.getAge();
  //...
  return "regist success";
}


目录
相关文章
|
6月前
|
JSON 前端开发 Java
@RequestParam这个注解的作用
@RequestParam这个注解的作用
329 0
@RequestParam()和@PathVariable()的区别
@RequestParam()和@PathVariable()的区别
|
6月前
|
Java Spring
@RequestParams是这作用?
@RequestParams是这作用?
|
6月前
|
XML SQL JSON
query 与 params:选择正确的参数传递方式
query 与 params:选择正确的参数传递方式
|
6月前
|
Java API Spring
spring注解中@RequestParam和@PathVariable的区别
spring注解中@RequestParam和@PathVariable的区别
139 0
|
前端开发 Java 数据安全/隐私保护
解决通过request.getParam()方法获取到的值为null的问题~
解决通过request.getParam()方法获取到的值为null的问题~
277 0
|
前端开发 API 开发者
后端controller类中方法参数前的注解@ApiParam @RequestParam @PathVariable 用法
后端controller类中方法参数前的注解@ApiParam @RequestParam @PathVariable 用法
Springboot中@RequestParam和@PathVariable的用法与区别
Springboot中@RequestParam和@PathVariable的用法与区别
|
XML SQL JSON
@PathVariable、@RequestBody、@RequestParam、@ResponseBody、@Param的详解和用法
@PathVariable、@RequestBody、@RequestParam、@ResponseBody、@Param的详解和用法
165 0
|
Java API Spring
@RequestParam和@PathVariable的区别
@RequestParam注解获取URL中携带的请求参数的值既URL中“?”后携带的参数,传递参数的格式是:key=value;@PathVariable注解用于获取URL中路径的参数值,参数名由RequestMapping注解请求路径时指定,常用于restful风格的api中,传递参数格式:直接在url后添加需要传递的值即可
191 0