问题描述:
昨天写数据接口的时候,忽然发现这样一个问题:
- 后台Java可以获得前台传来的参数
- 后台可根据前台传入的参数进行数据查询,并顺利打印查询结果在Java控制台
- 将接口URL拷贝至浏览器地址栏,可获得 HttpServletResponse 打印的数据
- 浏览器控制台 Network 可看到请求的 Status Code 为 200,响应结果与后台Java控制台相同
- jQuery ajax 中 error:function(){} 被执行
代码
Java code:
import java.io.IOException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
private static final long serialVersionUID = 8597954698686874293L;
public String test(){
System.out.println(ServletActionContext.getRequest().getParameter("test"));
StringBuffer sb = new StringBuffer();
sb.append("aaa,");
sb.append("bbb");
System.out.println(sb);
try {
ServletActionContext.getResponse().getWriter().print(sb);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return NONE;
}
}
ajax code:
$(".ajaxTest").click(function(){
$.ajax({
url:"test",
type:"post",
dataType:"JSON",
data:{
test:"test"
},
async:true,
success:function(data){
console.log(data);
},
error:function() {
console.log("error");
}
})
})
当 class=“ajaxTest” 这个按钮被点击后
Java控制台输出:
test
aaa,bbb
浏览器控制台输出:
error
修改思路:
-
修改 error 函数,function中传入
XMLHttpRequest, textStatus, errorThrown
这三个参数,并在函数中进行打印console.log(XMLHttpRequest.status);
console.log(XMLHttpRequest.readyState);
console.log(textStatus);
此时再点击页面上的按钮时,浏览器控制台会打印出一下信息:
200
4
parsererror
由此可知是类型转换错误。
2.修改 ajax 中 dataType 属性值为 text。再次点击按钮,此时浏览器控制台输出正确结果:
aaa,bbb
正确 ajax code:
$(".ajaxTest").click(function(){
$.ajax({
url:"test",
type:"post",
dataType:"text",
data:{
test:"test"
},
async:true,
success:function(data){
console.log(data);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
console.log(XMLHttpRequest.readyState);
console.log(textStatus);
}
})
})
注意:
ajax 中 dataType 为可缺省值,在使用ajax的时候,如果指定了dataType,会根据 dataType 指定的类型去解析返回的数据;如果没有指定dataType 会去检查 MIME 的值。在指定 dataType 或使用 response.setContentType(MIME)) 指定 MIME 值时,注意与返回的数据类型一致。如果返回的数据是一个纯文本字符串,但 dataType 设置为 “json” 或者是 MIME 值设置为 “text/json”,那么ajax会报错,直接走到 error 里面去,虽然数据是返回到了页面,但读不出来。如果返回数据是 json,却设置为 text,那么返回的只是一个纯文本。
总结:
- 要有写 dataType 属性,并指明返回值类型的习惯
- 要有写 error 属性的习惯
- error 属性函数中,可以通过添加
XMLHttpRequest, textStatus, errorThrown
参数来更好的定位问题所在。