SpringMVC和SpringBoot如何接收参数或者绑定参数

SpringMVC接收参数分情况有很多方式,用于绑定参数或者接收参数的注解有很多,当然springboot也一样,因为SpringBoot用的就是SpringMVC。我们大致可以根据它们处理request的方式不同,分成四类。

  1. @RequestParam ,@RequestBody //处理request body部分的注解
  2. @PathVariable //处理request 动态url的(resultful风格)注解
  3. @RequestHeader @CookieValue //处理request头部信息的注解
  4. @SessionAttributes @ModelAttributes //处理attributesd的注解

1,通常情况下,我们用名字匹配原则就可以接收参数

直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交。

  1. url为:http:127.0.0.1/login?userName=1111&pwd=2222
  1. @RequestMapping(“/login”)
  2. public void login(String loginname,String pwd)
  3. {
  4. system.out.println(loginname+“:”+pass);
  5. }

或者
通过一个bean来接收,post方式和get方式都可以。

  1. public Class User{
  2. private String userName;
  3. private String pwd;
  4. //setting和getting方法
  5. }
  1. @requestMapping(“/login”)
  2. public void login(User user){
  3.   System.out.println(userName+“ :”+pwd);
  4. }

当然可以通过HttpServletRequest接收,post方式和get方式都可以。

  1. @RequestMapping(“/login”)
  2. public String addUser2(HttpServletRequest request) {
  3. String username=request.getParameter(“username”);
  4. String password=request.getParameter(“pwd”);
  5. System.out.println(“username is:”+username);
  6. System.out.println(“password is:”+password);
  7. return “demo/index”;
  8. }

2.@RequestParam注解用于将指定的请求参数赋值给方法的参数。
虽然第一种方法可以,但是方法的参数要跟前端一样,这样不方便,而且为空时不能设置默认值,于是有了@RequestParam注解

属性 类型 是否必要 说明
name String 指定绑定请求的参数
value String name属性的别名,就是方法的参数名
reuuired boolean 指定方法是否绑定,如果绑定,方法参数必要有值
defaultValue String 如果请求没有传递值,而给方法参数默认的值
  1. @RequestMapping(“/login”)
  2. public void login(@RequestParam(name=“loginname”) String loginname,@RequestParam(name=“passname”,value=“pass”) String pass)
  3. {
  4. system.out.println(loginname+“:”+pass);
  5. }

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不能接收这种

  1. @requestMapping(“/login”)
  2. public void login(@requestBody String userName,@requestBody String pwd){
  3.   System.out.println(userName+“ :”+pwd);
  4. }
  1. $.ajax({
  2. url:“/login”,
  3. type:“POST”,
  4. data:‘{“userName”:”admin”,”pwd”,”admin123”}’,
  5. content-type:“application/json charset=utf-8”, //必须application/json
  6. success:function(data){
  7. alert(“request success ! “);
  8. }
  9. });

这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是如果很多呢,这样我们就可以@RequestBody和JavaBean来接收

  1. public Class User{
  2. private String userName;
  3. private String pwd;
  4. //setting和getting方法
  5. }
  1. @requestMapping(“/login”)
  2. public void login(@requestBody User user){
  3.   System.out.println(userName+“ :”+pwd);
  4. }
  1. $.ajax({
  2. url:“/login”,
  3. type:“POST”,
  4. data:‘{“userName”:”admin”,”pwd”,”admin123”}’,
  5. content-type:“application/json charset=utf-8”,
  6. success:function(data){
  7. alert(“request success ! “);
  8. }
  9. });

说明:

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);

GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam

4.@PathVariable注解可以方便的得到url中的动态参数,@PathVariable注解只有一个属性name,用来绑定参数的名称,如果不填,则默认是方法的参数名。

  1. @requestMapping(“/login/{userId}”)
  2. public void login(@PathVariable String userId){
  3.   System.out.println(userId);
  4. }
  5. @requestMapping(“/login/{userId}”)
  6. public void login(@PathVariable(name=“userId”) String username){
  7.   System.out.println(username);
  8. }

说明:
可以在@RequestMapping注解中用{}来表明它的变量部分,这种被称为resultful风格,例如:

  1. @RequestMapping(“/login/{userId}”)

这里{userId}就是我们定义的变量规则,userId是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:

  1. /login/tianmaying
  2. /login/ricky
  3. /login/tmy1234

注意:在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名

5.@CookieValue 用于将请求的cookie数据映射到方法的参数上。

属性 类型 是否必要 说明
name String 指定绑定请求的参数
value String name属性的别名,就是方法的参数名
reuuired boolean 指定方法是否绑定,如果绑定,方法参数必要有值
defaultValue String 如果请求没有传递值,而给方法参数默认的值
  1. @RequestMapping(“/login”)
  2. public void login(@CookieValue(value=“NAME”,defaultValue “”) String sessionId)
  3. {
  4. system.out.println(sessionId);
  5. }

上面会把NAME的值给sessionId,如果没有这个cookie,则默认为空。