Spring MVC無法獲取ajax POST的參數和值


一、怎么會這個樣子

很簡單的一個想法,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解析。

重新指示數據類型后,上面的取值方法都是可行的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM