【ajax 提交表單】多種方式的注意事項 ,serialize()的使用


在業務中,可能因為表單內容過於龐大,字段過於繁雜,如果人為去拼接的話 ,需要耗費大量的時間和精力,與此同時,代碼看上去也是冗余不堪。

所以,提交表單的時候如果能整個表單數據整體提交,那是非常開心的事情。

同時,有時候會有需求在前台提交給后台數據之后,希望后台能在處理之后返回數據給前台,可能是標識也好,可能是具體的數據也罷。

這時候又需要使用ajax去提交數據。【因為使用jQuery的submit()方法是沒有回調函數的,那個函數只是當表單發生提交時,要同時執行的函數而已,例如:$("#poFromId").submit()】

 

那能不能使用ajax進行局部頁面刷新的同時將整個表單的數據提交呢?

答案肯定是可以的,

首先,咱們把整個的一圈代碼給出來:

1.jsp頁面

 1 <form action="../department/addPosition.htmls" method="post"  role="form" id="poFromId" >
 2                       <div class="form-group">
 3                           <label class="col-md-3 control-label">職位名稱</label>
 4                           <div class="col-md-9" style="width: 77%">
 5                                 <input type="hidden" name="positionId" />
 6                                 <input type="hidden" name="positionCre" />
 7                               <input  type="text" class="form-control"  name="positionName" placeholder="eq:軟件開發工程師" data-bv-trigger="keyup" />
 8                           </div>
 9                       </div>
10                       <div class="form-group">
11                           <label class="col-lg-3 control-label">職位所屬等級</label>
12                           <select class="selectpicker input input-big" name="positionGrade">
13                                 <option value="專員">專員</option>
14                                 <option value="經理">經理</option>
15                                 <option value="總監">總監</option>
16                           </select>
17                         </div>
18                     <hr/>
19                      <div class="form-group center">
20                           <button type="button" class="btn btn-success positionUp">提交職務</button>
21                               &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22                             <button type="reset" class="btn btn-warning">重置頁面</button>
23                      </div>
24               </form>
View Code

2.js  表單整體使用ajax提交部分

 1 /**
 2      * 提交職位
 3      */
 4     $(".positionUp").click(function(){
 5         $("input[name='positionId']").val(UUID()); 
 6         $("input[name='positionCre']").val(parent.departmentId); 
 7         var position = $("#poFromId").serialize();
 8         
 9         $.getJSON("../department/addPosition.htmls?"+position,function(data){
10             if(data){
11                 layer.msg('添加成功', {
12                          icon: 1,
13                            time: 2000 
14                          }, function(){
15                   });
16                 parent.layer.close(parent.positionAdd);
17             }
18         });
19     
20     });
View Code

3.controller后台接收部分

 1 @RequestMapping("addPosition")
 2     @ResponseBody
 3     public boolean addPosition(Position position){
 4         position.setCreateDate(new Timestamp(System.currentTimeMillis()));
 5         position.setUpdateDate(new Timestamp(System.currentTimeMillis()));
 6         //操作人  未插入
 7         positionService.save(position);
 8         
 9         return true;
10     }
View Code

4.上面表單中name對應的實體Position

  1 package com.agen.entity;
  2 
  3 import java.sql.Timestamp;
  4 import java.util.HashSet;
  5 import java.util.Set;
  6 
  7 import javax.persistence.CascadeType;
  8 import javax.persistence.Column;
  9 import javax.persistence.Entity;
 10 import javax.persistence.FetchType;
 11 import javax.persistence.GeneratedValue;
 12 import javax.persistence.Id;
 13 import javax.persistence.OneToMany;
 14 import javax.persistence.Table;
 15 
 16 import org.hibernate.annotations.GenericGenerator;
 17 
 18 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 19 
 20 /**
 21  * Position 崗位表
 22  */
 23 @Entity
 24 @Table(name = "position", catalog = "performance")
 25 @JsonIgnoreProperties(value = {"positionchanges"})
 26 public class Position implements java.io.Serializable {
 27 
 28     // Fields
 29 
 30     private String positionId;
 31     private String positionName;    //崗位名稱
 32     private String positionGrade;    //崗位對應等級
 33     private Timestamp createDate;    
 34     private Timestamp updateDate;
 35     private String operation;
 36     private String positionCre;        //崗位所屬部門
 37     private Set<Positionchange> positionchanges = new HashSet<Positionchange>(0);
 38 
 39     // Constructors
 40 
 41     /** default constructor */
 42     public Position() {
 43     }
 44 
 45     /** full constructor */
 46     public Position(String positionName, String positionGrade,
 47             Timestamp createDate, Timestamp updateDate, String operation,
 48             String positionCre, Set<Positionchange> positionchanges) {
 49         this.positionName = positionName;
 50         this.positionGrade = positionGrade;
 51         this.createDate = createDate;
 52         this.updateDate = updateDate;
 53         this.operation = operation;
 54         this.positionCre = positionCre;
 55         this.positionchanges = positionchanges;
 56     }
 57 
 58     // Property accessors
 59     //@GenericGenerator(name = "generator", strategy = "uuid.hex")
 60     @Id
 61     //@GeneratedValue(generator = "generator")
 62     @Column(name = "positionID", unique = true, nullable = false, length = 36)
 63     public String getPositionId() {
 64         return this.positionId;
 65     }
 66 
 67     public void setPositionId(String positionId) {
 68         this.positionId = positionId;
 69     }
 70 
 71     @Column(name = "positionName", length = 30)
 72     public String getPositionName() {
 73         return this.positionName;
 74     }
 75 
 76     public void setPositionName(String positionName) {
 77         this.positionName = positionName;
 78     }
 79 
 80     @Column(name = "positionGrade", length = 20)
 81     public String getPositionGrade() {
 82         return this.positionGrade;
 83     }
 84 
 85     public void setPositionGrade(String positionGrade) {
 86         this.positionGrade = positionGrade;
 87     }
 88 
 89     @Column(name = "createDate", length = 0)
 90     public Timestamp getCreateDate() {
 91         return this.createDate;
 92     }
 93 
 94     public void setCreateDate(Timestamp createDate) {
 95         this.createDate = createDate;
 96     }
 97 
 98     @Column(name = "updateDate", length = 0)
 99     public Timestamp getUpdateDate() {
100         return this.updateDate;
101     }
102 
103     public void setUpdateDate(Timestamp updateDate) {
104         this.updateDate = updateDate;
105     }
106 
107     @Column(name = "operation", length = 36)
108     public String getOperation() {
109         return this.operation;
110     }
111 
112     public void setOperation(String operation) {
113         this.operation = operation;
114     }
115 
116     @Column(name = "positionCre", length = 500)
117     public String getPositionCre() {
118         return this.positionCre;
119     }
120 
121     public void setPositionCre(String positionCre) {
122         this.positionCre = positionCre;
123     }
124 
125     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "position")
126     public Set<Positionchange> getPositionchanges() {
127         return this.positionchanges;
128     }
129 
130     public void setPositionchanges(Set<Positionchange> positionchanges) {
131         this.positionchanges = positionchanges;
132     }
133 
134 }
View Code

 

接下來,咱們要細細談一談這上面需要注意的小細節:

1.首先,如果你想使用js控制提交整個表單,那最起碼的,頁面中不能存在元素的name=submit的,當然最下面的提交按鈕也不能使用type=submit了,因為你想在js中處理之后再去使用js提交表單數據嘛!!

2.其次,js中,獲取整體的表單數據,使用了var position = $("#poFromId").serialize();序列化的方法去獲取整個表單的數據!!

3.再者說,既然你講前后台表單數據傳輸交給spring去管理了,那最起碼的要求,你得在form表單中將實體中規定不能為null的字段值都給上,同樣的,如果你想前台傳遞給后台,后台直接拿到的就是一個字段都比較完整的實體對象,那表單中的name就要盡量多的和實體中的字段值保持一致;

4.對於第3點中,可能會出現,實體中的某個屬性也是個實體,例如:【注冊的時候,User實體需要選擇是哪個部門的,而Department實體在注冊頁面上,也就是個下拉框,也就是個departmentId而已,對於這種情況,我們可以將name設置為其他的,在后台單獨接收這個name對應的值,然后將departmentId實例化成Department對象,再賦值給User實體】

5.注意ajax中,data部分是:$.getJSON("../department/addPosition.htmls?"+position,拼接的,而不是$.getJSON("../department/addPosition.htmls",{position:position},給出的。這就需要試驗一下,兩種方式最后請求的地址是什么樣子的;

 

6.Controller中,這里需要返回數據給前台,才使用了@ResponseBody這個注解;而就算你返回是void的,不希望給前台返回值,也需要@ResponseBody。不然,spring會認為你要去找那一串地址,會無休止的找下去,就會報錯。

 

 

 

 

這里接着說:

上面那個表單,數據量很小,如果提交的是個大表單,那么就不能采用上面這種ajax的寫法了,而是:

1  var xmlDocument = [create xml document];
2  $.ajax({
3    url: "page.php",
4    processData: false,
5    data: xmlDocument,
6    success: handleResponse
7  });
View Code

使用jQuery中最原始的ajax的寫法,這樣就可以保證大量的數據傳遞給后台了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM