我正在尝试通过ajax调用将用户名发送到servlet,以检查其可用性,但是servlet显示空指针异常。
我还尝试了XMLHttpRequest而不是$ .ajax。
这是我的Javascript文件:
$(document).ready(function() {
$("#reg-form").submit(function() {
var res = true;
if (!testUser()) {
res = false;
$("#erruser").css("display", "block");
$("#username").addClass("errclass");
} else {
$("#erruser").css("display", "none");
$("#username").removeClass("errclass");
}
return res;
});
});
function testUser() {
var el = $("#username").val();
var b = false;
$.ajax({
type: "POST",
url: "CheckUserServlet",
data: { user: el },
dataType: "json",
success: function(bool) {
alert(bool);
if (bool == "si") b = true;
},
error: function() {
alert("errore");
}
});
return b;
}
这是我的servlet doPost
方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getAttribute("user").toString();
System.out.println("username servlet= "+username);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
if (!ud.doRetrieveByUser(username)) {
response.getWriter().write("si");
return;
}
response.getWriter().write("no");
return;
}
谢谢!
答案 0 :(得分:0)
由于$ .ajax()是异步函数,因此无论服务器是否运行正常,您的测试用户函数将始终返回false。有几种解决方法。对于您的情况,我不建议您进一步了解构建的内容,建议从测试用户函数中删除返回值,并将逻辑移至ajax回调的成功/失败区域。这样,ajax调用就可以完成任务,并让成功函数根据需要修改您的页面。
function testUser() {
var el = $("#username").val();
$.ajax({
type: "POST",
url: "CheckUserServlet",
data: { user: el },
dataType: "json",
success: function(bool) {
alert(bool);
// put logic here
if (bool === "si") {
$("#erruser").css("display", "block");
$("#username").addClass("errclass");
} else {
$("#erruser").css("display", "none");
$("#username").removeClass("errclass");
}
},
error: function() {
alert("errore");
}
});
}
我还建议您设置页面的初始状态,以便在发生此请求时,向用户显示有意义的内容。回答以下问题:“当页面尚不知道它是测试用户时,我应该向用户显示什么”,然后相应地设置页面的初始状态
我总是发现与Java和JSON数据的交互有些笨拙,而您的问题似乎就像我过去处理过的事情。
您的问题是“为什么ajax向服务器发送空值”。看起来好像是这样,但实际上发生的是您的服务器不了解如何解释其获取的数据。看一下this question about getting a JSON payload.。您需要告诉您的服务器如何解析来自客户端的数据。如果您要检查发送的数据,我希望它看起来像这样{"user":"blablabla"}
。
如果您已经有一个类定义,请使用它。为此,我正在使用如下所示的内容:
public class UserRequest {
String user;
}
// get the body as a string. Requires https://commons.apache.org/proper/commons-io/
String body = IOUtils.toString(request.getReader())
// parse the json with gson. Requires https://github.com/google/gson
Gson g = new Gson();
User u = g.fromJson(body, UserRequest.class);
String username = u.user;