关于前后端的交互在前边的文章中已经进行了初步的理解,但是我感觉还得再进行一些扩充,这里的扩充主要是通过案例来进行讲解。
案例需求分析:接收前端数据更具类型不同转换为不同类型的实体类
{"edorType":"A","data":{"A":"A1","B":"B1","C":"C1"}}{"edorType":"B","data":{"A":"A1","B":"B1","C":"C1","D":"D1"}}{"edorType":"C","data":{"A":"A1","B":"B1","C":"C1","D":"D1","E":"E1"}}{"edorType":"D","data":{"A":"A1","B":"B1","C":"C1","D":"D1","E":"E1","F":"F1"}}
更具edorType的实体类的不同进行转换为不同类型的实体类
这样为了实现我们前端接口的复用我们使用这样的方法进行实现,但是我得再此申明,这里单单是我处理这种需求的方式并不代表大众,所以有什么问题可以随时联系,咱们互相沟通共同进步
首先我们明确前端如何将这些数据传递给我们,这里我就单单说方式,这里可以使用ajax进行实现,也可以使用form表单提交进行实现,当然我所知道的发送post请求的方式也就这么两种,别的还得大家多多指教。
这里重点是后端的实现。试问后端如何实现呢?
1.@RequestParam(行,但是参数过多不合适)
我们知道我们要实现接收多个参数的时候使用注解@RequestParam肯定是不行的此参数只实现一个一个的接收,要是十多个属性那么就得进行编写十多个,这样显然是不合适的。
2.@PathVariable(不行)
这个注解是从url地址中获取参数(也就是我们前边学习额RestFul请求风格)同样获取的参数额数据也是当然也是一个具体额使用建议自行百度这里我只是简单提一句不想占用 过多的篇章。
3.@RequestBody(行)
这个注解是我们springmvc框架的额重点,不要问为什么springboot中没有引入springMvc那是spring-boot-star-web对其进行了封装这个注解主要是用来接收前端传来的多个json类型的数据而存在的,这样就可以用一个类来实现接收前端传来的多个数据但是有一点就是编写实体类的时候需要注意,实体类中的属性的的值一定要和json对象中的属性的name的值一定要一一对应否则接收不到。
具体代码实现:
我们这里接收的类并不是固定的A或者是B而是有可能是A,B,C,D中的某一个,这样我们的这个接口就不能写的固定,但是我们还想使用一个接口来实现,请问怎样解决。
实现使用类 JSONObject进行接收,这个类是json对象的类用来接收json对像
import net.sf.json.JSONObject;
包下的类
<dependency> <groupId>net.sf.json-libgroupId> <artifactId>json-libartifactId> <version>2.4version> <classifier>jdk15classifier> dependency>
控制层:
@RequestMapping(value = "/ceshi", method = RequestMethod.POST) @ResponseBodypublic RestEntity ploicyComputing(@RequestBody JSONObject object) { //1.进行接收参数中的edotype属性,更具此属性进行转换不同的类 String edorType =(String) object.get("edorType"); //2.更具edorType的属性值进行转换为不同类型的实体类 注意: 在进行转换的时若是实体类中有属性是list类型的集合这里需要特殊额转换 //1.创建map Map> classMap = new HashMap>(); //2.map中进行添加属性 key为实体类的属性,value为实体类额反射 classMap.put("headBankCode", HeadBankCode.class); (这里HeadBankCode是自建类) classMap.put("selectPhone",String.class); classMap.put("map",Map.class); classMap.put("属性名",类.class);只有存在上述的情况才会进行这样处理,否则会进行报错大概的内容就是数据太父砸不能进行转换。 //3.进行转换A a = (A)JSONObject.toBean((A) object.get("data"), A.class, classMap);这样就将json转为对应的A实体类了}
但是当我们在进行确定了这里我们前端传来的多个json类型的数据就是不变的这样我们可以使用单独的一个类进行接收不用再进行别的额外特殊处理
@RequestMapping(value = "/ceshi", method = RequestMethod.POST) @ResponseBodypublic RestEntity ploicyComputing(@RequestBody A a) {}
@ResponseBody和@RequestBody这两个一定要明确前者表名请求完成时响应的是一个json类型的实体类并不是要跳转的页面所以这个需要放在类中方法的上边,后者使用的是接收前端传来的参数。用在方法的参数中
上边的这个是我再工作中用用到的若是有什么疑问请加我微信咱们互相学习进步。