使用Spring webmvc开发web项目非常简便,它可以提取了http请求的Parameter
、RequestBody
、Session
、Cookie
、Header
等信息并将其绑定到Controller
中对应的处理方法入参上。并且Spring webmvc为我们提供了丰富的注解来绑定请求信息。
@RequestParam
:绑定单个请求数据值,可以是URL中的数据,表单提交的数据或上传的文件;@PathVariable
:绑定URL模板变量值;@RequestBody
:绑定请求body中的数据并能进行自动类型转换,不能处理multipart/form-data
格式的数据;@CookieValue
:绑定Cookie数据;@RequestHeader
:绑定请求头数据;@ModelAttribute
:绑定数据到Model;@SessionAttributes
:绑定数据到Session;@RequestPart
:绑定multipart/data
数据,并可以根据数据类型进行对象转换。 基本类型绑定比较简单,我们只需要在Controller
中对应的请求处理方法接受请求参数的入参即可,这里有两点需要注意的:
1. 使用基本类型接受http请求参数,由于基本类型为值类型,不能为null,所以请求参数为必传,如不传系统出报500
错误。
2. http请求参数key
须和Controller
中方法入参对应(key
与形参名相同),否则同样会报500
错误。
当然,以上两点是有其他解决方案的,第一点可以使用@RequestParam(required = false)
来将参数设为非必须,或者使用包装类型来代替基本类型;第二点我们可以使用@RequestParam(value = "xxx")
来指定别名。这里有个小技巧,如果接收参数为boolean
类型,可以使用1
来表示true
,相应0
可以表示false
。
/**
* 基本类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为必填
* url: http://localhost/basicType?number=5
* @param number
* @return
*/
@RequestMapping("basicType1")
public String basicType(int number) {
return "number:" + number;
}
/**
* 基本类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为必填
* url: http://localhost/basicType2?discount=true
* url: http://localhost/basicType2?discount=1
* @param discount
* @return
*/
@RequestMapping("basicType2")
public String basicType(boolean discount) {
return "discount:" + discount;
}
/**
* 包装类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为非必填
* url: http://localhost/packType?num=4
* @param number
* @return
*/
@RequestMapping("packType")
private String packType(@RequestParam(value = "num", required = false) Integer number) {
return "number: " + number;
}
对象绑定一般来用接收RequestBody
数据数据,当然也可以接收url param,处理器接收请求数据时会使用相应的HttpMessageConverter
进行解析,然后将解析后的数据绑定到要返回的对象上。这里需要注意的是请求中的key
需要与接收对象的属性名一致。
/**
* 对象绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
* url: http://localhost/spec1?color=白色&size=170
* @param spec
* @return
*/
@RequestMapping("spec1")
public String addSpec1(Spec spec) {
return spec.toString();
}
/**
* 对象绑定,只能接收RequestBody(raw)数据
* json: {"color":"蓝色","size":175}
* @param spec
* @return
*/
@RequestMapping("spec2")
public String addSpec2(@RequestBody Spec spec) {
return spec.toString();
}
多层级对象是建立在对象绑定之上的,需要注意的是绑定参数中对象的下级对象时,下级对象请求key
需要加上.
下级对象的属性名。如:spec.color=蓝色
。
/**
* 多层级对象绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
* url: http://localhost/goods1?name=上衣&price=98.9&stock=998&discount=false&spec.color=白色&spec.size=175
* @param spec
* @return
*/
@RequestMapping("goods1")
public String addGoods1(Goods goods) {
return goods.toString();
}
/**
* 多层级对象绑定,只能接收RequestBody(raw)数据
* json: {"name":"牛仔裤","price":158,"stock":200,"discount":true,"spec":{"color":"蓝色","size":31}}
* @param spec
* @return
*/
@RequestMapping("goods2")
public String addGoods2(@RequestBody Goods goods) {
return goods.toString();
}
数组绑定用于绑定请求中有一个多个相同的key
时,在方法中使用数组的形式接收。如果url与requestBody存在同个key
时,也可以数组接收,spring先会处理url中的值,然后再处理requestBody中的值。
/**
* 数组绑定
* url: http://localhost/array?name=aaa&name=bbb
*/
@RequestMapping("array")
public String array1(String[] name) {
String nameStr = "";
for (String n : name) {
nameStr += n + "\n";
}
return nameStr;
}
绑定Map数据也有两种方式,一种是不使用注解(可绑定url param和RequestBody(form-data、x-www-form-urlencoded),另一种是使用@RequestBody
注解(只能绑定RequestBody(raw)数据)。由于Spring mvc在绑定数据时会反射调用参数的set
方法,这里我们需要建一个类做为数据收集对象来存储绑定的map对象。
/**
* Map绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
* http://localhost/map1?map['nike'].name=耐克&map['nike'].price=899&map['adidas'].name=阿迪达斯&map['adidas'].price=998
*/
@RequestMapping("map1")
public String map1(GoodsMap goodsMap) {
String mapStr = "";
Map map = goodsMap.getMap();
for (Map.Entry entry : map.entrySet()) {
mapStr += entry.getKey() + ":" + entry.getValue() + "\n";
;
}
return mapStr;
}
/**
* Map绑定,只能接收RequestBody(raw)数据
* url: http://localhost/map2
* json: {"map":{"adidas":{"name":"衣服","price":98},"nike":{"name":"裤子","price":89}}}
*/
@RequestMapping("map2")
public String map2(@RequestBody GoodsMap goodsMap) {
String mapStr = "";
Map map = goodsMap.getMap();
for (Map.Entry entry : map.entrySet()) {
mapStr += entry.getKey() + ":" + entry.getValue() + "\n";
;
}
return mapStr;
}
list和map相同,也需要加数据收集对象来存储绑定的list对象。同样也针对不同请求有两种不同的处理方式。
/**
* list绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
* url: http://localhost/list1
*/
@RequestMapping("list1")
public String list1(GoodsList goodsList) {
String listStr = "";
for (Goods goods : goodsList.getList()) {
listStr += goods.toString() + "\n";
}
System.out.println(JSONObject.toJSON(goodsList));
return listStr;
}
/**
* list绑定,只能接收RequestBody(raw)数据
* url: http://localhost/list2
* json: {"list":[{"name":"衣服","price":100},{"name":"裤子","price":98}]}
*/
@RequestMapping("list2")
public String list2(@RequestBody GoodsList goodsList) {
String listStr = "";
for (Goods goods : goodsList.getList()) {
listStr += goods.toString() + "\n";
}
return listStr;
}
示例代码地址:https://git.oschina.net/Leeafei/springboot-study