【问题标题】:ajax call to java servlet results in 404 [duplicate]对java servlet的ajax调用导致404 [重复]
【发布时间】:2015-10-31 07:56:36
【问题描述】:

我正在尝试让网页通过 jQuery ajax POST 将 JSON 数据发送到 java servlet。 我已经检查了我能想到的所有内容,但我仍然无法弄清楚为什么我一直收到 404。 更令人困惑的是,对同一上下文路径的其他调用正常工作。

我的 web.xml

<web-app>
<servlet>
    <servlet-name>Controller</servlet-name>
    <servlet-class>com.vibridi.klyr.servlet.Controller</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>CustomerServlet</servlet-name>
    <servlet-class>com.vibridi.klyr.servlet.CustomerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/klyr</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/home</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>CustomerServlet</servlet-name>
    <url-pattern>/klyr/customer/*</url-pattern>
</servlet-mapping>

我的 ajax 调用:

  $.ajax({
url: "customer/save",
type: "POST",
data: JSON.stringify(o),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(obj) {
  alert('Customer saved');
},
error: function(obj) {
  alert('Error!');
}

});

我的小服务程序:

public class CustomerServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger("KLYR_LOGGER");
private CustomerManager manager;

public void init(ServletConfig sconfig) throws ServletException {
    super.init(sconfig);
    manager = new CustomerManager();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //stuff
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    PrintWriter out = response.getWriter();
    response.setContentType("application/json;charset=utf-8");

    try {
        StringBuffer sb = new StringBuffer();
        String line = null;
        BufferedReader reader = request.getReader();
        while((line = reader.readLine()) != null) {
            sb.append(line);
        }

        manager.saveCustomer(sb.toString());

    } catch(Exception e) {
        logger.log(Level.SEVERE, "Data processing failure: " + e.getMessage());
        out.write(Convertor.createBaseJSON(JSONType.E).toString());
        out.close();
    } 

    out.write(Convertor.createBaseJSON(JSONType.S).toString());
    out.close();

}}

}

我可以从 Chrome 的调试器工具中看到,调用正确地定向到 http://localhost:8080/klyr/customer/save,但它是 404,而 http://localhost:8080/klyr 没有。

非常感谢!

编辑: 我试图切换 servlet 映射,即 CustomerServlet 上的 /klyr (工作的)和 Controller 上的 /customer/save ,但实际上当我从浏览器栏中调用 /klyr 而不是看到来自的响应时,什么也没发生CustomerServlet.doGet 我仍然看到欢迎页面,就好像 Controller.doGet 被解雇了一样。即使我重新启动它,tomcat 似乎也没有重新加载 web.xml 文件。有任何想法吗?

【问题讨论】:

  • 我没有看到任何 url 为 customer/save 的 servlet 配置。尝试使用地址栏直接从浏览器中点击 url。

标签: java jquery ajax servlets


【解决方案1】:

这很明显,因为您的 CustomerServlet 没有绑定到 $.ajax({url: "customer/save", ... 所以它不起作用,您应该更改以下代码:

<servlet-mapping>
     <servlet-name>CustomerServlet</servlet-name>
     <url-pattern>/klyr/customer/*</url-pattern>
</servlet-mapping>

类似于:

<servlet-mapping>
     <servlet-name>CustomerServlet</servlet-name>
     <url-pattern>/customer/save</url-pattern>
</servlet-mapping>

为了解决问题~

【讨论】:

    【解决方案2】:

    我终于找到了罪魁祸首,把它贴在这里作为其他人的参考。 在我的 web.xml 中映射的两个 servlet 都是在启动时加载的。 第一个 servlet 尝试从其 init() 方法中的错误路径读取配置文件,但找不到并引发异常。 Catalina 启动例程在加载第二个 servlet 之前退出,因此出现 404 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2010-09-09
      • 2015-09-01
      • 1970-01-01
      • 2012-04-05
      • 2016-02-18
      • 2018-06-06
      • 2016-03-28
      相关资源
      最近更新 更多