1. 程式人生 > >一個表單中有多個相同的欄位,以及springmvc接收多個相同物件問題

一個表單中有多個相同的欄位,以及springmvc接收多個相同物件問題

                                               

問題背景: 
我要在一個表單裡同時一次性提交多名乘客的個人資訊到SpringMVC,前端HTML和SpringMVC Controller裡該如何處理?

  • 第1種方法:表單提交,以欄位陣列接收;
  • 第2種方法:表單提交,以BeanListModel接收;
  • 第3種方法:將Json物件序列化成Json字串提交,以List接收;
  • 第4種方法:將表單物件序列化成Json字串提交,以List接收; 
    第4種方法其實是第3種方法的升級,就是將表單轉成Json物件,再轉成Json字串提交; 
    然而,第4種方法還不支援含有多選控制元件表單的提交,故應該還有第5種加強版的方法。

以上4種方法都共用同一個User實體類,程式碼如下:

[java] view plain copy print ?
  1. public
     class User {  
  2.   
  3.     private Integer id;  
  4.     private String name;  
  5.     private String pwd;  
  6.   
  7.     @Override
      
  8.     public String toString() {  
  9.         return "User{" +  
  10.                 "id=" + id +  
  11.                 ", name='" + name + '\'' +  
  12.                 ", pwd='" + pwd + '\'' +  
  13.                 '}';  
  14.     }  
  15.     // .......後面還有getter、setter方法,省略了  
  16.  }  
public class User {

private Integer id;
    private String name;
    private String pwd;

@Override
    public String toString() {
        return “User{” +
                “id=” + id +
                “, name=’” + name + ‘’’ +
                “, pwd=’” + pwd + ‘’’ +
                ‘}’;
    }
    // …後面還有getter、setter方法,省略了
 }第1種方法:表單提交,以欄位陣列接收 
HTML程式碼如下:

[java] view plain copy print ?
  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.   
  6.       ID:<input type=“text” name=“id”><br/>  
  7.       Username:<input type=“text” name=“name”><br/>  
  8.       Password:<input type=“text” name=“pwd”><br/><br/>  
  9.       <input type=“submit” value=“submit”>  
  10.   </form>  
  <form action="/user/submitUserList_1" method=“post”>
        ID:<input type=“text” name=“id”><br/>
        Username:<input type=“text” name=“name”><br/>
        Password:<input type=“text” name=“pwd”><br/><br/>

ID:<input type=“text” name=“id”><br/>
        Username:<input type=“text” name=“name”><br/>
        Password:<input type=“text” name=“pwd”><br/><br/>
        <input type=“submit” value=“submit”>
    </form>Java程式碼如下:

[java] view plain copy print ?
  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.    }  
 @RequestMapping(value = “/submitUserList_1”, method ={RequestMethod.POST})
    @ResponseBody
    public String submitUserList_1(HttpServletResponse response,Integer[] id, String[] name, String[] pwd)
                            throws Exception{
        String result = “”;
        if(id == null || id.length <= 0){ return “No any ID.中文”; }
        List<User> userList = new ArrayList<User>();
        for (int i = 0; i < id.length; i++ ) {
            User user = new User();
            user.setId(id[i]);
            user.setName(name[i]);
            user.setPwd(pwd[i]);
            userList.add(user);
        }
        result = this.showUserList(userList);
        return result;
    }
第2種方法:表單提交,以BeanListModel接收  
HTML程式碼如下: [java] view plain copy print ?
  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.   
  6.       ID:<input type=“text” name=“users[2].id”><br/>  
  7.       Username:<input type=“text” name=“users[2].name”><br/>  
  8.       Password:<input type=“text” name=“users[2].pwd”><br/><br/>  
  9.       <input type=“submit” value=“Submit”>  
  10.   </form>  
  <form action="/user/submitUserList_2" method=“post”>
        ID:<input type=“text” name=“users[0].id”><br/>
        Username:<input type=“text” name=“users[0].name”><br/>
        Password:<input type=“text” name=“users[0].pwd”><br/><br/>

ID:<input type=“text” name=“users[2].id”><br/>
        Username:<input type=“text” name=“users[2].name”><br/>
        Password:<input type=“text” name=“users[2].pwd”><br/><br/>
        <input type=“submit” value=“Submit”>
    </form>
Java程式碼: 
除了剛才公用的User類,還要封裝一個User的容器類UserModel:

[java] view plain copy print ?
  1. public class UserModel {  
  2.     private List<User> users;  
  3.   
  4.     public List<User> getUsers() {  
  5.         return users;  
  6.     }  
  7.   
  8.     public void setUsers(List<User> users) {  
  9.         this.users = users;  
  10.     }  
  11.   
  12.     public UserModel(List<User> users) {  
  13.         super();  
  14.         this.users = users;  
  15.     }  
  16.   
  17.     public UserModel() {  
  18.         super();  
  19.     }  
  20.   
  21. }  
public class UserModel {
    private List<User> users;

public List<User> getUsers() {
        return users;
    }

public void setUsers(List<User> users) {
        this.users = users;
    }

public UserModel(List<User> users) {
        super();
        this.users = users;
    }

public UserModel() {
        super();
    }

}SpringMVC Controller方法:

[java] view plain copy print ?
  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.     }  
@RequestMapping(value = “/submitUserList_2”, method ={RequestMethod.POST})
    @ResponseBody
    public String submitUserList_2(UserModel users)
            throws Exception{
        String result = “”;
        List<User> userList = users.getUsers();
        if(userList == null || userList.size() <= 0){ return “No any ID.中文”; }
        result = this.showUserList(userList);
        return result;
    }
第4種方法:將表單物件序列化成Json字串提交,以List接收  
HTML程式碼: [java] view plain copy print ?
  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(KaTeX parse error: Expected '}', got '&' at position 3: ){&̲nbsp;&nbsp;</sp….fn.serializeJson = function(){  
  11.                 var jsonData1 = {};  
  12.                 var serializeArray = this.serializeArray();  
  13.                 // 先轉換成{“id”: [“12”,“14”], “name”: [“aaa”,“bbb”], “pwd”:[“pwd1”,“pwd2”]}這種形式  
  14.                 KaTeX parse error: Expected 'EOF', got '&' at position 31: …).each(function&̲nbsp;()&nbsp;{&….isArray(jsonData1[this.name])) {  
  15.                             jsonData1[this.name].push(this.value);  
  16.                         } else {  
  17.                             jsonData1[this.name] = [jsonData1[this.name], this.value];  
  18.                         }  
  19.                     } else {  
  20.                         jsonData1[this.name] = this.value;  
  21.                     }  
  22.                 });  
  23.                 // 再轉成[{“id”: “12”, “name”: “aaa”, “pwd”:“pwd1”},{“id”: “14”, “name”: “bb”, “pwd”:“pwd2”}]的形式  
  24.                 var vCount = 0;  
  25.                 // 計算json內部的陣列最大長度  
  26.                 for(var item in jsonData1){  
  27.                     var tmp = KaTeX parse error: Expected 'EOF', got '&' at position 26: …sonData1[item])&̲nbsp;?&nbsp;jso…("#form1").serializeJson();  
  28.             //console.log(“jsonStr:\r\n” + jsonStr);  
  29.             //alert(jsonStr);  
  30.             KaTeX parse error: Expected '}', got '&' at position 8: .ajax({&̲nbsp;&nbsp;</sp…){
                $.fn.serializeJson = function(){
                    var jsonData1 = {};
                    var serializeArray = this.serializeArray();
                    // 先轉換成{“id”: [“12”,“14”], “name”: [“aaa”,“bbb”], “pwd”:[“pwd1”,“pwd2”]}這種形式
                    KaTeX parse error: Expected '}', got 'EOF' at end of input: …           if (.isArray(jsonData1[this.name])) {
                                jsonData1[this.name].push(this.value);
                            } else {
                                jsonData1[this.name] = [jsonData1[this.name], this.value];
                            }
                        } else {
                            jsonData1[this.name] = this.value;
                        }
                    });
                    // 再轉成[{“id”: “12”, “name”: “aaa”, “pwd”:“pwd1”},{“id”: “14”, “name”: “bb”, “pwd”:“pwd2”}]的形式
                    var vCount = 0;
                    // 計算json內部的陣列最大長度
                    for(var item in jsonData1){
                        var tmp = $.isArray(jsonData1[item]) ? jsonData1[item].length : 1;
                        vCount = (tmp > vCount) ? tmp : vCount;
                    }

if(vCount > 1) {
                    var jsonData2 = new Array();
                    for(var i = 0; i < vCount; i++){
                        var jsonObj = {};
                        for(var item in jsonData1) {
                            jsonObj[item] = jsonData1[item][i];
                        }
                        jsonData2.push(jsonObj);
                    }
                    return JSON.stringify(jsonData2);
                }else{
                    return “[” + JSON.stringify(jsonData1) + “]”;
                }
            };
        })(jQuery);

function submitUserList_4() {alert(“ok”);
            var jsonStr = $("#form1").serializeJson();
            //console.log(“jsonStr:\r\n” + jsonStr);
            //alert(jsonStr);
            $.ajax({
                url: “/user/submitUserList_4”,
                type: “POST”,
                contentType : ‘application/json;charset=utf-8’, //設定請求頭資訊
                dataType:“json”,
                data: jsonStr,
                success: function(data){
                    alert(data);
                },
                error: function(res){
                    alert(res.responseText);
                }
            });
        }
    </script>
</head>

<body>
    <h1>submitUserList_4</h1>
    <form id=“form1”>
        ID:<input type=“text” name=“id”><br/>
        Username:<input type=“text” name=“name”><br/>
        Password:<input type=“text” name=“pwd”><br/><br/>

ID:<input type=“text” name=“id”><br/>
        Username:<input type=“text” name=“name”><br/>
        Password:<input type=“text” name=“pwd”><br/><br/>
        <input type=“button” value=“submit” onclick=“submitUserList_4();”>
    </form>
</body>
</html>Java程式碼:

[java] view plain copy print ?
  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.   }  
  @RequestMapping(value = “/submitUserList_4”, method ={RequestMethod.POST})
    @ResponseBody
    public String submitUserList_4(@RequestBody List<User> users)
            throws Exception{
        String result = “”;
        if(users == null || users.size() <= 0){ return “No any ID.中文”; }
        result = this.showUserList(users);
        return result;
    }

[java] view plain copy print ?
  1. 總結:   
  2. 12種方法其實都有一個共同的BUG:假如提交三條記錄時,前面兩條記錄的某些欄位不填值的話,在SpringMVC裡接收不準確了。而且,每2種方法在HMTL中需要給name屬性新增[下標],如果下標有跨度的話(比如第一組控制元件下標是0,第二組下標是2),那麼SpringMVC裡其實的是02三個物件的,預設下標是1的那個物件全為null值。   
  3. 34種方法最實用。  
總結: 
第1、2種方法其實都有一個共同的BUG:假如提交三條記錄時,前面兩條記錄的某些欄位不填值的話,在SpringMVC裡接收不準確了。而且,每2種方法在HMTL中需要給name屬性新增[下標],如果下標有跨度的話(比如第一組控制元件下標是0,第二組下標是2),那麼SpringMVC裡其實的是0到2三個物件的,預設下標是1的那個物件全為null值。 
第3、4種方法最實用。






           
               

                                               

問題背景: 
我要在一個表單裡同時一次性提交多名乘客的個人資訊到SpringMVC,前端HTML和SpringMVC Controller裡該如何處理?

  • 第1種方法:表單提交,以欄位陣列接收;
  • 第2種方法:表單提交,以BeanListModel接收;
  • 第3種方法:將Json物件序列化成Json字串提交,以List接收;
  • 第4種方法:將表單物件序列化成Json字串提交,以List接收; 
    第4種方法其實是第3種方法的升級,就是將表單轉成Json物件,再轉成Json字串提交; 
    然而,第4種方法還不支援含有多選控制元件表單的提交,故應該還有第5種加強版的方法。

以上4種方法都共用同一個User實體類,程式碼如下:

[java] view plain copy print ?
  1. public class User {  
  2.   
  3.     private Integer id;  
  4.     private String name;  
  5.     private String pwd;  
  6.   
  7.     @Override  
  8.     public String toString() {  
  9.         return "User{" +  
  10.                 "id=" + id +  
  11.                 ", name='" + name + '\'' +  
  12.                 ", pwd='" + pwd + '\'' +  
  13.                 '}';  
  14.     }  
  15.     // .......後面還有getter、setter方法,省略了  
  16.  }  
public class User {