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了~??
SpringMVC接收復雜對象