为什么 ajax 调用 send null 到 servlet?
Why ajax call send null to servlet?
我试图通过 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;
}
谢谢!
客户端
无论服务器是否正常运行,您的测试用户函数总是 return false,因为 $.ajax() 是一个异步函数。有几种解决方法。在你的情况下,在不了解你正在构建的内容的情况下,我建议从你的测试用户函数中删除 return 值,并将你的逻辑移动到 ajax 中的 success/failure 区域打回来。这样,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");
}
});
}
我还建议设置页面的初始状态,以便在发生此请求时向用户显示一些有意义的内容。回答以下问题:"what do I show my users when the page does not know yet if it is a test user" 然后相应地设置页面的初始状态
服务器端
我一直发现与 java 和 JSON 数据交互有点笨拙,您的问题似乎是我过去一直在努力解决的问题。
您的问题是"why is ajax sending null to the server"。看起来可能是这样,但真正发生的是您的服务器不了解如何解释它获取的数据。看看this question about getting a JSON payload.。您需要告诉您的服务器如何解析来自客户端的数据。如果您要检查正在发送的数据,我希望它看起来像这样 {"user":"blablabla"}
.
如果您已经有 class 定义,请使用它。为此,我使用的是这样的东西:
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;
我试图通过 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;
}
谢谢!
客户端
无论服务器是否正常运行,您的测试用户函数总是 return false,因为 $.ajax() 是一个异步函数。有几种解决方法。在你的情况下,在不了解你正在构建的内容的情况下,我建议从你的测试用户函数中删除 return 值,并将你的逻辑移动到 ajax 中的 success/failure 区域打回来。这样,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");
}
});
}
我还建议设置页面的初始状态,以便在发生此请求时向用户显示一些有意义的内容。回答以下问题:"what do I show my users when the page does not know yet if it is a test user" 然后相应地设置页面的初始状态
服务器端
我一直发现与 java 和 JSON 数据交互有点笨拙,您的问题似乎是我过去一直在努力解决的问题。
您的问题是"why is ajax sending null to the server"。看起来可能是这样,但真正发生的是您的服务器不了解如何解释它获取的数据。看看this question about getting a JSON payload.。您需要告诉您的服务器如何解析来自客户端的数据。如果您要检查正在发送的数据,我希望它看起来像这样 {"user":"blablabla"}
.
如果您已经有 class 定义,请使用它。为此,我使用的是这样的东西:
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;