Статьи

JQuery AJAX с игрой 2

Я только что подготовил курс по 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 упрощает прием и реагирование на эти вызовы. Идеальное совпадение!