zoukankan      html  css  js  c++  java
  • 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解析。

    重新指示数据类型后,上面的取值方法都是可行的。

  • 相关阅读:
    环境是如何建立的 启动文件有什么
    环境中存储的是什么
    串行 并行 异步 同步
    TPC-H is a Decision Support Benchmark
    进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
    删除环境变量
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
  • 原文地址:https://www.cnblogs.com/yoyotl/p/5853206.html
Copyright © 2011-2022 走看看