1. 程式人生 > >SpringMVC接收復雜對象

SpringMVC接收復雜對象

技術分享 解析 img att 題目 spring bsp mat 高中

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

SpringMVC接收復雜對象