Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186

Spring MVC + Ajax (XmlHttpRequest)

22.03.2016, 00:41. Показов 2242. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите, пожалуйста, как сделать такую штуку:
Есть статья на сайте и есть к ней комментарии. Нужно сделать так, чтобы комментарии добавлялись динамически без перезагрузки страницы. При этом использовать именно XmlHttpRequest, а не JQuery.
Делаю так:
view.jsp
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<script type="text/javascript">
 
            /*
             * creates a new XMLHttpRequest object which is the backbone of AJAX,
             * or returns false if the browser doesn't support it
             */
            function getXMLHttpRequest() {
                var xmlHttpReq = false;
                // to create XMLHttpRequest object in non-Microsoft browsers
                if (window.XMLHttpRequest) {
                    xmlHttpReq = new XMLHttpRequest();
                } else if (window.ActiveXObject) {
                    try {
                        // to create XMLHttpRequest object in later versions
                        // of Internet Explorer
                        xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch (exp1) {
                        try {
                            // to create XMLHttpRequest object in older versions
                            // of Internet Explorer
                            xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch (exp2) {
                            xmlHttpReq = false;
                        }
                    }
                }
                return xmlHttpReq;
            }
            /*
             * AJAX call starts with this function
             */
            function makeRequest() {
                var xmlHttpRequest = getXMLHttpRequest();
                xmlHttpRequest.onreadystatechange = getReadyStateHandler(xmlHttpRequest);
                xmlHttpRequest.open("POST", "/addcomment", true);
                xmlHttpRequest.setRequestHeader("Content-Type",
                        "application/x-www-form-urlencoded");
                xmlHttpRequest.send(null);
            }
 
            /*
             * Returns a function that waits for the state change in XMLHttpRequest
             */
            function getReadyStateHandler(xmlHttpRequest) {
 
                // an anonymous function returned
                // it listens to the XMLHttpRequest instance
                return function () {
                    if (xmlHttpRequest.readyState === 4) {
                        if (xmlHttpRequest.status === 200) {
                            document.getElementById("com").innerHTML = xmlHttpRequest.responseText;
                        } else {
                            alert("HTTP error " + xmlHttpRequest.status + ": " + xmlHttpRequest.statusText);
                        }
                    }
                };
            }
        </script>
.....................................
<p>Comments:</p>
        <div id="com">
        <c:forEach items="${new.commentsList}" var="comment">
            <p>${comment.timestamp}</p>
            <p>${comment.comment}</p>
        </c:forEach>
        </div>
        <p>
            <form:form method="POST" action="view${new.id}" modelAttribute="newcomment">
            <table>
                <tr>
                <input type="hidden" name="id" value="${new.id}" />
                <td><label for="comment">New comment: </label>
                    <form:input path="comment" id="comment"/></td>
            </tr>
            <tr>
                <td><input type="submit" value="Add comment" onclick="makeRequest()" /></td>
            </tr>
        </table>
    </form:form>
Controller:
Java
1
2
3
4
5
@RequestMapping(value = "view{id}", method = RequestMethod.POST)
    public @ResponseBody List<Comments> addComment(@RequestParam String comment, @RequestParam int id) {
        List<Comments> comments = commentsService.findByNewsId(id);
        return comments;
    }
Выводит мне кучу записей из БД (одинаковых). Типа такого:
XML
1
[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":[{"id":1,"timestamp":1458419873000,"comment":"comment 1","idNew":{"id":1,"newdate":"2016-03-19","newtitle":"Header 1","newcontent":"Text 1","commentsList":
И все это не в определенный блок <div id="com"></div>, а вообще вместо всей JSP-страницы.
Пытаюсь понять как это работает и уже два дня ничерта не получается.

Можете показать какой-нибудь пример или объяснить, как это делается?
Конкретно не понятны такие вещи:
1. xmlHttpRequest.open("POST", "/addcomment", true); Какой здесь нужно указывать URL? Как я понимаю, тот, который отлавливается в контроллере (@RequestMapping(value = "/addcomment", method = RequestMethod.POST)). Но так не работает.
2. Если это POST, то нужно как-то передать параметры формы в xmlHttpRequest.send();. Но как?
3. Возвращаю список комментариев List<Comments>. Как его вывести в HTML в блок <div>, если это XML?

В общем, прошу помощи. Подскажите, как это делается или может, ссылку какую подкиньте, если знаете, где разжевано. Гугл в основном дает результаты по работе с JSON. Но мне не нужен Ajax via XmlHttpRequery.

Добавлено через 2 часа 19 минут
Кое-что прояснилось. У меня данные брались из БД зацикленно.
Упростил пример. Хочу просто вывести строку в <div id="com"></div>, если коммент добавлен в базу.
Делаю так:

View.jsp
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<script>
function makeRequest() {
                var xmlHttpRequest = getXMLHttpRequest();
                xmlHttpRequest.onreadystatechange = getReadyStateHandler(xmlHttpRequest);
                xmlHttpRequest.open("POST", "/addcomment", true);
                xmlHttpRequest.setRequestHeader("Content-Type",
                        "application/x-www-form-urlencoded");
                xmlHttpRequest.send();
            }
 
            /*
             * Returns a function that waits for the state change in XMLHttpRequest
             */
            function getReadyStateHandler(xmlHttpRequest) {
 
                // an anonymous function returned
                // it listens to the XMLHttpRequest instance
                return function () {
                    if (xmlHttpRequest.readyState == 4) {
                        if (xmlHttpRequest.status == 200) {
                            document.getElementById("com").innerHTML = xmlHttpRequest.responseText;
                        } else {
                            alert("HTTP error " + xmlHttpRequest.status + ": " + xmlHttpRequest.statusText);
                        }
                    }
                };
            }
        </script>
 
 
.............................................
 
<div id="com"></div>
<form:form method="POST" action="addcomment" modelAttribute="newcomment">
....................
</form:form>
Controller.java
Java
1
2
3
4
5
6
@RequestMapping(value = {"/addcomment"}, method = RequestMethod.POST)
    public @ResponseBody String addComment(@RequestParam String comment, @RequestParam int id) {
        System.err.println(id);
        System.err.println(comment);
        return "Test";
    }
В итоге, запрос проходит, в консоль печатаются значения comment и id из формы.
После этого на jsp-страничке мне показывает alert с текстом "HTTP error 0:".
Потом перезагружается страница, в URL пишет "/addcomment" (такого view нету) с одним единственным словом "Test".

Т.е. все проходит хорошо ровно до момента приема ответа с сервера.
1. Выкидывает ошибку "HTTP error 0:"
2. Вместо вывода переданного значения в <div>, выводит его на отдельную страницу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2016, 00:41
Ответы с готовыми решениями:

Spring MVC ajax
Добрый день. Не получается передать список объектов(или просто объект) с контроллера в js. Контроллер: @RequestMapping(value =...

Ajax в Spring mvc
Добрый день всем. Решил выучить ajax, в частности применять его фреймворк jQuery, но материала так много, что немного запутался с чего...

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2016, 00:41
Помогаю со студенческими работами здесь

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -...

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...

Spring MVC, Spring REST
Всем привет! Изучаю фреймворк Spring и возникло несколько вопросов в процессе, на которые не уверен однозначно, что до конца понимаю....

Spring mvc spring jdbc
Простое веб приложение с использованием Spring mvc + jdbc(JdbcTemplate). Можно добавить запись в таблицу или вывести список данных из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru