SpringMVC快速的完成ajax功能?
页面:$.ajax( { } );发请求 |
---|
对于服务器来说,返回json数据 |
导包:
jackson-annotations-2.8.5.jar,
jackson-core-2.8.5.jar,
jackson-databind-2.8.5.jar,
@ResponseBody | 响应体 |
---|---|
将返回的数据放在响应体中 | |
如果返回的是对象,自动将对象转为json格式 |
自动注入 employeeDao
@Autowired
EmployeeDao employeeDao;
返回的这个集合应该是json格式
@ResponseBody
处理器方法处理ajax请求
@RequestMapping("/getallajax")
public Collection<Employee> ajaxGetAll(){
查询所有员工,直接返回集合(Collection)
Collection<Employee> all=employeeDao.getAll();
return all;
}
@JsonFormat
<script type="text/javascript">
给这个a标签 $("a:first") 绑定单击事件 .click(function(){ } )
${"a:first"}.click(function(){
发送ajax请求获取所有员工 $.ajax ({ })
$.ajax({
url:发送的请求地址
url:"${ctp}/getallajax",
type:请求方式
type:"GET",
success:function(){}请求成功以后
success:function(data){
$.each(data,function(){}) 遍历data数据,每次遍历干什么
$.each(data,function(){
var empInfo = this.lastName+"-->"+this.birth+"-->"+this.gender;
$("div").append() 每次遍历的数据放在div里面
$("div").append(empInfo);
});
}
});
一点击a标签后,进入到默认行为 return false
return false;
});
只有表单才有请求体,点链接没有请求体。
@RequestBody | 请求体,获取一个请求的请求体内容 |
---|---|
就不用@RequestParam |
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("请求体: "+body);
return "success";
}
enctype就是encodetype就是编码类型的意思。
multipart/form-data
multipart是指表单数据有多部分构成,
既有文本数据(form),又有文件等二进制数据(data)。
multipart/form-data是将文件以二进制的形式上传
<form action="${ctp}/testRequestBody" method="post" enctype="multipart/form-data">
<input name="username" value="tomcat"/>
<input name="password" value="123456">
<input type="submit"/>
</form>
图片没在字符集范围的,所以她显示乱码正常的。
文本数据是字符编码的。
如果想让请求体的内容,封装成自定义类型对象(employee对象)
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody Employee employee){
System.out.println("请求体: "+employee);
return "success";
}
会不会整一堆自定义的类型转换器,不用这样做。
@ResopnseBody: | 可以把返回对象转化为json字符串,放在响应体中 |
---|---|
@RequestBody: | 接收json字符串,封装为自定义对象 |
1.发送ajax请求
前端发json字符串,
通过@RequestBody直接跟自定义类型的对象映射。
JSON包 也会把json字符串给转换成自定义类型的对象。
<a href="${ctp }/hello">发送ajax请求,请求数据带的是json</a>
</body>
<script type="text/javascript">
$("a:first").click(function(){
点击发送ajax请求,请求数据带的是json
前端提交数据的字段名称或者类型和后台的实体类不一致,会报错;
var emp = {
lastName : "张三",
email : "aaa@aa.com",
gender : 0
};
这是json格式吗?这是js对象。js对象转成json串。
var empStr = JSON.stringify(emp);
$.ajax({
url : "${ctp}/hello",
type : "POST",
data : empStr,
data请求带的数据
contentType : "application/json",
内容类型是json
success:function(data){
alert(data);
}
});
return false;
});
</script>
@RequestMapping("/hello")
public String testRequestBody(@RequestBody Employee employee){
System.out.println("请求体: "+employee);
return "success";
}
AJAX请求给后台发数据时,有时会报HTTP400错误-请求无效(Badrequest); |
---|
出现这个请求无效报错,说明请求没有进入到拦截器,也没有进入到控制器; |
本质原因 | 最大几率是出现了数据类型不一致的问题,简单来说是Controller层不能正确读取你发送请求带的参数 |
---|---|
具体原因 | 1. 封装失败:前端提交数据的字段名称或者类型和后台的实体类不一致; |
具体原因 | 2.前端没有将js对象转化为json字符串类型;前端提交的到后台数据应该是json字符串类型 |
解决方案: | 1)对照字段名称,类型保证和实体类一致性 |
---|---|
2)前端使用stringify将传递的js对象转化为json字符串data:JSON.stringify(param); |
请求体:直接就是json数据,不是以前的key=value&key=value