【问题标题】:Why ajax call send null to servlet? [duplicate]为什么ajax调用将null发送到servlet? [复制]
【发布时间】:2019-11-25 12:20:33
【问题描述】:

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

谢谢!

【问题讨论】:

  • 需要了解ajax是异步的。你不能做if(!testUser())。在return 之前,该请求不会完成。见How do I return the response from an asynchronous call?
  • 我也尝试添加 async:false 但没有
  • 永远不要使用async:false。这是一种可怕的做法,已被弃用
  • 首先在浏览器开发工具中检查实际请求以查看实际发送的内容
  • 您需要使用 request.getParameter("user"); 而不是 request.getAttribute("user").toString(); 来获取 user 的值,而且您正在从服务器返回 plain text 但您已在 ajax 调用中将 dataType: "json" 更改为好吧。

标签: javascript jquery ajax servlets


【解决方案1】:

客户端

无论服务器是否正常运行,您的测试用户函数都将始终返回 false,因为 $.ajax() 是一个异步函数。有几种方法可以解决这个问题。在您的情况下,在不了解您正在构建的内容的情况下,我建议从您的测试用户函数中删除返回值,并将您的逻辑移动到 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 将 null 发送到服务器”。看起来可能是这样,但真正发生的是您的服务器不了解如何解释它获取的数据。看看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;

【讨论】:

  • 感谢您非常清楚的解释。现在问题解决了
猜你喜欢
  • 2013-04-15
  • 2017-12-30
  • 1970-01-01
  • 2014-09-26
  • 2020-12-30
  • 2015-05-02
  • 2014-09-25
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多