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
相关文章
|
7月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
810 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1485 0
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
875 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
812 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
560 0
|
10月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
704 0
|
10月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
306 0
|
10月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
395 0
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
886 29

热门文章

最新文章