故事是这样的,有一个需求是新增病历,一个用户有多个用药方案如下:

 

Spring MVC同时接收一个对象与List集合对象_json格式

 

在网上找了,几种方案,都不行啊,有关于如何接收对象的,如何接收List的,就是没有同时如何接收一个对象与List,自己写了个能用的方法就是,就是把整个表单全部提交,以数组下表区分是第几个,对象,保存提交代码如下:

 

 

http://localhost:8080/GZ/dtcasehistory/addcasehistory?guid=4DF7694521DC7FC1E053AA0012AC45DE&name=ckse&sex=男&birthday=2017-3-6&cardid="123465798&medicalid=36985274&jws=没有既往史&medicalid=36985274&mainn=这是主诉&zhand=这是诊断1,诊断2,诊断3&dts[0].drunam=这是药品1&dts[0].unit=这是规格&dts[0].numnit=123456&dts[0].pian=963&dts[0].pc=33364&dts[0].kfwyname=这是途径0&dts[1].drunam=这是药品2&dts[1].unit="这是规格2&dts[1].numnit=1234561&dts[1].pian=9632&dts[1].pc=333642&dts[1].kfwyname=这是途径1

 

guid=4DF7694521DC7FC1E053AA0012AC45DE

&name=ckse

&sex=男

&birthday=2017-3-6

&cardid="123465798

&medicalid=36985274

&jws=没有既往史

&medicalid=36985274

&mainn=这是主诉

&zhand=这是诊断1,诊断2,诊断3

&dts[0].drunam=这是药品1

&dts[0].unit=这是规格

&dts[0].numnit=123456

&dts[0].pian=963

&dts[0].pc=33364

&dts[0].kfwyname=这是途径0

&dts[1].drunam=这是药品2

&dts[1].unit="这是规格2

&dts[1].numnit=1234561

&dts[1].pian=9632

&dts[1].pc=333642

&dts[1].kfwyname=这是途径1

 

 

写好之后,交给前端,遇到一个很尴尬的地方就是,他问我怎么提交这个数据?????,说很难实现,以JS的形式,我当时傻逼了。。。觉得是有点麻烦。。下班之后,在地铁上一想。。。这他妈还不简单。。。一个表单就提交了。。。

 

具体代码如下:

 

实体类如下:

 

病历只有一个:

 

 
  1. /**

  2. * @version V1.0

  3. * @Author fendo

  4. * @ClassName DTsickblhdrRequest

  5. * @PackageName com.gz.medicine.yun.doctor.request

  6. * @Description 病历请求数据

  7. * @Data 2017-08-18 14:17

  8. **/

  9. public class DTsickblhdrRequest implements Serializable {

  10.  
  11.  
  12. //患者ID

  13. @NotEmpty(message = "患者guid不能为空!")

  14. private String guid;

  15.  
  16. //1、患者姓名

  17. @NotEmpty(message="患者姓名name不能为空!")

  18. private String name;

  19. //2、性别

  20. @NotEmpty(message="性别sex不能为空!")

  21. private String sex;

  22. //3、出生年月

  23. @NotEmpty(message="出生年月birthday不能为空!")

  24. private String birthday;

  25. //4、医保卡号

  26. @NotEmpty(message="医保卡号cardid不能为空!")

  27. private String cardid;

  28. //5、就诊卡号

  29. @NotEmpty(message="就诊卡号medicalid不能为空!")

  30. private String medicalid;

  31.  
  32. //6、主诉

  33. @NotEmpty(message="主诉mainn不能为空!")

  34. private String mainn;

  35.  
  36. //7、既往史

  37. @NotEmpty(message="既往史jws不能为空!")

  38. private String jws;

  39.  
  40. //8、诊断

  41. @NotEmpty(message="诊断zhand不能为空!")

  42. private String zhand;

  43.  
  44. .......

  45.  
  46. }


 

 

用药方案有多个,用个List来装:

 

 

 
  1. /**

  2. * @version V1.0

  3. * @Author fendo

  4. * @ClassName DTsickbldtlRequestList

  5. * @PackageName com.gz.medicine.yun.doctor.request

  6. * @Description 用药方案请求List数据封装

  7. * @Data 2017-08-19 14:21

  8. **/

  9. public class DTsickbldtlRequestList implements Serializable {

  10.  
  11. private List<DTsickbldtlRequest> dts;

  12.  
  13.  
  14. public List<DTsickbldtlRequest> getDts() {

  15. return dts;

  16. }

  17.  
  18. public void setDts(List<DTsickbldtlRequest> dts) {

  19. this.dts = dts;

  20. }

  21.  
  22. public DTsickbldtlRequestList() {

  23. }

  24. }


 

 

Controller如下:

 

 

 
  1. /**

  2. *

  3. *@Title AddCaseHistory

  4. *@Description: 新增患者病历

  5. *@Author fendo

  6. *@Date 2017年8月17日 上午10:52

  7. *@param dTsickblhdrRequest,dTsickblhdrRequest

  8. *@return int

  9. *@throws

  10. */

  11. @RequestMapping(value = "addcasehistory",method = RequestMethod.POST,produces="text/html;charset=UTF-8")

  12. @ResponseBody

  13. public SimpleResult AddCaseHistory(DTsickblhdrRequest dTsickblhdrRequest,DTsickbldtlRequestList dTsickbldtlRequestList){

  14. SimpleResult simpleResult=null;

  15. try{

  16. if(validates(validator, dTsickblhdrRequest)!=null){

  17. return SimpleResult.error(SimpleCode.ERROR.getCode(), validates(validator, dTsickblhdrRequest));

  18. }

  19.  
  20. if(dTsickbldtlRequestList.getDts()!=null){

  21. for (int j=0;j<dTsickbldtlRequestList.getDts().size();j++){

  22. DTsickbldtlRequest dTsickbldtlRequest=dTsickbldtlRequestList.getDts().get(j);

  23. if(validates(validator, dTsickbldtlRequest)!=null){

  24. return SimpleResult.error(SimpleCode.ERROR.getCode(), validates(validator, dTsickbldtlRequest));

  25. }

  26. }

  27. }

  28. simpleResult=dtCaseHistoryService.addMedicalRecords(dTsickbldtlRequestList,dTsickblhdrRequest);

  29. return simpleResult;

  30. }catch (CommonException e){

  31. LOGGER.error(e);

  32. return SimpleResult.error(SimpleCode.ERROR.getCode(), e.getDesc());

  33. }

  34.  
  35.  
  36. }


 

 

页面如下:

 

 

 
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>

  2. <html>

  3. <head>

  4. <title>Title</title>

  5. <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

  6. </head>

  7. <body>

  8.  
  9. <form action="" method="post" id="formdata">

  10. ID: <input type="text" id="guid" name="guid" value="4DF7694521DC7FC1E053AA0012AC45DE" placeholder="4DF7694521DC7FC1E053AA0012AC45DE"/> <br>

  11. 姓名: <input type="text" id="name" name="name" value="ckse" placeholder="ckse"/> <br>

  12. 性别: <input type="text" id="sex" name="sex" value="男" placeholder="男"/> <br>

  13. 出生日期: <input type="text" id="birthday" name="birthday" value="2017-3-6" placeholder="2017-3-6"/> <br>

  14. 医保卡号: <input type="text" id="cardid" name="cardid" value="2017-3-6" placeholder="2017-3-6"/> <br>

  15. 就诊卡号: <input type="text" id="medicalid" name="medicalid" value="36985274" placeholder="36985274"/> <br>

  16. 主诉: <input type="text" id="mainn" name="mainn" value="这是主诉" placeholder="这是主诉"/> <br>

  17. 既往史: <input type="text" id="jws" name="jws" value="没有既往史" placeholder="没有既往史"/> <br>

  18. 诊断: <input t ype="text" id="zhand" name="zhand" value="这是诊断1,诊断2,诊断3" placeholder="这是诊断1,诊断2,诊断3"/> <br>

  19.  
  20. 用药方案:<br>

  21. <hr>

  22. 方案1------------------<br>

  23. 药品名: <input type="text" id="dts[0].drunam" name="dts[0].drunam" value="这是药品1" placeholder="这是药品1"/><br>

  24. 规格: <input type="text" id="dts[0].unit" name="dts[0].unit" value="这是规格" placeholder="这是规格"/><br>

  25. 数量: <input type="text" id="dts[0].numnit" name="dts[0].numnit" value="123456" placeholder="123456"/><br>

  26. 剂量: <input type="text" id="dts[0].pian" name="dts[0].pian" value="963" placeholder="963"/><br>

  27. 频次: <input type="text" id="dts[0].pc" name="dts[0].pc" value="33364" placeholder="33364"/><br>

  28. 途径: <input type="text" id="dts[0].kfwyname" name="dts[0].kfwyname" value="这是途径0" placeholder="这是途径0"/><br>

  29.  
  30.  
  31. 方案2------------------<br>

  32. 药品名: <input type="text" id="dts[1].drunam" name="dts[1].drunam" value="这是药品1" placeholder="这是药品1"/><br>

  33. 规格: <input type="text" id="dts[1].unit" name="dts[1].unit" value="这是规格" placeholder="这是规格"/><br>

  34. 数量: <input type="text" id="dts[1].numnit" name="dts[1].numnit" value="123456" placeholder="123456"/><br>

  35. 剂量: <input type="text" id="dts[1].pian" name="dts[1].pian" value="963" placeholder="963"/><br>

  36. 频次: <input type="text" id="dts[1].pc" name="dts[1].pc" value="33364" placeholder="33364"/><br>

  37. 途径: <input type="text" id="dts[1].kfwyname" name="dts[1].kfwyname" value="这是途径0" placeholder="这是途径0"/><br>

  38.  
  39. <hr>

  40. <input id="submit" value="提交" type="button">

  41.  
  42. </form>

  43.  
  44. <script>

  45.  
  46. $(function () {

  47.  
  48. $("#submit").click(function () {

  49. $.ajax({

  50. url: "<%=request.getContextPath()%>/dtcasehistory/addcasehistory",

  51. type: "POST",

  52. dataType:"json",

  53. data: $("#formdata").serialize() ,

  54. success: function(data){

  55. alert(data);

  56. },

  57. error: function(res){

  58. alert(res.responseText);

  59. }

  60. });

  61. })

  62.  
  63. })

  64.  
  65. </script>

  66.  
  67. </body>

  68. </html>


页面效果如下:

 

 

Spring MVC同时接收一个对象与List集合对象_json格式_02

 

打开调试,请求的参数如下:

 

Spring MVC同时接收一个对象与List集合对象_json格式_03

 

这不就解决了。。。。。。。。。

 

 

----------------------------------后续-------------------------------------

 

还有种方法就是,全部以JSON的形式往后台传:

 

 

 
  1. localhost:8996/GZ/dtcasehistory/adds?model={

  2. "guid": "123",

  3. "name": "234",

  4. "sex": "男",

  5. "birthday":"2017-3-6",

  6. "cardid":"123465798",

  7. "medicalid":"36985274",

  8. "mainn":"这是主诉",

  9. "jws":"没有既往史",

  10. "zhand":"这是诊断1,诊断2,诊断3",

  11. "dts": [{

  12. "drunam": "药品名0",

  13. "unit": "规格0",

  14. "numnit": "数量0",

  15. "pian":"剂量0",

  16. "pc":"频次0",

  17. "kfwyname":"途径0"

  18. },{

  19. "drunam": "药品名1",

  20. "unit": "规格1",

  21. "numnit": "数量1",

  22. "pian":"剂量1",

  23. "pc":"频次1",

  24. "kfwyname":"途径1"

  25. }]

  26. }

 

 

前端代码:

 

 

 
  1. $("#suv").click(function () {

  2.  
  3. var mode={"guid": "123", "name": "234","sex": "男","birthday":"2017-3-6","cardid":"123465798","medicalid":"36985274","mainn":"这是主诉","jws":"没有既往史", "zhand":"这是诊断1,诊断2,诊断3", "dts": [{"drunam": "药品名0", "unit": "规格0", "numnit": "数量0", "pian":"剂量0", "pc":"频次0", "kfwyname":"途径0"},{"drunam": "药品名1", "unit": "规格1", "numnit": "数量1", "pian":"剂量1", "pc":"频次1", "kfwyname":"途径1"}]};

  4.  
  5. var ddd = encodeURI(JSON.stringify(mode));

  6.  
  7. $.ajax({

  8. url: "<%=request.getContextPath()%>/dtcasehistory/adds",

  9. type: "POST",

  10. dataType:"json",

  11. data:"model="+ddd,

  12. success: function(data){

  13. alert(data);

  14. },

  15. error: function(res){

  16. alert(res.responseText);

  17. }

  18. });

  19. })


 

 

 

注意:JSON放在model里面,所以,在后台通过可以request.getParameter("model")来获取这个数据,然后通过json-lib来解析就行了,具体代码如下:

 

 

 
  1. @RequestMapping(value = "adds",method = RequestMethod.POST,produces="text/html;charset=UTF-8")

  2. @ResponseBody

  3. public SimpleResult adds(HttpServletRequest request, HttpServletResponse response){

  4. SimpleResult simpleResult=null;

  5.  
  6. String str = null;

  7. try {

  8. //解码,为了解决中文乱码

  9. str = URLDecoder.decode(request.getParameter("model"),"UTF-8");

  10. System.out.println("----------------str"+str);

  11. JSONObject jb=new JSONObject();

  12. //将json格式的字符串转换为json数组对象

  13. JSONArray array=(JSONArray)jb.fromObject(str).get("dts");

  14.  
  15. //取得json数组中的第一个对象

  16. JSONObject o = (JSONObject) array.get(0);//获得第一个array结果

  17. System.out.println("数组大小:"+array.size());

  18. //取出json数组中第一个对象的“userName”属性值

  19. String name=o.get("drunam").toString();//获得属性值

  20. System.out.println(name);

  21. System.out.println(o);

  22. } catch (Exception e) {

  23. e.printStackTrace();

  24. }

  25.  
  26.  
  27. simpleResult=SimpleResult.success();

  28. return simpleResult;

  29. }


后端输出如下:

 

Spring MVC同时接收一个对象与List集合对象_html_04

 

注意: 这里引入了json-lib,使用的是json-lib来解析JSON,因为其中有个将json格式的字符串转换为json数组对象的方法,maven依赖如下

 

 

 
  1. <dependency>

  2. <groupId>net.sf.json-lib</groupId>

  3. <artifactId>json-lib</artifactId>

  4. <version>2.4</version>

  5. <classifier>jdk15</classifier>

  6. </dependency>


还有方法就是扩展SpringMVC以支持绑定JSON格式的请求参数,具体可参考这:http://jinnianshilongnian.iteye.com/blog/1719952 我这用的spring 版本是4,而他用的是3,所以没试。