我正在尝试通过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!');
}
});
我的servlet:
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映射切换,即/ klyr(工作的)在CustomerServlet上和/ customer / save在Controller上,但没有任何反应,实际上当我从浏览器栏调用/ klyr而不是看到来自CustomerServlet.doGet我仍然看到欢迎页面,就像Controller.doGet被解雇了一样。看起来tomcat没有重新加载web.xml文件,即使我重新启动它。有任何想法吗?
答案 0 :(得分:0)
这是显而易见的,因为您的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>
为了解决问题〜
答案 1 :(得分:0)
我最终找到了罪魁祸首,将其作为其他人的参考发布在这里。 在我的web.xml中映射的两个servlet都在启动时加载。 第一个servlet尝试从其init()方法中的不正确路径读取配置文件,但无法找到它并引发异常。 Catalina启动例程在加载第二个servlet之前退出,因此出现404错误。