SpringMVC接收復雜對象


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了~🍱
   

 


免責聲明!

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



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