SpringMVC接收復雜物件

funnyZpC發表於2017-11-14

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

 

相關文章