SpringMVC接收复杂对象

简介: SpringMVC接收复杂对象转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7642977.html  本节内容暂放一边,我先扯点儿,心情好了,代码顺风顺水哈~“    上周一,也就是六号那天,我在市中心医院做手术,一边做手术一边跟做手术的医生闲扯。

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
相关文章
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
54 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
112 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
3月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
162 4
|
3月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
121 3