最近為了準備新工作重新摸出了SSM框架,同時從0學習了JQuery,終於用一周做完了一個包括增刪改查的模塊(主要是屬性太多了,其中一個類50+,複製粘貼耗時)。 從中特意記下了幾個遇到的問題,總結一下。 1. 執行網頁js代碼時, 出現$ is not defined錯誤。 原因:未引入JQuery ...
最近為了準備新工作重新摸出了SSM框架,同時從0學習了JQuery,終於用一周做完了一個包括增刪改查的模塊(主要是屬性太多了,其中一個類50+,複製粘貼耗時)。
從中特意記下了幾個遇到的問題,總結一下。
1. 執行網頁js代碼時, 出現$ is not defined錯誤。
原因:未引入JQuery,需要在HTML代碼中加入以下代碼:
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
2. 通過Ajax向SSM的後臺傳遞一個Map轉JSON的數據時,無法調用方法request.getParameter(name)來獲取屬性名稱。
原因:具體見:https://blog.csdn.net/u010648555/article/details/79084466
將代碼做如下修改即可成功:
$.ajax({ url:selectUrl, type:'POST', data:dataMap, //而不是JSON.stringify(dataMap) contentType: "application/x-www-form-urlencoded", //而不是"application/json" success: function(data) { if(data.success) { alert('提交成功!'); } else { alert('提交失敗!' + data.errMsg); } } });
3. 頁面輸入的中文傳到後臺變成了亂碼。
原因:資料庫和網頁需要統一utf-8的編碼。將問題2中的代碼改為以下即可:
contentType: "application/x-www-form-urlencoded; charset=utf-8",
4. 由於有動態、非同步插入<option>的需求,同時有“增加新情況”的需求,需要等動態載入完選項後保存下可增項的HTML代碼,以便在按下“增加”按鈕後添加在頁面上。
解決:1. 每當一個<select>載入完後,更新一次可增項的HTML代碼。
2. 使用$.when()方法(http://www.runoob.com/jquery/misc-when.html),如下例子:
//獲取html var addHtml = ''; $.when(getList1(), getList2()).done(function() { addHtml= '<div class="item">' + $('.item').html() + '</div>'; }); //更新屬性1 function getList1() { var initUrl = '/getattr1'; return getAttrList(initUrl, 'attr1'); } //更新屬性2 function getList2() { var initUrl = '/getattr2'; return getAttrList(initUrl, 'attr2'); } function getAttrList(url, idname) { return $.getJSON(url, function(data) { if(data.success) { var tempHtml = ''; data.info.map(function(attr, index) { tempHtml += '<option class="text-style" value="' + attr.attrid+ '">' + attr.attrval+ '</option>'; }); $('#' + idname).html(tempHtml); } else { $.toast(data.errMsg); } }); }
5. 前端向後端傳遞參數時,@RequestBody不能放多個不同的對象。
解決:可以把這些對象封裝起來,比如:
public class AllAttrs { private Attr1 attr1; private List<Attr2> attr2list; private List<Attr3> attr3list; //get/set方法略 }
public class AttrController { @RequestMapping(value = "updateattr", method = RequestMethod.POST) @ResponseBody private Map<String, Object> updateAttr(@RequestBody AllAttrs allAttrs) { Map<String, Object> modelMap = new HashMap<>(); //處理代碼略 return modelMap; } }
6. 如果更新項有“更新時間”這一屬性,且要求“沒有更新內容的時候需要特別提示”,update的時候需要註意。
更新時前端不會向後端傳遞更新時間,如果將更新時間設定為null或者取當前時間,那麼update後會返回1,無法判斷有沒有更新內容。
因此設計SQL的時候,類似這樣的屬性變數要判斷是否為空(加<if>標簽),如果不為空才更新這個屬性。
7. MyBatis中,保持原值不變,update後返回值不為0。
原因:MyBatis返回的是匹配值而不是影響值,如果需要影響值,在jdbc.properties中需要加上“&useAffectedRows=true”。