[JAVA] SpringMVC中RequestBody注解的List参数传递方式

1895 0
王子 2022-11-8 17:22:34 | 显示全部楼层 |阅读模式
目录

    RequestBody注解的List参数传递
      Controller方法参数:@RequestBody List<Long> idsController方法参数:@RequestBody User user
    @RequestBody注解分析
      get和post1.@RequestBody2.@RequestParam3.两者混合使用



RequestBody注解的List参数传递


Controller方法参数:@RequestBody List<Long> ids

前端传的json数据:
  1. [
  2.   1010,
  3.   1011
  4. ]
复制代码
Controller方法参数:@RequestBody User user

把List集合封装在一个实体类型中,用该实体类型作为Controller的方法参数
User为实体类型,里面有个List<Long>类型的参数(假设名为userIds,且有对应的getter、setter方法)
前端传的json数据:
  1. {
  2.   "userIds": [ 1, 2 ]
  3. }</pre></iv>
  4. <p>参考:Spring MVC 数据绑定</p>
  5. <p class="maodian"></p><h2>@RequestBody注解分析</h2>
  6. <p class="maodian"></p><h3>get和post</h3>
  7. <p>GET可以拥有请求体,RFC 文档中从来就没有说过 GET 没有请求体.RFC 只是说GET 意味着通过 URI 来识别资源。所以GET请求体中的数据一般都是不做处理的,有些 http 的 lib 里不让甚至直接不提供 GET 方法追加请求体的操作。</p>
  8. <p>POST请求拥有请求体,并且请求数据一般都是放在请求体当中的。所以在处理POST请求时,通常都是从请求体中获取数据。</p>
  9. <p class="maodian"></p><h3>1.@RequestBody</h3>
  10. <p><strong>1.1用途:</strong></p>
  11. <p>用于接收前端传递给后端的json字符串中的数据。(处理json格式的数据)</p>
  12. <p>@RequestBody用来接收前端传递给后端的json字符串中的数据,GET方式的请求一般通过URL中携带key-value参数,而@RequestBody接收的是请求体中的数据(json格式的数据,只有请求体中能保存json),所以使用@RequestBody接收数据的时候必须是POST方式等方式。</p>
  13. <p>@RequestBody与@RequestParam()可以同时使用,但@RequestBody最多只能有一个,而@RequestParam()可以多个。</p>
  14. <p><strong>1.2语法:</strong></p>
  15. <div class="jb51code"><pre class="brush:java;">(@RequestBody Map map)
  16. (@RequestBody Object object)
复制代码
    (@RequestBody Map map)先对简单,将json解析成Map形式的key-value对,直接通过map.get(“KeyName”)就能拿到值了(@RequestBody Object object) 通过json字符串中的key来匹配对应实体类的属性如果匹配一致且json中的该key对应的值符合实体类的对应属性的类型要求时,会调用实体类的setter方法将值注入到该属性。
如:
  1. public Result deleteBookById(@RequestBody HashMap<String, String> map) {
  2.     this.bookService.deleteBookById(Long.parseLong(map.get("id")));
  3.     return Result.createWithSuccessMessage();
  4.   }
  5. public Result updateBookById(@RequestBody Book book){
  6.     Book record = this.bookService.updateBookById(book);
  7.     return Result.createWithModel(record);
  8.   }
复制代码
注意:
在(@RequestBody Object object)中,前端POST过来的数据会通过反序列数据到实体类中,并且在反序列的过程中会进行类型的转换。
在json中应该用null来代表空值,如果是""(空字符串)会判断为空串,如果实体类属性是String类型的,那么接受到的就是"",如果实现类属性类型是Integer、Double等类型,那么接收到的就是null。
  1. {
  2. name:"",
  3. age:null
  4. }
复制代码
(@RequestBody Object object)内部是通过传递过来的数据中的Key寻找setter方法,有则调用,无则不作任何操作(其实可以设计)。
如果通过Key匹配到setter方法,但是Value无法转换为对应的实例类属性的类型时,抛出异常。

2.@RequestParam

2.1 用途:
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。
可以用于接收URL中的参数并捆绑到方法的参数中,也可以接受post请求体中的Content-Type 为 application/x-www-form-urlencoded的数据。(post比较常用的是json格式数据)
语法:
@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
    value:参数的keyrequired:是否为必须,请求中必须包含该参数,如果不包含就报错。defaultValue:代替的默认参数值,设置后required将自动置false
如:
  1. public ModelAndView getUserByName(@RequestParam("name")String name){
  2.     ModelAndView mv = new ModelAndView();
  3.     log.info(name);
  4.     return mv;
  5. }
  6. //必须携带name参数
  7. public ModelAndView getUserByName2(@RequestParam("name",required="true")String name){
  8.     ModelAndView mv = new ModelAndView();
  9.     log.info(name);
  10.     return mv;
  11. }
复制代码
3.两者混合使用
  1. @RequestBody与@RequestParam()可以同时使用,但@RequestBody最多只能有一个,而@RequestParam()可以多个。
  2. public Result deleteBookById(@RequestBody HashMap<String, String> map,@RequestParam("name")String name) {
  3.     System.out.println(map.get("id"));
  4.     System.out.println(name);
  5.     return Result.createWithSuccessMessage();
  6. }
复制代码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持中国红客联盟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行