在業務中,可能因為表單內容過於龐大,字段過於繁雜,如果人為去拼接的話 ,需要耗費大量的時間和精力,與此同時,代碼看上去也是冗余不堪。
所以,提交表單的時候如果能整個表單數據整體提交,那是非常開心的事情。
同時,有時候會有需求在前台提交給后台數據之后,希望后台能在處理之后返回數據給前台,可能是標識也好,可能是具體的數據也罷。
這時候又需要使用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 22 <button type="reset" class="btn btn-warning">重置頁面</button> 23 </div> 24 </form>
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 });
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 }
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 }
接下來,咱們要細細談一談這上面需要注意的小細節:
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 });
使用jQuery中最原始的ajax的寫法,這樣就可以保證大量的數據傳遞給后台了。