文章目录
一、正确理解 访问请求路径、URL、请求参数的区别
请求URL (requestURL)= http://www.test.com/user/031267/view?username=zhangsan&age=20
请求路径:/user/031267/view
请求参数(queryString)= username=zhangsan&age=20
二、@PathVariable
映射 URL 绑定的占位符
@PathVariable
可以将 URL 中 占位符参数
绑定到控制器处理 方法的入参
中:
URL 中的 { xxx }
占位符可以通过 @PathVariable("xxx")
绑定到操作方法的入参中。
请求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 新增的功能。
三、@RequestParam
获取request请求参数中的值
请求路径:/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
如上面例子,请求路径是 /user/query?age=20
,程序一定会报错的,
如果username不传时, 就是null ,而 @RequestParam
默认是必传的。
解决方法是
第1种: 请求路径改为 /user/query?username=&age=20
表示 username==""
,不为null;
第2种: required=false
,具体如下:
@RequestParam(value="username",required=false) String username
四、@PathVariable
与 @RequestParam
的区别
4.1、@PathVariable
:
请求URL : http://www.test.com/user/031267/view?username=zhangsan&age=20
请求路径 : /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 的值
-
仅限用于 post 请求
-
因为一次请求只能有一个请求体body,所以方法参数中也只能有一个
@RequestBody
参数。但是,也可以把 请求体body的对象拆分开,用多个@RequestBody
参数来接收。 -
一般情况下,
@RequestBody
只处理Content-Type
是application/json
或者application/xml
。(a)、使用时,必须在请求头中声是
Content-Type
是application/json
或者application/xml
。
(b)、参数必须通过HttpEntity
传递。
(c)、SpringMVC 通过使用HandlerAdapter
配置的HttpMessageConverters
来解析HttpEntity
中的数据,然后绑定到相应的 bean上。 -
特殊情况,
@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="david@etc.com"/><br>
<input type="button" value="OK" onclick="addUser()"/>
</form>
</body>
</html>
当前台界面使用 GET 或 POST 方式提交数据时,数据编码格式由请求头的 Content-Type
指定。
分为以下几种情况:
application/x-www-form-urlencoded
,这种情况的数据@RequestParam
、@ModelAttribute
可以处理,@RequestBody
也可以处理。multipart/form-data
,@RequestBody
不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data
,意思是以二进制流的形式传输文件。)application/json
、application/xml
等格式的数据,必须使用@RequestBody
来处理。