一、怎么會這個樣子
很簡單的一個想法,ajax以POST的方式提交一個表單,Spring MVC解析。然而一次次的打印null折磨了我整整一天……
最后的解決現在看來是很明顯的問題,“只是當時已惘然”……
學海無涯!學海無涯!學海無涯!
二、簡單的原罪
ajax提交的代碼如下:
1 <script type="text/javascript"> 2 $(document).ready(function() { 3 $("#submit").click(function(e) { 4 e.preventDefault(); 5 var obj = $(this); 6 var name = $("input[name='name']").val(); 7 var phone = $("input[name='phone']").val(); 8 $.ajax({ 9 url : "userAsk", 10 type : "POST", 11 contentType : "application/json;charset=utf-8", 12 data : {name:name,phone:phone}, 13 //dataType : "text", 14 success : function(result, status, req) { 15 $(".noticeInfo").css("display", "block"); 16 }, 17 error : function(req, status, reason) { 18 $(".noticeInfo").css("display", "block").text('Error:' + reason); 19 } 20 }) 21 return false; 22 }) 23 }); 24 </script>
三、糾結的后台
順便復習一下Spring MVC的取值方式:
1. 通過注解PathVariable獲取url中的值。
1 @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET) 2 public String myController(@PathVariable String id,@PathVariable String name, ModelMap model) { 3 …… 4 return "ok"; 5 }
2.通過注解RequestParam獲取傳遞過來的值。
1 @RequestMapping(value = "/test", method = RequestMethod.POST) 2 public String myTest(@RequestParam("name") String name,@RequestParam("phone") String phone, ModelMap model) { 3 …… 4 return "ok"; 5 }
3.通過源生的HttpServletRequest自己動手取值。
1 @RequestMapping(value="/test" method = RequestMethod.POST) 2 public String get(HttpServletRequest request, HttpServletResponse response) { 3 String name = request.getParameter("name")); 4 return "ok"; 5 }
4.通過注解ModelAttribute直接映射表單中的參數到POJO。
注:暫時沒用過,一般這種情況我用JSON序列化。
上面的方法我各種嘗試,一直無情的打印null。
四、懷疑后台有沒有收到數據?
1 BufferedReader br; 2 try { 3 br = req.getReader(); 4 String str, wholeStr = ""; 5 while((str = br.readLine()) != null){ 6 wholeStr += str; 7 } 8 System.out.println(wholeStr); 9 } catch (IOException e) { 10 e.printStackTrace(); 11 }
打印出來的字符串和前端發送的數據一模一樣……
五、最后的真相……
我用了最原始的方法,重新寫了一個一模一樣的表單,這個表單不用ajax,而用form提交。后台能打印出數據了!
對比兩個前端的http請求數據,修改了一下ajax提交的數據格式,解決了:
1 contentType : "application/x-www-form-urlencoded",
也就是說:收到ajax請求,Spring MVC根據“數據類型指示”,按照json格式解析收到的請求。
但是看起來name=lings&phone=13899999999這種以表單數據格式提交的字符串無法匹配json解析。
重新指示數據類型后,上面的取值方法都是可行的。