SpringMVC接收復雜物件
轉載請註明地址:http://www.cnblogs.com/funnyzpc/p/7642977.html
本節內容暫放一邊,我先扯點兒,心情好了,程式碼順風順水哈~
“
上週一,也就是六號那天,我在市中心醫院做手術,一邊做手術一邊跟做手術的醫生閒扯。
醫生:你哪個學校的?
我:說哪個學校你也不知道,我就一高中生。
醫生:啊~,哦~,那你現在做什麼呢?
我:在上海寫程式碼啊。
醫生一臉的驚訝。。。
隨口又問到:高中...也能寫程式碼?
我:能寫啊,寫程式碼也不過就是打打雜而已,沒啥難的,哈哈。
醫生:這也行啊,寫程式碼不是要高的程式設計能力嗎?
我:哪啊~,no no no,幹這個的能力往往也很一般,要說能力啊,初中生、小學生才厲害呢
醫生:他們怎麼有什麼厲害的?
我:你看看郭某某也就初中畢業,人家在美帝襯幾百個億,口才又那麼的好,咋們能比╮(╯_╰)╭麼,還有小學生,一個二個打農藥嫩麼牛?掰,而且還寫對戰教程呢,還有他們做數學題(奧數題),三下五除二不一會兒就做完了,要是咋們的話看半小時還在苦思冥想呢,所以論能力小學生咋們也沒法兒比啊~
醫生徹底無語?,沉默於手術中。。。
以上對話大部分是真實的,我稍稍總結下就是:對於人要多些尊重,談論的時候最好不要總是先自報門派,這樣不會讓人覺得你很有水平,而更多的是一種無厘頭的傲慢,還有點兒就是儘量尊重尊重人,尤其是服務業不應該有太強的階級意識或偏見,尤其是對於管理人員,同時要儘量鼓勵人去做事情,不管是自己的孩子還是自己的下屬還是什麼的~,不要太在意年齡、性別的差距,也許他就真的做的比你好!
”
扯完,這次我總結下載SpringMVC中後端如何接收復雜的物件引數,啊~,首先宣告下,後端接收的不是某個實體物件型別,而是字串哈,看到題目是不是感覺上當了;。。。。(沉默許久後)。。。,既然不能直接這樣幹那就使用工具類解析字串為指定物件型別吧,還就是那個前端頁面該怎麼傳這個“物件”呢?答案是:將dict(字典型別)轉成String(字串)不就OK啦~。OK,上茶,哦~,不對?,上程式碼==?>
(前端js部分)
1 //儲存**矩陣
2 function saveSalaryMatrix(elem){
3 var trs=$(elem).find("tbody tr");
4 var data=[];
5 for(var i=0;i<trs.length;i++){
6 var record={id:"",stId:"",minLevel:"",type:"",mediumLevel:"",maxLevel:""};
7 record.id=$(trs[i]).find("input[name=id]").val();
8 record.stId=$(trs[i]).find("input[name=stId]").val();
9 record.type=$(trs[i]).find("input[name=type]").val();
10 var minLevel=$(trs[i]).find("input[name=minLevel]").val(),
11 mediumLevel=$(trs[i]).find("input[name=mediumLevel]").val(),
12 maxLevel=$(trs[i]).find("input[name=maxLevel]").val();
13 //驗證
14 if(isNaN(minLevel) || isNaN(mediumLevel) || isNaN(maxLevel)){
15 alert("非數字,請檢查!");
16 return;
17 }
18 record.minLevel=(minLevel/100+"").substr(0,5);
19 record.mediumLevel=(mediumLevel/100+"").substr(0,5);
20 record.maxLevel=(maxLevel/100+"").substr(0,5);
21
22 data.push(record);
23 }
24 $.post(mngPath+"/emolument/salaryMatrix/saveSalaryMatrix.json",{data:$.json2str(data)},function(result){
25 if(result.error){
26 alert("提示:"+(result.error.msg?result.error.msg:result.error));
27 return;
28 }
29 alert("儲存成功!");
30 window.location.href=mngPath+"/emolument/salaryMatrix";//定位到當前記錄
31 })
32 }
(後端,java部分)
1 /**
2 * **矩陣儲存
3 * @param m
4 */
5 @RequestMapping(value="/saveSalaryMatrix",method=RequestMethod.POST)
6 void saveSalaryMatrix(String data,Model m){
7 List<TSalaryMatrix> listObj=JSON.parseArray(data, TSalaryMatrix.class);
8 if(listObj.size()==0){
9 m.addAttribute("error", "儲存資料為空,請檢查!");
10 return;
11 }
12 for (TSalaryMatrix tSalaryMatrix : listObj) {
13 dao.update(tSalaryMatrix);
14 }
15 m.addAttribute("data", listObj);
16 }
現在稍稍講下,首先在js中(第24行:{data:$.json2str(data)})將“data”的value通過$.json2str()方法轉換成字串,然後直接將這個dict(字典物件)扔到後端交給java處理,oh~,等等,這個$.json2str()方法我得先展示下,具體邏輯就是過濾傳過來的物件剔除空或引號這些,然後遍歷拼接字元,最後返回字串,至於其中用到的正則,這裡就略過哈~(づ。◕‿‿◕。)づ
1 $.json2str = function (o) {
2 var arr = [];
3 var fmt = function (s) {
4 if (typeof s == "object" && s != null) return json2str(s);
5 return /^(string|number)$/.test(typeof s) ? "\"" + s.replace(/\"/g, "\\\"") + "\"" : s;
6 }
7 for (var i in o) arr.push("\"" + i + "\":" + fmt(o[i]));
8 return "{" + arr.join(",") + "}";
9 }
post提交到後端之後只需通過定義一個String的data名稱的物件來接就可以了,需要注意的是:這個名稱“data”一定要跟傳過來的dict(字典型別)的key(鍵)一致,要不然,java不認就不要怪我囖ㄟ(▔,▔)ㄏ~
以上,後端看似最重要的一句大概就是這個:
List<TSalaryMatrix> listObj=JSON.parseArray(data, TSalaryMatrix.class);
工具類JSON用的是:import com.alibaba.fastjson.JSON;
需要到自己新增一個fastjson包,我這裡用的是maven,只需要在pom.xml檔案裡面貼上這段就好:
1 <dependency>
2 <groupId>com.alibaba</groupId>
3 <artifactId>fastjson</artifactId>
4 <version>1.1.29</version>
5 </dependency>
至於fastjson版本的話,大家開心就行~
以上用的是parseArray()方法來進行轉換的,因為我傳的是類似於這樣的dict(字典)物件:{data:"[{aa:1,bb:2},{aa:41,bb:2}]}",dict的第一層是個[](Array型別),如果就是一整個dict型別的話就不能使用parseArray來轉,(具體用什麼,自己看api咯~),切記切記,(遵紀守法要牢記?)~~~
對於本猿所使用的方法已經講完,接下來擴充套件下相關的問題...
因為以前使用過ObjectMapper來進行字串到物件的轉換,這裡需要說明下的是這個ObjectMapper不大好用,理由大致有三點:
1>這個ObjectMapper需要在專案進入虛擬機器後首先初始化,在SpringMVC中大概是這樣寫:
1 @PostConstruct
2 public void init()
3 {
4 om = new ObjectMapper();
5 om.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
6 om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
7 }
2>轉換的源字串中不能有多餘的屬性,否則轉換時極容易報錯,若使用fastJson則會忽略多餘的屬性,至於不存在的屬性會以null作為值,這個需要注意
3>再~,可能碰到的概率不是很大的一個問題就是:如果傳入的的有日期型別,這個日期型別會在某些時候(視傳入的日期精度而定)出現市區不一致的問題,導致轉換後的那個物件引數有誤!
至於解決這個問題的辦法請參照以上程式碼塊的5~6行,這裡不作解釋哈~
還需要提到的一個點兒就是SpringMVC中,每個請求對應的Controller的方法的引數(傳過來的)儘量是包裝型別或物件型別,至於解釋就是:包裝型別的引數允許為null,如果使用基本型別(int float double)這些來接引數的話,一定要注意:傳過來的引數一定不能為空!!!否則請求過來會直接報錯。
畢生對於SpringMVC的內容目前就總結到這裡,如果後期還從事java相關的開發的話(希望不是~(●´∀`●)ノ),相關內容會繼續更新。
--現在是:2017-11-14 18:08:48--
加班要適度,下班要及時,各位,該dinner了~?