XmlHttpRequest уровень 2: Ответ ничего не возвращает

У меня есть эта проблема, я уже задавал этот вопрос вчера, но у меня не было никакого ответа...:(

У меня есть этот код на стороне клиента:

 var formdata = new FormData();
    //fill fields of formdata... for example:
    var file = document.getElementById("file").files[0];
    formdata.append("file", file);
    //and others....but the problem is not here
    var xhr = new XMLHttpRequest();
    xhr.open("POST","http://127.0.0.1:8080/Commerciale",true);
    xhr.send(formdata);
    xhr.onreadystatechange = function() {

        if (xhr.readyState == 4) {
    if (xhr.status == 200) {
                   var str = xhr.responseText;
                   alert(str);
              }
         }
      });

пока это кажется справедливым. В сервлете у меня есть этот код:

 protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException             {
   ***other code, but i think that the problem is here:
   PrintWriter ajaxWriter = response.getWriter();
   ajaxWriter.println(p.getJSON());
   ajaxWriter.flush();          
   System.out.println(p.getJSON());
   ajaxWriter.close();
 }

проблема в том, что с

 System.out.println(p.getJSON()); 

печатает то, что я ожидаю, но кажется, что

 xhr.responseText 

ничего не возвращает, на самом деле оповещение пустое.

кто-то может объяснить мне, почему?

2 ответа

Решение

:) После обнаружения, что это является причиной:

Вы не должны закрывать писатель после промывки.
Удалить строку:

ajaxWriter.close();

Интересный связанный вопрос - нужно ли вызывать.close() для HttpServletResponse.getOutputStream()/. GetWriter()?

Хотя нет специальной документации, которая запрещает закрывать модуль записи / потока, это должен выполнять контейнер, а не приложение.

Вы должны установить тип контента по запросу POST:

    var formdata = new FormData();    
    var file = document.getElementById("file").files[0];
    formdata.append("file", file);

    var xhr = new XMLHttpRequest();
    xhr.open("POST","http://127.0.0.1:8080/Commerciale",true);
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xhr.onreadystatechange = function() {

    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            var str = xhr.responseText;
            alert(str);
        }
     }
  };
xhr.send(formdata);
Другие вопросы по тегам