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解析。

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

时间: 2024-07-29 10:30:35

Spring MVC无法获取ajax POST的参数和值的相关文章

为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring MVC的时候,你即使不使用注解,只要参数名和请求参数的key对应上了,就能自动完成数值的封装 在使用MyBatis(接口模式)时,接口方法向xml里的SQL语句传参时,必须(当然不是100%的必须,特殊情况此处不做考虑)使用@Param('')指定key值,在SQL中才可以取到 我敢相信这绝不是我一

使用Spring MVC 的 @RequestBody 映射json请求参数时报异常问题

使用Spring MVC 的 @RequestBody 映射json请求参数时报"The request sent by the client was syntactically incorrect."异常解决方案 最近工作中开发RESTful接口需要处理客户端上传的json,图方便想起Spring的Controller中有@RequestBody可以优雅地完成json报文与Java类的映射,但是使用时碰到了 "The request sent by the client w

Spring MVC(三)--控制器接受普通请求参数

Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数名称和pojo属性一致即可: 注解方式:当前端参数名和控制器名称不一致时可以使用注解方式,比如前端是param_id,而控制器中是paramId的情况: URL方式:当前端以restful格式传递参数时,后台使用这种方式接受: JSON方式:前后端如果用json方式交互时,可以使用这种方式,这是常用

spring mvc 3.1的自动注入参数遇到的问题

在网上下载了xheditor作为页面的编辑器,编辑内容后post到后台保存,后台方法用spring mvc的自动注入的方式接收参数. 这种方式在各个浏览器下运行良好,但是在ie11下发现,从word.文本编辑器或者其它编辑器复制内容到xheditor后,这时提交到后台的参数不能被接收到. 仔细排查下发现ie11下复制到xheditor的内容都被默默的加了一段无用的div: <div style="top: 0px;"> </div> 此时用最原始的接收参数的方式

Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象

场景: 在web应用开发中,spring mvc凭借出现的性能和良好的可扩展性,导致使用日渐增多,成为事实标准,在日常的开发过程中,有一个很常见的场景:即前端通过ajax提交方式,提交参数为一个json对象的字符串,采用application/json的类型,在后端control中利用@RequestBody将json字符串直接转换成对应的Java对象,如: var dataStr = '[{"id":1476,"name":"test"}]';

spring mvc 后台获取不到form提交的参数

在spring mvc 后台一直获取不到 $("#Form").serialize();提交的参数,一直想来想去都找不到原因.无意当中想起自己使用<input type="text" name="name" value="xxx" disabled="true"/>来禁用了.当把这个属性去掉之后,果然就可以获取到参数的值了. 在这里也顺便比较一下,input中属性disabled与readonl

Spring MVC无法获取到页面表单put过来的参数的解决方案

问题: 在使用Spring MVC开发resetful风格的Web应用时,发现Sping接收不到页面Form表单传到后台的值. 解决: 1.把Spring及Spring MVC的版本升级到3.1.1 <org.springframework.version>3.1.1.RELEASE</org.springframework.version> 2.增加HttpPutFormContentFilter过滤器 <filter> <filter-name>Http

spring mvc如何获取问号后的url参数

@RequestMapping(method=RequestMethod.GET) public ModelAndView allUsers(@RequestParam int page){ ModelAndView mav = new ModelAndView(); mav.setViewName("list"); List<String> list = new ArrayList<String>(); list.add("zhangsan"

spring MVC 中获取request

spring MVC中如何获取request 呢? 有如下方式: 方式一:在action中注入request 直接在action的参数中增加HttpServletRequest request 例如 /*** * 返回json * @param id * @param roleLevel * @param model * @param request * @param targetView * @return * @throws SecurityException * @throws NoSuc