起因: 在学习vue.js的时候,利用axios向后台发送请求:
load: function (val) {
axios
.post('/gms/shopNewVmiGoods/getShopNewVmiGoods',
{
pageSize: this.pageSize,
pageIndex: val,
gidOrName: this.gidOrName
})
.then(response => (console.log(response)))
.catch(function(error){
console.log(error);
})
}
后端在用controller接收这三个参数时,发现接收不到参数。后端接收的代码如下:
@RequestMapping(value = "/getShopNewVmiGoods")
@ResponseBody
public PageResult getShopNewVmiGoods(HttpServletRequest request , Integer pageIndex , Integer pageSize , String gidOrName) {
List<Long> departmentIdList = getDepartment(request);
return shopNewVmiGoodsBusiness.getShopVmiGoodsListByGidOrName(gidOrName,departmentIdList,pageIndex,pageSize);
}
查询后,发现,在axios发送post请求时,会自动将携带的参数转化为json格式,放到Body中,因此后端接收时也必须接收json格式。
参考资料:
由此引出第二个问题:@RequestBody 与 @RequestParam等注解的区别:
首先,类似与@RequestBody这种后端用来接收参数的注解主要有如下几个:
- @PathVariable
- @RequestHeader
- @CookieValue
- @RequestParam
- @RequestBody
- @SessionAttributes
- @ModelAttribute
下面开始逐个解释这些注解
- @PathVariable:这个注解主要用于接收请求路径中占位符的值,示例如下,可以将url中的占位符(/{xxx})绑定到形参上。
@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
@RequestMapping(value=”user/{id}/{name}”)
- @RequestHeader:此注解主要用于获取请求header中的信息,例如编码方式等等。例如:
public void query( @RequestHeader(value="Accept-Encoding",defaultValue="UTF-8") String encoding, @RequestHeader("Keep-Alive") long keepAlive) {
}
- @CookieValue:@CookieValue用于将Cookie中的参数绑定到形参上,用法如下:
@Controller
public class HelloWorldController {
@RequestMapping("/cookieValueTest")
public void cookieValueTest(@CookieValue(value="JSESSIONID")String sessionId) {
}
}
-
@RequestParam和@RequestBody:这两个注解是最常用的,两者的区别为:
@RequestBody可以将请求体中的参数绑定到相应的形参上(注意:@RequestBody会一次将所有的Body参数全部拿出来,也就是说形参中只能出现一次@RequestBody,如果有多个参数,可以把他们包裹在一个大的参数中);@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码(默认编码)的内容或者header内的参数,可以出现多个。
-
@SessionAttributes
若希望在多个请求之间共用某个模型属性数据,则可以在
控制器类上标注一个 @SessionAttributes, Spring MVC
将在模型中对应的属性暂存到 HttpSession 中。 -
@ModelAttribute
此注解可以访问模型中的属性,如果不存在模型,会自动实例化一个模型,如果请求中与字段有名称匹配的值,会将请求参数绑定到这个模型对象。