问题:用ajax向后台传值,正常是根据服务器的响应来决定进入success或者进入error,但是只要运行ajax,不等后台响应,直接进入error;然而后台接受数据正常;(暂不考虑跨域问题)
解决方法:(不要对号入座)
html:
<button type="submit" class="btn btn-login login disabled" id="login">登录</button>
将type改成button就ok了!
具体代码如下
今天做一个登录页面时,前台页面通过ajax将帐号和密码发送至服务器:
//data对象保存的是帐号密码信息
var _username = $.trim($("#username").val()),
_pwd = $.trim($("#password").val());
var data = {
user_name: _username,
user_password: _pwd
};
ajax代码如下:
$.ajax({
type: "POST",
url: "http://localhost:8080/testLogin",
async: true,
data: JSON.stringify(data),
//dataType:"jsonp",
processData: false,
success: function (response) {
if (response !== "") {
//处理response
var json = response.replace(/'/g, '"');
var obj = JSON.parse(json);
//写入cookie
$.cookie("login_status", obj.status);
$.cookie("user_name", obj.user_name);
$(location).attr("href", "index.html");
} else {
alert("用户名或密码错误");
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
如果服务器接受并处理data,会返回一段json字符串,后台用servlet的dopost方法来处理,代码如下:
解析json步骤:
1,导入fastjson jar包
2,创建JSONObject对象:
JSONObject jo = JSON.parseObject(json);
3,根据键名获取值,键名就是在js代码中创建data对象时候的“属性名”
4,交给ServiceUserDAOImpl(和数据库交互类)处理,User是自定义的实体类
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedReader br = new BufferedReader(req.getReader());
String json = br.readLine();
//解析json,根据键获取值
JSONObject jo = JSON.parseObject(json);
String user_name = jo.getString("user_name");
String user_password = jo.getString("user_password");
//到数据库中查找user是否存在
ServiceUserDAOImpl dao = new ServiceUserDAOImpl();
//准备发送data回浏览器
PrintWriter pw = resp.getWriter();
resp.setCharacterEncoding("UTF-8");
User user = dao.selectBy(User.class,"select * from tb_user where user_tel = ? and user_password = ?",
user_name,user_password);
if (user != null) {
//String data =JSON.toJSONString(user);
//上面方法会去掉空值,如果需要保留null,需要设置Fastjson的SerializerFeature序列化属性,
// 将WriteMapNullValue——–是否输出值为null的字段,默认为false
//String data =JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
//System.out.println(data);
String uname = user.getUser_nickname();
String data = "{'status':'true','user_name':'" + uname + "'}";
pw.write(data);
pw.close();
}
}
处理结果:
前台直接进error,后台正常解析数据,正常发送数据,但是前台无法接受
解决方法:
见本文开头。