做Java已經有8個多月了,但是基本沒有學習過Java語言,因此在項目中寫代碼基本靠的是其他語言的基礎來寫Java代碼,寫出來的很多代碼雖然能用,但是感覺很不地道,雖然從來沒有同事說過,但是我自己覺得是,因為我經常用下中國象棋的套路去下國際象棋。
在手頭的項目用的SSM的框架,其中有用到Ajax的地方不少,方法是再簡單不過了,在Ajax中對指定的URL提交參數,然后在Controller里通過request.getParameter()方法來接收參數。代碼差不多就像下面的結構,Ajax的代碼如下:
1 function addRoomPic() { 2 var housingPic = document.getElementById("housingPic").value; 3 var remarks1 = document.getElementById("remarks1").value; 4 5 if ( remarks1 == '' ) { 6 return ; 7 } 8 9 document.getElementById("housingPic").value = ""; 10 document.getElementById("remarks1").value = ""; 11 12 $.post( 13 "${ctx}/housingresource/housingPics/ajaxSave", 14 {housingPic: housingPic, remarks:remarks1}, 15 function (result) { 16 // ... 17 } 18 ); 19 }
Controller中代碼如下:
1 @RequestMapping(value = "ajaxSave") 2 @ResponseBody 3 public HousingPics ajaxSave(HttpServletRequest request) { 4 HousingPics hrp = new HousingPics(); 5 hrp.setHousingPic(request.getParameter("housingPic")); 6 hrp.setRemarks(request.getParameter("remarks")); 7 8 // .... 9 }
這樣的做法沒有錯,看着也比較直觀,對於我這個用其他語言討論來寫Java代碼的人來說,這樣已經很好了。難道還有更好的方法嗎?事實證明,無知會自大。
在Spring中有一個注解可以方便的獲取以Json形式提交的參數,並且可以把各個參數直接...直接...直接設置到一個對象中(猶豫的表達出自己不一定正確的用於),這個注解就是該文章標題中的@RequestBody了。修改項目中的代碼,修改后的Controller如下:
1 @RequestMapping(value = "ajaxSave") 2 @ResponseBody 3 public HousingPics ajaxSave(@RequestBody HousingPics hrp) { 4 // ... 5 }
在此處,傳遞的兩個參數已經被@RequestBody注解直接設置到對象中了,方法中實例化對象,接收參數的過程就免掉了。
修改完Controller以后,直接進行測試,發現並沒有得到預期的效果,那么在修改后的方法中下斷。再次測試,但是竟然沒有被斷下,那么就在瀏覽器中進行調試,調試發現提示415報錯,提示類似如下:
Unsupported Media Type 415
該問題因為傳輸的數據格式不太對,那么就修改Ajax請求的方式,代碼如下:
1 function addRoomPic() { 2 var housingPic = document.getElementById("housingPic").value; 3 var remarks1 = document.getElementById("remarks1").value; 4 5 if ( remarks1 == '' ) { 6 return ; 7 } 8 9 document.getElementById("housingPic").value = ""; 10 document.getElementById("remarks1").value = ""; 11 12 $.ajax({ 13 url:"${ctx}/housingresource/housingPics/ajaxSave", 14 dataType:"json", 15 contentType:"application/json", 16 type:"post", 17 data:JSON.stringify({housingPic: housingPic, remarks:remarks1}), 18 success:function(result) { 19 // ... 20 }}); 21 }
在代碼中,另外增加了dataType和contentType兩個Http的標識,對data數據進行了json格式的轉換。修改后再次測試,這次OK了。
相對的,在接收Json格式后需要設置入對象中使用@RequestBody注解,如果要將返回的對象轉換為Json格式,需要使用@ResponseBody注解即可。
我的微信公眾號:“碼農UP2U”