SpringMVC 中 @PathVariable、@RequestParam、@RequestBody的使用

一、正确理解 访问请求、URI、URL、请求参数 四者的区别

一个完整的请求路径:http://www.test.com/user/031267/view?username=zhangsan&age=20

请求URL (requestURL)= http://www.test.com/user/031267/view
请求URI (requestURI)= /user/031267/view
请求参数(queryString)= username=zhangsan&age=20

二、@PathVariable 映射 URL 绑定的占位符

@PathVariable 可以将 URL 中 占位符参数 绑定到控制器处理 方法的入参 中:
URL 中的 { xxx } 占位符可以通过 @PathVariable("xxx") 绑定到操作方法的入参中。

请求路径 : http://www.test.com/user/031267/view?username=zhangsan&age=20
请求URL : http://www.test.com/user/031267/view

@RequestMapping(value = "/user/{userid}/view")  //占位符 userid
public String view ( @PathVariable("userid") String userid){ //@PathVariable 中指定 userid
    System.out.println("userid= "+userid);   //此处可以获取:userid= 031267
    return SUCCESS;
}

带占位符的URL 是Spring3.0 新增的功能,该功能在SpringMVC 向REST目标挺进发展过程中具有里程碑的意义。

三、@RequestParam 获取request请求参数中的值

请求路径:http://www.test.com/user/query?username=zhangsan&age=20
请求参数:username=zhangsan&age=20

@RequestMapping(value = "/user/query")
public String query(@RequestParam(value="username") String username) {	
	System.out.println("username = " + username);   //此处打印:username = zhangsan
	return SUCCESS;
}

通过@RequestParam 获取 不同请求对应的值:

  • .../query?username=zhangsan 获取 username 等于 zhangsan
  • .../query?username= 获取 username==""
  • .../query 获取 username==null

@RequestParam 默认必传的,不能为null

如上面例子,请求路径是 http://www.test.com/user/query?age=20 ,程序一定会报错的,
如果username不传时, 就是null ,而 @RequestParam 默认是必传的。

解决方法是
第1种: 请求路径改为 http://www.test.com/user/query?username=&age=20 表示 username=="",不为null;
第2种: required=false,具体如下:
@RequestParam(value="username",required=false) String username

四、@PathVariable@RequestParam 的区别

4.1、@PathVariable

请求路径 : http://www.test.com/user/031267/view?username=zhangsan&age=20
请求URL : http://www.test.com/user/031267/view

@PathVariable 是 处理 URL 中的参数值

  • 请求URL 是 不带请求参数 的;
  • @PathVariable("userid") 是 获取访 请求URL 的 变量值 ;
  • 而 变量值(如 031267)是 请求URL 的一部分。

4.2、@RequestParam

请求路径 :http://www.test.com/user/031267/view?username=zhangsan&age=20
请求参数: username=zhangsan&age=20

@RequestParam 是 获取请求参数的值,也就是 ? 后面的那些值 。

username 的值 是 zhangsan,age 的值 就是20

4.3、@PathVariable@RequestParam 综合使用

请求路径 : http://www.test.com/user/031267/view?username=zhangsan&age=20

@RequestMapping(value = "/user/{userid}/view")
public String query(@PathVariable("userid") String userid,@RequestParam(value="username") String username ) {	
	System.out.println("userid= "+userid);   //此处可以获取:userid= 031267
	System.out.println("username = " + username);   //此处打印:username = zhangsan
	return SUCCESS;
}

五、@RequestBody 获取 request 请求体 body 的值

  1. 仅限用于 post 请求

  2. 因为一次请求只能有一个请求体body,所以方法参数中也只能有一个@RequestBody参数。但是,也可以把 请求体body的对象拆分开,用多个@RequestBody参数来接收。

  3. 一般情况下,@RequestBody只处理 Content-Typeapplication/json 或者 application/xml

    (a)、使用时,必须在请求头中声是 Content-Typeapplication/json 或者 application/xml
    (b)、参数必须通过 HttpEntity 传递。
    (c)、SpringMVC 通过使用HandlerAdapter 配置的 HttpMessageConverters 来解析 HttpEntity 中的数据,然后绑定到相应的 bean上。

  4. 特殊情况,@RequestBody 也可以处理 Content-Type 类型为 application/x-www-form-urlcoded 编码的内容。@RequestBody会将处理结果放到一个MultiValueMap<String,String> 中。

@RequestMapping(value="addUser.do",method=RequestMethod.POST,consumes="application/json")
@ResponseBody
public int addUser(@RequestBody UserVo vo){
	System.out.println( vo.toString() );
	return 1;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Store</title>
<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
 
function addUser() {
   var name = $("#userName").val();
   var password = $("#password").val();
   var email = $("#email").val();      

   var user = {
		userName: name,
        password: password,
        email: email               
   };

   $.ajax({
       type: "POST",
       url: "user/addUser.do",
	   data:JSON.stringify(user),
       contentType:'application/json;charset=utf-8', //默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。
       dataType: "json",    //预期服务器返回的数据类型
       success: function (msg) {
           console.log(msg)
       }	        
   });
}
</script>
</head>
<body>
	Post 提交
	<form action="" method="post">
		userName:<input type="text" id ="userName" value="david"/><br>
		password:<input type="text" id ="password" value="111111"/><br>
		email:<input type="text" id ="email" value="[email protected]"/><br>		
		<input type="button" value="OK" onclick="addUser()"/>
	</form>
</body>
</html>

当前台界面使用 GET 或 POST 方式提交数据时,数据编码格式由请求头的 Content-Type 指定。

分为以下几种情况:

  1. application/x-www-form-urlencoded,这种情况的数据 @RequestParam@ModelAttribute可以处理,@RequestBody 也可以处理。
  2. multipart/form-data@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data ,意思是以二进制流的形式传输文件。)
  3. application/jsonapplication/xml 等格式的数据,必须使用 @RequestBody 来处理。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/83628701