@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;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

带占位符的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;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

通过@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;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

五、@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;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<!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 = KaTeX parse error: Expected 'EOF', got '#' at position 76: …token string">"#̲userName"</span…("#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=“david@etc.com”/><br>
<input type=button value=OK onclick=addUser()/>
</form>
</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

当前台界面使用 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 来处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值