如何从 jQuery $.ajax 调用 servlet 而不会出现 HTTP 404 错误

How to call servlet from jQuery $.ajax without getting HTTP 404 error

我正在尝试使用 ajax 调用来调用 servlet,如下所示:

$.ajax({
  url: 'CheckingAjax',
  type: 'GET',
  data: { field1: "hello", field2 : "hello2"} ,
  contentType: 'application/json; charset=utf-8',
  success: function (response) {
    //your success code
    alert("success");
  },
  error: function (errorThrown) {
    //your error code
    alert("not success :"+errorThrown);
  }                         
});

但是,它转到 error 函数并显示警报:

not success :Not Found

这是怎么造成的,我该如何解决?

当你指定一个相对URL(一个不以scheme或/开头的URL)时,它会变成相对于当前请求URL( URL 你在浏览器的地址栏中看到。

您说过您的 servlet 可在以下位置获得:

http://localhost:8080/FullcalendarProject/CheckingAjax

假设您的 ajax 脚本运行的网页是通过以下方式打开的:

http://localhost:8080/FullcalendarProject/pages/some.jsp

而你指定相对URLurl: "CheckingAjax",那么它会被解释为:

http://localhost:8080/FullcalendarProject/pages/CheckingAjax

但这并不存在。因此它将 return 一个 HTTP 404 "Page Not Found" 错误。

为了使其正常工作,您基本上需要使用以下方法之一指定 URL:

  1. url: "http://localhost:8080/FullcalendarProject/CheckingAjax"

    这不是便携式的。每次将 webapp 移动到另一个域时都需要对其进行编辑。您无法从网络应用程序内部控制它。

  2. url: "/FullcalendarProject/CheckingAjax"

    这也不是真正的便携。每次更改上下文路径时都需要对其进行编辑。您无法从网络应用程序内部控制它。

  3. url: "../CheckingAjax"

    这实际上也是不可移植的,尽管您可以从 webapp 内部完全控制它。每次在 JSP 移动到另一个文件夹时都需要编辑它,但是如果你在 JSPs 移动,你基本上已经在忙于编码,所以这可以很容易地同时完成时间.

  4. 最好的方法是让JSP EL 动态打印当前请求上下文路径。假设JS代码封装在JSP文件中:

    url: "${pageContext.request.contextPath}/CheckingAjax"

    或者当它包含在自己的 JS 文件中时(好习惯!),然后创建一个全局 JS 变量:

    <script>var contextPath = "${pageContext.request.contextPath}";</script>
    <script src="yourajax.js"></script>
    

    url: contextPath + "/CheckingAjax"

    或文档元素上的 HTML5 数据属性:

    <html data-contextPath="${pageContext.request.contextPath}">
        <head>
            <script src="yourajax.js"></script>
    

    url: $("html").data("contextPath") + "/CheckingAjax"