Я только что подготовил курс по jQuery для своих коллег, и один из разделов посвящен функциям jQuery AJAX. Чтобы продемонстрировать это, я написал быстрое веб-приложение с использованием Play 2 . Поскольку в разных местах было задано несколько вопросов о том, как это работает, я собираюсь разбить его здесь на несколько простых примеров основного метода $ .ajax () , а также сокращенных методов, которые упрощают его использование.
$ .Ajax ()
Метод $ .ajax () jQuery является частью низкоуровневого интерфейса и может быть настроен для обеспечения всех ваших потребностей AJAX. Для этого примера мы собираемся сделать простой GET, который приведет к 200 ответу от сервера вместе с текстовым сообщением.
JavaScript:
$.ajax(ajaxParameters({ url: '/ajax', success: function(data, textStatus, jqXHR) { window.alert(data); }, error: function(jqXHR, textStatus, errorThrown) { window.alert(textStatus); } }));
Обратите внимание на URL — это приводит к вызову http: // localhost: 9000 / ajax, и поэтому должен появиться в файле маршрутов:
GET /ajax controllers.Application.ajax()
Реализация на стороне сервера настолько проста, насколько это возможно:
public static Result ajax() { return ok("Here's my server-side data"); }
Отвечая на ошибки
Посмотрите снова на JavaScript — вы увидите, что есть обработчики, объявленные для условий успеха и ошибок. Какая разница? Ответ 200 активирует обработчик успеха, а другие коды запускают обработчик ошибок. Давайте настроим код, чтобы показать, как это работает.
JavaScript. Единственное, что здесь изменилось, — это URL-адрес. Теперь он указывает на URL-адрес, который гарантированно возвращает ответ, отличный от 200.
$.ajax(ajaxParameters({ url: '/ajaxWithError', success: function(data, textStatus, jqXHR) { window.alert(data); }, error: function(jqXHR, textStatus, errorThrown) { window.alert(textStatus); } }));
Маршрут:
GET /ajaxWithError controllers.Application.ajaxWithError()
И реализация на стороне сервера:
public static Result ajaxWithError() { return badRequest("Somehow, somewhere, you screwed up"); }
И это все — теперь вы обрабатываете условия успеха и ошибок.
Сокращенные методы
В jQuery полезны сокращенные методы, которые упрощают использование $ .ajax () и в некоторых случаях предоставляют дополнительные функции, такие как анализ данных отклика в объектах JSON или загрузка контента в элементы.
$ .Get ()
Неудивительно, что $ .get () предназначен для выдачи асинхронных GET на сервер. Вы можете предоставить параметры и дать одну функцию, которая будет выполняться в случае успешного вызова.
JavaScript:
$.get('/get', {'foo': 'bar'}, function(data) { window.alert(data); });
Маршрут — обратите внимание, это не указывает параметр метода!
GET /get controllers.Application.get()
Реализация на стороне сервера:
public static Result get() { Map queryParameters = request().queryString(); return ok(String.format("Here's my server-side data using $.get(), and you sent me [%s]", queryParameters.get("foo")[0])); }
Обработка ошибок
В реальном мире вы будете иногда получать ошибки, и вышеупомянутый JavaScript не справляется с этим. Ключ заключается в том, чтобы использовать функции обработки событий jQuery вместо предоставления обратных вызовов. В этом примере обрабатываются любые события успеха, ошибки и завершения, инициируемые $ .get ().
$.get('/getWithError') .success(function(data) { window.alert('Success: ' + data); }) .error(function(data) { window.alert('Error: ' + data.responseText); }) .complete(function(data) { window.alert('The call is now complete'); });
Маршрут:
GET /getWithError controllers.Application.getWithError()
Реализация на стороне сервера:
public static Result getWithError() { return badRequest("Something went very, very wrong"); }
$ .Post ()
Пока все хорошо, но что, если вы хотите отправить данные на сервер? Вы можете использовать $ .post () для этого. Интересно, что для DELETE, PUT и т. Д. Не существует сокращенных методов — для них нужно использовать метод $ .ajax ().
Семантика та же, что и для $ .get (), поэтому я не буду здесь приводить события. Это использует обычный обратный вызов.
JavaScript:
$.post('/post', {'foo':'bar'}, function(data) { window.alert(data); });
Маршрут — обратите внимание, что используется HTTP-метод POST.
POST /post controllers.Application.post()
И код на стороне сервера:
public static Result post() { Map parameters = request().body().asFormUrlEncoded(); String message = parameters.get("foo")[0]; return ok(message); }
$ .GetJSON ()
$ .getJSON () загружает данные в формате JSON с сервера, используя HTTP-запрос GET (чтобы украсть строку из документации jQuery). Это означает, что возвращенные данные могут быть немедленно обработаны как объект JSON без дальнейшей обработки.
JavaScript:
$.getJSON('/getJson', function(data) { // data is a JSON list, so we can iterate over it $.each(data, function(key, val) { window.alert(key + ':' + val); }); });
Маршрут:
GET /getJson controllers.Application.getJson()
Серверный код:
public static Result getJson() { List data = Arrays.asList("foo", "bar"); return ok(Json.toJson(data)); }
$ .GetScript ()
$ .getScript () загружает скрипт с сервера с помощью HTTP GET, а затем выполняет его в глобальном контексте.
JavaScript:
$.getScript('/getScript');
Маршрут:
GET /getScript controllers.Application.getScript()
Серверный код:
public static Result getScript() { return ok("window.alert('hello');"); }
Обработка событий
Этот пример не может быть проще. Это может быть, однако, немного сложнее. События, генерируемые $ .getScript (), немного отличаются от событий success, error и т. Д. Других методов. Для $ .getScript () есть события done и fail . Для успеха вы должны использовать обратный вызов.
$.getScript('/getScriptWithError', function() { window.alert('This is the success callback'); }) .done(function(script, textStatus) { window.alert('Done: ' + textStatus); }) .fail(function(jqxhr, settings, exception) { window.alert('Fail: ' + exception); });
Маршрут:
GET /getScriptWithError controllers.Application.getScriptWithError()
Реализация на стороне сервера. Обратите внимание, что возвращается ответ 200, но с неработающим JavaScript.
public static Result getScriptWithError() { return ok("this is not a valid script!"); }
.load
Последний, но не менее важный .load () . Обратите внимание, что это не $ .load (), а $ (селектор) .load (), поскольку его целью является получение HTML-кода с сервера и размещение его в сопоставленном элементе.
JavaScript:
$('#loadContainer').load('/load');
Маршрут:
GET /load controllers.Application.load()
Реализация на стороне сервера:
public static Result load() { return ok(snippet.render()); }
Шаблон:
<div id="aTable"> <table> <tr> <td>Foo</td> <td>Bar</td> </tr> <tr> <td>Hurdy</td> <td>Gurdy</td> </tr> </table> </div> <div id="aList"> <ul> <li>Foo</li> <li>Bar</li> </ul> </div>
Загрузка фрагментов
.load () может принимать второй параметр в строке URL, разделенный пробелом. Этот параметр является селектором — если он присутствует, jQuery будет извлекать выбранный элемент из HTML и вставлять только тот, который находится в цели.
$('#loadFragmentContainer').load('/load #aList');
Обратите внимание, что здесь нет изменений в маршруте, коде на стороне сервера или шаблоне — это чисто клиентская операция.
Вот и все, ребята
jQuery упрощает выполнение вызовов AJAX, а Play упрощает прием и реагирование на эти вызовы. Идеальное совпадение!