为什么 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;