方法参数属性params,@PathVariable和@RequestParam用法及区别

目录
  • 【1】params
  • 【2】@PathVariable绑定URL中变量
    • ① 前台实例
    • ② 后台代码
    • ③ 注解源码
  • 【3】@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<String,String>,该方法参数将会被所有路径变量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<String,String>或org.springframework.util.MultiValueMap MultiValueMap<String,String>,如果未指定参数名,则方法参数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" rel="external nofollow" >
  • 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";
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • @PathVariable和@RequestParam传参为空问题及解决

    目录 @PathVariable和@RequestParam传参为空 小结一下 使用@pathvariable与@requestparam碰到的问题 1.@pathvariable 2.@requestparam @PathVariable和@RequestParam传参为空 @RestController public class UserController { @GetMapping(value = {"/xie/{name}","/xie"}) public

  • 聊聊@RequestParam,@PathParam,@PathVariable等注解的区别

    @RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充 @RequestParam 看下面一段代码: http://localhost:8080/springmvc/hello/101?param1=10&param2=20 根据上面的这个URL,你可以用这样的方式来进行获取 public Strin

  • 使用@pathvariable与@requestparam碰到的一些问题及解决

    目录 @pathvariable与@requestparam碰到的一些问题 一.@pathvariable 二.@requestparam @PathVariable和@RequestParam的使用说明 value的uri值为以下三类 拓展 @pathvariable与@requestparam碰到的一些问题 一.@pathvariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {x} 占位符可以通过@PathVariable("x") 绑定到操作方

  • 方法参数属性params,@PathVariable和@RequestParam用法及区别

    目录 [1]params [2]@PathVariable绑定URL中变量 ① 前台实例 ② 后台代码 ③ 注解源码 [3]@RequestParam ① 注解源码 ② 前台请求实例 ③ 后台代码 [1]params 您可以根据请求参数条件缩小请求映射范围. 您可以测试是否存在请求参数(myParam),是否缺少一个(!myParam),或针对特定值(myParam=myValue). 以下示例显示了如何测试特定值: @GetMapping(path = "/pets/{petId}"

  • 基于params、@PathVariabl和@RequestParam的用法与区别说明

    方法参数相关属性params.@PathVariabl和@RequestParam的使用 [1]params params:指定request中必须包含某些参数值是,才让该方法处理. @RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10" }) public String testParamsAndHeaders() { System.out.

  • Yii框架参数配置文件params用法实例分析

    本文实例讲述了Yii参数配置文件params用法.分享给大家供大家参考,具体如下: 1.标题的调用 1.1设置 <?php return [ 'title' => '图书商城', "domain" => [ 'www' => 'http://super.nat300.top/', 'm' => 'http://super.nat300.top/m', 'web' => 'http://super.nat300.top/web', 'weixin' =

  • C#中的out参数、ref参数和params可变参数用法介绍

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args) { string s = "123"; int result; bool b = MyTest(s,out result); } public static bool MyTest(string s, out int result) { bool isTrue; try { resul

  • Python3.5常见内置方法参数用法实例详解

    本文实例讲述了Python3.5常见内置方法参数用法.分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/functions.html?highlight=built#ascii 1.abs(x):返回一个数字的绝对值.参数可以是整数或浮点数.如果参数是一个复数,则返回它的大小. #内置函数abs() print(abs(-2)) print(abs(4.5)) print(abs(0.1+7j)) 运行结果

  • Js-$.extend扩展方法使方法参数更灵活

    在做JS开发时,我们将第三方复杂的插件进行封装,然后对外公开一个很简单的方法接口,这是开发时常用的方法,在JS里,我们的方法参数通常使用JQ的$.extend 扩展方法来实现 复制代码 代码如下: function extend(arr) { arr = $.extend({ name: 'zzl', sex: 'male', age: 31 }, arr || {}); alert("[Name:]" + arr.name + "[Sex:]" + arr.sex

  • Python中的对象,方法,类,实例,函数用法分析

    本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. 复制代码 代码如下: class Foo(object):     static_attr = True     def method(self):         pass foo = Foo() 这段代码实际上创造了两个对象,Foo和foo.而Foo同时又是一个类,foo是这个类的实例. 在C++里类型定义是在编

  • C#动态对象(dynamic)详解(实现方法和属性的动态)

    C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道: 1) 定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身. public delegate object MyDelegate(dynamic Sender, params object[] PMs

随机推荐