为什么Ajax调用会向Servlet发送null?

时间:2019-07-16 17:38:25

标签: javascript jquery ajax servlets

我正在尝试通过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;
}

谢谢!

1 个答案:

答案 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;