2015-10-31 5 views
0

Я пытаюсь получить веб-страницу для отправки данных JSON в сервлет Java через jQuery ajax POST. Я уже проверял все, что мог придумать, но я до сих пор не могу понять, почему я продолжаю получать 404. Еще более запутанным является то, что другие вызовы одного и того же контекстного пути работают правильно.ajax call to java servlet results in 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({ 
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 нет.

Большое спасибо!

EDIT: Я попытался переключить отображение сервлетов, т.е./klyr (рабочий) на CustomerServlet и/клиент/сохранить на контроллере, но ничего не происходит, фактически, когда я вызываю/klyr из браузера вместо ответа от CustomerServlet.doGet. Я все еще вижу страницу приветствия, как если бы Controller.doGet был запущен. Похоже, что tomcat не перезагружает файл web.xml, даже если я его перезагружу. Есть идеи?

+0

Я не вижу конфигурацию сервлета с url как 'customer/save'. Попробуйте нажать URL из браузера напрямую, используя адресную строку. – Arvind

ответ

0

Я в конце концов нашел виновника, собирается разместить его здесь в качестве ссылки для других людей Оба сервлеты м. apped в моем web.xml загружаются при запуске. Первый сервлет попытался прочитать конфигурационный файл с неправильного пути внутри его метода init(), но не смог найти его и выбросил исключение. Процедура запуска Catalina вышла, прежде чем она смогла загрузить второй сервлет, следовательно, ошибку 404.

0

Это очевидно, потому что ваш CustomerServlet не связывается с $ .ajax ({URL: «клиент/сохранить», ... так что это не будет работать, вам следует изменить код ниже:

<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> 

для того, чтобы решить проблему ~

+0

спасибо Мехди, но я все еще получаю 404 – TXV

+0

@TXV какое исключение? откройте свой браузер и введите URL-адрес и убедитесь, что ваш метод получает вызов при отправке запроса GET. – Mehdi

+0

сначала попробуйте открыть простую страницу приветствия, используя ваш навигационный URL-адрес, затем зайдите в ajax – Mehdi