起因: 在学习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格式。
参考资料:

https://www.cnblogs.com/yiyi17/p/9409249.html

由此引出第二个问题:@RequestBody 与 @RequestParam等注解的区别:
首先,类似与@RequestBody这种后端用来接收参数的注解主要有如下几个:

  • @PathVariable
  • @RequestHeader
  • @CookieValue
  • @RequestParam
  • @RequestBody
  • @SessionAttributes
  • @ModelAttribute

下面开始逐个解释这些注解

  1. @PathVariable:这个注解主要用于接收请求路径中占位符的值,示例如下,可以将url中的占位符(/{xxx})绑定到形参上。
@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) 

@RequestMapping(value=”user/{id}/{name})
  1. @RequestHeader:此注解主要用于获取请求header中的信息,例如编码方式等等。例如:
public void query( @RequestHeader(value="Accept-Encoding",defaultValue="UTF-8") String encoding, @RequestHeader("Keep-Alive") long keepAlive)  {  

}  
  1. @CookieValue:@CookieValue用于将Cookie中的参数绑定到形参上,用法如下:

@Controller
public class HelloWorldController {
	@RequestMapping("/cookieValueTest")
	public void cookieValueTest(@CookieValue(value="JSESSIONID")String sessionId) {

	}
}
  1. @RequestParam和@RequestBody:这两个注解是最常用的,两者的区别为:
    @RequestBody可以将请求体中的参数绑定到相应的形参上(注意:@RequestBody会一次将所有的Body参数全部拿出来,也就是说形参中只能出现一次@RequestBody,如果有多个参数,可以把他们包裹在一个大的参数中);

    @RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码(默认编码)的内容或者header内的参数,可以出现多个。

  2. @SessionAttributes
    若希望在多个请求之间共用某个模型属性数据,则可以在
    控制器类上标注一个 @SessionAttributes, Spring MVC
    将在模型中对应的属性暂存到 HttpSession 中。

  3. @ModelAttribute
    此注解可以访问模型中的属性,如果不存在模型,会自动实例化一个模型,如果请求中与字段有名称匹配的值,会将请求参数绑定到这个模型对象。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐