一个表单同时提交多条记录

问题背景: 
我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该如何处理?

  • 第1种方法:表单提交,以字段数组接收;
  • 第2种方法:表单提交,以BeanListModel接收;
  • 第3种方法:将Json对象序列化成Json字符串提交,以List接收;
  • 第4种方法:将表单对象序列化成Json字符串提交,以List接收; 
    第4种方法其实是第3种方法的升级,就是将表单转成Json对象,再转成Json字符串提交; 
    然而,第4种方法还不支持含有多选控件表单的提交,故应该还有第5种加强版的方法。

以上4种方法都共用同一个User实体类,代码如下:


 
 
  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private String pwd;
  5. @Override
  6. public String toString () {
  7. return "User{" +
  8. "id=" + id +
  9. ", name='" + name + '\'' +
  10. ", pwd='" + pwd + '\'' +
  11. '}';
  12. }
  13. // .......后面还有getter、setter方法,省略了
  14. }

    第1种方法:表单提交,以字段数组接收 
    HTML代码如下:

    
     
     
    1. <form action="/user/submitUserList_1" method="post">
    2. ID: <input type="text" name="id"> <br/>
    3. Username: <input type="text" name="name"> <br/>
    4. Password: <input type="text" name="pwd"> <br/> <br/>
    5. ID: <input type="text" name="id"> <br/>
    6. Username: <input type="text" name="name"> <br/>
    7. Password: <input type="text" name="pwd"> <br/> <br/>
    8. <input type="submit" value="submit">
    9. </form>

      Java代码如下:

      
       
       
      1. @RequestMapping(value = "/submitUserList_1", method ={RequestMethod.POST})
      2. @ResponseBody
      3. public String submitUserList_1(HttpServletResponse response,Integer[] id , String[] name , String[] pwd)
      4. throws Exception{
      5. String result = "";
      6. if( id == null || id. length <= 0){ return "No any ID.中文"; }
      7. List<User> userList = new ArrayList<User>();
      8. for ( int i = 0; i < id. length; i++ ) {
      9. User user = new User();
      10. user.setId( id[i]);
      11. user.setName( name[i]);
      12. user.setPwd(pwd[i]);
      13. userList.add(user);
      14. }
      15. result = this.showUserList(userList);
      16. return result;
      17. }

        第2种方法:表单提交,以BeanListModel接收 
        HTML代码如下:

        
         
         
        1. <form action="/user/submitUserList_2" method="post">
        2. ID: <input type="text" name="users[0].id"> <br/>
        3. Username: <input type="text" name="users[0].name"> <br/>
        4. Password: <input type="text" name="users[0].pwd"> <br/> <br/>
        5. ID: <input type="text" name="users[2].id"> <br/>
        6. Username: <input type="text" name="users[2].name"> <br/>
        7. Password: <input type="text" name="users[2].pwd"> <br/> <br/>
        8. <input type="submit" value="Submit">
        9. </form>

          Java代码: 
          除了刚才公用的User类,还要封装一个User的容器类UserModel:

          
           
           
          1. public class UserModel {
          2. private List<User> users;
          3. public List<User> getUsers () {
          4. return users;
          5. }
          6. public void setUsers (List<User> users) {
          7. this.users = users;
          8. }
          9. public UserModel (List<User> users) {
          10. super();
          11. this.users = users;
          12. }
          13. public UserModel () {
          14. super();
          15. }
          16. }

            SpringMVC Controller方法:

            
             
             
            1. @RequestMapping (value = "/submitUserList_2" , method ={RequestMethod.POST})
            2. @ResponseBody
            3. public String submitUserList_2(UserModel users)
            4. throws Exception{
            5. String result = "";
            6. List<User> userList = users.getUsers();
            7. if(userList == null || userList.size() <= 0){ return "No any ID.中文"; }
            8. result = this.showUserList(userList);
            9. return result;
            10. }

              第3种方法:将Json对象序列化成Json字符串提交,以List接收 
              HTML代码:

              
               
               
              1. <head>
              2. <title>submitUserList_3 </title>
              3. <meta http-equiv="content-type" content="text/html; charset=utf-8">
              4. <script language="JavaScript" src="/js/jquery.min.js" > </script>
              5. <script language="JavaScript" src="/js/jquery.json.min.js" > </script>
              6. <script type="text/javascript" language="JavaScript">
              7. function submitUserList_3() { alert( "ok" );
              8. var customerArray = new Array ();
              9. customerArray.push({ id: "1" , name: "李四" , pwd: "123" });
              10. customerArray.push({ id: "2" , name: "张三" , pwd: "332" });
              11. $.ajax({
              12. url: "/user/submitUserList_3" ,
              13. type: "POST" ,
              14. contentType : 'application/json;charset=utf-8' , //设置请求头信息
              15. dataType: "json" ,
              16. //data: JSON.stringify(customerArray), //将Json对象序列化成Json字符串,JSON.stringify()原生态方法
              17. data: $.toJSON(customerArray), //将Json对象序列化成Json字符串,toJSON()需要引用jquery.json.min.js
              18. success: function(data){
              19. alert(data);
              20. },
              21. error: function(res){
              22. alert(res.responseText);
              23. }
              24. });
              25. }
              26. </script>
              27. </head>
              28. <body>
              29. <h1>submitUserList_3 </h1>
              30. <input id="submit" type="button" value="Submit" onclick="submitUserList_3();">
              31. </body>

                Java代码:

                
                 
                 
                1. @RequestMapping (value = "/submitUserList_3" , method ={RequestMethod.POST})
                2. @ResponseBody
                3. public String submitUserList_3( @RequestBody List<User> users)
                4. throws Exception{
                5. String result = "";
                6. if(users == null || users.size() <= 0){ return "No any ID.中文"; }
                7. result = this.showUserList(users);
                8. return result;
                9. }

                  第4种方法:将表单对象序列化成Json字符串提交,以List接收 
                  HTML代码:

                  
                   
                   
                  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                  2. "http://www.w3.org/TR/html4/loose.dtd">
                  3. <html>
                  4. <head>
                  5. <title>submitUserList_4 </title>
                  6. <meta http-equiv="content-type" content="text/html; charset=utf-8">
                  7. <script language="JavaScript" src="/js/jquery.min.js" > </script>
                  8. <script type="text/javascript" language="JavaScript">
                  9. //将表单序列化成json格式的数据(但不适用于含有控件的表单,例如复选框、多选的select)
                  10. ( function($){
                  11. $.fn.serializeJson = function(){
                  12. var jsonData1 = {};
                  13. var serializeArray = this .serializeArray();
                  14. // 先转换成{"id": ["12","14"], "name": ["aaa","bbb"], "pwd":["pwd1","pwd2"]}这种形式
                  15. $(serializeArray).each( function () {
                  16. if (jsonData1[ this .name]) {
                  17. if ($.isArray(jsonData1[ this .name])) {
                  18. jsonData1[ this .name].push( this .value);
                  19. } else {
                  20. jsonData1[ this .name] = [jsonData1[ this .name], this .value];
                  21. }
                  22. } else {
                  23. jsonData1[ this .name] = this .value;
                  24. }
                  25. });
                  26. // 再转成[{"id": "12", "name": "aaa", "pwd":"pwd1"},{"id": "14", "name": "bb", "pwd":"pwd2"}]的形式
                  27. var vCount = 0 ;
                  28. // 计算json内部的数组最大长度
                  29. for ( var item in jsonData1){
                  30. var tmp = $.isArray(jsonData1[item]) ? jsonData1[item].length : 1 ;
                  31. vCount = (tmp > vCount) ? tmp : vCount;
                  32. }
                  33. if (vCount > 1 ) {
                  34. var jsonData2 = new Array ();
                  35. for ( var i = 0 ; i < vCount; i++){
                  36. var jsonObj = {};
                  37. for ( var item in jsonData1) {
                  38. jsonObj[item] = jsonData1[item][i];
                  39. }
                  40. jsonData2.push(jsonObj);
                  41. }
                  42. return JSON .stringify(jsonData2);
                  43. } else {
                  44. return "[" + JSON .stringify(jsonData1) + "]" ;
                  45. }
                  46. };
                  47. })(jQuery);
                  48. function submitUserList_4() { alert( "ok" );
                  49. var jsonStr = $( "#form1" ).serializeJson();
                  50. //console.log("jsonStr:\r\n" + jsonStr);
                  51. //alert(jsonStr);
                  52. $.ajax({
                  53. url: "/user/submitUserList_4" ,
                  54. type: "POST" ,
                  55. contentType : 'application/json;charset=utf-8' , //设置请求头信息
                  56. dataType: "json" ,
                  57. data: jsonStr,
                  58. success: function(data){
                  59. alert(data);
                  60. },
                  61. error: function(res){
                  62. alert(res.responseText);
                  63. }
                  64. });
                  65. }
                  66. </script>
                  67. </head>
                  68. <body>
                  69. <h1>submitUserList_4 </h1>
                  70. <form id="form1">
                  71. ID: <input type="text" name="id"> <br/>
                  72. Username: <input type="text" name="name"> <br/>
                  73. Password: <input type="text" name="pwd"> <br/> <br/>
                  74. ID: <input type="text" name="id"> <br/>
                  75. Username: <input type="text" name="name"> <br/>
                  76. Password: <input type="text" name="pwd"> <br/> <br/>
                  77. <input type="button" value="submit" onclick="submitUserList_4();">
                  78. </form>
                  79. </body>
                  80. </html>

                    Java代码:

                    
                     
                     
                    1. @RequestMapping (value = "/submitUserList_4" , method ={RequestMethod.POST})
                    2. @ResponseBody
                    3. public String submitUserList_4( @RequestBody List<User> users)
                    4. throws Exception{
                    5. String result = "";
                    6. if(users == null || users.size() <= 0){ return "No any ID.中文"; }
                    7. result = this.showUserList(users);
                    8. return result;
                    9. }

                      总结: 
                      第1、2种方法其实都有一个共同的BUG:假如提交三条记录时,前面两条记录的某些字段不填值的话,在SpringMVC里接收不准确了。而且,每2种方法在HMTL中需要给name属性添加[下标],如果下标有跨度的话(比如第一组控件下标是0,第二组下标是2),那么SpringMVC里其实的是0到2三个对象的,默认下标是1的那个对象全为null值。 
                      第3、4种方法最实用。

                      以上方法参考自以下URL: 
                      http://www.cnblogs.com/wsw0515/p/3582627.html 
                      http://www.oschina.net/question/917732_106601 
                      http://jxd-zxf.iteye.com/blog/2072300 
                      http://www.tashan10.com/jquery-jiang-biao-dan-xu-lie-hua-wei-jsondui-xiang/

                      评论
                      添加红包

                      请填写红包祝福语或标题

                      红包个数最小为10个

                      红包金额最低5元

                      当前余额3.43前往充值 >
                      需支付:10.00
                      成就一亿技术人!
                      领取后你会自动成为博主和红包主的粉丝 规则
                      hope_wisdom
                      发出的红包
                      实付
                      使用余额支付
                      点击重新获取
                      扫码支付
                      钱包余额 0

                      抵扣说明:

                      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                      余额充值