SpringMVC接收参数分情况有很多方式,用于绑定参数或者接收参数的注解有很多,当然springboot也一样,因为SpringBoot用的就是SpringMVC。我们大致可以根据它们处理request的方式不同,分成四类。
@RequestParam ,@RequestBody //处理request body部分的注解
@PathVariable //处理request 动态url的(resultful风格)注解
@RequestHeader @CookieValue //处理request头部信息的注解
@SessionAttributes @ModelAttributes //处理attributesd的注解
1,通常情况下,我们用名字匹配原则就可以接收参数
直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交。
url为:http:127.0.0.1/login?userName=1111&pwd=2222
@RequestMapping(“/login”)
public void login(String loginname,String pwd)
{
system.out.println(loginname+“:”+pass);
}
或者
通过一个bean来接收,post方式和get方式都可以。
public Class User{
private String userName;
private String pwd;
//setting和getting方法
}
@requestMapping(“/login”)
public void login(User user){
System.out.println(userName+“ :”+pwd);
}
当然可以通过HttpServletRequest接收,post方式和get方式都可以。
@RequestMapping(“/login”)
public String addUser2(HttpServletRequest request) {
String username=request.getParameter(“username”);
String password=request.getParameter(“pwd”);
System.out.println(“username is:”+username);
System.out.println(“password is:”+password);
return “demo/index”;
}
2.@RequestParam注解用于将指定的请求参数赋值给方法的参数。
虽然第一种方法可以,但是方法的参数要跟前端一样,这样不方便,而且为空时不能设置默认值,于是有了@RequestParam注解
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定绑定请求的参数 |
value | String | 否 | name属性的别名,就是方法的参数名 |
reuuired | boolean | 否 | 指定方法是否绑定,如果绑定,方法参数必要有值 |
defaultValue | String | 否 | 如果请求没有传递值,而给方法参数默认的值 |
@RequestMapping(“/login”)
public void login(@RequestParam(name=“loginname”) String loginname,@RequestParam(name=“passname”,value=“pass”) String pass)
{
system.out.println(loginname+“:”+pass);
}
3.@RequestBody将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
上面都是普通的字段,但是json字符串怎么接收呢,于是有了@RequestBody。将前台使用get和post方式提交数据时,数据编码格式由请求头ContentType指定,可以分这几种情况:
application/x-www-form-urlencoded:可以用@RequestParam很方便的接收,当然@RequestBody也可以
application/json或者application/xml:只能用@RequestBody接收
multipart/form-data:.@RequestBody不能接收这种
@requestMapping(“/login”)
public void login(@requestBody String userName,@requestBody String pwd){
System.out.println(userName+“ :”+pwd);
}
$.ajax({
url:“/login”,
type:“POST”,
data:‘{“userName”:”admin”,”pwd”,”admin123”}’,
content-type:“application/json charset=utf-8”, //必须application/json
success:function(data){
alert(“request success ! “);
}
});
这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是如果很多呢,这样我们就可以@RequestBody和JavaBean来接收
public Class User{
private String userName;
private String pwd;
//setting和getting方法
}
@requestMapping(“/login”)
public void login(@requestBody User user){
System.out.println(userName+“ :”+pwd);
}
$.ajax({
url:“/login”,
type:“POST”,
data:‘{“userName”:”admin”,”pwd”,”admin123”}’,
content-type:“application/json charset=utf-8”,
success:function(data){
alert(“request success ! “);
}
});
说明:
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
在后端的同一个接收方法里,@RequestBody 与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam
4.@PathVariable注解可以方便的得到url中的动态参数,@PathVariable注解只有一个属性name,用来绑定参数的名称,如果不填,则默认是方法的参数名。
@requestMapping(“/login/{userId}”)
public void login(@PathVariable String userId){
System.out.println(userId);
}
@requestMapping(“/login/{userId}”)
public void login(@PathVariable(name=“userId”) String username){
System.out.println(username);
}
说明:
可以在@RequestMapping注解中用{}来表明它的变量部分,这种被称为resultful风格,例如:
@RequestMapping(“/login/{userId}”)
这里{userId}就是我们定义的变量规则,userId是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:
/login/tianmaying
/login/ricky
/login/tmy1234
注意:在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名
5.@CookieValue 用于将请求的cookie数据映射到方法的参数上。
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定绑定请求的参数 |
value | String | 否 | name属性的别名,就是方法的参数名 |
reuuired | boolean | 否 | 指定方法是否绑定,如果绑定,方法参数必要有值 |
defaultValue | String | 否 | 如果请求没有传递值,而给方法参数默认的值 |
@RequestMapping(“/login”)
public void login(@CookieValue(value=“NAME”,defaultValue “”) String sessionId)
{
system.out.println(sessionId);
}
上面会把NAME的值给sessionId,如果没有这个cookie,则默认为空。
原创来源:滴一盘技术