 | Ajax в WSRF::Lite: Изменение ResourceProperties ресурса WS-Resource с Web-страницы
В предыдущем разделе вы узнали, как обновить Web-страницу путем обновления ResourceProperties ресурса WS-Resource с использованием JavaScript и HTTP GET-запроса. Теперь вы узнаете, как изменить ResourceProperties WS-Resource-счетчика из Web-браузера. На этот раз HTML-форма используется не для отображения значения, а для ввода данных пользователем. Вместо передачи данных HTML-формы с использованием традиционного кодирования HTML-форм и запросов HTTP POST или GET, используется Ajax для создания и отправки запроса HTTP PUT с полезной нагрузкой в XML-формате.
Поддержка HTTP PUT и DELETE
Отображением HTTP-методов на WSRF-операции в WSRF::Lite являются: HTTP PUT на PutResourcePropertyDocument и HTTP DELETE на Destroy. К сожалению, в большинстве Web-браузеров нет встроенной поддержки HTTP PUT или HTTP DELETE, аналогичной поддержке GET и POST для HTML-форм. Однако при помощи объекта XMLHttpRequest можно использовать эти HTTP-методы в Web-браузерах, поддерживающих XMLHttpRequest. XMLHttpRequest также обеспечивает лучший контроль над форматом данных, отправляемых в теле запроса. Как показано в листинге 13, можно создать полезную нагрузку в XML-формате и передать ее в WS-Resource, используя HTTP PUT.
Функция updateResourceProperties, приведенная в листинге 13, передает HTTP PUT-запрос в WS-Resource для изменения одного или более свойств ResourceProperties ресурса WS-Resource. Ответное сообщение содержит документ ResourcePropertyDocument ресурса WS-Resource - такой же ответ, как и для HTTP GET-запроса. Это означает, что обработчик ответа в функции updateResourceProperties может быть таким же, как и в функции reloadResourcePropertiesDocument, о чем говорилось в предыдущем разделе.
Листинг 13. Общая функция для обновления свойств ResourceProperties в WS-Resource с использованием технологии Ajax
function updateResourceProperties(xmlContent)
{
// Создает новый объект XMLHttpRequest (или эквивалент).
var req = newXMLHttpRequest();
// Вызывает функцию-обработчик для обратной связи с пользователем.
indicateActive();
// Определяет функцию обратного вызова для асинхронного HTTP-запроса.
// Эта функция вызывается несколько раз с различными значениями readyState
// во время асинхронной обработки запроса объектом
// XMLHttpRequest.
req.onreadystatechange = function()
{
if(req.readyState == 4)
{
// Когда код состояния равен 200 (OK), запрос выполнился успешно.
if(req.status == 200)
{
var respDocElem = req.responseXML.documentElement;
// Вызывает функцию-обработчик для обновления страницы.
updatePageFromResourcePropertiesDocument(respDocElem);
}
else
{
// Вызывает функцию-обработчик для индикации возникновения ошибки.
updatePageAfterError("Error: returned status code " + req.status
+ " " + req.statusText);
}
// Вызывает функцию-обработчик для завершения ответной реакции.
indicateIdle();
}
};
// Подготавливает тело запроса
var newValues = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"
+ '<wsrp:ResourceProperties xmlns:wsrp="'+wsrpNS+'">'
+ xmlContent
+ '</wsrp:ResourceProperties>';
// Устанавливает тип запроса: асинхронный ("true") PUT на window.location.href
req.open("PUT", window.location.href, true);
req.setRequestHeader("Content-Type", "text/xml");
// Выполняет запрос, используя содержимое newValues в теле сообщения.
req.send(newValues);
return false;
}
|
Функцию updateResourceProperties можно использовать повторно для других типов WS-Resources в WSRF::Lite. Она полагается на три функции-обработчика, являющиеся такими же, как и в функции reloadResourcePropertiesDocument. Эти функции можно настроить для конкретного типа WS-Resource:
-
updatePageFromResourcePropertiesDocument(respDocElement)
-
indicateActive()
-
indicateIdle()
Функция updateResourceProperties принимает аргумент xmlContent, который является строкой, содержащей последовательность XML-элементов для установки их как дочерних элементов в элементе ResourceProperties
PUT-запроса. Эту строку можно сгенерировать, читая значения из HTML-формы.
Обновление счетчика
Значения ResourceProperty являются чем-то таким, что можно выразить на XML, и они зависят от типа WS-Resource. В примере WS-Resource-счетчика ResourceProperty count имеет тип integer, поэтому только одно значение должно читаться из поля input в HTML-форме. Можно создать более сложные типы элементов, считывая значения из более сложных HTML-форм.
Функция updateResourcePropertiesFromPage, показанная в листинге 14, предоставляет пример того, как создать дочерние XML-элементы, требующиеся для updateResourceProperties. В данном примере значение элемента mmk:count устанавливается путем чтения атрибута value input-элемента count в HTML-документ. TerminationTime обрабатывается аналогично.
Листинг 14. Пример кода для обновления WS-Resource из значений на Web-странице
function updateResourcePropertiesFromPage()
{
// Извлекает значения count и TerminationTime из элементов формы
// и помещает их в XML-формат.
var xmlContent =
'<mmk:count xmlns:mmk="'+mmkNS+'">'
+ document.getElementById('count').value + '</mmk:count>'
+ '<wsrl:TerminationTime xmlns:wsrl="'+wsrlNS+'">'
+ document.getElementById('TerminationTime').value
+ '</wsrl:TerminationTime>';
// Вызывает общую функцию для обновления ResourceProperties с использованием данного
// содержимого.
updateResourceProperties(xmlContent);
}
|
Попробуйте изменить функцию так, чтобы использовалось случайное значение count путем замены определения элемента mmk:count в листинге 14 на:
'<mmk:count xmlns:mmk="'+mmkNS+'">' + Math.floor(10000*Math.random()) +
'</mmk:count>'
|
Уничтожение счетчика
Ajax-интерфейс для примера WS-Resource-счетчика, предоставляемого с WSRF::Lite, не реализует средства для уничтожения ресурса, иначе как путем изменения времени его завершения. В данном разделе вы реализуете кнопку, уничтожающую счетчик немедленно. Прежде всего, добавьте функцию destroyResource, показанную в листинге 15, в файл Counter.js. Эта функция передает запрос HTTP DELETE ресурсу WS-Resource.
Листинг 15. Пример функции destroyResource()
function destroyResource()
{
// Создает новый объект XMLHttpRequest (или его эквивалент).
var req = newXMLHttpRequest();
// Вызывает функцию-обработчик для обратной связи с пользователем.
indicateActive();
// Определяет функцию обратного вызова для асинхронного HTTP-запроса.
// Эта функция вызывается несколько раз с различными значениями readyState
// во время асинхронной обработки запроса объектом
// XMLHttpRequest.
req.onreadystatechange = function()
{
if(req.readyState == 4)
{
// Когда код состояния равен 200 (OK), запрос выполнился успешно.
if(req.status != 200)
{
// Вызывает функцию-обработчик для индикации возникновения ошибки.
updatePageAfterError("Error: returned status code " + req.status
+ " " + req.statusText);
}
// Вызывает функцию-обработчик для завершения ответной реакции.
indicateIdle();
}
};
// Устанавливает тип запроса: асинхронный ("true") DELETE на window.location.href
req.open("DELETE", window.location.href, true);
// Выполняет запрос.
req.send(null);
}
|
Теперь нужно добавить кнопку в Web-страницу для активизации функции deleteResource. Это делается в XSLT-файле таблицы стилей Counter.xsl. Например, в листинге 16 в HTML-таблицу была добавлена дополнительная строка для этой кнопки.
Листинг 16. Добавление кнопки в XSLT-файл таблицы стилей для уничтожения WS-Resource
..................
<tr>
<td colspan="2" align="center" id="destroyResource" class="idle">
<input type="button" value="Destroy the resource"
onclick="javascript: return destroyResource();" />
</td>
</tr>
..................
|
|  |