#java #spring #spring-mvc #jakarta-ee
#java #spring #spring-mvc #джакарта-ee
Вопрос:
У меня есть вопрос, связанный с Spring 3 MVC, Ajax и form: ошибки.
У меня есть форма, которую я отправляю на сервер, и я использую Spring MVC. У меня все проверки, контроллеры и т.д. Настроены и работают нормально. Когда я отправляю данные, которые не прошли проверку, я получаю сообщение об ошибке, возвращающееся и отображаемое в форме в соответствии с моими тегами form: errors в моем jsp.
Мой вопрос таков…
Если я захочу перейти на Ajax-подход, могу ли я по-прежнему использовать всю инфраструктуру «обычного» приложения Spring MVC (т. Е., в частности, функции проверки и формы: ошибки), чтобы возвращать ошибки обратно в браузер (и отображать их в нем)? Я вижу, как отправлять Ajax-запросы, но я не вижу, как (или если) я все еще могу использовать возможности jsp form: errors.
Кто-нибудь знает, можно ли это сделать, и если да, укажите мне соответствующее общее направление?
Заранее спасибо.
Ответ №1:
Вы не можете, поскольку теги типа <form:errors>
вычисляются на стороне сервера и встраивают сообщения об ошибках / элементы в HTML-содержимое HTTP-ответа. Поскольку запрос AJAX к серверу обычно возвращает XML или JSON в ответ (а не HTML), который затем анализируется JavaScript на стороне клиента, нет точки, в которой Spring может привязываться к запросу / форме и добавлять сообщения об ошибках к содержимому.
Ответ №2:
Я использовал довольно много AJAX при отправке форм весной. В основном, что я сделал, так это то, что я создал файл form.jsp, который я затем возвращаю из вызова AJAX. Поскольку AJAX вернет всю форму со всеми доступными тегами формы, я получаю все преимущества проверки на стороне сервера.
Итак, если у меня есть страница, содержащая форму, у меня мог бы, например, быть div, который действует как контейнер формы
<div id="form-container">
<form id="myform">
Normal form here ...
</form>
</div>
И когда я отправляю форму, я мог бы загрузить form.jsp с помощью jQuery, например,
$('#myform').submit(function() {
$('#form-container').load('ajax/somehandler');
});
Итак, все, что вам нужно сделать, это вернуть form.jsp из контроллера со всеми обычными привязками, как и при использовании подхода, отличного от AJAX. Вы поняли идею?
Ответ №3:
На самом деле, нет. form:error
Тег творит свое волшебство, когда страница впервые генерируется на стороне сервера. Если вы не генерируете страницу повторно на стороне сервера, потому что вы использовали ajax, ничего из этого не будет запущено. Сам объект Errors на самом деле не может быть полностью возвращен клиенту. Я полагаю, вы могли бы сериализовать ее в JSON, но там ужасно много всего, что вам не нужно. Плюс, конечно, обычно в нем содержатся только коды, а не фактические сообщения, и для поиска переводов требуется источник сообщения.
В итоге вам нужно будет отправить ошибки вручную и самостоятельно настроить сообщения об ошибках в javascript, когда вы получите ответ ajax.