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