SpringMVC接收复杂对象
转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7642977.html
本节内容暂放一边,我先扯点儿,心情好了,代码顺风顺水哈~
“
上周一,也就是六号那天,我在市中心医院做手术,一边做手术一边跟做手术的医生闲扯。
医生:你哪个学校的?
我:说哪个学校你也不知道,我就一高中生。
医生:啊~,哦~,那你现在做什么呢?
我:在上海写代码啊。
医生一脸的惊讶。。。
随口又问到:高中...也能写代码?
我:能写啊,写代码也不过就是打打杂而已,没啥难的,哈哈。
医生:这也行啊,写代码不是要高的编程能力吗?
我:哪啊~,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.xml文件里面贴上这段就好:
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 @PostConstruct
2 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了~
funnyzpc@gmail.com