Spring MVC无法获取ajax POST的参数和值

时间:2022-04-14 18:15:01

一、怎么会这个样子

很简单的一个想法,ajax以POST的方式提交一个表单,Spring MVC解析。然而一次次的打印null折磨了我整整一天……

最后的解决现在看来是很明显的问题,“只是当时已惘然”……

学海无涯!学海无涯!学海无涯!

二、简单的原罪

ajax提交的代码如下:

 <script type="text/javascript">
$(document).ready(function() {
$("#submit").click(function(e) {
e.preventDefault();
var obj = $(this);
var name = $("input[name='name']").val();
var phone = $("input[name='phone']").val();
$.ajax({
url : "userAsk",
type : "POST",
contentType : "application/json;charset=utf-8",
data : {name:name,phone:phone},
//dataType : "text",
success : function(result, status, req) {
$(".noticeInfo").css("display", "block");
},
error : function(req, status, reason) {
$(".noticeInfo").css("display", "block").text('Error:' + reason);
}
})
return false;
})
});
</script>

三、纠结的后台

顺便复习一下Spring MVC的取值方式:

1. 通过注解PathVariable获取url中的值。

  @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET)
public String myController(@PathVariable String id,@PathVariable String name, ModelMap model) {
……
return "ok";
}

2.通过注解RequestParam获取传递过来的值。

 @RequestMapping(value = "/test", method = RequestMethod.POST)
public String myTest(@RequestParam("name") String name,@RequestParam("phone") String phone, ModelMap model) {
……
return "ok";
}

3.通过源生的HttpServletRequest自己动手取值。

 @RequestMapping(value="/test" method = RequestMethod.POST)
public String get(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name"));
return "ok";
}

4.通过注解ModelAttribute直接映射表单中的参数到POJO。

注:暂时没用过,一般这种情况我用JSON序列化。

上面的方法我各种尝试,一直无情的打印null。

四、怀疑后台有没有收到数据?

         BufferedReader br;
try {
br = req.getReader();
String str, wholeStr = "";
while((str = br.readLine()) != null){
wholeStr += str;
}
System.out.println(wholeStr);
} catch (IOException e) {
e.printStackTrace();
}

打印出来的字符串和前端发送的数据一模一样……

五、最后的真相……

我用了最原始的方法,重新写了一个一模一样的表单,这个表单不用ajax,而用form提交。后台能打印出数据了!

对比两个前端的http请求数据,修改了一下ajax提交的数据格式,解决了:

 contentType : "application/x-www-form-urlencoded",

也就是说:收到ajax请求,Spring MVC根据“数据类型指示”,按照json格式解析收到的请求。

但是看起来name=lings&phone=13899999999这种以表单数据格式提交的字符串无法匹配json解析。

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