springboot教程-@RequestParam详解

应用场景

请求中 参数名 与 Controller方法 形参名 不同时,比如:

在前后台分离式开发中,前台页面是由 前端程序员开发的,表单控件名是由 前端程序员命名的,命名为:u_phone、u_pwd

后台程序员编写 Controller 时,方法的 形参名不能是:u_phone、u_pwd,因为 不符合 java命名规范,形参为:phone、password

此时,前端 请求中的 参数名 和 Controller方法的形参名 不匹配,就需要用该注解,使之匹配上

源码

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

由 @Target({ElementType.PARAMETER}) 可知,只能声明形参

value属性

请求中的参数名。表示将请求中该参数的值,传给 声明的形参

只用该属性时可省略;当用多个属性时,不能省略

支持的数据类型

  • 基本数据类型、字符串
  • javabean
  • 数组
  • 集合。如:List、Map等

例子

html 代码

手机号:<input type="text" id="u_phone" /><br>
密码:<input type="password" id="u_pwd" /><br>
<input type="button" value="登录" onclick="doLogin()"/>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
    function doLogin(){
        var u_phone=$("#u_phone").val();
        var u_pwd=$("#u_pwd").val();
        $.ajax({
            url:'doLogin',
            type:'post', //使用post方法
            dataType:'json',//服务器端返回的数据格式是json
            data: {
                "u_phone":u_phone,
                "u_pwd":u_pwd
            },//发给服务器端的数据
            success:function(data){   //data:服务器端返回给浏览器端的数据
                if(data.code==0){
                    alert("登录成功,跳转首页!");
                    // location.href='index.html';
                }else{
                    alert(data.msg)
                }
            },
            error:function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest);
                alert(textStatus);
                alert(errorThrown);
            }
        });
    }
</script>

Controller 代码

@RestController
public class LoginCtrl {
    @RequestMapping("/doLogin")
    public JsonResult login(@RequestParam("u_phone") String phone,@RequestParam("u_pwd") String password){
        System.out.println(phone+"-"+password);
        JsonResult jr=new JsonResult(0,"登录成功!");
        return jr;
    }
}

name 属性

等同于 value 属性

value 和 name 同时使用

注意:一般情况,name 和 value 不要同时使用,可能报错

情况一

name 和 value 同时使用,且两个都是 "",此时 按照形参名,从 request 对象中取值

情况二

name 和 value 同时使用,此时,name 和 value 都不为 "" 时,两者的值必须一致,否则报错如下:

attribute 'name' and its alias 'value' are present with values of [XXX] and [XXX], but only one is permitted

情况三

name 和 value 同时使用,且一个是 "",另一个不是 "",此时, 按照 不是 "" 的,从 request 对象中取值

required 属性

表示 请求中,是否必须存在该参数名,默认为 true,表示 必须 存在,否则 报错

由于 Controller中使用 @RequestParam("u_phone") ,默认 required=true ,那么前台页面 必须提供 u_phone 参数,该参数可以是 "",但必须得有此参数,没有此参数会报错

如下: 直接访问该Controller,没有参数,报错如下图:

如果设置 required = false ,即:@RequestParam(value = "u_phone",required = false),前端发请求没有提供 u_phone 参数,也不会报错


原文出处:/show_1IXimecIOkf.html