你的位置:首页 > Java教程

[Java教程]SpringMVC接收复杂对象

SpringMVC接收复杂对象

转载请注明地址:

  本节内容暂放一边,我先扯点儿,心情好了,代码顺风顺水哈~

“  

  上周一,也就是六号那天,我在市中心医院做手术,一边做手术一边跟做手术的医生闲扯。

  医生:你哪个学校的?

  我:说哪个学校你也不知道,我就一高中生。

  医生:啊~,哦~,那你现在做什么呢?

  我:在上海写代码啊。

  医生一脸的惊讶。。。

  随口又问到:高中...也能写代码?

  我:能写啊,写代码也不过就是打打杂而已,没啥难的,哈哈。

  医生:这也行啊,写代码不是要高的编程能力吗?

  我:哪啊~,no no no,干这个的能力往往也很一般,要说能力啊,初中生、小学生才厉害呢

  医生:他们怎么有什么厉害的?

  我:你看看郭某某也就初中毕业,人家在美帝衬几百个亿,口才又那么的好,咋们能比╮(╯_╰)╭么,还有小学生,一个二个打农药嫩么牛🐂掰,而且还写对战教程呢,还有他们做数学题(奥数题),三下五除二不一会儿就做完了,要是咋们的话看半小时还在苦思冥想呢,所以论能力小学生咋们也没法儿比啊~

  医生彻底无语😶,沉默于手术中。。。

  以上对话大部分是真实的,我稍稍总结下就是:对于人要多些尊重,谈论的时候最好不要总是先自报门派,这样不会让人觉得你很有水平,而更多的是一种无厘头的傲慢,还有点儿就是尽量尊重尊重人,尤其是服务业不应该有太强的阶级意识或偏见,尤其是对于管理人员,同时要尽量鼓励人去做事情,不管是自己的孩子还是自己的下属还是什么的~,不要太在意年龄、性别的差距,也许他就真的做的比你好!

  扯完,这次我总结下载SpringMVC中后端如何接收复杂的对象参数,啊~,首先声明下,后端接收的不是某个实体对象类型,而是字符串哈,看到题目是不是感觉上当了;。。。。(沉默许久后)。。。,既然不能直接这样干那就使用工具类解析字符串为指定对象类型吧,还就是那个前端页面该怎么传这个“对象”呢?答案是:将dict(字典类型)转成String(字符串)不就OK啦~。OK,上茶,哦~,不对😁,上代码==💃>

  (前端js部分)

 1 //保存**矩阵 2 function saveSalaryMatrix(elem){ 3  var trs=$(elem).find("tbody tr"); 4  var data=[]; 5  for(var i=0;i<trs.length;i++){ 6   var record={id:"",stId:"",minLevel:"",type:"",mediumLevel:"",maxLevel:""}; 7   record.id=$(trs[i]).find("input[name=id]").val(); 8   record.stId=$(trs[i]).find("input[name=stId]").val(); 9   record.type=$(trs[i]).find("input[name=type]").val();10   var minLevel=$(trs[i]).find("input[name=minLevel]").val(),11     mediumLevel=$(trs[i]).find("input[name=mediumLevel]").val(),12     maxLevel=$(trs[i]).find("input[name=maxLevel]").val();13   //验证14   if(isNaN(minLevel) || isNaN(mediumLevel) || isNaN(maxLevel)){15    alert("非数字,请检查!");16    return;17   }18   record.minLevel=(minLevel/100+"").substr(0,5);19   record.mediumLevel=(mediumLevel/100+"").substr(0,5);20   record.maxLevel=(maxLevel/100+"").substr(0,5);21   22   data.push(record);23  }24  $.post(mngPath+"/emolument/salaryMatrix/saveSalaryMatrix.json",{data:$.json2str(data)},function(result){25   if(result.error){26    alert("提示:"+(result.error.msg?result.error.msg:result.error));27    return;28   }29   alert("保存成功!");30   window.location.href=mngPath+"/emolument/salaryMatrix";//定位到当前记录31  })32 }

  (后端,java部分)

 1  /** 2   * **矩阵保存 3   * @param m 4  */ 5  @RequestMapping(value="/saveSalaryMatrix",method=RequestMethod.POST) 6  void saveSalaryMatrix(String data,Model m){ 7   List<TSalaryMatrix> listObj=JSON.parseArray(data, TSalaryMatrix.class); 8   if(listObj.size()==0){ 9    m.addAttribute("error", "保存数据为空,请检查!");10    return;11   }12   for (TSalaryMatrix tSalaryMatrix : listObj) {13    dao.update(tSalaryMatrix);14   }15   m.addAttribute("data", listObj);16  }

  现在稍稍讲下,首先在js中(第24行:{data:$.json2str(data)})将“data”的value通过$.json2str()方法转换成字符串,然后直接将这个dict(字典对象)扔到后端交给java处理,oh~,等等,这个$.json2str()方法我得先展示下,具体逻辑就是过滤传过来的对象剔除空或引号这些,然后遍历拼接字符,最后返回字符串,至于其中用到的正则,这里就略过哈~(づ。◕‿‿◕。)づ

1   $.json2str = function (o) {2    var arr = [];3    var fmt = function (s) {4     if (typeof s == "object" && s != null) return json2str(s);5     return /^(string|number)$/.test(typeof s) ? "\"" + s.replace(/\"/g, "\\\"") + "\"" : s;6    }7    for (var i in o) arr.push("\"" + i + "\":" + fmt(o[i]));8    return "{" + arr.join(",") + "}";9   }

post提交到后端之后只需通过定义一个String的data名称的对象来接就可以了,需要注意的是:这个名称“data”一定要跟传过来的dict(字典类型)的key(键)一致,要不然,java不认就不要怪我囖ㄟ(▔,▔)ㄏ~ 

以上,后端看似最重要的一句大概就是这个:

  List<TSalaryMatrix> listObj=JSON.parseArray(data, TSalaryMatrix.class);

工具类JSON用的是:import com.alibaba.fastjson.JSON;

需要到自己添加一个fastjson包,我这里用的是maven,只需要在pom.文件里面贴上这段就好:

1 <dependency>2 <groupId>com.alibaba</groupId>3 <artifactId>fastjson</artifactId>4 <version>1.1.29</version>5 </dependency>

至于fastjson版本的话,大家开心就行~

  以上用的是parseArray()方法来进行转换的,因为我传的是类似于这样的dict(字典)对象:{data:"[{aa:1,bb:2},{aa:41,bb:2}]}",dict的第一层是个[](Array类型),如果就是一整个dict类型的话就不能使用parseArray来转,(具体用什么,自己看api咯~),切记切记,(遵纪守法要牢记😎)~~~

  对于本猿所使用的方法已经讲完,接下来扩展下相关的问题...

  因为以前使用过ObjectMapper来进行字符串到对象的转换,这里需要说明下的是这个ObjectMapper不大好用,理由大致有三点:

    1>这个ObjectMapper需要在项目进入虚拟机后首先初始化,在SpringMVC中大概是这样写:

      

1 @PostConstruct2  public void init()3  {4   om = new ObjectMapper();5   om.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);6   om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));7  }

    2>转换的源字符串中不能有多余的属性,否则转换时极容易报错,若使用fastJson则会忽略多余的属性,至于不存在的属性会以null作为值,这个需要注意

    3>再~,可能碰到的概率不是很大的一个问题就是:如果传入的的有日期类型,这个日期类型会在某些时候(视传入的日期精度而定)出现市区不一致的问题,导致转换后的那个对象参数有误!

     至于解决这个问题的办法请参照以上代码块的5~6行,这里不作解释哈~

  还需要提到的一个点儿就是SpringMVC中,每个请求对应的Controller的方法的参数(传过来的)尽量是包装类型或对象类型,至于解释就是:包装类型的参数允许为null,如果使用基本类型(int float double)这些来接参数的话,一定要注意:传过来的参数一定不能为空!!!否则请求过来会直接报错。

 毕生对于SpringMVC的内容目前就总结到这里,如果后期还从事java相关的开发的话(希望不是~(●´∀`●)ノ),相关内容会继续更新。

 --现在是:2017-11-14 18:08:48--
 加班要适度,下班要及时,各位,该dinner了~🍱