应用场景
请求中 参数名 与 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 属性
required 属性
表示 请求中,是否必须存在该参数名,默认为true,表示 必须 存在,否则 报错
由于 Controller中使用 @RequestParam("u_phone")
,默认 required=true
,那么前台页面 必须提供 u_phone
参数,该参数可以是 空值,但必须得有此参数,没有此参数会报错
如下: 直接访问该Controller,没有参数,报错如下图:
如果设置 required = false
,即:@RequestParam(value = "u_phone",required = false)
,前端发请求没有提供 u_phone
参数,也不会报错