本文以springmvc为背景,模拟ajax发送get/post请求时,展示Controller层方法接收参数的几种方式。
- 传递的是普通的字段
<script type="text/javascript">
function test() {
$.get("ajax/test", {
"name" : "123",
"age" : 23
}, function(data, status) {
alert(data);
})
}
</script>
</head>
<body>
<button id="btn" onclick='test()'>测试ajax</button>
</body>
无关乎是get方法还是post方法,使用ajax传递参数主要的是拼接json,拼接参数json。
方式一:一个萝卜一个坑,比对着传递的参数,在方法体中声明形参,如下:
@Controller
@RequestMapping("/ajax")
public class AjaxController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String doSomethins(String name, int age) {
return "index";
}
}
这种方式,若是GET请求,还可以直接将参数拼在URL后面,如ajax/test?name=123&age=23 获取方式不变
方式二:由于ajax是借助于http协议来发送请求,接收响应的。而且是web项目嘛,所以可以使用HttpServletRequest这个类来获取参数,如下:
@Controller
@RequestMapping("/ajax")
public class AjaxController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String doSomethins(HttpServletRequest request) {
String name = request.getParameter("name");
//这里未进行类型转换
String age = request.getParameter("age");
return "index";
}
}
- 若传递的是普通对象
public class User implements Serializable {
private static final long serialVersionUID = -5824634576564462723L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
POST请求的话,传递到后台的必须是JSON字符串,而不应该是JSON对象。而且还要显示的设置contentType : ‘application/json;charset=UTF-8’,不然会报出415错误。
还要注意的是 json字符串中的字段要与对象中是完全一致的。 如配置皆正确,还是出现415错误,那可能缺少解析json的jar包,如jackson-mapper-asl,jackson-core-asl;亲测有用JSON.stringify(obj)==>可以将json对象转化为json字符串
JSON.parse(obj)==>可以将json字符串转化为json对象
json对象,如var user={name:”123”,age:23};
json字符串,如var user={“name”:”123”,”age”:23}
//这里贴出js代码
function test() {
var user = {
name : "123",
age : 23
};
var userData = JSON.stringify(user);
$.ajax({
url : 'ajax/test',
dataType : 'json',
contentType : 'application/json;charset=UTF-8',
type : 'POST',
data : userData,
async : true,
success : function(data, status) {
}
});
//贴出代码,这里的user对象是有数据的,即ajax传递过来的
@RequestMapping(value = "/test", method = RequestMethod.POST)
//@RequestBody 接收的参数格式必须是json
public String doSomethins(@RequestBody User user) {
return "index";
}
- 若传递的是集合数组
若依然使用POST方式传递参数,则跟上述POST传递方式类似,只是对象变成了集合,而后台接收的形参变成了集合,代码如下:
function test() {
var lists = JSON.stringify([ {
name : "123",
age : 23
}, {
name : "124",
age : 24
} ]);
var user = {
name : "123",
age : 23
};
$.ajax({
url : 'ajax/test',
dataType : 'json',
contentType : 'application/json;charset=UTF-8',
type : 'POST',
data : lists,
async : true,
success : function(data, status) {
}
});
}
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String doSomethins(@RequestBody List<User> user) {
return "index";
}
GET方式传递对象
依照上述思想使用GET方式传递对象时,一直400。还请熟悉的大神指点。另外,若非得使用GET传递对象,可以以单个字段的形式传递到后台,再拼成对象,不过较为麻烦。
以上,若有错误,请指出,谢谢!